import psensor trunk from private svn
[psensor.git] / www / monitor.lua
1 --
2 -- Convenient functions for HTML output
3 -- 
4
5 function td(content)
6    return "<td>" .. content .. "</td>"
7 end
8
9 function th(style, content)
10    if style then
11       return "<th class='"..style.."'>"..content.."</th>"
12    else
13       return "<th>"..content.."</th>"
14    end
15 end
16
17 function tr(style,...)
18    if style then
19       ret = "<tr class='"..style.."'>"
20    else 
21       ret = "<tr>"
22    end
23
24    for i,s in ipairs(arg) do
25       ret = ret .. s
26    end
27
28    ret = ret .. "</tr>\n"
29
30    return ret
31 end
32
33 function h2(str) 
34    return "<h2>"..str.."</h2>\n"
35 end
36
37
38 -- Formats sensor information to HTML 'tr'
39 function sensor_to_tr(id,sensor)
40    return tr(nil,
41              td(sensor["name"]),
42              td(sensor["measure_last"]),
43              td(sensor["measure_min"]),
44              td(sensor["measure_max"]))
45 end
46
47
48 -- Formats number of bytes to string
49 function format_mem_size(bytes)
50    if (bytes == 0) then
51       return "0"
52    end
53
54    if (bytes < 1024) then
55       return bytes .. " o";
56    end
57
58    mo_bytes = 1024 * 1024;
59
60    if (bytes < mo_bytes) then
61       return math.ceil(bytes / 1024) .. " Ko"
62    end
63
64    go_bytes = 1024 * mo_bytes;
65
66    if (bytes < go_bytes) then
67       return math.ceil(bytes / mo_bytes) .. " Mo"
68    end
69
70    return math.ceil(bytes / go_bytes) .. " Go"
71 end
72
73 -- Formats uptime to string
74 function format_uptime(uptime)
75    uptime_s = sysinfo["uptime"]%60
76    uptime_mn = math.floor( (sysinfo["uptime"] / 60) % 60)
77    uptime_h = math.floor( (sysinfo["uptime"] / (60*60)) % 24)
78    uptime_d = math.floor(sysinfo["uptime"] / (60*60*24))
79
80    return uptime_d .. "d " ..
81       uptime_h .. "h " ..
82       string.format("%02.d",uptime_mn) .. "mn " ..
83       string.format("%02d",uptime_s) .. "s"
84 end
85
86 str = "<html><head><link rel='stylesheet' type='text/css' href='/style.css' /></head><body><h1>Psensor Monitoring Server</h1>"
87
88 if sysinfo then
89
90 --
91 -- Uptime
92 --
93
94    str = str .. "<p><strong>Uptime</strong>: " .. format_uptime(sysinfo["uptime"]) .. "</p>"
95
96 --
97 -- CPU
98 --
99
100    str = str .. h2("CPU")
101
102    str = str .. "<table>"
103       .. tr("title",
104             th(nil,"Current usage"),
105             th(nil,"Load 1mn"),
106             th(nil,"Load 5mn"),
107             th(nil,"Load 15mn"))
108
109    str = str .. "<tr>"
110
111    if sysinfo["load"] then
112       str = str .. td(math.ceil(100*sysinfo["load"]) .. "%")
113    else
114       str = str .. td("N/A")
115    end
116
117    str = str  .. td(string.format("%.2f",sysinfo["load_1mn"])) ..
118    td(string.format("%.2f",sysinfo["load_5mn"])) ..
119    td(string.format("%.2f",sysinfo["load_15mn"])) ..
120    "</tr>" ..
121    "</table>"
122
123 --
124 -- Memory
125 --
126
127    totalram = format_mem_size(sysinfo["totalram"] * sysinfo["mem_unit"])
128    freeram = format_mem_size(sysinfo["freeram"] * sysinfo["mem_unit"])
129    sharedram = format_mem_size(sysinfo["sharedram"] * sysinfo["mem_unit"])
130    bufferram = format_mem_size(sysinfo["bufferram"] * sysinfo["mem_unit"])
131    usedram = format_mem_size(sysinfo["totalram"] - sysinfo["freeram"])
132
133    totalswap = format_mem_size(sysinfo["totalswap"] * sysinfo["mem_unit"])
134    freeswap = format_mem_size(sysinfo["freeswap"] * sysinfo["mem_unit"])
135    usedswap = format_mem_size(sysinfo["totalswap"] - sysinfo["freeswap"])
136
137    str = str 
138       .. h2("Memory")
139
140       .. "<table>"
141
142       .. tr("title",
143             th(nil,""),
144             th(nil,"Total"),
145             th(nil,"Used"),
146             th(nil,"Free"),
147             th(nil,"Shared"),
148             th(nil,"Buffer"))
149
150       .. tr(nil,
151             th(nil,"Memory"),
152             td(totalram),
153             td(usedram),
154             td(freeram),
155             td(sharedram),
156             td(bufferram))
157    
158        .. tr(nil,
159              th(nil,"Swap"),
160              td(totalswap),
161              td(usedswap),
162              td(freeswap))
163     
164        .. "</table>"
165                                    
166 end
167
168 --
169 -- Sensors
170 -- 
171
172 if sensors then
173
174    str = str .. "<h2>Sensors</h2>"
175       .. "<table>"
176       .. "<tr class='title'><th>Name</th><th>Value</th><th>Min</th><th>Max</th></tr>"
177
178    for i,sensor in ipairs(sensors) do 
179       str = str .. sensor_to_tr(i,sensor) 
180    end
181    
182    str = str .. "</table><hr /><a href='http://wpitchoune.net/psensor'>psensor-server</a></body></html>"
183
184 end
185
186
187 return str
188