]> git.pld-linux.org Git - packages/nagios.git/blame - nagios-googlemap.patch
- use favicon.ico from tarball
[packages/nagios.git] / nagios-googlemap.patch
CommitLineData
b7e814c5
ER
1--- nagios-3.2.0/cgi/statusmap.c 2009-10-22 17:06:10.117113115 +0300
2+++ nagios-3.2.0.googlemap/cgi/statusmap.c 2009-10-22 17:05:32.644615709 +0300
6442e2ee
ER
3@@ -27,6 +27,10 @@
4 *
5 *****************************************************************************/
6
7+#include <stdio.h>
8+#include <stdlib.h>
9+#include <string.h>
10+
11 #include "../include/config.h"
12 #include "../include/common.h"
13 #include "../include/objects.h"
b7e814c5 14@@ -93,13 +97,27 @@
6442e2ee
ER
15 #define LAYOUT_CIRCULAR 4
16 #define LAYOUT_CIRCULAR_MARKUP 5
17 #define LAYOUT_CIRCULAR_BALLOON 6
b7e814c5 18-
6442e2ee
ER
19+#define LAYOUT_GOOGLEMAP 7
20
6442e2ee
ER
21 typedef struct layer_struct{
22 char *layer_name;
23 struct layer_struct *next;
24 }layer;
25
26+typedef struct location_t {
27+ char* name;
28+ char* note;
29+ char* latitude;
30+ char* longitude;
31+ struct location_t* next;
32+} location_t;
33+
34+typedef struct general_location_t {
35+ char* key;
36+ char* zoom;
37+ char* latitude;
38+ char* longitude;
39+} general_location_t;
40
41 void document_header(int);
42 void document_footer(void);
b7e814c5 43@@ -117,6 +135,10 @@
6442e2ee
ER
44 void draw_background_image(void);
45 void draw_background_extras(void);
46 void draw_host_links(void);
47+
48+void google_map(void);
49+void write_google_head_code(void);
50+
51 void draw_hosts(void);
52 void draw_host_text(char *,int,int);
53 void draw_text(char *,int,int,int);
b7e814c5
ER
54@@ -345,9 +367,14 @@
55
6442e2ee
ER
56 /* write JavaScript code for popup window */
57 write_popup_code();
b7e814c5 58+ if (layout_method == LAYOUT_GOOGLEMAP)
6442e2ee
ER
59+ write_google_head_code();
60
61 printf("</head>\n");
62
b7e814c5 63+ if (layout_method == LAYOUT_GOOGLEMAP) {
6442e2ee
ER
64+ printf("<body onload='load()' onunload='GUnload()' CLASS='statusmap' name='mappage' id='mappage'>\n");
65+ } else
b7e814c5 66 printf("<body CLASS='statusmap' name='mappage' id='mappage'>\n");
6442e2ee
ER
67
68 /* include user SSI header */
b7e814c5 69@@ -703,7 +730,7 @@
6442e2ee
ER
70 /* right hand column of top row */
71 printf("<td align=right valign=top>\n");
72
73- printf("<form method=\"POST\" action=\"%s\">\n",STATUSMAP_CGI);
74+ printf("<form name=\"layoutform\" method=\"POST\" action=\"%s\">\n",STATUSMAP_CGI);
75 printf("<table border=0 CLASS='optBox'>\n");
76 printf("<tr><td valign=top>\n");
77 printf("<input type='hidden' name='host' value='%s'>\n",escape_string(host_name));
b7e814c5 78@@ -725,6 +752,7 @@
6442e2ee
ER
79 printf("<option value=%d %s>Circular\n",LAYOUT_CIRCULAR,(layout_method==LAYOUT_CIRCULAR)?"selected":"");
80 printf("<option value=%d %s>Circular (Marked Up)\n",LAYOUT_CIRCULAR_MARKUP,(layout_method==LAYOUT_CIRCULAR_MARKUP)?"selected":"");
81 printf("<option value=%d %s>Circular (Balloon)\n",LAYOUT_CIRCULAR_BALLOON,(layout_method==LAYOUT_CIRCULAR_BALLOON)?"selected":"");
82+ printf("<option value=%d %s>Googlemap\n",LAYOUT_GOOGLEMAP,(layout_method==LAYOUT_GOOGLEMAP)?"selected":"");
83 printf("</select>\n");
84 printf("</td>\n");
85 printf("<td CLASS='optBoxItem'>\n");
b7e814c5 86@@ -821,6 +849,11 @@
6442e2ee
ER
87 /* display page header */
88 display_page_header();
89
90+ if (layout_method==LAYOUT_GOOGLEMAP){
91+ google_map();
92+ return;
93+ }
94+
95 initialize_graphics();
96 draw_background_image();
97 draw_background_extras();
b7e814c5 98@@ -876,6 +909,13 @@
6442e2ee
ER
99
100
101 /******************************/
102+ /***** GOOGLEMAP LAYOUT MODE *****/
103+ /******************************/
104+ if(layout_method==LAYOUT_GOOGLEMAP){
105+
106+ }
107+
108+ /******************************/
109 /***** MANUAL LAYOUT MODE *****/
110 /******************************/
111
b7e814c5 112@@ -1563,10 +1603,19 @@
6442e2ee
ER
113 return;
114 }
115
116+/* create the googlemap */
117+void google_map(void){
118+ printf("<!-- Produced by Infoflex Connect AB (http://www.infoflexconnect.se), Fredrik Nilsson and Rujinschi Remus. -->\n");
119+ printf("<P><DIV ALIGN=center>");
120+ printf("<div id='map' style='width: 800px; height: 500px'></div>");
121+ printf("</DIV></P>");
122+ printf("<!-- Produced by Infoflex Connect AB (http://www.infoflexconnect.se), Fredrik Nilsson and Rujinschi Remus. -->\n");
123
124+}
125
126 /* draws hosts */
127 void draw_hosts(void){
128+
129 host *temp_host;
130 int x1, x2;
131 int y1, y2;
b7e814c5 132@@ -1586,6 +1635,8 @@
6442e2ee
ER
133 int translated_x;
134 int translated_y;
135
136+ if (layout_method==LAYOUT_GOOGLEMAP)
137+ return;
138
139 /* user didn't supply any coordinates for hosts, so display a warning */
140 if(coordinates_were_specified==FALSE){
b7e814c5 141@@ -2241,6 +2292,287 @@
6442e2ee
ER
142 /************************* MISC FUNCTIONS *************************/
143 /******************************************************************/
144
6442e2ee
ER
145+char* get_status_code(char* name)
146+{
147+ char* retVal;
148+ hoststatus *temp_status;
149+ temp_status=find_hoststatus(name);
150+
151+ /* strip nasty stuff from plugin output */
152+ sanitize_plugin_output(temp_status->plugin_output);
153+
154+ retVal=malloc(1000);
155+ retVal[0]=0;
156+ if(temp_status->status==HOST_DOWN){
157+ strcat(retVal,"Down");
158+ if(temp_status->problem_has_been_acknowledged==TRUE)
159+ strcat(retVal," (Acknowledged)");
160+ strcat(retVal, "");
161+ }
162+
163+ else if(temp_status->status==HOST_UNREACHABLE){
164+ strcat(retVal, "Unreachable");
165+ if(temp_status->problem_has_been_acknowledged==TRUE)
166+ strcat(retVal, " (Acknowledged)");
167+ strcat(retVal, "");
168+ }
169+
170+ else if(temp_status->status==HOST_UP)
171+ strcat(retVal, "Up");
172+
173+ else if(temp_status->status==HOST_PENDING)
174+ strcat(retVal, "Pending");
175+ return retVal;
176+}
177+
178+void write_google_head_code(void)
179+{
180+ char ch;
181+ char* ptr;
182+ int rc;
183+ FILE *fp;
184+ char stateinfo[1024];
185+ char line[1024];
186+ char key[1024];
187+ char value[1024];
b7e814c5 188+ char buf[256];
6442e2ee
ER
189+ char* filename;
190+ int state = 0;
191+ int counter = 0;
192+ general_location_t gen_loc;
193+ location_t* loc;
194+ location_t* loc_list=NULL;
195+
196+
197+/***************************************
198+ * parse location.cfg
199+ **************************************/
200+
201+ filename = "/etc/webapps/nagios/location.cfg";
202+ if((fp=fopen(filename, "r"))==NULL) {
203+ char* err_mess = "The file: location.cfg does not exist or could not be read";
204+ printf("<p>");
205+ printf("<font color=\"red\">%s</font>\r\n",err_mess);
206+ printf("</p>");
207+ return;
208+ }
209+
210+ while(fgets(buf, sizeof(buf), fp)!=NULL) {
211+ if ( (state == 1) && (buf[0] == '}')) {
212+ // we have reached a definition end
213+ state = 0;
214+ counter++;
215+ if (loc_list) {
216+ loc->next = loc_list;
217+ loc_list = loc;
218+ } else {
219+ loc_list = loc;
220+ }
221+ loc = NULL;
222+ continue;
223+ }
224+ if ( (state==2) && (buf[0] == '}')) {
225+ state=0;
226+ }
227+ key[0] = value[0] = 0;
228+ if (isspace(buf[0]))
229+ rc = sscanf(buf, "%*[ \t]%[^ \t]%*[ \t]%[^\n]", key, value);
230+ else
231+ rc = sscanf(buf, "%[^ \t]%*[ \t]%[^\n]", key, value);
232+
233+ if ( (rc == 2)) {
234+ if ( (state == 0) && (strcmp(key,"define")==0) ) {
235+ // we have a start of a new definition
236+
237+ // check if it is the default definition
238+ if ( (strncmp(value,"default ",8)==0) ||
239+ (strncmp(value,"default{",8)==0)) {
240+ state=2;
241+ continue;
242+ }
243+ state = 1;
244+ // declare a new location
245+ loc = calloc(1,sizeof(*loc));
246+ continue;
247+ }
248+ // state 2 == default definition
249+ if ( state == 2 ) {
250+ if ( strcmp(key,"key") == 0) {
251+ gen_loc.key=strdup(value);
252+ }
253+ if ( strcmp(key,"zoom") == 0) {
254+ gen_loc.zoom=strdup(value);
255+ }
256+ if ( strcmp(key,"lat") == 0) {
257+ gen_loc.latitude=strdup(value);
258+ }
259+ if ( strcmp(key,"long") == 0) {
260+ gen_loc.longitude=strdup(value);
261+ }
262+ }
263+ // state 1 == location definition
264+ if ( state == 1 ) {
265+ if ( strcmp(key,"host_name") == 0) {
266+ loc->name=strdup(value);
b7e814c5 267+ }
6442e2ee
ER
268+ if ( strcmp(key,"notes") == 0) {
269+ loc->note = strdup(value);
270+ }
271+ if ( strcmp(key,"lat") == 0) {
272+ loc->latitude = strdup(value);
273+ }
274+ if ( strcmp(key,"long") == 0) {
275+ loc->longitude = strdup(value);
276+ }
277+ }
278+ }
279+ }
280+ fclose(fp);
281+
282+ printf("<script src='http://maps.google.com/maps?file=api&amp;v=2&key=%s&amp;sensor=false' type='text/javascript'></script>\n",gen_loc.key);
283+
284+ printf("<script type='text/javascript'>\n"
285+ "//<![CDATA[ \n");
286+
287+ // printf("<script type=javascript src="webbserverfil" />);
288+
289+ printf("function setMapCookie(map) {"
290+ "document.cookie = 'googlemaplng='+map.getCenter().lng();\n"
291+ "document.cookie = 'googlemaplat='+map.getCenter().lat();\n"
292+ "var zoom = map.getZoom();\n"
293+ "document.cookie = 'googlemapzoom='+zoom;\n"
294+ "document.layoutform.scaling_factor.value=+zoom;\n"
295+ "}\n"
296+
297+ "function readCookie(name) {\n"
298+ "var nameEQ = name + \"=\";\n"
299+ "var ca = document.cookie.split(';');\n"
300+ "for(var i=0;i < ca.length;i++)\n"
301+ "{\n"
302+ "var c = ca[i];\n"
303+ "while (c.charAt(0)==' ') c = c.substring(1,c.length);\n"
304+ "if (c.indexOf(nameEQ) == 0)\n"
305+ "{\n"
306+ "c=c.substring(nameEQ.length,c.length);\n"
307+ "while (c.substring(c.length-1, c.length) == ' ')\n"
308+ "c = c.substring(0,c.length-1);\n"
309+ "return c;\n"
310+ "}\n"
311+ "}\n"
312+ "return null;\n"
313+ "}\n"
314+
315+ "function createMarker(hostname, comment, lat, long, state) {\n"
316+ " var point = new GLatLng(lat,long);\n"
317+ "var marker;\n"
318+ "if ( state==\"Up\" ) {\n"
319+ "var baseIcon = new GIcon();\n"
320+ "baseIcon.shadow = \"../images/shadow.png\";\n"
321+ "baseIcon.iconSize = new GSize(20, 34);\n"
322+ "baseIcon.shadowSize = new GSize(37, 34);\n"
323+ "baseIcon.iconAnchor = new GPoint(9, 34);\n"
324+ "baseIcon.infoWindowAnchor = new GPoint(9, 2);\n"
325+ "baseIcon.infoShadowAnchor = new GPoint(18, 25);\n"
326+ "var okicon = new GIcon(baseIcon);\n"
327+ "okicon.image = \"../images/green.png\";\n"
328+ "marker = new GMarker(point,okicon);\n"
329+ "} else {\n"
330+ "marker = new GMarker(point);\n"
331+ "}\n"
332+
333+ "GEvent.addListener(marker, \"click\", function() { \n"
334+ "marker.openInfoWindowHtml(\"<b>\"+hostname+\"</b><br>\"+comment+\"<br>State: \"+state+\"\");\n"
335+ "});\n"
336+ "return marker;\n"
337+ "}\n"
338+
339+ "function load() {\n"
340+ "if (GBrowserIsCompatible()) {\n"
341+ "var map = new GMap2(document.getElementById(\"map\"));\n"
342+ "map.addControl(new GSmallMapControl());\n"
343+ "map.addControl(new GMapTypeControl());\n"
344+
345+ "GEvent.addListener(map, \"click\", function () {\n"
346+ "setMapCookie(map);\n"
347+ "});\n"
348+
349+ "GEvent.addListener(map, \"move\", function () {\n"
350+ "setMapCookie(map);\n"
351+ "});\n"
352+
353+ "GEvent.addListener(map, \"zoom\", function () {\n"
354+ "setMapCookie(map);\n"
355+ "});\n"
356+
357+ "var googlemaplat = readCookie('googlemaplat');\n"
358+ "var googlemaplng = readCookie('googlemaplng');\n"
359+
360+ "var centerPoint;\n"
361+ "if( googlemaplng!=null && googlemaplat!=null ) \n"
362+ "centerPoint = new GLatLng(googlemaplat,googlemaplng);\n"
363+ "else\n");
364+ printf("centerPoint = new GLatLng(%s,%s);\n",gen_loc.latitude,gen_loc.longitude);
365+
366+ printf("var zoom = map.getZoom();\n"
367+ "document.layoutform.scaling_factor.value=+zoom;\n");
368+
369+
b7e814c5 370+ if (user_supplied_scaling==TRUE)
6442e2ee
ER
371+ {
372+ printf("map.setCenter(centerPoint, %2.1f);\n",user_scaling_factor);
373+ printf("document.layoutform.scaling_factor.value=%2.1f;\n",user_scaling_factor);
374+ } else {
375+ printf("var googlemapzoom = readCookie('googlemapzoom');\n"
376+ "if ( googlemapzoom != null ) \n"
377+ "{\n"
378+ "map.setCenter(centerPoint,parseInt(googlemapzoom));\n"
379+ "document.layoutform.scaling_factor.value=googlemapzoom;\n"
380+ "} else\n"
381+ "{\n");
382+ printf("map.setCenter(centerPoint, %s);\n",gen_loc.zoom);
383+ printf("document.layoutform.scaling_factor.value=%s;\n",gen_loc.zoom);
384+ printf("}\n");
385+ user_scaling_factor = atof(gen_loc.zoom);
386+ }
387+
388+ loc = loc_list;
389+ while (loc) {
390+ // check if allowed to show hostname first
391+ host* temp_host=find_host(loc->name);
392+ int in_layer_list=FALSE;
393+ in_layer_list=is_host_in_layer_list(temp_host);
394+
395+ if ( !is_authorized_for_host(temp_host,&current_authdata) && !is_host_in_layer_list(temp_host)) {
396+ loc = loc->next;
397+ continue;
398+ } else {
399+ if((in_layer_list==TRUE && exclude_layers==TRUE) || (in_layer_list==FALSE && exclude_layers==FALSE))
400+ {
401+ loc = loc->next;
402+ continue;
403+ }
404+ ptr = get_status_code(loc->name);
405+ strcpy(stateinfo,ptr);
406+ free(ptr);
407+
408+
409+ printf("map.addOverlay(createMarker('%s','",loc->name);
410+ ptr = loc->note;
411+ while ((ch = *ptr++)) {
412+ if (ch == '\'') printf("\\'");
413+ else printf("%c", ch);
414+ }
415+ printf("',%s,%s,'%s'))\n",loc->latitude,loc->longitude,stateinfo);
416+
417+ loc = loc->next;
418+ }
419+ }
420+
421+ printf("}\n"
422+ "}\n"
423+ "//]]>\n"
424+ "</script>\n");
425+}
426
427 /* write JavaScript code an layer for popup window */
428 void write_popup_code(void){
This page took 0.139173 seconds and 4 git commands to generate.