packages feed

Dust-tools-pcap 1.1 → 1.3.1

raw patch · 5 files changed

+86/−230 lines, 5 filesdep ~Dustdep ~Dust-toolsnew-component:exe:shaper-update

Dependency ranges changed: Dust, Dust-tools

Files

Dust-tools-pcap.cabal view
@@ -1,5 +1,5 @@ Name:                Dust-tools-pcap-Version:             1.1+Version:             1.3.1 Description:         A set of tools for exploring network filtering Synopsis:            Network filtering exploration tools that rely on pcap Category:            Network@@ -15,12 +15,12 @@   location: git@github.com:blanu/Dust-tools.git  Executable replay-convert-  Main-is: Dust/Services/Replay/convert.hs+  Main-is: Dust/Model/convert.hs   Build-Depends:     base >= 3 && < 5,     Dust-crypto,-    Dust >= 2.3,-    Dust-tools >=1.3,+    Dust >= 2.3.1,+    Dust-tools >=1.3.2,     bytestring,     entropy,     network,@@ -36,50 +36,8 @@     split,     pcap -Executable update+Executable shaper-update   Main-is:           Dust/Model/update.hs-  Build-Depends:-    base >= 3 && < 5,-    Dust,-    bytestring,-    entropy,-    network,-    cereal,-    ghc-prim,-    binary,-    random,-    random-extras,-    random-source,-    random-fu,-    containers,-    directory,-    split,-    pcap,-    csv--Executable export-  Main-is:           Dust/Model/export.hs-  Build-Depends:-    base >= 3 && < 5,-    Dust,-    bytestring,-    entropy,-    network,-    cereal,-    ghc-prim,-    binary,-    random,-    random-extras,-    random-source,-    random-fu,-    containers,-    directory,-    split,-    pcap,-    csv--Executable show-  Main-is:           Dust/Model/show.hs   Build-Depends:     base >= 3 && < 5,     Dust,
+ Dust/Model/convert.hs view
@@ -0,0 +1,81 @@+import System.IO+import qualified Data.ByteString as B+import Data.ByteString.Char8 (pack)+import Data.Serialize+import Text.Printf (printf)+import Data.List as L+import Control.Concurrent+import Network.Socket hiding (recv, Stream)+import Network.Socket.ByteString (recv, sendAll)+import System.Entropy+import Control.Exception+import Data.Word (Word16)+import Network.Pcap+import System.Environment (getArgs)+import Data.Word (Word32)++import Dust.Network.Util+import Dust.Model.Packet+import Dust.Model.TrafficModel+import Dust.Model.Observations+import Dust.Services.Replay.Replay++main :: IO()+main = do+    args <- getArgs++    case args of+        (pcappath:protocol:port:pspath:_) -> convert pcappath protocol port pspath+        otherwise                         -> do+          putStrLn "replay-convert converts .pcap files into the packetstream format for use in replay-server and replay-client"+          putStrLn "Usage: replay-convert [pcap-file] [tcp|udp] [port] [packetstream-file]"++convert :: FilePath -> String -> String -> FilePath -> IO()+convert pcappath protocol sport pspath = do+    let rport = (read sport)::Word16+    case protocol of+      "tcp" -> do+          let config = TCPConfig (PortNum rport) False+          pcap <- openPcap pcappath config+          stream <- convertStream config pcap $ Stream ProtocolTCP rport []+          putStrLn "---------------------------"+          putStrLn $ show stream+          let bs = encode stream+          B.writeFile pspath bs+      "udp" -> do+          let config = UDPConfig (PortNum rport) False "" True+          pcap <- openPcap pcappath config+          stream <- convertStream config pcap $ Stream ProtocolUDP rport []+          putStrLn $ show stream+          let bs = encode stream+          B.writeFile pspath bs+      otherwise -> putStrLn $ "Unknown protocol " ++ protocol++convertStream :: ReplayConfig -> PcapHandle -> Stream -> IO Stream+convertStream config pcap stream@(Stream protocol rport packets) = do+    (hdr, body) <- nextBS pcap+    if hdrWireLength hdr /= 0+        then do+            let eitherHeaders = parsePacket body++            case eitherHeaders of+                Left error -> do+                  putStrLn "Error parsing [TCP|UDP]/IP headers"+                  return stream+                Right packet@(Packet _ _ _ payload) -> do+                    putStrLn $ show packet+	            if (B.length payload) > 0+        	        then convertStream config pcap $ Stream protocol rport $ packets ++ [packet]+        		else convertStream config pcap stream+        else return stream++openPcap :: FilePath -> ReplayConfig -> IO PcapHandle+openPcap pcappath config = do+    pcap <- openOffline pcappath+    putStrLn "Opened pcap file"+    let ipmask = (fromIntegral 0)::Word32+    case config of+      (TCPConfig (PortNum port) _)     -> setFilter pcap ("tcp port " ++ (show port)) True ipmask+      (UDPConfig (PortNum port) _ _ _) -> setFilter pcap ("udp port " ++ (show port)) True ipmask+    return pcap+
− Dust/Model/export.hs
@@ -1,41 +0,0 @@-import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as BL-import Data.ByteString.Char8 (pack)-import System.Environment (getArgs)-import System.IO.Error-import Data.Serialize-import Text.CSV-import Data.List as L-import Network.Pcap-import Data.Word-import Foreign.Ptr-import Foreign.ForeignPtr-import Control.Monad-import System.Directory--import Dust.Model.TrafficModel-import Dust.Model.PacketLength-import Dust.Model.Content-import Dust.Model.Observations--main = do-    args <- getArgs--    case args of-        (modelpath:csvpath:_) -> export modelpath csvpath-        otherwise      -> putStrLn "Usage: export [observation-file] [csv-file]"--export :: FilePath -> FilePath -> IO()-export modelpath csvpath = do-    eitherObs <- loadObservations modelpath-    case eitherObs of-      Left error -> putStrLn "Could not load observations"-      Right obs -> do-        let model = makeModel obs-        let text = csvify modelpath model-        writeFile csvpath text--csvify :: String -> TrafficModel -> String-csvify name (TrafficModel (PacketLengthModel ls) _ _) =-  name ++ "\n" ++ (unlines $ map show ls)-
− Dust/Model/show.hs
@@ -1,61 +0,0 @@-import Data.ByteString (ByteString)-import qualified Data.ByteString as B-import qualified Data.ByteString.Lazy as BL-import Data.ByteString.Char8 (pack)-import System.Environment (getArgs)-import System.IO.Error-import Data.Serialize-import Text.CSV-import Data.List as L-import Network.Pcap-import Data.Word-import Foreign.Ptr-import Foreign.ForeignPtr-import Control.Monad-import System.Directory-import Data.Map--import Dust.Model.TrafficModel-import Dust.Model.PacketLength-import Dust.Model.Content-import Dust.Model.Observations--main = do-    args <- getArgs--    case args of-        (modelpath:_) -> showModel modelpath-        otherwise      -> putStrLn "Usage: show [observation-file]"--showModel :: FilePath -> IO()-showModel modelpath = do-    eitherObs <- loadObservations modelpath-    case eitherObs of-      Left error -> putStrLn "Could not load observations"-      Right obs -> do---        putStrLn $ show obs-        showSubstrings obs--showSubstrings :: Observations -> IO()-showSubstrings (Observations _ _ _ (SubstringObservations items)) = showSubstring 0 items--showSubstring :: Int -> [(Map ByteString Int)] -> IO()-showSubstring offset [] = return ()-showSubstring offset (item:rest) = do-  showMap offset item-  showSubstring (offset+1) rest--showMap :: Int -> (Map ByteString Int) -> IO()-showMap offset item = showGoodItems offset (assocs item)--showGoodItems :: Int -> [(ByteString,Int)] -> IO()-showGoodItems offset [] = return ()-showGoodItems offset ((bs,count):rest) = do-  showGoodItem offset bs count-  showGoodItems offset rest--showGoodItem :: Int -> ByteString -> Int -> IO()-showGoodItem offset bs count = do-  if count > 1-    then putStrLn $ (show offset) ++ " " ++ (show bs) ++ " " ++ (show count)-    else return ()
− Dust/Services/Replay/convert.hs
@@ -1,81 +0,0 @@-import System.IO-import qualified Data.ByteString as B-import Data.ByteString.Char8 (pack)-import Data.Serialize-import Text.Printf (printf)-import Data.List as L-import Control.Concurrent-import Network.Socket hiding (recv, Stream)-import Network.Socket.ByteString (recv, sendAll)-import System.Entropy-import Control.Exception-import Data.Word (Word16)-import Network.Pcap-import System.Environment (getArgs)-import Data.Word (Word32)--import Dust.Network.Util-import Dust.Model.Packet-import Dust.Model.TrafficModel-import Dust.Model.Observations-import Dust.Services.Replay.Replay--main :: IO()-main = do-    args <- getArgs--    case args of-        (pcappath:protocol:port:pspath:_) -> convert pcappath protocol port pspath-        otherwise                         -> do-          putStrLn "replay-convert converts .pcap files into the packetstream format for use in replay-server and replay-client"-          putStrLn "Usage: replay-client [pcap-file] [tcp|udp] [port] [packetstream-file]"--convert :: FilePath -> String -> String -> FilePath -> IO()-convert pcappath protocol sport pspath = do-    let rport = (read sport)::Word16-    case protocol of-      "tcp" -> do-          let config = TCPConfig (PortNum rport) False-          pcap <- openPcap pcappath config-          stream <- convertStream config pcap $ Stream ProtocolTCP rport []-          putStrLn "---------------------------"-          putStrLn $ show stream-          let bs = encode stream-          B.writeFile pspath bs-      "udp" -> do-          let config = UDPConfig (PortNum rport) False "" True-          pcap <- openPcap pcappath config-          stream <- convertStream config pcap $ Stream ProtocolUDP rport []-          putStrLn $ show stream-          let bs = encode stream-          B.writeFile pspath bs-      otherwise -> putStrLn $ "Unknown protocol " ++ protocol--convertStream :: ReplayConfig -> PcapHandle -> Stream -> IO Stream-convertStream config pcap stream@(Stream protocol rport packets) = do-    (hdr, body) <- nextBS pcap-    if hdrWireLength hdr /= 0-        then do-            let eitherHeaders = parsePacket body--            case eitherHeaders of-                Left error -> do-                  putStrLn "Error parsing [TCP|UDP]/IP headers"-                  return stream-                Right packet@(Packet _ _ _ payload) -> do-                    putStrLn $ show packet-	            if (B.length payload) > 0-        	        then convertStream config pcap $ Stream protocol rport $ packets ++ [packet]-        		else convertStream config pcap stream-        else return stream--openPcap :: FilePath -> ReplayConfig -> IO PcapHandle-openPcap pcappath config = do-    pcap <- openOffline pcappath-    putStrLn "Opened pcap file"-    let ipmask = (fromIntegral 0)::Word32-    case config of-      (TCPConfig (PortNum port) _)     -> setFilter pcap ("tcp port " ++ (show port)) True ipmask-      (UDPConfig (PortNum port) _ _ _) -> setFilter pcap ("udp port " ++ (show port)) True ipmask-    return pcap-