From b683b474fa5b8cbb29704f88f7a43f8084dd8070 Mon Sep 17 00:00:00 2001
From: John Soros <johnny@r0x0r.me>
Date: Thu, 11 Oct 2012 15:01:10 +0200
Subject: Second try at fixing #73 and #74: enable io monitoring for
 non-mounted disks

---
 src/Plugins/Monitors/Disk.hs | 36 ++++++++++++++++--------------------
 1 file changed, 16 insertions(+), 20 deletions(-)

(limited to 'src')

diff --git a/src/Plugins/Monitors/Disk.hs b/src/Plugins/Monitors/Disk.hs
index d52dce2..3c8ea04 100644
--- a/src/Plugins/Monitors/Disk.hs
+++ b/src/Plugins/Monitors/Disk.hs
@@ -39,31 +39,27 @@ type DevDataRef = IORef [(DevName, [Float])]
 
 mountedDevices :: [String] -> IO [(DevName, Path)]
 mountedDevices req = do
-  s <- B.readFile "/etc/mtab"
-  parse `fmap` mapM canon (devs s)
+  sm <- B.readFile "/etc/mtab"
+  sd <- B.readFile "/proc/diskstats"
+  parse `fmap` mapM canon (devs [sm, sd])
   where
     canon (d, p) = do {d' <- canonicalizePath d; return (d', p)}
-    devs =  filter isDev . map (firstTwo . B.words) . B.lines
+    devs fs = concatMap devs' fs
+              where
+                devs' f = case (devsm f) of
+                               [] -> devsd f
+                               d  -> d
+                firstTwo (a:b:_) = (B.unpack a, B.unpack b)
+                firstTwo _ = ("", "")
+                third (_:_:c:_) = ("/dev/"++(B.unpack c), B.unpack c)
+                third _ = ("", "")
+                devsm = filter isDev . map (firstTwo . B.words) . B.lines
+                devsd = filter isDev . map (third . B.words) . B.lines
     parse = map undev . filter isReq
-    firstTwo (a:b:_) = (B.unpack a, B.unpack b)
-    firstTwo _ = ("", "")
     isDev (d, _) = "/dev/" `isPrefixOf` d
     isReq (d, p) = p `elem` req || drop 5 d `elem` req
     undev (d, f) = (drop 5 d, f)
 
-availDevices :: [String] -> IO [(DevName, Path)]
-availDevices req = do
-  s <- B.readFile "/proc/diskstats"
-  parse `fmap` mapM canon (devs s)
-  where
-    canon (d, p) = do {d' <- canonicalizePath ("/dev/"++d); return (d', p)}
-    devs =  map (third . B.words) . B.lines
-    parse = map undev . filter isReq
-    third (_:_:c:_) = (B.unpack c, B.unpack c)
-    third _ = ("", "")
-    isReq (d, p) = p `elem` req || drop 5 d `elem` req
-    undev (d, f) = (drop 5 d, f)
-
 
 diskData :: IO [(DevName, [Float])]
 diskData = do
@@ -123,7 +119,7 @@ runDiskIO' (tmp, xs) = do
 
 runDiskIO :: DevDataRef -> [(String, String)] -> [String] -> Monitor String
 runDiskIO dref disks _ = do
-  mounted <- io $ availDevices (map fst disks)
+  mounted <- io $ mountedDevices (map fst disks)
   dat <- io $ mountedData dref (map fst mounted)
   strs <- mapM runDiskIO' $ devTemplates disks mounted dat
   return $ unwords strs
@@ -131,7 +127,7 @@ runDiskIO dref disks _ = do
 startDiskIO :: [(String, String)] ->
                [String] -> Int -> (String -> IO ()) -> IO ()
 startDiskIO disks args rate cb = do
-  mounted <- availDevices (map fst disks)
+  mounted <- mountedDevices (map fst disks)
   dref <- newIORef (map (\d -> (fst d, repeat 0)) mounted)
   _ <- mountedData dref (map fst mounted)
   runM args diskIOConfig (runDiskIO dref disks) rate cb
-- 
cgit v1.2.3