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 +5/−47
- Dust/Model/convert.hs +81/−0
- Dust/Model/export.hs +0/−41
- Dust/Model/show.hs +0/−61
- Dust/Services/Replay/convert.hs +0/−81
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-