diff options
| -rw-r--r-- | Monitors/Net.hs | 137 | 
1 files changed, 49 insertions, 88 deletions
| diff --git a/Monitors/Net.hs b/Monitors/Net.hs index 7554c56..2c7e2f0 100644 --- a/Monitors/Net.hs +++ b/Monitors/Net.hs @@ -14,82 +14,51 @@  module Main where -import Numeric -import Control.Concurrent -import Text.ParserCombinators.Parsec -import System.Environment - -data Config =  -    Config { intervall :: Int -           , netDevice :: String -           , netNormal :: Integer -           , netNormalColor :: String -           , netCritical :: Integer -           , netCriticalColor :: String -           } - -defaultConfig :: Config -defaultConfig =  -    Config { intervall = 500000 -           , netDevice = "eth1" -           , netNormal = 0 -           , netNormalColor = "#00FF00"  -           , netCritical = 50 -           , netCriticalColor = "#FF0000"  -           } - -config :: Config -config = defaultConfig - --- Utilities - -interSec :: IO () -interSec = threadDelay  (intervall config) - -takeDigits :: Int -> Float -> Float -takeDigits d n =  -    read $ showFFloat (Just d) n "" - -floatToPercent :: Float -> String -floatToPercent n =  -    showFFloat (Just 2) (n*100) "%"  +import Monitors.Common +import Data.IORef +import Text.ParserCombinators.Parsec -run :: Parser [a] -> IO String -> IO [a] -run p input -        = do a <- input -             case (parse p "" a) of -               Left _ -> return [] -               Right x  -> return x +data NetDev = NA +            | ND { netDev :: String +                 , netRx :: Float +                 , netTx :: Float +                 } deriving (Eq,Show,Read) + +interval :: Int +interval = 500000 + +monitorConfig :: IO MConfig +monitorConfig =  +    do lc <- newIORef "#BFBFBF" +       l <- newIORef 0 +       nc <- newIORef "#00FF00" +       h <- newIORef 32 +       hc <- newIORef "#FF0000" +       t <- newIORef "<dev>: <rx>|<tx>" +       p <- newIORef package +       u <- newIORef "dev" +       a <- newIORef [] +       e <- newIORef ["dev", "rx", "tx"] +       return $ MC nc l lc h hc t p u a e  fileNET :: IO String  fileNET =       do f <- readFile "/proc/net/dev"         return $ unlines $ drop 2 $ lines f --- CPU - -getNumbers :: Parser Float -getNumbers = skipMany space >> many1 digit >>= \n -> return $ read n +formatNet :: Float -> Monitor String +formatNet d = +    showWithColors f d +        where f s = show s ++ "Kb" --- Net Devices - -data NetDev = NA -            | ND { netDev :: String -                 , netRx :: Float -                 , netTx :: Float -                 } deriving (Eq,Read) - -instance Show NetDev where -    show NA = "N/A" -    show (ND nd rx tx) = -        nd ++ ": " ++ (formatNet rx) ++ "|" ++ formatNet tx           - -formatNet :: Float -> String -formatNet d | d > fromInteger (netCritical config) = setColor str netCriticalColor  -            | d > fromInteger (netNormal config) = setColor str netNormalColor -            | otherwise = str -            where str = show d ++ "Kb" +printNet :: NetDev -> Monitor String +printNet nd = +    do case nd of +         ND d r t -> do rx <- formatNet r +                        tx <- formatNet t +                        parseTemplate [d,rx,tx] +         NA -> return "N/A"  pNetDev :: Parser NetDev  pNetDev =  @@ -108,35 +77,27 @@ parserNet = manyTill pNetDev eof  parseNET :: String -> IO [NetDev]  parseNET nd =  -    do a <- run parserNet fileNET -       interSec -       b <- run parserNet fileNET -       let netRate f da db = takeDigits 2 $ ((f db) - (f da)) * fromIntegral (1000000 `div` (intervall config)) +    do (a',b') <- doActionTwiceWithDelay interval fileNET +       a <- runP parserNet a' +       b <- runP parserNet b' +       let netRate f da db = takeDigits 2 $ ((f db) - (f da)) * fromIntegral (1000000 `div` interval)             diffRate (da,db) = ND (netDev da)                                 (netRate netRx da db)                                (netRate netTx da db)         return $ filter (\d -> netDev d == nd) $ map diffRate $ zip a b --- Formattings - -setColor :: String -> (Config -> String) -> String -setColor str ty = -    "<fc=" ++ ty config ++ ">" ++ -    str ++ "</fc>" -     -net :: String -> IO String -net nd =  -    do pn <- parseNET nd +runNet :: [String] -> Monitor String +runNet nd =  +    do pn <- io $ parseNET $ head nd         n <- case pn of                [x] -> return x                _ -> return $ NA -       return $ show n +       printNet n + +package :: String +package = "xmb-net"  main :: IO ()  main = -    do args <- getArgs -       n <- -           if length args /= 1 -              then error "No device specified.\nUsage: net dev" -              else net (args!!0) -       putStrLn n +    do let f = return "No device specified" +       runMonitor monitorConfig f runNet | 
