UPS: apcupsd clean sources
[tomato.git] / release / src / router / apcupsd / src / cgi / upsstats.c
blob29d12f50f3396b71a936187bcd1a9c006288b55a
1 /*
2 * upsstats - cgi program to generate the main UPS info page
4 * Author: Russell Kroll <rkroll@exploits.org>
6 * To use: install the binary in a directory where CGI programs may be
7 * executed by your web server. On many systems something like
8 * /usr/local/etc/httpd/cgi-bin will work nicely. I recommend
9 * calling the binary "upsstats.cgi" in that directory.
11 * Assuming a path like the above, the following link will suffice:
12 * <A HREF="/cgi-bin/upsstats.cgi">UPS Status</A>
14 * This program assumes that upsimage.cgi will be in the same
15 * directory. The install-cgi target will take care of putting
16 * things in the right place if you set the paths properly in the
17 * Makefile.
19 * Modified: Jonathan Benson <jbenson@technologist.com>
20 * 19/6/98 to suit apcupsd
21 * 23/6/98 added more graphs and menu options
23 * Modified: Kern Sibbald <kern@sibbald.com>
24 * Nov 1999 to work with apcupsd networking and
25 * to include as much of the NUT code
26 * as possible.
27 * added runtim status
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <sys/types.h>
35 #include "cgiconfig.h"
36 #include "cgilib.h"
37 #include "upsfetch.h"
39 #ifndef DEFAULT_REFRESH
40 #define DEFAULT_REFRESH 30
41 #endif
43 #ifndef MAXHOSTNAMELEN
44 #define MAXHOSTNAMELEN 64
45 #endif
47 static char monhost[MAXHOSTNAMELEN] = "127.0.0.1";
48 static int img1 = 1;
49 static int img2 = 6;
50 static int img3 = 5;
51 static char temps[16] = "C";
52 static int refresh = DEFAULT_REFRESH;
54 void parsearg(const char *var, const char *value)
56 if (strcmp(var, "host") == 0) {
57 strncpy (monhost, value, sizeof(monhost));
58 monhost[sizeof(monhost) - 1] = '\0';
60 } else if (strcmp(var, "img1") == 0) {
61 img1 = atoi(value);
62 if ((img1 <= 0) || (img1 > 6)) {
63 img1 = 1;
66 } else if (strcmp(var, "img2") == 0) {
67 img2 = atoi(value);
68 if ((img2 <= 0) || (img2 > 6)) {
69 img2 = 6;
72 } else if (strcmp(var, "img3") == 0) {
73 img3 = atoi(value);
74 if ((img3 <= 0) || (img3 > 6)) {
75 img3 = 5;
78 } else if (strcmp(var, "temp") == 0) {
79 strncpy (temps, value, sizeof(temps));
80 temps[sizeof(temps) - 1] = '\0';
82 } else if (strcmp(var, "refresh") == 0) {
83 refresh = atoi(value);
84 if (refresh < 0) {
85 refresh = DEFAULT_REFRESH;
90 void send_image(int report, int defrpt)
92 char answer[256], answer2[256], answer3[256];
94 if (report < 1 || report > 6)
95 report = defrpt;
97 fputs ("<img src=\"upsimage.cgi?display=", stdout);
98 switch ( report ) {
99 case 1:
100 getupsvar (monhost, "battcap", answer, sizeof(answer));
101 getupsvar (monhost, "mbattchg", answer2, sizeof(answer2));
102 printf ("battcap&amp;value=%s&amp;value2=%s\" alt=\"Battery Capacity %s%%\"",
103 answer, answer2, answer);
104 break;
105 case 2:
106 getupsvar (monhost, "battvolt", answer, sizeof(answer));
107 getupsvar (monhost, "nombattv", answer2, sizeof(answer2));
108 printf ("battvolt&amp;value=%s&amp;value2=%s\" alt=\"Battery Voltage %s VDC\"",
109 answer, answer2, answer);
110 break;
111 case 3:
112 getupsvar (monhost, "utility", answer, sizeof(answer));
113 getupsvar (monhost, "lowxfer", answer2, sizeof(answer2));
114 getupsvar (monhost, "highxfer", answer3, sizeof(answer3));
115 printf ("utility&amp;value=%s&amp;value2=%s&amp;value3=%s\" alt=\"Utility Voltage %s VAC\"",
116 answer, answer2, answer3, answer);
117 break;
118 case 4:
119 getupsvar (monhost, "outputv", answer, sizeof(answer));
120 printf ("outputv&amp;value=%s\" alt=\"Output Voltage %s VAC\"",
121 answer, answer);
122 break;
123 case 5:
124 getupsvar (monhost, "upsload", answer, sizeof(answer));
125 printf ("upsload&amp;value=%s\" alt=\"UPS Load %s%%\"",
126 answer, answer);
127 break;
128 case 6:
129 getupsvar (monhost, "runtime", answer, sizeof(answer));
130 getupsvar (monhost, "mintimel", answer2, sizeof(answer2));
131 printf ("runtime&amp;value=%s&amp;value2=%s\" alt=\"Run time remaining %s minutes\"",
132 answer, answer2, answer);
133 break;
135 puts (" width=\"150\" height=\"350\" />");
138 static void image_menu(int select)
140 fputs (" <option value=\"1\"", stdout);
141 if (select == 1)
142 fputs(" selected=\"selected\"", stdout);
143 puts (">Battery Capacity</option>");
145 fputs (" <option value=\"2\"", stdout);
146 if (select == 2)
147 fputs(" selected=\"selected\"", stdout);
148 puts (">Battery Voltage</option>");
150 fputs (" <option value=\"3\"", stdout);
151 if (select == 3)
152 fputs(" selected=\"selected\"", stdout);
153 puts (">Utility Voltage</option>");
155 fputs (" <option value=\"4\"", stdout);
156 if (select == 4)
157 fputs(" selected=\"selected\"", stdout);
158 puts (">Output Voltage</option>");
160 fputs (" <option value=\"5\"", stdout);
161 if (select == 5)
162 fputs(" selected=\"selected\"", stdout);
163 puts (">UPS Load</option>");
165 fputs (" <option value=\"6\"", stdout);
166 if (select == 6)
167 fputs(" selected=\"selected\"", stdout);
168 puts (">Run Time Remaining</option>");
171 int main(int argc, char **argv)
173 int status;
174 double tempf;
175 char *p;
176 char answer[256];
178 (void) extractcgiargs();
180 p = strstr(monhost, "%3");
181 if (p) {
182 *p++ = ':'; /* set colon */
183 memmove(p, p+2, sizeof(monhost)-(p-monhost)); /* get rid of hex 3A */
186 snprintf(answer, sizeof(answer), "%s UPS Status", monhost);
187 html_begin(answer, refresh);
189 if (!checkhost(monhost)) {
190 fputs ("<p><strong>Access to host ", stdout);
191 html_puts(monhost);
192 puts (" is not authorized.</strong></p>");
193 html_finish();
194 exit (EXIT_FAILURE);
197 /* check if host is available */
198 if (getupsvar(monhost, "date", answer, sizeof(answer)) <= 0) {
199 fputs ("<p><strong>Unable to communicate with the UPS on ", stdout);
200 html_puts(monhost);
201 puts (".</strong></p>");
202 html_finish();
203 exit (EXIT_FAILURE);
206 puts ("<div class=\"Center\">");
207 puts ("<table border=\"2\" cellspacing=\"10\" cellpadding=\"5\">");
209 getupsvar(monhost, "date", answer, sizeof(answer));
210 fputs ("<tr><th>", stdout);
211 html_puts(answer);
212 puts ("</th>");
214 puts ("<th>");
215 printf (" <form method=\"get\" action=\"upsstats.cgi\"><div>\n");
216 printf (" <input type=\"hidden\" name=\"host\" value=\"%s\" />\n", monhost);
217 printf (" <select onchange=\"this.form.submit()\" name=\"img1\">\n");
218 image_menu(img1);
219 printf (" </select>\n");
220 printf (" <input type=\"hidden\" name=\"img2\" value=\"%d\" />\n",img2);
221 printf (" <input type=\"hidden\" name=\"img3\" value=\"%d\" />\n",img3);
222 printf (" <input type=\"hidden\" name=\"temp\" value=\"%s\" />\n",temps);
223 printf (" <input type=\"hidden\" name=\"refresh\" value=\"%d\" />\n",refresh);
224 puts (" </div></form>");
225 puts ("</th>");
227 puts ("<th>");
228 printf (" <form method=\"get\" action=\"upsstats.cgi\"><div>\n");
229 printf (" <input type=\"hidden\" name=\"host\" value=\"%s\" />\n", monhost);
230 printf (" <input type=\"hidden\" name=\"img1\" value=\"%d\" />\n",img1);
231 printf (" <select onchange=\"this.form.submit()\" name=\"img2\">\n");
232 image_menu(img2);
233 printf (" </select>\n");
234 printf (" <input type=\"hidden\" name=\"img3\" value=\"%d\" />\n",img3);
235 printf (" <input type=\"hidden\" name=\"temp\" value=\"%s\" />\n",temps);
236 printf (" <input type=\"hidden\" name=\"refresh\" value=\"%d\" />\n",refresh);
237 puts (" </div></form>");
238 puts ("</th>");
240 puts ("<th>");
241 printf (" <form method=\"get\" action=\"upsstats.cgi\"><div>\n");
242 printf (" <input type=\"hidden\" name=\"host\" value=\"%s\" />\n", monhost);
243 printf (" <input type=\"hidden\" name=\"img1\" value=\"%d\" />\n",img1);
244 printf (" <input type=\"hidden\" name=\"img2\" value=\"%d\" />\n",img2);
245 printf (" <select onchange=\"this.form.submit()\" name=\"img3\">\n");
246 image_menu(img3);
247 printf (" </select>\n");
248 printf (" <input type=\"hidden\" name=\"temp\" value=\"%s\" />\n",temps);
249 printf (" <input type=\"hidden\" name=\"refresh\" value=\"%d\" />\n",refresh);
250 puts (" </div></form>");
251 puts ("</th></tr>");
253 puts ("<tr><td><pre>");
255 getupsvar (monhost, "hostname", answer, sizeof(answer));
256 fputs ("Monitoring: ", stdout);
257 html_puts (answer);
258 fputs ("\n", stdout);
260 getupsvar (monhost, "model", answer, sizeof(answer));
261 fputs (" UPS Model: ", stdout);
262 html_puts (answer);
263 fputs ("\n", stdout);
265 getupsvar (monhost, "upsname", answer, sizeof(answer));
266 fputs (" UPS Name: ", stdout);
267 html_puts (answer);
268 fputs ("\n", stdout);
270 getupsvar (monhost, "version", answer, sizeof(answer));
271 fputs (" APCUPSD: Version ", stdout);
272 html_puts (answer);
273 fputs ("\n", stdout);
275 fputs (" Status: ", stdout);
277 if (getupsvar (monhost, "status", answer, sizeof(answer)) <= 0) {
278 puts ("Not available");
279 } else {
280 status = strtol(answer, 0, 16);
281 if (status & UPS_calibration)
282 fputs ("CALIBRATION ", stdout);
283 if (status & UPS_trim)
284 fputs ("TRIM ", stdout);
285 if (status & UPS_boost)
286 fputs ("BOOST ", stdout);
287 if (status & UPS_online)
288 fputs ("ONLINE ", stdout);
289 if (status & UPS_onbatt)
290 fputs ("ON BATTERY ", stdout);
291 if (status & UPS_overload)
292 fputs ("OVERLOADED ", stdout);
293 if (status & UPS_battlow)
294 fputs ("BATTERY LOW ", stdout);
295 if (status & UPS_replacebatt)
296 fputs ("REPLACE BATTERY ", stdout);
297 if (status & UPS_commlost)
298 fputs("COMM LOST ", stdout);
299 if (status & UPS_shutdown)
300 fputs("SHUTDOWN ", stdout);
301 if (status & UPS_slave)
302 fputs("SLAVE ", stdout);
303 if (!(status & UPS_battpresent))
304 fputs("NOBATT ", stdout);
305 fputs ("\n", stdout);
308 puts ("</pre></td>");
310 puts ("<td rowspan=\"3\">");
311 send_image(img1, 1);
312 puts ("</td>");
314 puts ("<td rowspan=\"3\">");
315 send_image(img2, 6);
316 puts ("</td>");
318 puts ("<td rowspan=\"3\">");
319 send_image(img3, 5);
320 puts ("</td>");
321 puts ("</tr>");
323 puts ("<tr><td><pre>");
325 getupsvar (monhost, "selftest", answer, sizeof(answer));
326 fputs ("Last UPS Self Test: ", stdout);
327 html_puts (answer);
328 fputs ("\n", stdout);
330 getupsvar(monhost, "laststest", answer, sizeof(answer));
331 /* To reduce the length of the output, we drop the
332 * seconds and the trailing year.
334 for (p=answer; *p && *p != ':'; p++) ;
335 if (*p == ':')
336 p++;
337 for ( ; *p && *p != ':'; p++) ;
338 *p = '\0';
339 fputs ("Last Test Date: ", stdout);
340 html_puts (answer);
341 fputs ("\n", stdout);
343 puts ("</pre></td></tr>");
345 puts ("<tr><td><pre>");
347 getupsvar (monhost, "utility", answer, sizeof(answer));
348 fputs ("Utility Voltage: ", stdout);
349 html_puts (answer);
350 puts (" VAC");
352 getupsvar (monhost, "linemin", answer, sizeof(answer));
353 fputs (" Line Minimum: ", stdout);
354 html_puts (answer);
355 puts (" VAC");
357 getupsvar (monhost, "linemax", answer, sizeof(answer));
358 fputs (" Line Maximum: ", stdout);
359 html_puts (answer);
360 puts (" VAC");
362 getupsvar (monhost, "outputfreq", answer, sizeof(answer));
363 fputs (" Output Freq: ", stdout);
364 html_puts (answer);
365 puts (" Hz");
367 if (getupsvar(monhost, "ambtemp", answer, sizeof(answer)) > 0) {
368 if (strcmp(answer, "Not found" ) != 0) {
369 if (strcmp(temps,"F") == 0) {
370 tempf = (strtod (answer, 0) * 1.8) + 32;
371 printf (" Amb. Temp.: %.1f&deg; F\n", tempf);
372 } else if (strcmp(temps,"K") == 0) {
373 tempf = (strtod (answer, 0)) + 273;
374 printf (" Amb. Temp.: %.1f&deg; K\n", tempf);
375 } else {
376 printf (" Amb. Temp.: %s&deg; C\n", answer);
381 if ( getupsvar (monhost, "humidity", answer, sizeof(answer)) > 0) {
382 if (strcmp(answer, "Not found") != 0) {
383 fputs (" Amb. Humidity: ", stdout);
384 html_puts (answer);
385 puts (" %");
389 printf ("</pre>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tr>\n<td colspan=\"2\">\n<pre>\n");
391 if (getupsvar (monhost, "upstemp", answer, sizeof(answer)) > 0) {
392 if (strcmp(temps,"F") == 0) {
393 tempf = (strtod (answer, 0) * 1.8) + 32;
394 printf (" UPS Temp: %.1f \n</pre>\n</td>\n<td>\n", tempf);
395 printf (" <form method=\"get\" action=\"upsstats.cgi\"><div>\n");
396 printf (" <input type=\"hidden\" name=\"host\" value=\"%s\" />\n",monhost);
397 printf (" <input type=\"hidden\" name=\"img1\" value=\"%d\" />\n",img1);
398 printf (" <input type=\"hidden\" name=\"img2\" value=\"%d\" />\n",img2);
399 printf (" <input type=\"hidden\" name=\"img3\" value=\"%d\" />\n",img3);
400 printf (" <input type=\"hidden\" name=\"refresh\" value=\"%d\" />\n",refresh);
401 printf (" <select onchange=\"this.form.submit();\" name=\"temp\">\n");
402 printf (" <option value=\"C\">&deg; C</option>\n");
403 printf (" <option selected=\"selected\" value=\"F\">&deg; F</option>\n");
404 printf (" <option value=\"K\">&deg; K</option>\n");
406 } else if (strcmp(temps,"K") == 0) {
407 tempf = (strtod (answer, 0)) + 273;
408 printf (" UPS Temp: %.1f \n</pre>\n</td>\n<td>\n", tempf);
409 printf (" <form method=\"get\" action=\"upsstats.cgi\"><div>\n");
410 printf (" <input type=\"hidden\" name=\"host\" value=\"%s\" />\n",monhost);
411 printf (" <input type=\"hidden\" name=\"img1\" value=\"%d\" />\n",img1);
412 printf (" <input type=\"hidden\" name=\"img2\" value=\"%d\" />\n",img2);
413 printf (" <input type=\"hidden\" name=\"img3\" value=\"%d\" />\n",img3);
414 printf (" <input type=\"hidden\" name=\"refresh\" value=\"%d\" />\n",refresh);
415 printf (" <select onchange=\"this.form.submit()\" name=\"temp\">\n");
416 printf (" <option value=\"C\">&deg; C</option>\n");
417 printf (" <option value=\"F\">&deg; F</option>\n");
418 printf (" <option selected=\"selected\" value=\"K\">&deg; K</option>\n");
420 } else {
421 printf (" UPS Temp: %s \n</pre>\n</td>\n<td>\n", answer);
422 printf (" <form method=\"get\" action=\"upsstats.cgi\"><div>\n");
423 printf (" <input type=\"hidden\" name=\"host\" value=\"%s\" />\n",monhost);
424 printf (" <input type=\"hidden\" name=\"img1\" value=\"%d\" />\n",img1);
425 printf (" <input type=\"hidden\" name=\"img2\" value=\"%d\" />\n",img2);
426 printf (" <input type=\"hidden\" name=\"img3\" value=\"%d\" />\n",img3);
427 printf (" <input type=\"hidden\" name=\"refresh\" value=\"%d\" />\n",refresh);
428 printf (" <select onchange=\"this.form.submit()\" name=\"temp\">\n");
429 printf (" <option selected=\"selected\" value=\"C\">&deg; C</option>\n");
430 printf (" <option value=\"F\">&deg; F</option>\n");
431 printf (" <option value=\"K\">&deg; K</option>\n");
435 puts (" </select>");
436 puts (" </div></form>");
437 puts ("</td></tr></table>");
438 puts ("</td></tr>");
440 puts ("<tr><td colspan=\"4\"><b>Recent Events</b><br />");
441 puts ("<textarea rows=\"5\" cols=\"95\">");
443 fetch_events(monhost);
444 html_puts (statbuf);
446 puts ("</textarea>");
447 puts ("</td></tr>");
449 puts ("</table></div>");
451 html_finish();
452 return 0;