aboutsummaryrefslogtreecommitdiff
path: root/widgets/raid.lua
blob: eafb11897aabf59c242feb530e7c0e6aaaabe147 (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
50
51
52
53
54
55
56
57
58
59
60
-----------------------------------------------------
-- Licensed under the GNU General Public License v2
--  * (c) 2010, Hagen Schink <troja84@googlemail.com>
-----------------------------------------------------

-- {{{ Grab environment
local io = { open = io.open }
local setmetatable = setmetatable
local string = {
    len = string.len,
    sub = string.sub,
    match = string.match,
    gmatch = string.gmatch
}
-- }}}


-- Raid: provides state information for a requested RAID array
-- vicious.widgets.raid
local raid = {}


-- Initialize function tables
local mddev = {}

-- {{{ RAID widget type
local function worker(format, warg)
    if not warg then return end
    mddev[warg] = {
        ["found"]    = false,
        ["active"]   = 0,
        ["assigned"] = 0
    }

    -- Linux manual page: md(4)
    local f = io.open("/proc/mdstat")
    for line in f:lines() do
        if mddev[warg]["found"] then
            local updev = string.match(line, "%[[_U]+%]")

            for i in string.gmatch(updev, "U") do
                mddev[warg]["active"] = mddev[warg]["active"] + 1
            end

            break
        elseif string.sub(line, 1, string.len(warg)) == warg then
            mddev[warg]["found"] = true

            for i in string.gmatch(line, "%[[%d]%]") do
                mddev[warg]["assigned"] = mddev[warg]["assigned"] + 1
            end
        end
    end
    f:close()

    return {mddev[warg]["assigned"], mddev[warg]["active"]}
end
-- }}}

return setmetatable(raid, { __call = function(_, ...) return worker(...) end })