From 431b8eaffd865593bed4e1db1843452a1f1fe64c Mon Sep 17 00:00:00 2001 From: Reto Habluetzel Date: Tue, 4 Sep 2012 07:10:26 +0200 Subject: automatic detection of devices using /sys/class/net directory --- src/Plugins/Monitors.hs | 6 +++--- src/Plugins/Monitors/Net.hs | 34 +++++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/Plugins/Monitors.hs b/src/Plugins/Monitors.hs index bea91eb..009da68 100644 --- a/src/Plugins/Monitors.hs +++ b/src/Plugins/Monitors.hs @@ -50,7 +50,7 @@ import Plugins.Monitors.Mpris data Monitors = Weather Station Args Rate | Network Interface Args Rate - | DynNetwork [Interface] Args Rate + | DynNetwork Args Rate | BatteryP [String] Args Rate | DiskU DiskSpec Args Rate | DiskIO DiskSpec Args Rate @@ -96,7 +96,7 @@ type DiskSpec = [(String, String)] instance Exec Monitors where alias (Weather s _ _) = s alias (Network i _ _) = i - alias (DynNetwork _ _ _) = "dynnetwork" + alias (DynNetwork _ _) = "dynnetwork" alias (Thermal z _ _) = z alias (ThermalZone z _ _) = "thermal" ++ show z alias (Memory _ _) = "memory" @@ -128,7 +128,7 @@ instance Exec Monitors where alias (Mpris2 _ _ _) = "mpris2" #endif start (Network i a r) = startNet i a r - start (DynNetwork is a r) = startDynNet is a r + start (DynNetwork a r) = startDynNet a r start (Cpu a r) = startCpu a r start (MultiCpu a r) = startMultiCpu a r start (TopProc a r) = startTop a r diff --git a/src/Plugins/Monitors/Net.hs b/src/Plugins/Monitors/Net.hs index 10ca9cc..8234670 100644 --- a/src/Plugins/Monitors/Net.hs +++ b/src/Plugins/Monitors/Net.hs @@ -22,7 +22,9 @@ import Plugins.Monitors.Common import Data.IORef (IORef, newIORef, readIORef, writeIORef) import Data.Time.Clock (UTCTime, getCurrentTime, diffUTCTime) -import Control.Monad (forM) +import Control.Monad (forM, filterM) +import System.Directory (getDirectoryContents, doesFileExist) +import System.FilePath (()) import qualified Data.ByteString.Lazy.Char8 as B @@ -32,10 +34,9 @@ data NetDev = NA type NetDevRef = IORef (NetDev, UTCTime) -{- The more information available, the better. - - Note that names don't matter. Therefore, if only the names differ, - - a compare evaluates to EQ while (==) evaluates to False. - -} +-- The more information available, the better. +-- Note that names don't matter. Therefore, if only the names differ, +-- a compare evaluates to EQ while (==) evaluates to False. instance Ord NetDev where compare NA NA = EQ compare NA _ = LT @@ -54,9 +55,18 @@ netConfig = mkMConfig ": KB|KB" -- template ["dev", "rx", "tx", "rxbar", "txbar"] -- available replacements +operstateDir :: String -> FilePath +operstateDir d = "/sys/class/net" d "operstate" + +existingDevs :: IO [String] +existingDevs = getDirectoryContents "/sys/class/net" >>= filterM isDev + where isDev d | d `elem` excludes = return False + | otherwise = doesFileExist (operstateDir d) + excludes = [".", "..", "lo"] + isUp :: String -> IO Bool isUp d = do - operstate <- B.readFile $ "/sys/class/net/" ++ d ++ "/operstate" + operstate <- B.readFile (operstateDir d) return $ "up" == (B.unpack . head . B.lines) operstate readNetDev :: [String] -> IO NetDev @@ -139,13 +149,15 @@ startNet i a r cb = do _ <- parseNet nref i runM a netConfig (runNet nref i) r cb -startDynNet :: [String] -> [String] -> Int -> (String -> IO ()) -> IO () -startDynNet is a r cb = do - refs <- forM is $ \i -> do +startDynNet :: [String] -> Int -> (String -> IO ()) -> IO () +startDynNet a r cb = do + devs <- existingDevs + refs <- forM devs $ \d -> do t <- getCurrentTime nref <- newIORef (NA, t) - _ <- parseNet nref i - return (nref, i) + _ <- parseNet nref d + return (nref, d) runM a netConfig (runNets refs) r cb -- TODO: Prelude.head: empty list +-- TODO: remember last active interface. -- cgit v1.2.3