summaryrefslogtreecommitdiffhomepage
path: root/Plugins/Monitors/CoreCommon.hs
blob: 9a19cd5b4fa74401878274863f4516152fbf963a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
-----------------------------------------------------------------------------
-- |
-- Module      :  Plugins.Monitors.CoreCommon
-- Copyright   :  (c) Juraj Hercek
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Juraj Hercek <juhe_haskell@hck.sk>
-- Stability   :  unstable
-- Portability :  unportable
--
-- The common part for cpu core monitors (e.g. cpufreq, coretemp)
--
-----------------------------------------------------------------------------

module Plugins.Monitors.CoreCommon where

import Plugins.Monitors.Common
import System.Posix.Files (fileExist)
import System.Directory

-- |
-- Function checks the existence of first file specified by pattern and if the
-- file doesn't exists failure message is shown, otherwise the data retrieval
-- is performed.
checkedDataRetrieval :: String -> String -> String -> String -> Double -> Monitor String
checkedDataRetrieval failureMessage dir file pattern divisor = do
    exists <- io $ fileExist $ foldl (++) dir ["/", pattern, "0/", file]
    case exists of
         False  -> return failureMessage
         True   -> retrieveData dir file pattern divisor

-- |
-- Function retrieves data from files in directory dir specified by pattern.
-- String values are converted to double and adjusted with divisor. Final array
-- is processed by template parser function and returned as monitor string.
retrieveData :: String -> String -> String -> Double -> Monitor String
retrieveData dir file pattern divisor = do
    count <- io $ dirCount dir pattern
    contents <- io $ mapM readFile $ files count
    values <- mapM (showWithColors show) $ map conversion contents
    parseTemplate values
    where
        dirCount path str = getDirectoryContents path
                            >>= return . length
                                       . filter ((str ==) . take (length str))
        files count = [ foldl (++) dir [ "/", pattern, show i, "/", file ]
                      | i <- [0 .. count - 1] ]
        conversion = flip (/) divisor . (read :: String -> Double)