himpy-0.5.0: System/Himpy/Config.hs
{-# LANGUAGE OverloadedStrings #-}
module System.Himpy.Config (configure) where
import System.Himpy.Types
import Data.Aeson
import System.IO (readFile)
import Data.Text (unpack, Text)
import Data.Attoparsec.Number as AN
import qualified Data.Vector as V
import qualified Data.HashMap.Strict as HM
import qualified Data.Map as M
import qualified Data.ByteString.Lazy as BL
get_rcp :: (String,[String]) -> HimpyRecipe
get_rcp ("storage",_) = StorageRecipe
get_rcp ("network", _) = NetworkRecipe
get_rcp ("load", _) = LoadRecipe
get_rcp ("juniper", _) = JuniperRecipe
get_rcp ("winservices", services) = WinSrvRecipe services
to_str (String t) = unpack t
clean_rcp :: (Text, Value) -> (String, [String])
clean_rcp (k, (Array strs)) = (unpack k, V.toList $ V.map to_str strs)
get_host_conf :: Value -> HimpyHost
get_host_conf (Object h) = (Host (unpack host) (unpack comm) rcps) where
(String host) = h HM.! "host"
(String comm) = h HM.! "community"
(Object raw_rcps) = h HM.! "recipes"
rcps = map (get_rcp . clean_rcp) $ HM.toList raw_rcps
get_host :: Object -> String
get_host conf = case HM.lookup "host" conf of
Nothing -> "127.0.0.1"
Just (String x) -> unpack x
get_log :: Object -> String
get_log conf = case HM.lookup "logfile" conf of
Nothing -> "/var/log/himpy.log"
Just (String x) -> unpack x
get_port :: Object -> Integer
get_port conf = case HM.lookup "port" conf of
Nothing -> 5555
Just (String x) -> (read (unpack x) :: Integer)
get_hosts conf = case HM.lookup "hosts" conf of
Nothing -> []
Just (Array hosts) -> V.toList $ V.map get_host_conf hosts
get_warn :: Object -> Maybe Double
get_warn t = case HM.lookup "warning" t of
Nothing -> Nothing
Just (String w) -> Just (read (unpack w) :: Double)
get_threshold :: Value -> Threshold
get_threshold (Object t) = Threshold {tHost = host, tService = service, tWarning =
warning, tCritical = critical} where
(String t_host) = t HM.! "host"
(String t_service) = t HM.! "service"
(String t_critical) = t HM.! "critical"
host = unpack t_host
service = unpack t_service
warning = get_warn t
critical = (read (unpack t_critical) :: Double)
get_thresholds conf = case HM.lookup "thresholds" conf of
Nothing -> []
Just (Array thresholds) -> V.toList $ V.map get_threshold thresholds
get_interval :: Object -> Integer
get_interval conf = case HM.lookup "interval" conf of
Nothing -> 60
Just (String x) -> (read (unpack x) :: Integer)
get_ttl :: Object -> Float
get_ttl conf = case HM.lookup "ttl" conf of
Nothing -> 125.0
Just (String x) -> (read (unpack x) :: Float)
from_json :: Object -> HimpyConfig
from_json conf =
(Hosts (get_interval conf) (get_ttl conf)
(get_host conf) (get_port conf) (get_log conf)
(get_hosts conf) (get_thresholds conf))
configure path = do
content <- BL.readFile path
let Just json_config = decode content :: Maybe Object
let conf = from_json json_config
return conf