agentx-0.1.0.3: src/Main.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
module Main where
import Network.Protocol.Snmp.AgentX
import qualified Data.ByteString as BS
import Data.ByteString (ByteString)
import Data.Fixed (div')
import Data.Time.Clock.POSIX (getPOSIXTime)
import Control.Applicative ((<$>))
import Control.Monad.State
import Data.IORef
str :: ByteString -> PVal
str x = rsValue (String x)
now :: PVal
now = rdValue $ TimeTicks . flip div' 1 <$> liftIO getPOSIXTime
rws :: IORef Value -> PVal
rws io = rwValue readV commit test undo
where
test (String x)
| BS.length x < 10 = return NoTestError
| otherwise = return TooBig
test _ = return WrongType
commit v = do
writeIORef io v
return NoCommitError
undo _ = return NoUndoError
readV = readIORef io
rwi :: IORef Value -> PVal
rwi io = rwValue readV commit test undo
where
test (Integer x)
| x < 5 = return NoTestError
| otherwise = return TooBig
test _ = return WrongType
commit v = do
writeIORef io v
return NoCommitError
undo _ = return NoUndoError
readV = readIORef io
dynTree :: IORef Value -> Update
dynTree i = Update $ do
Integer count <- liftIO $ readIORef i
return $ concatMap fun [0 .. count]
where
fun x = [ mkObject (fromIntegral x) "trees" ("tree" ++ show x) Nothing
, mkObjectType 0 ("tree" ++ show x) "abr" Nothing (str "abr")
, mkObjectType 1 ("tree" ++ show x) "abrvalg" Nothing (str "abrvalg")
]
ver :: Maybe Context
ver = Just "version"
simpleTree :: IORef Value -> IORef Value -> [MIB]
simpleTree m i =
[ mkObject 0 "Fixmon" "about" Nothing
, mkObjectType 0 "about" "name" Nothing $ rsValue (String "Fixmon agent")
, mkObjectType 1 "about" "version" Nothing $ rsValue (String "0.0.1")
, mkObjectType 1 "about" "version" ver $ rsValue (String "Alpha")
, mkObjectType 2 "about" "comment" Nothing (rws m)
, mkObject 1 "Fixmon" "dyn" Nothing
, mkObjectType 0 "dyn" "counter" Nothing (rwi i)
, mkObject 1 "dyn" "trees" (Just $ dynTree i)
]
tree :: IO [MIB]
tree = do
m <- newIORef (String "init")
i <- newIORef (Integer 0)
return $ simpleTree m i
main :: IO ()
main = agent "/var/agentx/master" [1,3,6,1,4,1,44729] Nothing =<< tree