#! /usr/bin/env runhaskell import Data.Time (getZonedTime) import Text.Printf (printf) import System.Process (runInteractiveCommand) import Data.List import System.IO (hGetContents) getOutput :: String -> IO String getOutput cmd = do (_, out, _, _) <- runInteractiveCommand cmd hGetContents out memParse :: String -> String memParse file = let content = map words $ take 4 $ lines file [total, free, buffer, cache] = map (\line -> (read $ line !! 1 :: Float) / 1024) content rest = free + buffer + cache used = total - rest usedratio = used * 100 / total realused = if usedratio > 50 then "^#FF0000"++show used++"^#FFFFFF" else "^#FF00FF"++show used++"^#FFFFFF" in printf "MEM: %sM %.1f%% used %.0fM rest" realused usedratio rest mem :: IO String mem = do file <- readFile "/proc/meminfo" return $ memParse file time :: IO String time = do now <- getZonedTime return $ take 16 $ show now temp :: IO String temp = do file <- readFile "/proc/acpi/thermal_zone/THRM/temperature" let t = (words file) !! 1 f t | read t > 60 = "^#FF0000"++t++"^#FFFFFF" | otherwise = "^#00FF00"++t++"^#FFFFFF" return $ "TEMP: " ++ (f t) ++ "C" takeTail :: Int -> [a] -> [a] takeTail n xs = let len = length xs in drop (len-n) xs load :: IO String load = do content <- getOutput "uptime" let l = map (delete ',') $ takeTail 3 $ words content return $ unwords $ "LOAD:" : l sep :: IO String sep = return " " main = do putStr "" mapM_ (>>=putStr) $ intersperse sep [load, temp, mem, time] putChar '\n'