diff options
-rw-r--r-- | Commands.hs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/Commands.hs b/Commands.hs new file mode 100644 index 0000000..5bc02a9 --- /dev/null +++ b/Commands.hs @@ -0,0 +1,65 @@ +module Commands where + +import System.Process +import System.Exit +import System.IO (hClose, hGetLine) + +import Monitors.Common ( runM ) +import Monitors.Weather +import Monitors.Net +import Monitors.Mem +import Monitors.Swap +import Monitors.Cpu +import Monitors.Batt + +data Command = Exec Program Args Alias + | Weather Station Args + | Network Interface Args + | Memory Args + | Swap Args + | Cpu Args + | Battery Args + deriving (Read,Eq) + +type Args = [String] +type Program = String +type Alias = String +type Station = String +type Interface = String + +instance Show Command where + show (Weather s _) = s + show (Network i _) = i + show (Memory _) = "memory" + show (Swap _) = "swap" + show (Cpu _) = "cpu" + show (Battery _) = "battery" + show (Exec p _ a) | p /= "" = if a == "" then p else a + | otherwise = "" +class Exec e where + run :: e -> IO String + +instance Exec Command where + run (Weather s a) = do let af = return "No station ID specified" + runM (a ++ [s]) weatherConfig af runWeather + run (Network i a) = do let f = return "No device specified" + runM (a ++ [i]) netConfig f runNet + run (Memory args) = do let af = runMem [] + runM args memConfig af runMem + run (Swap args) = do let af = runSwap [] + runM args swapConfig af runSwap + run (Cpu args) = do let af = runCpu [] + runM args cpuConfig af runCpu + run (Battery args) = do let af = runBatt [] + runM args battConfig af runBatt + run (Exec prog args _) = do (i,o,e,p) <- runInteractiveCommand (prog ++ concat (map (' ':) args)) + exit <- waitForProcess p + let closeHandles = do hClose o + hClose i + hClose e + case exit of + ExitSuccess -> do str <- hGetLine o + closeHandles + return str + _ -> do closeHandles + return $ "Could not execute command " ++ prog |