packages feed

mptcpanalyzer-0.0.2.0: src/MptcpAnalyzer/Commands/Definitions.hs

module MptcpAnalyzer.Commands.Definitions (
  RetCode(..)
  , CommandMapPcap (..)
  , CommandArgs (..)
  , parserPcapMapping
)
where
import MptcpAnalyzer.Pcap
import MptcpAnalyzer.Plots.Types
import MptcpAnalyzer.Stream
import MptcpAnalyzer.Types

import Data.Word (Word32)
import MptcpAnalyzer.Utils.Completion (completePath, readFilename)
import Options.Applicative


-- | Mapping streams between 2 pcaps is something common in this program.
-- This structure avoids copy/paste.
data CommandMapPcap = CommandMapPcap {
  argsMapPcap1 :: FilePath
  , argsMapPcap2 :: FilePath
  , argsMapStream :: Word32
  , argsMapVerbose :: Bool
  , argsMapLimit :: Int -- ^Number of comparisons to show
  -- , argsMapMptcp :: Bool -- ^Wether it's an MPTCP
}

-- | Registered commands
-- TODO make it possible to add some from a plugin
data CommandArgs =
    ArgsLoadCsv FilePath Bool
    | ArgsHelp
    | ArgsQuit
    | ArgsLoadPcap FilePath
    | ArgsListTcpConnections Bool  -- ^ Detailed
    | ArgsListMpTcpConnections Bool  -- ^ Detailed
    | ArgsMapTcpConnections CommandMapPcap Bool
    -- ^ Pcap 1 Pcap 2 streamId1 verbose Limit Mptcp
    -- | ArgsMapMptcpConnections FilePath FilePath Word32 Bool Int Bool
    | ArgsListSubflows Bool
    | ArgsListInterfaces
      -- ^ _listSubflowsDetailed
    | ArgsListReinjections (StreamId Mptcp)
    | ArgsTcpSummary Bool (StreamId Tcp)
    | ArgsTcpSummaryFromFile FilePath 
      -- Bool (StreamId Tcp)
    | ArgsMptcpSummary Bool (StreamId Mptcp)
    | ArgsExport FilePath   -- ^ argsExportFilename
    -- | plotOut
    -- Bool Whether we have to display
    -- Bool Whether it's TCP
    | ArgsPlotGeneric PlotSettings ArgsPlots
    | ArgsQualifyReinjections (PcapMapping Mptcp) Bool

-- | Return code for user command. Whether to exit program or keep going
data RetCode = Exit | Error String | Continue

parserPcapMapping :: Bool -> Parser (PcapMapping a)
parserPcapMapping forMptcp =
  -- if forMptcp then
    PcapMapping <$>
  -- else
  --   ArgsMapMptcpConnections <$> toto
  -- where
  -- toto =
      strArgument (
          metavar "PCAP1"
          <> completer completePath
          <> help "File to analyze"
      )
      <*> argument readStreamId (
          metavar "TCP_STREAM"
          <> help "stream id to analyzer"
      )
      <*> strArgument (
          metavar "PCAP2"
          <> completer completePath
          <> help "File to analyze"
      )
      <*> argument readStreamId (
          metavar "TCP_STREAM"
          <> help "stream id to analyzer"
      )