vflow-types-0.1: src/VFlow/Types/NetFlow5.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DeriveGeneric #-}
module VFlow.Types.NetFlow5
( NetFlow(..)
, FlowsElt(..)
, Header(..)
) where
import Control.Monad (mzero)
import Data.Aeson(Value(..), FromJSON(..), ToJSON(..), pairs, (.:), (.=), object)
import Data.Monoid((<>))
import qualified GHC.Generics
import Net.Types (IPv4)
data FlowsElt = FlowsElt {
flowsEltDstAsNum :: !Int,
flowsEltStartTime :: !Int,
flowsEltL3Octets :: !Int,
flowsEltTCPFlags :: !Int,
flowsEltDstAddr :: !IPv4,
flowsEltTos :: !Int,
flowsEltPadding1 :: !Int,
flowsEltNextHop :: !IPv4,
flowsEltSrcPort :: !Int,
flowsEltInput :: !Int,
flowsEltPktCount :: !Int,
flowsEltOutput :: !Int,
flowsEltDstMask :: !Int,
flowsEltDstPort :: !Int,
flowsEltEndTime :: !Int,
flowsEltPadding2 :: !Int,
flowsEltSrcMask :: !Int,
flowsEltSrcAsNum :: !Int,
flowsEltSrcAddr :: !IPv4,
flowsEltProtType :: !Int
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON FlowsElt where
parseJSON (Object v) = FlowsElt <$> v .: "DstAsNum" <*> v .: "StartTime" <*> v .: "L3Octets" <*> v .: "TCPFlags" <*> v .: "DstAddr" <*> v .: "Tos" <*> v .: "Padding1" <*> v .: "NextHop" <*> v .: "SrcPort" <*> v .: "Input" <*> v .: "PktCount" <*> v .: "Output" <*> v .: "DstMask" <*> v .: "DstPort" <*> v .: "EndTime" <*> v .: "Padding2" <*> v .: "SrcMask" <*> v .: "SrcAsNum" <*> v .: "SrcAddr" <*> v .: "ProtType"
parseJSON _ = mzero
instance ToJSON FlowsElt where
toJSON (FlowsElt {..}) = object ["DstAsNum" .= flowsEltDstAsNum, "StartTime" .= flowsEltStartTime, "L3Octets" .= flowsEltL3Octets, "TCPFlags" .= flowsEltTCPFlags, "DstAddr" .= flowsEltDstAddr, "Tos" .= flowsEltTos, "Padding1" .= flowsEltPadding1, "NextHop" .= flowsEltNextHop, "SrcPort" .= flowsEltSrcPort, "Input" .= flowsEltInput, "PktCount" .= flowsEltPktCount, "Output" .= flowsEltOutput, "DstMask" .= flowsEltDstMask, "DstPort" .= flowsEltDstPort, "EndTime" .= flowsEltEndTime, "Padding2" .= flowsEltPadding2, "SrcMask" .= flowsEltSrcMask, "SrcAsNum" .= flowsEltSrcAsNum, "SrcAddr" .= flowsEltSrcAddr, "ProtType" .= flowsEltProtType]
toEncoding (FlowsElt {..}) = pairs ("DstAsNum" .= flowsEltDstAsNum<>"StartTime" .= flowsEltStartTime<>"L3Octets" .= flowsEltL3Octets<>"TCPFlags" .= flowsEltTCPFlags<>"DstAddr" .= flowsEltDstAddr<>"Tos" .= flowsEltTos<>"Padding1" .= flowsEltPadding1<>"NextHop" .= flowsEltNextHop<>"SrcPort" .= flowsEltSrcPort<>"Input" .= flowsEltInput<>"PktCount" .= flowsEltPktCount<>"Output" .= flowsEltOutput<>"DstMask" .= flowsEltDstMask<>"DstPort" .= flowsEltDstPort<>"EndTime" .= flowsEltEndTime<>"Padding2" .= flowsEltPadding2<>"SrcMask" .= flowsEltSrcMask<>"SrcAsNum" .= flowsEltSrcAsNum<>"SrcAddr" .= flowsEltSrcAddr<>"ProtType" .= flowsEltProtType)
data Header = Header {
headerUNIXSecs :: !Int,
headerCount :: !Int,
headerEngType :: !Int,
headerVersion :: !Int,
headerSysUpTimeMSecs :: !Int,
headerUNIXNSecs :: !Int,
headerSmpInt :: !Int,
headerSeqNum :: !Int,
headerEngID :: !Int
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON Header where
parseJSON (Object v) = Header <$> v .: "UNIXSecs" <*> v .: "Count" <*> v .: "EngType" <*> v .: "Version" <*> v .: "SysUpTimeMSecs" <*> v .: "UNIXNSecs" <*> v .: "SmpInt" <*> v .: "SeqNum" <*> v .: "EngID"
parseJSON _ = mzero
instance ToJSON Header where
toJSON (Header {..}) = object ["UNIXSecs" .= headerUNIXSecs, "Count" .= headerCount, "EngType" .= headerEngType, "Version" .= headerVersion, "SysUpTimeMSecs" .= headerSysUpTimeMSecs, "UNIXNSecs" .= headerUNIXNSecs, "SmpInt" .= headerSmpInt, "SeqNum" .= headerSeqNum, "EngID" .= headerEngID]
toEncoding (Header {..}) = pairs ("UNIXSecs" .= headerUNIXSecs<>"Count" .= headerCount<>"EngType" .= headerEngType<>"Version" .= headerVersion<>"SysUpTimeMSecs" .= headerSysUpTimeMSecs<>"UNIXNSecs" .= headerUNIXNSecs<>"SmpInt" .= headerSmpInt<>"SeqNum" .= headerSeqNum<>"EngID" .= headerEngID)
data NetFlow = NetFlow {
netflowAgentID :: !IPv4,
netflowHeader :: !Header,
netflowFlows :: [FlowsElt]
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON NetFlow where
parseJSON (Object v) = NetFlow <$> v .: "AgentID" <*> v .: "Header" <*> v .: "Flows"
parseJSON _ = mzero
instance ToJSON NetFlow where
toJSON (NetFlow {..}) = object ["AgentID" .= netflowAgentID, "Header" .= netflowHeader, "Flows" .= netflowFlows]
toEncoding (NetFlow {..}) = pairs ("AgentID" .= netflowAgentID<>"Header" .= netflowHeader<>"Flows" .= netflowFlows)