{-| Module : Hi3Status.Blocks.Ethernet License : MIT Maintainer : Josh Kirklin (jjvk2@cam.ac.uk) Stability : experimental -} module Hi3Status.Blocks.Ethernet ( EthernetBlock (..) ) where import Hi3Status.Block import Hi3Status.Block.Util import qualified Data.Text as T import Control.Monad.IO.Class import System.Process -- | An ethernet status indicator. Uses files at @/sys/class/net/@. data EthernetBlock = EthernetBlock { -- | The format of the displayed text when connected to a network. connectedFormat :: String, -- | The format of the displayed text when not connected to a network. disconnectedFormat :: String, -- | The color of the text when connected to a network. connectedColor :: Maybe String, -- | The color of the text when not connected to a network. disconnectedColor :: Maybe String, -- | The device to query, e.g. "eth0". device :: String } instance Block EthernetBlock where runBlock b = periodic 5000000 $ do os <- operstate (device b) let (c,text) = if os then (connectedColor b, formatText [] (connectedFormat b)) else (disconnectedColor b, formatText [] (disconnectedFormat b)) pushBlockDescription $ emptyBlockDescription { full_text = text, color = T.pack <$> c} operstate :: String -> BlockM Bool operstate dev = do os <- liftIO $ filter (/='\n') <$> readProcess "cat" ["/sys/class/net/"++dev++"/operstate"] "" return (os == "up")