summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Commands.hs65
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