vflow-types-0.1: src/VFlow/Types/NetFlow9.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeOperators #-}
module VFlow.Types.NetFlow9
( NetFlow(..)
, Header(..)
, DataSetsEltElt(..)
, HexInt(..)
) where
import Control.Monad (mzero)
import Data.Aeson(Value(..), FromJSON(..), ToJSON(..), pairs, (.:), (.=), object)
import Data.Aeson.AutoType.Alternative
import Data.Int (Int64)
import Data.Monoid((<>))
import Net.Types (IPv4)
import Text.Read (readMaybe)
import qualified Data.Scientific as Sci
import qualified Data.Text
import qualified GHC.Generics
newtype HexInt = HexInt Int64
deriving (Eq, Show)
instance FromJSON HexInt where
parseJSON (String s) = case readMaybe (Data.Text.unpack s) of
Nothing -> mzero
Just x -> pure (HexInt x)
parseJSON (Number s) = if Sci.isInteger s
then case Sci.toBoundedInteger s of
Nothing -> mzero
Just x -> pure (HexInt x)
else mzero
parseJSON _ = mzero
instance ToJSON HexInt where
toJSON (HexInt x) = toJSON x
toEncoding (HexInt x) = toEncoding x
data DataSetsEltElt = DataSetsEltElt {
dataSetsEltEltV :: !(IPv4 :|: HexInt),
dataSetsEltEltI :: !Int
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON DataSetsEltElt where
parseJSON (Object v) = DataSetsEltElt <$> v .: "V" <*> v .: "I"
parseJSON _ = mzero
instance ToJSON DataSetsEltElt where
toJSON (DataSetsEltElt {..}) = object ["V" .= dataSetsEltEltV, "I" .= dataSetsEltEltI]
toEncoding (DataSetsEltElt {..}) = pairs ("V" .= dataSetsEltEltV<>"I" .= dataSetsEltEltI)
data Header = Header {
headerUNIXSecs :: !Int,
headerSrcID :: !Int,
headerCount :: !Int,
headerSysUpTime :: !Int,
headerVersion :: !Int,
headerSeqNum :: !Int
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON Header where
parseJSON (Object v) = Header <$> v .: "UNIXSecs" <*> v .: "SrcID" <*> v .: "Count" <*> v .: "SysUpTime" <*> v .: "Version" <*> v .: "SeqNum"
parseJSON _ = mzero
instance ToJSON Header where
toJSON (Header {..}) = object ["UNIXSecs" .= headerUNIXSecs, "SrcID" .= headerSrcID, "Count" .= headerCount, "SysUpTime" .= headerSysUpTime, "Version" .= headerVersion, "SeqNum" .= headerSeqNum]
toEncoding (Header {..}) = pairs ("UNIXSecs" .= headerUNIXSecs<>"SrcID" .= headerSrcID<>"Count" .= headerCount<>"SysUpTime" .= headerSysUpTime<>"Version" .= headerVersion<>"SeqNum" .= headerSeqNum)
data NetFlow = NetFlow {
netflowAgentID :: !IPv4,
netflowHeader :: !Header,
netflowDataSets :: [[DataSetsEltElt]]
} deriving (Show,Eq,GHC.Generics.Generic)
instance FromJSON NetFlow where
parseJSON (Object v) = NetFlow <$> v .: "AgentID" <*> v .: "Header" <*> v .: "DataSets"
parseJSON _ = mzero
instance ToJSON NetFlow where
toJSON (NetFlow {..}) = object ["AgentID" .= netflowAgentID, "Header" .= netflowHeader, "DataSets" .= netflowDataSets]
toEncoding (NetFlow {..}) = pairs ("AgentID" .= netflowAgentID<>"Header" .= netflowHeader<>"DataSets" .= netflowDataSets)