]> git.pld-linux.org Git - packages/nagios.git/blob - nagios-googlemap.patch
- updated to 3.2.2
[packages/nagios.git] / nagios-googlemap.patch
1 --- nagios-3.2.0/cgi/statusmap.c        2009-10-22 18:19:21.913340828 +0300
2 +++ nagios-3.2.0.googlemap/cgi/statusmap.c      2009-10-22 18:19:06.830007817 +0300
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"
14 @@ -93,13 +97,27 @@
15  #define LAYOUT_CIRCULAR                 4
16  #define LAYOUT_CIRCULAR_MARKUP          5
17  #define LAYOUT_CIRCULAR_BALLOON         6
18 -
19 +#define LAYOUT_GOOGLEMAP                               7
20  
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);
43 @@ -117,6 +135,10 @@
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);
54 @@ -288,12 +310,11 @@
55         /* initialize macros */
56         init_macros();
57  
58 -
59 -       document_header(TRUE);
60 -
61         /* get authentication information */
62         get_authentication_information(&current_authdata);
63  
64 +       document_header(TRUE);
65 +
66         /* display the network map... */
67         display_map();
68  
69 @@ -345,9 +366,14 @@
70  
71                 /* write JavaScript code for popup window */
72                 write_popup_code();
73 +               if (layout_method == LAYOUT_GOOGLEMAP)
74 +                       write_google_head_code();
75  
76                 printf("</head>\n");
77                 
78 +               if (layout_method == LAYOUT_GOOGLEMAP) {
79 +                       printf("<body onload='load()' onunload='GUnload()' CLASS='statusmap' name='mappage' id='mappage'>\n");
80 +               } else 
81                 printf("<body CLASS='statusmap' name='mappage' id='mappage'>\n");
82  
83                 /* include user SSI header */
84 @@ -703,7 +729,7 @@
85                 /* right hand column of top row */
86                 printf("<td align=right valign=top>\n");
87  
88 -               printf("<form method=\"POST\" action=\"%s\">\n",STATUSMAP_CGI);
89 +               printf("<form name=\"layoutform\" method=\"POST\" action=\"%s\">\n",STATUSMAP_CGI);
90                 printf("<table border=0 CLASS='optBox'>\n");
91                 printf("<tr><td valign=top>\n");
92                 printf("<input type='hidden' name='host' value='%s'>\n",escape_string(host_name));
93 @@ -725,6 +751,7 @@
94                 printf("<option value=%d %s>Circular\n",LAYOUT_CIRCULAR,(layout_method==LAYOUT_CIRCULAR)?"selected":"");
95                 printf("<option value=%d %s>Circular (Marked Up)\n",LAYOUT_CIRCULAR_MARKUP,(layout_method==LAYOUT_CIRCULAR_MARKUP)?"selected":"");
96                 printf("<option value=%d %s>Circular (Balloon)\n",LAYOUT_CIRCULAR_BALLOON,(layout_method==LAYOUT_CIRCULAR_BALLOON)?"selected":"");
97 +               printf("<option value=%d %s>Googlemap\n",LAYOUT_GOOGLEMAP,(layout_method==LAYOUT_GOOGLEMAP)?"selected":"");
98                 printf("</select>\n");
99                 printf("</td>\n");
100                 printf("<td CLASS='optBoxItem'>\n");
101 @@ -821,6 +848,11 @@
102         /* display page header */
103         display_page_header();
104  
105 +       if (layout_method==LAYOUT_GOOGLEMAP){
106 +               google_map();
107 +               return;
108 +       }
109 +
110         initialize_graphics();
111         draw_background_image();
112         draw_background_extras();
113 @@ -1563,10 +1602,19 @@
114         return;
115          }
116  
117 +/* create the googlemap */
118 +void google_map(void){
119 +       printf("<!-- Produced by Infoflex Connect AB (http://www.infoflexconnect.se), Fredrik Nilsson and Rujinschi Remus. -->\n");
120 +       printf("<P><DIV ALIGN=center>");
121 +       printf("<div id='map' style='width: 800px; height: 500px'></div>");
122 +       printf("</DIV></P>");
123 +       printf("<!-- Produced by Infoflex Connect AB (http://www.infoflexconnect.se), Fredrik Nilsson and Rujinschi Remus. -->\n");
124  
125 +}
126  
127  /* draws hosts */
128  void draw_hosts(void){
129 +       
130         host *temp_host;
131         int x1, x2;
132         int y1, y2;
133 @@ -1586,6 +1634,8 @@
134         int translated_x;
135         int translated_y;
136  
137 +       if (layout_method == LAYOUT_GOOGLEMAP)
138 +               return;
139         
140         /* user didn't supply any coordinates for hosts, so display a warning */
141         if(coordinates_were_specified==FALSE){
142 @@ -2241,6 +2291,197 @@
143  /************************* MISC FUNCTIONS *************************/
144  /******************************************************************/
145  
146 +char* get_status_code(char* name)
147 +{
148 +       char* retVal;
149 +       hoststatus *temp_status;
150 +       temp_status=find_hoststatus(name);
151 +
152 +       /* strip nasty stuff from plugin output */
153 +       sanitize_plugin_output(temp_status->plugin_output);
154 +       
155 +       retVal=malloc(1000);
156 +       retVal[0]=0;
157 +       if(temp_status->status==HOST_DOWN){
158 +               strcat(retVal,"Down");
159 +               if(temp_status->problem_has_been_acknowledged==TRUE)
160 +                       strcat(retVal," (Acknowledged)");
161 +               strcat(retVal, "");
162 +               }
163 +
164 +       else if(temp_status->status==HOST_UNREACHABLE){
165 +               strcat(retVal, "Unreachable");
166 +               if(temp_status->problem_has_been_acknowledged==TRUE)
167 +                       strcat(retVal, " (Acknowledged)");
168 +               strcat(retVal, "");
169 +               }
170 +
171 +       else if(temp_status->status==HOST_UP)
172 +               strcat(retVal, "Up");
173 +
174 +       else if(temp_status->status==HOST_PENDING)
175 +               strcat(retVal, "Pending");
176 +       return retVal;
177 +}
178 +
179 +void write_google_head_code(void)
180 +{
181 +       char ch;
182 +       char* ptr;
183 +       int rc;
184 +       FILE *fp;
185 +       char stateinfo[1024];   
186 +       char line[1024];        
187 +       char key[1024]; 
188 +       char value[1024];       
189 +       char buf[256];
190 +       char* filename;
191 +       int state = 0;
192 +       int counter = 0;
193 +       general_location_t gen_loc;
194 +       location_t* loc;
195 +       location_t* loc_list=NULL;
196 +
197 +
198 +/***************************************
199 + * parse location.cfg
200 + **************************************/
201 +
202 +       filename = "/etc/webapps/nagios/location.cfg";
203 +       if((fp=fopen(filename, "r"))==NULL) {
204 +               char* err_mess = "The file: location.cfg does not exist or could not be read";  
205 +               printf("<p>");
206 +               printf("<font color=\"red\">%s</font>\r\n",err_mess);
207 +               printf("</p>");
208 +               return;
209 +       }
210 +
211 +       while(fgets(buf, sizeof(buf), fp)!=NULL) {
212 +               if ( (state == 1) && (buf[0] == '}')) {
213 +                       // we have reached a definition end
214 +                       state = 0;
215 +                       counter++;
216 +                       if (loc_list) {
217 +                               loc->next = loc_list;
218 +                               loc_list = loc;
219 +                       } else {
220 +                               loc_list = loc;
221 +                       }
222 +                       loc = NULL;
223 +                       continue;
224 +               }       
225 +               if ( (state==2) && (buf[0] == '}')) {
226 +                       state=0;
227 +               }
228 +               key[0] = value[0] = 0;
229 +               if (isspace(buf[0]))
230 +                       rc = sscanf(buf, "%*[ \t]%[^ \t]%*[ \t]%[^\n]", key, value);
231 +               else
232 +                       rc = sscanf(buf, "%[^ \t]%*[ \t]%[^\n]", key, value);
233 +
234 +               if ( (rc == 2)) {
235 +                       if ( (state == 0) &&  (strcmp(key,"define")==0) ) {
236 +                               // we have a start of a new definition
237 +
238 +                               // check if it is the default definition
239 +                               if ( (strncmp(value,"default ",8)==0) ||
240 +                                               (strncmp(value,"default{",8)==0)) {
241 +                                       state=2;
242 +                                       continue;
243 +                               }
244 +                               state = 1;
245 +                               // declare a new location
246 +                               loc = calloc(1,sizeof(*loc));
247 +                               continue;
248 +                       }
249 +                       // state 2 == default definition
250 +                       if ( state == 2 ) {
251 +                               if ( strcmp(key,"key") == 0) {
252 +                                       gen_loc.key=strdup(value);
253 +                               }
254 +                               if ( strcmp(key,"zoom") == 0) {
255 +                                       gen_loc.zoom=strdup(value);
256 +                               }
257 +                               if ( strcmp(key,"lat") == 0) {
258 +                                       gen_loc.latitude=strdup(value);
259 +                               }
260 +                               if ( strcmp(key,"long") == 0) {
261 +                                       gen_loc.longitude=strdup(value);
262 +                               }
263 +                       }
264 +                       // state 1 == location definition
265 +                       if ( state == 1 ) {
266 +                               if ( strcmp(key,"host_name") == 0) {
267 +                                       loc->name=strdup(value);
268 +                               }
269 +                               if ( strcmp(key,"notes") == 0) {
270 +                                       loc->note = strdup(value);
271 +                               }
272 +                               if ( strcmp(key,"lat") == 0) {
273 +                                       loc->latitude = strdup(value);
274 +                               }
275 +                               if ( strcmp(key,"long") == 0) {
276 +                                       loc->longitude = strdup(value);
277 +                               }
278 +                       }
279 +               }
280 +       }
281 +       fclose(fp);
282 +
283 +
284 +       printf("<script type='text/javascript'>\n");
285 +       printf("gstatusmap = {\n");
286 +       printf("lat:%s,\n", gen_loc.latitude);
287 +       printf("lng:%s,\n", gen_loc.longitude);
288 +       if (user_supplied_scaling==TRUE) {
289 +               printf("scale: '%2.1f',\n", user_scaling_factor);
290 +       } else {
291 +               printf("scale: '%2.1f',\n", gen_loc.zoom);
292 +               user_scaling_factor = atof(gen_loc.zoom);
293 +       }
294 +       printf("markers: [\n");
295 +
296 +       loc = loc_list;
297 +       while (loc) {
298 +               // check if allowed to show hostname first
299 +               host* temp_host=find_host(loc->name);
300 +               int in_layer_list=FALSE;
301 +               in_layer_list=is_host_in_layer_list(temp_host);
302 +
303 +               if ( !is_authorized_for_host(temp_host,&current_authdata) && !is_host_in_layer_list(temp_host)) {
304 +                       loc = loc->next;        
305 +                       continue;
306 +               } else {
307 +                       if((in_layer_list==TRUE && exclude_layers==TRUE) || (in_layer_list==FALSE && exclude_layers==FALSE))
308 +                       {
309 +                               loc = loc->next;        
310 +                               continue;
311 +                       }
312 +                       ptr = get_status_code(loc->name);       
313 +                       strcpy(stateinfo,ptr);
314 +                       free(ptr);
315 +
316 +       
317 +                       printf("['%s','",loc->name);
318 +                       ptr = loc->note;
319 +                       while ((ch = *ptr++)) {
320 +                               if (ch == '\'') printf("\\'");
321 +                               else printf("%c", ch);
322 +                       }
323 +                       printf("',%s,%s,'%s'],\n",loc->latitude,loc->longitude,stateinfo);
324 +
325 +                       loc = loc->next;
326 +               }
327 +       }
328 +
329 +       printf("0], \n");
330 +       printf("images_url: '%s'\n", url_images_path);
331 +       printf("};\n");
332 +       printf("</script>\n");
333 +
334 +       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);
335 +       printf("<script src='%sgooglemap.js' type='text/javascript'></script>\n", url_images_path);
336 +}
337  
338  /* write JavaScript code an layer for popup window */
339  void write_popup_code(void){
This page took 0.080545 seconds and 3 git commands to generate.