module HNormalise
( normaliseRsyslog
, normaliseJsonInput
, normaliseText
, parseMessage
, Normalised (..)
) where
import Control.Applicative ((<|>))
import Data.Aeson (ToJSON)
import qualified Data.Aeson as Aeson
import Data.Aeson.Text (encodeToLazyText)
import Data.Attoparsec.Combinator (lookAhead, manyTill)
import Data.Attoparsec.Text
import qualified Data.ByteString.Char8 as SBS
import qualified Data.ByteString.Lazy.Char8 as BS
import Data.Text (Text, empty)
import Data.Text.Encoding (encodeUtf8)
import Data.Text.Lazy (toStrict)
import HNormalise.Huppel.Internal
import HNormalise.Huppel.Json
import HNormalise.Internal
import HNormalise.Json
import HNormalise.Lmod.Internal
import HNormalise.Lmod.Json
import HNormalise.Parser
import HNormalise.Torque.Internal
import HNormalise.Torque.Json
data Normalised
= Transformed !SBS.ByteString
| Original !SBS.ByteString
normaliseJsonInput :: SBS.ByteString
-> Normalised
normaliseJsonInput logLine =
case (Aeson.decodeStrict logLine :: Maybe Rsyslog) >>= normaliseRsyslog of
Just j -> Transformed j
Nothing -> Original logLine
normaliseText :: Text
-> Normalised
normaliseText logLine =
case parse parseRsyslogLogstashString logLine of
Done _ r -> Transformed r
Partial c -> case c empty of
Done _ r -> Transformed r
_ -> original
_ -> original
where
original = Original $ encodeUtf8 $ logLine
convertMessage :: Text -> Maybe ParseResult
convertMessage message =
case parse parseMessage message of
Done _ (_, pm) -> Just pm
Partial c -> case c empty of
Done _ (_, pm) -> Just pm
_ -> Nothing
_ -> Nothing
normaliseRsyslog :: Rsyslog
-> Maybe SBS.ByteString
normaliseRsyslog rsyslog = do
cm <- convertMessage $ msg rsyslog
return $ BS.toStrict
$ Aeson.encode
$ NRsyslog { rsyslog = rsyslog, normalised = cm, jsonkey = getJsonKey cm }