1 --- nagios-4.2.1/cgi/statusmap.c~ 2016-09-07 19:23:29.000000000 +0300
2 +++ nagios-4.2.1/cgi/statusmap.c 2016-09-07 19:24:13.969747452 +0300
5 *****************************************************************************/
11 #include "../include/config.h"
12 #include "../include/common.h"
13 #include "../include/objects.h"
14 @@ -92,6 +92,7 @@ extern int default_statusmap_layout_meth
15 #define LAYOUT_CIRCULAR 4
16 #define LAYOUT_CIRCULAR_MARKUP 5
17 #define LAYOUT_CIRCULAR_BALLOON 6
18 +#define LAYOUT_GOOGLEMAP 7
22 @@ -99,6 +100,20 @@ struct layer {
31 + struct location_t* next;
34 +struct general_location_t {
41 void document_header(int);
42 void document_footer(void);
44 void draw_background_image(void);
45 void draw_background_extras(void);
46 void draw_host_links(void);
48 +void google_map(void);
49 +void write_google_head_code(void);
51 void draw_hosts(void);
52 void draw_host_text(char *,int,int);
53 void draw_text(char *,int,int,int);
55 /* initialize macros */
59 - document_header(TRUE);
61 /* get authentication information */
62 get_authentication_information(¤t_authdata);
64 + document_header(TRUE);
66 /* display the network map... */
71 /* write JavaScript code for popup window */
73 + if (layout_method == LAYOUT_GOOGLEMAP)
74 + write_google_head_code();
78 + if (layout_method == LAYOUT_GOOGLEMAP) {
79 + printf("<body onload='load()' onunload='GUnload()' CLASS='statusmap' name='mappage' id='mappage'>\n");
81 printf("<body CLASS='statusmap' name='mappage' id='mappage'>\n");
83 /* include user SSI header */
85 printf("<td align=right valign=top>\n");
87 #ifdef LEGACY_GRAPHICAL_CGIS
88 - printf("<form method=\"POST\" action=\"%s\">\n", STATUSMAP_CGI);
89 + printf("<form name=\"layoutform\" method=\"POST\" action=\"%s\">\n", STATUSMAP_CGI);
91 - printf("<form method=\"POST\" action=\"%s\">\n", LEGACY_STATUSMAP_CGI);
92 + printf("<form name=\"layoutform\" method=\"POST\" action=\"%s\">\n", LEGACY_STATUSMAP_CGI);
94 printf("<table border=0 CLASS='optBox'>\n");
95 printf("<tr><td valign=top>\n");
97 printf("<option value=%d %s>Circular\n", LAYOUT_CIRCULAR, (layout_method == LAYOUT_CIRCULAR) ? "selected" : "");
98 printf("<option value=%d %s>Circular (Marked Up)\n", LAYOUT_CIRCULAR_MARKUP, (layout_method == LAYOUT_CIRCULAR_MARKUP) ? "selected" : "");
99 printf("<option value=%d %s>Circular (Balloon)\n", LAYOUT_CIRCULAR_BALLOON, (layout_method == LAYOUT_CIRCULAR_BALLOON) ? "selected" : "");
100 + printf("<option value=%d %s>Googlemap\n", LAYOUT_GOOGLEMAP, (layout_method == LAYOUT_GOOGLEMAP) ? "selected" : "");
101 printf("</select>\n");
103 printf("<td CLASS='optBoxItem'>\n");
105 /* display page header */
106 display_page_header();
108 + if (layout_method==LAYOUT_GOOGLEMAP){
113 initialize_graphics();
114 draw_background_image();
115 draw_background_extras();
116 @@ -1563,10 +1602,19 @@
120 +/* create the googlemap */
121 +void google_map(void){
122 + printf("<!-- Produced by Infoflex Connect AB (http://www.infoflexconnect.se), Fredrik Nilsson and Rujinschi Remus. -->\n");
123 + printf("<P><DIV ALIGN=center>");
124 + printf("<div id='map' style='width: 800px; height: 500px'></div>");
125 + printf("</DIV></P>");
126 + printf("<!-- Produced by Infoflex Connect AB (http://www.infoflexconnect.se), Fredrik Nilsson and Rujinschi Remus. -->\n");
131 void draw_hosts(void) {
136 @@ -1586,6 +1634,8 @@
140 + if (layout_method == LAYOUT_GOOGLEMAP)
143 /* user didn't supply any coordinates for hosts, so display a warning */
144 if(coordinates_were_specified == FALSE) {
145 @@ -2241,6 +2291,197 @@
146 /************************* MISC FUNCTIONS *************************/
147 /******************************************************************/
149 +char* get_status_code(char* name)
152 + hoststatus *temp_status;
153 + temp_status=find_hoststatus(name);
155 + /* strip nasty stuff from plugin output */
156 + sanitize_plugin_output(temp_status->plugin_output);
158 + retVal=malloc(1000);
160 + if(temp_status->status==HOST_DOWN){
161 + strcat(retVal,"Down");
162 + if(temp_status->problem_has_been_acknowledged==TRUE)
163 + strcat(retVal," (Acknowledged)");
164 + strcat(retVal, "");
167 + else if(temp_status->status==HOST_UNREACHABLE){
168 + strcat(retVal, "Unreachable");
169 + if(temp_status->problem_has_been_acknowledged==TRUE)
170 + strcat(retVal, " (Acknowledged)");
171 + strcat(retVal, "");
174 + else if(temp_status->status==HOST_UP)
175 + strcat(retVal, "Up");
177 + else if(temp_status->status==HOST_PENDING)
178 + strcat(retVal, "Pending");
182 +void write_google_head_code(void)
188 + char stateinfo[1024];
196 + struct general_location_t gen_loc;
197 + struct location_t* loc;
198 + struct location_t* loc_list=NULL;
201 +/***************************************
202 + * parse location.cfg
203 + **************************************/
205 + filename = "/etc/webapps/nagios/location.cfg";
206 + if((fp=fopen(filename, "r"))==NULL) {
207 + char* err_mess = "The file: location.cfg does not exist or could not be read";
209 + printf("<font color=\"red\">%s</font>\r\n",err_mess);
214 + while(fgets(buf, sizeof(buf), fp)!=NULL) {
215 + if ( (state == 1) && (buf[0] == '}')) {
216 + // we have reached a definition end
220 + loc->next = loc_list;
228 + if ( (state==2) && (buf[0] == '}')) {
231 + key[0] = value[0] = 0;
232 + if (isspace(buf[0]))
233 + rc = sscanf(buf, "%*[ \t]%[^ \t]%*[ \t]%[^\n]", key, value);
235 + rc = sscanf(buf, "%[^ \t]%*[ \t]%[^\n]", key, value);
238 + if ( (state == 0) && (strcmp(key,"define")==0) ) {
239 + // we have a start of a new definition
241 + // check if it is the default definition
242 + if ( (strncmp(value,"default ",8)==0) ||
243 + (strncmp(value,"default{",8)==0)) {
248 + // declare a new location
249 + loc = calloc(1,sizeof(*loc));
252 + // state 2 == default definition
253 + if ( state == 2 ) {
254 + if ( strcmp(key,"key") == 0) {
255 + gen_loc.key=strdup(value);
257 + if ( strcmp(key,"zoom") == 0) {
258 + gen_loc.zoom=strdup(value);
260 + if ( strcmp(key,"lat") == 0) {
261 + gen_loc.latitude=strdup(value);
263 + if ( strcmp(key,"long") == 0) {
264 + gen_loc.longitude=strdup(value);
267 + // state 1 == location definition
268 + if ( state == 1 ) {
269 + if ( strcmp(key,"host_name") == 0) {
270 + loc->name=strdup(value);
272 + if ( strcmp(key,"notes") == 0) {
273 + loc->note = strdup(value);
275 + if ( strcmp(key,"lat") == 0) {
276 + loc->latitude = strdup(value);
278 + if ( strcmp(key,"long") == 0) {
279 + loc->longitude = strdup(value);
287 + printf("<script type='text/javascript'>\n");
288 + printf("gstatusmap = {\n");
289 + printf("lat:%s,\n", gen_loc.latitude);
290 + printf("lng:%s,\n", gen_loc.longitude);
291 + if (user_supplied_scaling==TRUE) {
292 + printf("scale: '%2.1f',\n", user_scaling_factor);
294 + printf("scale: '%2.1f',\n", gen_loc.zoom);
295 + user_scaling_factor = atof(gen_loc.zoom);
297 + printf("markers: [\n");
301 + // check if allowed to show hostname first
302 + host* temp_host=find_host(loc->name);
303 + int in_layer_list=FALSE;
304 + in_layer_list=is_host_in_layer_list(temp_host);
306 + if ( !is_authorized_for_host(temp_host,¤t_authdata) && !is_host_in_layer_list(temp_host)) {
310 + if((in_layer_list==TRUE && exclude_layers==TRUE) || (in_layer_list==FALSE && exclude_layers==FALSE))
315 + ptr = get_status_code(loc->name);
316 + strcpy(stateinfo,ptr);
320 + printf("['%s','",loc->name);
322 + while ((ch = *ptr++)) {
323 + if (ch == '\'') printf("\\'");
324 + else printf("%c", ch);
326 + printf("',%s,%s,'%s'],\n",loc->latitude,loc->longitude,stateinfo);
333 + printf("images_url: '%s'\n", url_images_path);
335 + printf("</script>\n");
337 + printf("<script src='http://maps.google.com/maps?file=api&v=2&key=%s&sensor=false' type='text/javascript'></script>\n",gen_loc.key);
338 + printf("<script src='%sgooglemap.js' type='text/javascript'></script>\n", url_images_path);
341 /* write JavaScript code an layer for popup window */
342 void write_popup_code(void){