module Hi3Status.Blocks.Network
( NetworkBlock (..)
) where
import Hi3Status.Block
import Hi3Status.Block.Util
import qualified Data.Text as T
import Data.Prefix.Units
import Control.Monad.IO.Class
import Control.Concurrent
import System.Process
data NetworkBlock = NetworkBlock {
format :: String,
device :: String,
checkPeriod :: Int
}
instance Block NetworkBlock where
runBlock b = do
(rx,tx) <- rxtx (device b)
go rx tx
where
go rx tx = do
(rx',tx') <- rxtx (device b)
let rr = 1000000 * (realToFrac $ rx'rx) / (realToFrac $ checkPeriod b) :: Double
tr = 1000000 * (realToFrac $ tx'tx) / (realToFrac $ checkPeriod b) :: Double
rs = showValue FormatSiKMGT (round rr :: Int)
ts = showValue FormatSiKMGT (round tr :: Int)
pushBlockDescription $ emptyBlockDescription { full_text = formatText [("rx",rs),("tx",ts)] (format b) }
liftIO $ threadDelay (checkPeriod b)
go rx' tx'
rxtx :: String -> BlockM (Int, Int)
rxtx dev = do
rx <- liftIO $ filter (/='\n') <$> readProcess "cat" ["/sys/class/net/"++dev++"/statistics/rx_bytes"] ""
tx <- liftIO $ filter (/='\n') <$> readProcess "cat" ["/sys/class/net/"++dev++"/statistics/tx_bytes"] ""
return (read rx, read tx)