packages feed

Dust-tools-1.0: Dust/Services/Replay/ReplayClient.hs

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 qualified Network.Socket as NS
import Network.Socket.ByteString (recv, sendAll)
import System.Entropy
import Control.Exception
import Data.Word (Word16)
import System.Environment (getArgs)

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
        (pspath:maskfile:_) -> do
          mask <- loadMask maskfile
          bs <- B.readFile pspath
          let eitherStream = (decode bs)::(Either String Stream)
          case eitherStream of
            Left error -> putStrLn "Could not load packetstream file"
            Right stream -> replayClient stream mask
        (pspath:_) -> do
          bs <- B.readFile pspath
          let eitherStream = (decode bs)::(Either String Stream)
          case eitherStream of
            Left error -> putStrLn "Could not load packetstream file"
            Right stream -> replayClient stream (PacketMask [])
        otherwise      -> putStrLn "Usage: replay-client [packetstream-file] <mask-file>"

replayClient :: Stream -> PacketMask -> IO()
replayClient stream@(Stream protocol rport packets) mask = do
    let host = "166.78.129.122"
    let port = 3306 :: PortNumber

    case protocol of
      ProtocolTCP -> do
          let config = TCPConfig (PortNum rport) False          
          client protocol host port (replayStream config stream mask)
      ProtocolUDP -> do
          let config = UDPConfig (PortNum rport) False host True
          client protocol host port (replayStream config stream mask)

client :: Protocol -> String -> PortNumber -> (Socket -> IO()) -> IO()
client protocol host port handleRequest = withSocketsDo $ do
    case protocol of
      ProtocolTCP -> do
        sock <- socket AF_INET NS.Stream defaultProtocol
        addr <- inet_addr host
        connect sock (SockAddrInet port addr)
        setSocketOption sock NoDelay 1

        handleRequest sock

      ProtocolUDP -> do
        let iport = 2014
        let myport = PortNum iport
        sock <- socket AF_INET Datagram defaultProtocol
        addr <- inet_addr host
        putStrLn $ "Binding to " ++ (show iport)
        bindSocket sock (SockAddrInet myport iNADDR_ANY)
        connect sock (SockAddrInet port addr)

        handleRequest sock