module HNormalise.Shorewall.Parser where
import Control.Applicative ((<|>))
import Data.Attoparsec.Combinator (lookAhead, manyTill)
import Data.Attoparsec.Text
import Data.Text (Text)
import HNormalise.Common.Parser
import HNormalise.Shorewall.Internal
parseShorewallTCP :: Parser Shorewall
parseShorewallTCP = do
string "kernel:: Shorewall:"
fwrule <- takeTill (== ':')
fwtarget <- char ':' *> takeTill (== ':')
fwin <- char ':' *> kvTextParser "IN"
fwmac <- skipSpace *> string "OUT=" *> skipSpace *> kvParser >>= return . snd
fwsrc <- skipSpace *> kvHostOrIPParser "SRC"
fwdst <- skipSpace *> kvHostOrIPParser "DST"
manyTill anyChar (lookAhead $ string " PROTO=")
string " PROTO=TCP"
fwspt <- skipSpace *> kvNumParser "SPT"
fwdpt <- skipSpace *> kvNumParser "DPT"
takeText
return $ Shorewall
{ fwrule = fwrule
, fwtarget = fwtarget
, fwin = fwin
, fwout = Nothing
, fwmac = Just fwmac
, fwsrc = fwsrc
, fwdst = fwdst
, fwproto = TCP
, fwspt = Just fwspt
, fwdpt = Just fwdpt
}
parseShorewallUDP :: Parser Shorewall
parseShorewallUDP = do
string "kernel:: Shorewall:"
fwrule <- takeTill (== ':')
fwtarget <- char ':' *> takeTill (== ':')
fwin <- char ':' *> kvTextParser "IN"
fwout <- skipSpace *> kvTextParser "OUT"
fwsrc <- skipSpace *> kvHostOrIPParser "SRC"
fwdst <- skipSpace *> kvHostOrIPParser "DST"
manyTill anyChar (lookAhead $ string "PROTO=")
string "PROTO=UDP"
fwspt <- skipSpace *> kvNumParser "SPT"
fwdpt <- skipSpace *> kvNumParser "DPT"
takeText
return $ Shorewall
{ fwrule = fwrule
, fwtarget = fwtarget
, fwin = fwin
, fwout = Just fwout
, fwmac = Nothing
, fwsrc = fwsrc
, fwdst = fwdst
, fwproto = UDP
, fwspt = Just fwspt
, fwdpt = Just fwdpt
}
parseShorewallICMP :: Parser Shorewall
parseShorewallICMP = do
string "kernel:: Shorewall:"
fwrule <- takeTill (== ':')
fwtarget <- char ':' *> takeTill (== ':')
fwin <- char ':' *> kvTextParser "IN"
fwout <- skipSpace *> kvTextParser "OUT"
fwsrc <- skipSpace *> kvHostOrIPParser "SRC"
fwdst <- skipSpace *> kvHostOrIPParser "DST"
manyTill anyChar (lookAhead $ string " PROTO=")
string " PROTO=ICMP"
takeText
return $ Shorewall
{ fwrule = fwrule
, fwtarget = fwtarget
, fwin = fwin
, fwout = Just fwout
, fwmac = Nothing
, fwsrc = fwsrc
, fwdst = fwdst
, fwproto = ICMP
, fwspt = Nothing
, fwdpt = Nothing
}
parseShorewall :: Parser (Text, Shorewall)
parseShorewall = do
s <- parseShorewallTCP
<|> parseShorewallUDP
<|> parseShorewallICMP
return ("kernel", s)