1 # -*- coding: utf-8 -*-
2 from twisted.web import resource, http
5 from Sensors import sensors
7 from Components.config import configfile, config
12 ########################################################
13 class FC2web(resource.Resource):
15 title = "FanControl2 Webinterface"
18 def render(self, req):
19 req.setHeader('Content-type', 'text/html')
20 req.setHeader('charset', 'UTF-8')
22 """ rendering server response """
23 command = req.args.get("cmd",None)
27 html += "<meta http-equiv=\"Content-Language\" content=\"de\">\n"
28 html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">\n"
29 html += "<meta http-equiv=\"cache-control\" content=\"no-cache\" />\n"
30 html += "<meta http-equiv=\"pragma\" content=\"no-cache\" />\n"
31 html += "<meta http-equiv=\"expires\" content=\"0\">\n"
32 html += "<meta http-equiv=\"refresh\" content=\"20\">\n"
33 html += "<title>Fan Control 2 - Info</title>\n"
35 html += "<body bgcolor=\"#666666\" text=\"#FFFFFF\">\n"
36 html += "<form method=\"POST\" action=\"--WEBBOT-SELF--\">\n"
37 html += "<table border=\"1\" width=\"500\" bordercolorlight=\"#000000\" bordercolordark=\"#000000\" cellspacing=\"1\"><tr><td bgcolor=\"#000000\" width=\"200\">\n"
38 html += "<p align=\"center\"><img border=\"0\" src=\"/fancontrol/FC2dreambox.png\" width=\"181\" height=\"10\">\n"
39 html += "<font color=\"#FFFFFF\"><BR><b>Fan Control 2 - Info</b></font></p>\n"
40 html += "</td><td bgcolor=\"#000000\">\n"
41 html += "<p align=\"right\">"
43 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
44 html += "<a href=\"/fancontrol/chart\"><img border=\"0\" src=\"/fancontrol/FC2Chart.png\" width=\"100\" height=\"40\"></a>\n"
45 html += "<a href=\"/fancontrol/log\"><img border=\"0\" src=\"/fancontrol/FC2Setup.png\" width=\"100\" height=\"40\"></a></td></tr></table>\n"
46 html += "<table border=\"1\" width=\"500\" id=\"table1\">\n"
48 html += "<td>%s: <b><font color=\"#FFCC00\">%4.1f °C</font></b></td>\n" % (_("Temperature"),FC2werte[0])
49 html += "<td>%s: <font color=\"#FFCC00\"><b>%4d rpm</b></font></td>\n" % (_("Speed"),FC2werte[1])
50 html += "<td>%s: <font color=\"#FFCC00\"><b>%03d</b></font></td>\n" % (_("Voltage"),FC2werte[2])
51 html += "<td>PWM: <font color=\"#FFCC00\"><b>%03d</b></font></td>\n" % FC2werte[3]
55 html += "<table border=\"1\" width=\"500\">\n"
57 html += "<td>%s °C</td>\n" % _("Sensors")
58 templist = sensors.getSensorsList(sensors.TYPE_TEMPERATURE)
59 tempcount = len(templist)
60 for count in range(tempcount):
61 html += "<td><font color=\"#FFCC00\">%d</font></td>" % sensors.getSensorValue(count)
63 html += "<td><font size=\"1\">HDD </font><font color=\"#FFCC00\">%d</font></td>\n" % FC2werte[4]
67 html += "<table border=\"1\" width=\"500\">\n"
69 for count in range(0,12):
70 tmp = ("<BR>-" if FC2stunde[count] == "-" else FC2stunde[count])
71 html +="<td><p align=\"center\"><font size=\"1\">%02d:00<br><font color=\"#FFCC00\">%s</font></font></td>\n" % (count,tmp)
73 for count in range(12,24):
74 tmp = ("<BR>-" if FC2stunde[count] == "-" else FC2stunde[count])
75 html +="<td><p align=\"center\"><font size=\"1\">%02d:00<br><font color=\"#FFCC00\">%s</font></font></td>\n" % (count,tmp)
76 html += "</tr></table>\n"
78 html += "<script type=\"text/javascript\">\n"
79 html += "function doLogWrite() {\n"
80 html += "var iFrameWin = window.myIFrameName;\n"
81 html += "iFrameWin.document.write('<html><head><title>FC2 Log Window</title></head><body bgcolor=\"#D3D3D3\">');\n"
82 html += "iFrameWin.document.write('<font size=\"-1\">');\n"
84 html += "iFrameWin.document.write('" + L + "<br>');\n"
85 html += "iFrameWin.document.write('</font>');\n"
86 html += "iFrameWin.document.write('</body></html>');\n"
87 html += "iFrameWin.document.close();\n"
90 html += "<iframe id=\"myIFrameId\" name=\"myIFrameName\" width=\"500\" height=\"320\" marginwidth=\"5\" vspace=\"2\" marginheight=\"5\" frameborder=\"1\" scrolling=\"auto\"></iframe>\n"
91 html += "<script>doLogWrite();\n"
92 html += "myIFrameName.document.body.scrollTop = myIFrameName.document.body.scrollHeight*100;\n"
95 html += "<table border=\"1\" width=\"500\">\n"
97 html += "<td>Version: %s </td>\n" % Version
98 html += "<td>Settings: %s-%s °C</td>\n" % (config.plugins.FanControl.temp.value,config.plugins.FanControl.tempmax.value)
99 html += "<td>%s-%s rpm</td>\n" % (config.plugins.FanControl.minRPM.value,config.plugins.FanControl.maxRPM.value)
109 ##########################################################
110 class FC2webLog(resource.Resource):
112 title = "FanControl2 Webinterface"
115 def render(self, req):
116 command = req.args.get("cmd",None)
119 req.setHeader('Content-type', 'text/html')
120 req.setHeader('charset', 'UTF-8')
122 """ rendering server response """
126 html += "<meta http-equiv=\"Content-Language\" content=\"de\">"
127 html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">"
128 html += "<meta http-equiv=\"cache-control\" content=\"no-cache\" />"
129 html += "<meta http-equiv=\"pragma\" content=\"no-cache\" />"
130 html += "<meta http-equiv=\"expires\" content=\"0\">"
131 html += "<meta http-equiv=\"refresh\" content=\"30\">"
132 html += "<title>Fan Control 2 - Logging</title>"
134 html += "<body bgcolor=\"#666666\" text=\"#FFFFFF\">\n"
135 html += "<table border=\"1\" width=\"500\" bordercolorlight=\"#000000\" bordercolordark=\"#000000\" cellspacing=\"1\"><tr><td bgcolor=\"#000000\" width=\"200\">\n"
136 html += "<p align=\"center\"><img border=\"0\" src=\"/fancontrol/FC2dreambox.png\" width=\"181\" height=\"10\">\n"
137 html += "<font color=\"#FFFFFF\"><BR><b>Fan Control 2 - Logging</b></font></p>\n"
138 html += "</td><td bgcolor=\"#000000\">\n"
139 html += "<p align=\"right\">"
141 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
142 html += "<a href=\"/fancontrol/chart\"><img border=\"0\" src=\"/fancontrol/FC2Chart.png\" width=\"100\" height=\"40\"></a>\n"
143 html += "<a href=\"/fancontrol\"><img border=\"0\" src=\"/fancontrol/FC2Info.png\" width=\"100\" height=\"40\"></a></td></tr></table>\n"
145 html += "<table border=\"1\" width=\"500\">"
146 html += "<tr><td width=\"50%\" align=\"center\" valign=\"top\">Data Logging "
147 if config.plugins.FanControl.EnableDataLog.value:
148 html += "<font color=\"#00FF00\">%s</font>" % _("active")
149 html += "<form method=\"GET\">"
150 html += "<input type=\"hidden\" name=\"cmd\" value=\"dataenable\">"
151 html += "<input type=\"submit\" value=\"%s\">" % _("turn off")
154 html += "<font color=\"#FF0000\">%s</font>" % _("not active")
155 html += "<form method=\"GET\">"
156 html += "<input type=\"hidden\" name=\"cmd\" value=\"dataenable\">"
157 html += "<input type=\"submit\" value=\"%s\">" % _("turn on")
159 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
160 s = os.stat(config.plugins.FanControl.LogPath.value + "FC2data.csv")
161 if int(s.st_size/1024) == 0:
162 html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size), "")
164 html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size/1024), "k")
165 s = os.statvfs(config.plugins.FanControl.LogPath.value)
166 html += "<BR>" + _("Disk free : %d MByte") % (int(s.f_bsize * s.f_bavail / 1024 / 1024))
167 html += "<form method=\"GET\">"
168 html += "<input type=\"hidden\" name=\"cmd\" value=\"data\">"
169 html += "<input type=\"submit\" value=\"%s\">" % _("Download")
171 html += "<form method=\"GET\">"
172 html += "<input type=\"hidden\" name=\"cmd\" value=\"datadel\">"
173 html += "<input type=\"submit\" value=\"%s\">" % _("Delete")
175 html += "<form method=\"GET\">"
176 html += "<input type=\"hidden\" name=\"cmd\" value=\"datadel48h\">"
177 html += "<input type=\"submit\" value=\"%s\">" % _("Delete older 48h")
180 html += "<BR>" + _("File %s does not exists") % "FC2data.csv"
182 html += "</td><td width=\"50%\" align=\"center\" valign=\"top\">Event Logging "
183 if config.plugins.FanControl.EnableEventLog.value:
184 html += "<font color=\"#00FF00\">%s</font>" % _("active")
185 html += "<form method=\"GET\">"
186 html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsenable\">"
187 html += "<input type=\"submit\" value=\"%s\">" % _("turn off")
190 html += "<font color=\"#FF0000\">%s</font>" % _("not active")
191 html += "<form method=\"GET\">"
192 html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsenable\">"
193 html += "<input type=\"submit\" value=\"%s\">" % _("turn on")
195 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
196 s = os.stat(config.plugins.FanControl.LogPath.value + "FC2events.txt")
197 if int(s.st_size/1024) == 0:
198 html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size), "")
200 html += "<BR>" + _("Filesize : %d %sByte") % (int(s.st_size/1024), "k")
201 s = os.statvfs(config.plugins.FanControl.LogPath.value)
202 html += "<BR>" + _("Disk free : %d MByte") % (int(s.f_bsize * s.f_bavail / 1024 / 1024))
203 html += "<form method=\"GET\">"
204 html += "<input type=\"hidden\" name=\"cmd\" value=\"events\">"
205 html += "<input type=\"submit\" value=\"%s\">" % _("Download")
207 html += "<form method=\"GET\">"
208 html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsdel\">"
209 html += "<input type=\"submit\" value=\"%s\">" % _("Delete")
211 # html += "<form method=\"GET\">"
212 # html += "<input type=\"hidden\" name=\"cmd\" value=\"eventsdel48h\">"
213 # html += "<input type=\"submit\" value=\"%s\">" % _("Delete older 48h")
217 html += "<BR>" + _("File %s does not exists") % "FC2events.txt"
218 html += "</td></tr></table>"
219 html += _("Logging-Path: %s") % config.plugins.FanControl.LogPath.value
222 elif command[0] == "data":
223 req.setResponseCode(http.OK)
224 # req.setHeader('Content-type', 'application/octet-stream')
225 req.setHeader('Content-type', 'application/vnd.ms-excel')
226 req.setHeader('Content-Disposition', 'attachment;filename=FC2data.csv')
227 req.setHeader('Content-Length', os.stat(config.plugins.FanControl.LogPath.value + "FC2data.csv").st_size)
228 # req.setHeader('Content-Disposition', 'inline;filename=FC2data.csv')
229 req.setHeader('charset', 'UTF-8')
230 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","r")
233 elif command[0] == "datadel":
234 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
235 os.remove(config.plugins.FanControl.LogPath.value + "FC2data.csv")
238 elif command[0] == "datadel48h":
239 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv") and os.stat(config.plugins.FanControl.LogPath.value + "FC2data.csv").st_size > 10000:
240 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
243 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","r")
248 DT = DT[0].split(" ")
249 DD = DT[0].split(".")
250 DD48h = datetime.date(int(DD[0]),int(DD[1]),int(DD[2])) - datetime.timedelta(2)
251 Dfind = "%04d.%02d.%02d %s" % (DD48h.year,DD48h.month,DD48h.day,DT[1])
254 fw = open(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp","w")
256 for line in f.readlines():
262 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
263 os.remove(config.plugins.FanControl.LogPath.value + "FC2data.csv")
264 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp"):
265 os.rename(config.plugins.FanControl.LogPath.value + "FC2data.csv.tmp",config.plugins.FanControl.LogPath.value + "FC2data.csv")
267 elif command[0] == "dataenable":
268 config.plugins.FanControl.EnableDataLog.value = not config.plugins.FanControl.EnableDataLog.value
270 config.plugins.FanControl.EnableDataLog.save()
273 elif command[0] == "events":
274 req.setResponseCode(http.OK)
275 req.setHeader('Content-type', 'application/octet-stream')
276 req.setHeader('Content-Disposition', 'attachment;filename=FC2events.txt')
277 req.setHeader('Content-Length', os.stat(config.plugins.FanControl.LogPath.value + "FC2events.txt").st_size)
278 # req.setHeader('Content-Disposition', 'inline;filename=FC2events.txt')
279 req.setHeader('charset', 'UTF-8')
280 f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","r")
283 elif command[0] == "eventsdel":
284 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
285 os.remove(config.plugins.FanControl.LogPath.value + "FC2events.txt")
287 elif command[0] == "eventsdel48h":
288 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
289 f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","a")
292 f = open(config.plugins.FanControl.LogPath.value + "FC2events.txt","r")
297 DT = DT[0].split(" ")
298 DD = DT[0].split(".")
299 DD48h = datetime.date(int(DD[0]),int(DD[1]),int(DD[2])) - datetime.timedelta(2)
300 Dfind = "%04d.%02d.%02d %s" % (DD48h.year,DD48h.month,DD48h.day,DT[1])
303 fw = open(config.plugins.FanControl.LogPath.value + "FC2events.txt.tmp","w")
305 for line in f.readlines():
311 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt"):
312 os.remove(config.plugins.FanControl.LogPath.value + "FC2events.txt")
313 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2events.txt.tmp"):
314 os.rename(config.plugins.FanControl.LogPath.value + "FC2events.txt.tmp",config.plugins.FanControl.LogPath.value + "FC2events.txt")
316 elif command[0] == "eventsenable":
317 config.plugins.FanControl.EnableEventLog.value = not config.plugins.FanControl.EnableEventLog.value
318 config.plugins.FanControl.EnableEventLog.save()
326 h += "<meta http-equiv=\"refresh\" content=\"1; url=/fancontrol/log\">"
327 h += "<a href=\"/fancontrol/log\">Execution completed... jump back...</a>"
332 def CreateDataHead():
333 if not os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv") and config.plugins.FanControl.EnableDataLog.value and Free(config.plugins.FanControl.LogPath.value):
335 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","w")
343 ##########################################################
344 class FC2webChart(resource.Resource):
346 title = "FanControl2 Webinterface"
349 def render(self, req):
350 command = req.args.get("cmd",None)
352 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
353 req.setHeader('Content-type', 'text/html')
354 req.setHeader('charset', 'UTF-8')
356 """ rendering server response """
358 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","a")
362 html = "<html><body><html>Not enough Data (wait 3min)!</body></html>"
364 f = open(config.plugins.FanControl.LogPath.value + "FC2data.csv","r")
369 DT = DT[0].split(" ")
370 DD = DT[0].split(".")
371 DD48h = datetime.date(int(DD[0]),int(DD[1]),int(DD[2])) - datetime.timedelta(2)
372 Dfind = "%04d.%02d.%02d %s" % (DD48h.year,DD48h.month,DD48h.day,DT[1])
376 for line in f.readlines():
383 html += "<meta http-equiv=\"Content-Language\" content=\"de\">"
384 html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">"
385 html += "<meta http-equiv=\"cache-control\" content=\"no-cache\" />"
386 html += "<meta http-equiv=\"pragma\" content=\"no-cache\" />"
387 html += "<meta http-equiv=\"expires\" content=\"0\">"
388 html += "<title>Fan Control 2 - Chart</title>"
390 html += "<body bgcolor=\"#666666\" text=\"#FFFFFF\">\n"
391 html += "<table border=\"1\" width=\"900\" bordercolorlight=\"#000000\" bordercolordark=\"#000000\" cellspacing=\"1\"><tr><td bgcolor=\"#000000\" width=\"200\">\n"
392 html += "<p align=\"center\"><img border=\"0\" src=\"/fancontrol/FC2dreambox.png\" width=\"181\" height=\"10\">\n"
393 html += "<font color=\"#FFFFFF\"><BR><b>Fan Control 2 - Chart</b></font></p>\n"
394 html += "</td><td bgcolor=\"#000000\">\n"
395 html += "<p align=\"right\">"
397 if os.path.exists(config.plugins.FanControl.LogPath.value + "FC2data.csv"):
398 html += "<a href=\"/fancontrol\"><img border=\"0\" src=\"/fancontrol/FC2Info.png\" width=\"100\" height=\"40\"></a>\n"
399 html += "<a href=\"/fancontrol/log\"><img border=\"0\" src=\"/fancontrol/FC2Setup.png\" width=\"100\" height=\"40\"></a></td></tr></table>\n"
401 html += "<applet code=\"diagram.class\" codebase=\"/fancontrol/\" name=\"DiaTemp\" "
402 html += "align=\"baseline\" width=\"900\" height=\"250\" mayscript>\n"
403 html += "<param name=\"title\" value=\"Temp (48h - %s)\">\n" % DT[0]
404 html += "<param name=\"bgcolor\" value=\"240; 240; 240\">\n"
405 html += "<param name=\"ytitle\" value=\"Temp\">\n"
406 html += "<param name=\"rolling\" value=\"%d\">\n" % Anzahl
407 html += "<param name=\"show_xscale\" value=\"atText\">\n"
408 html += "<param name=\"show_ygrid\" value=\"true\">\n"
409 html += "<param name=\"show_xgrid\" value=\"true\">\n"
411 html += "<param name=\"y0\" value=\"\">\n"
412 html += "<param name=\"color0\" value=\"240; 0; 0\">\n"
413 html += "<param name=\"style0\" value=\"LINE\">\n"
414 html += "<param name=\"ylabel0\" value=\"Temp\">\n"
416 html += "<param name=\"y1\" value=\"\">\n"
417 html += "<param name=\"color1\" value=\"240; 0; 240\">\n"
418 html += "<param name=\"style1\" value=\"LINE\">\n"
419 html += "<param name=\"ylabel1\" value=\"HDD\">\n"
421 html += "<param name=\"y2\" value=\"\">\n"
422 html += "<param name=\"color2\" value=\"0; 255; 0\">\n"
423 html += "<param name=\"style2\" value=\"LINE\">\n"
424 html += "<param name=\"ylabel2\" value=\"BoxOn\">\n"
426 html += "<param name=\"y3\" value=\"\">\n"
427 html += "<param name=\"color3\" value=\"72; 118; 255\">\n"
428 html += "<param name=\"style3\" value=\"LINE\">\n"
429 html += "<param name=\"ylabel3\" value=\"HDDon\">\n"
431 html += "<param name=\"y4\" value=\"\">\n"
432 html += "<param name=\"color4\" value=\"255; 165; 0\">\n"
433 html += "<param name=\"style4\" value=\"LINE\">\n"
434 html += "<param name=\"ylabel4\" value=\"Record\">\n"
436 html += "</applet>\n"
438 # html += "<div style=\"position: absolute; width: 100px; height: 100px; z-index: 1; left: 910px; top: 146px\" id=\"Ebene1\">\n"
439 # html += "<img border=\"0\" src=\"/web-data/fc2/FC2Status.png\" width=\"115\" height=\"168\"></div>\n"
441 html += "<applet code=\"diagram.class\" codebase=\"/fancontrol/\" name=\"DiaRPM\" "
442 html += "align=\"baseline\" width=\"900\" height=\"250\" mayscript>\n"
443 html += "<param name=\"title\" value=\"RPM (48h - %s)\">\n" % DT[0]
444 html += "<param name=\"bgcolor\" value=\"240; 240; 240\">\n"
445 html += "<param name=\"ytitle\" value=\"RPM\">\n"
446 html += "<param name=\"rolling\" value=\"%d\">\n" % Anzahl
447 html += "<param name=\"show_xscale\" value=\"atText\">\n"
448 html += "<param name=\"show_ygrid\" value=\"true\">\n"
449 html += "<param name=\"show_xgrid\" value=\"true\">\n"
451 html += "<param name=\"y0\" value=\"\">\n"
452 html += "<param name=\"color0\" value=\"240; 0; 0\">\n"
453 html += "<param name=\"style0\" value=\"LINE\">\n"
454 html += "<param name=\"ylabel0\" value=\"RPM\">\n"
456 html += "</applet>\n"
460 html += "<script language=javascript>\n"
461 html += "dT = document.DiaTemp\n"
462 html += "dR = document.DiaRPM\n"
464 Xtime = int((Anzahl/20))
467 for line in f.readlines():
471 tmp = ("\"" + DT[0].split(" ")[1] + "\"") if t % Xtime == 0 else "null"
487 html += "dT.AddPoint(\"%s; %s; %d; %d; %d\", %s, null);\n" % (DT[1].replace(",","."),DT[5],B,H,R,tmp)
488 html += "dR.AddPoint(\"%s\", %s, null);\n" % (DT[2],tmp)
490 html += "dT.repaint();\ndR.repaint();\n"
493 html = "<html>no Data!"
503 h += "<img border=\"0\" src=\"/fancontrol/FC2on.png\" width=\"20\" height=\"20\" title=\"Box On\" align=\"left\" hspace=\"2\" vspace=\"5\">\n"
505 h += "<img border=\"0\" src=\"/fancontrol/FC2hdd.png\" width=\"20\" height=\"20\" title=\"HDD On\" align=\"left\" hspace=\"2\" vspace=\"5\">\n"
507 h += "<img border=\"0\" src=\"/fancontrol/FC2record.png\" width=\"20\" height=\"20\" title=\"Recording\" align=\"left\" hspace=\"2\" vspace=\"5\">\n"