![]() |
Icinga-core 1.4.0
next gen monitoring
|
00001 /************************************************************************** 00002 * 00003 * SUMMARY.C - Icinga Alert Summary CGI 00004 * 00005 * Copyright (c) 2002-2008 Ethan Galstad (egalstad@nagios.org) 00006 * Copyright (c) 2009-2011 Icinga Development Team (http://www.icinga.org) 00007 * 00008 * License: 00009 * 00010 * This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License version 2 as 00012 * published by the Free Software Foundation. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00022 *************************************************************************/ 00023 00024 #include "../include/config.h" 00025 #include "../include/common.h" 00026 #include "../include/objects.h" 00027 #include "../include/comments.h" 00028 #include "../include/statusdata.h" 00029 00030 #include "../include/cgiutils.h" 00031 #include "../include/getcgi.h" 00032 #include "../include/cgiauth.h" 00033 00034 00035 extern char main_config_file[MAX_FILENAME_LENGTH]; 00036 extern char url_html_path[MAX_FILENAME_LENGTH]; 00037 extern char url_images_path[MAX_FILENAME_LENGTH]; 00038 extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; 00039 extern char url_js_path[MAX_FILENAME_LENGTH]; 00040 00041 extern host *host_list; 00042 extern hostgroup *hostgroup_list; 00043 extern service *service_list; 00044 extern servicegroup *servicegroup_list; 00045 extern logentry *entry_list; 00046 00047 extern int log_rotation_method; 00048 00049 00050 /* custom report types */ 00051 #define REPORT_NONE 0 00052 #define REPORT_RECENT_ALERTS 1 00053 #define REPORT_ALERT_TOTALS 2 00054 #define REPORT_TOP_ALERTS 3 00055 #define REPORT_HOSTGROUP_ALERT_TOTALS 4 00056 #define REPORT_HOST_ALERT_TOTALS 5 00057 #define REPORT_SERVICE_ALERT_TOTALS 6 00058 #define REPORT_SERVICEGROUP_ALERT_TOTALS 7 00059 00060 /* standard report types */ 00061 #define SREPORT_NONE 0 00062 #define SREPORT_RECENT_ALERTS 1 00063 #define SREPORT_RECENT_HOST_ALERTS 2 00064 #define SREPORT_RECENT_SERVICE_ALERTS 3 00065 #define SREPORT_TOP_HOST_ALERTS 4 00066 #define SREPORT_TOP_SERVICE_ALERTS 5 00067 00068 #define AE_SOFT_STATE 1 00069 #define AE_HARD_STATE 2 00070 00071 #define AE_HOST_ALERT 1 00072 #define AE_SERVICE_ALERT 2 00073 00074 #define AE_HOST_PRODUCER 1 00075 #define AE_SERVICE_PRODUCER 2 00076 00077 #define AE_HOST_DOWN 1 00078 #define AE_HOST_UNREACHABLE 2 00079 #define AE_HOST_UP 4 00080 #define AE_SERVICE_WARNING 8 00081 #define AE_SERVICE_UNKNOWN 16 00082 #define AE_SERVICE_CRITICAL 32 00083 #define AE_SERVICE_OK 64 00084 00085 typedef struct archived_event_struct{ 00086 time_t time_stamp; 00087 int event_type; 00088 int entry_type; 00089 char *host_name; 00090 char *service_description; 00091 int state; 00092 int state_type; 00093 char *event_info; 00094 struct archived_event_struct *next; 00095 }archived_event; 00096 00097 typedef struct alert_producer_struct{ 00098 int producer_type; 00099 char *host_name; 00100 char *service_description; 00101 int total_alerts; 00102 struct alert_producer_struct *next; 00103 }alert_producer; 00104 00105 void read_archived_event_data(void); 00106 void scan_log_file_for_archived_event_data(char *); 00107 void compute_report_times(void); 00108 void determine_standard_report_options(void); 00109 void add_archived_event(int,time_t,int,int,char *,char *,char *); 00110 alert_producer *find_producer(int,char *,char *); 00111 alert_producer *add_producer(int,char *,char *); 00112 void free_event_list(void); 00113 void free_producer_list(void); 00114 00115 void sort_archive_states(void); 00116 00117 void display_report(void); 00118 void display_recent_alerts(void); 00119 void display_top_alerts(void); 00120 void display_alerts(void); 00121 00122 int process_cgivars(void); 00123 00124 archived_event *event_list=NULL; 00125 alert_producer *producer_list=NULL; 00126 00127 authdata current_authdata; 00128 00129 time_t t1; 00130 time_t t2; 00131 00132 int start_second=0; 00133 int start_minute=0; 00134 int start_hour=0; 00135 int start_day=1; 00136 int start_month=1; 00137 int start_year=2000; 00138 int end_second=0; 00139 int end_minute=0; 00140 int end_hour=24; 00141 int end_day=1; 00142 int end_month=1; 00143 int end_year=2000; 00144 00145 int compute_time_from_parts=FALSE; 00146 int timeperiod_type=TIMEPERIOD_CUSTOM; 00147 00148 int state_types=AE_HARD_STATE+AE_SOFT_STATE; 00149 int alert_types=AE_HOST_ALERT+AE_SERVICE_ALERT; 00150 int host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE; 00151 int service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL; 00152 00153 char *target_hostgroup_name=""; 00154 char *target_servicegroup_name=""; 00155 char *target_host_name=""; 00156 host *target_host=NULL; 00157 hostgroup *target_hostgroup=NULL; 00158 service *target_service=NULL; 00159 servicegroup *target_servicegroup=NULL; 00160 00161 int earliest_archive=0; 00162 int item_limit=25; 00163 int total_items=0; 00164 00165 extern int embedded; 00166 extern int display_header; 00167 extern int daemon_check; 00168 extern int content_type; 00169 00170 extern char *csv_delimiter; 00171 extern char *csv_data_enclosure; 00172 00173 int json_list_start=TRUE; 00174 00175 int display_type=REPORT_RECENT_ALERTS; 00176 int show_all_hosts=TRUE; 00177 int show_all_hostgroups=TRUE; 00178 int show_all_servicegroups=TRUE; 00179 00180 char *host_name=NULL; 00181 char *host_filter=NULL; 00182 char *hostgroup_name=NULL; 00183 char *servicegroup_name=NULL; 00184 char *service_desc=NULL; 00185 char *service_filter=NULL; 00186 00187 int standard_report=SREPORT_NONE; 00188 int generate_report=FALSE; 00189 00190 int CGI_ID=SUMMARY_CGI_ID; 00191 00192 int main(int argc, char **argv){ 00193 int result=OK; 00194 char temp_buffer[MAX_INPUT_BUFFER]; 00195 char start_timestring[MAX_DATETIME_LENGTH]; 00196 char end_timestring[MAX_DATETIME_LENGTH]; 00197 host *temp_host; 00198 int days, hours, minutes, seconds; 00199 hostgroup *temp_hostgroup; 00200 servicegroup *temp_servicegroup; 00201 time_t t3; 00202 time_t current_time; 00203 struct tm *t; 00204 int x; 00205 00206 /* reset internal CGI variables */ 00207 reset_cgi_vars(); 00208 00209 /* read the CGI configuration file */ 00210 result=read_cgi_config_file(get_cgi_config_location()); 00211 if(result==ERROR){ 00212 document_header(CGI_ID,FALSE); 00213 print_error(get_cgi_config_location(), ERROR_CGI_CFG_FILE); 00214 document_footer(CGI_ID); 00215 return ERROR; 00216 } 00217 00218 /* read the main configuration file */ 00219 result=read_main_config_file(main_config_file); 00220 if(result==ERROR){ 00221 document_header(CGI_ID,FALSE); 00222 print_error(main_config_file, ERROR_CGI_MAIN_CFG); 00223 document_footer(CGI_ID); 00224 return ERROR; 00225 } 00226 00227 /* read all object configuration data */ 00228 result=read_all_object_configuration_data(main_config_file,READ_ALL_OBJECT_DATA); 00229 if(result==ERROR){ 00230 document_header(CGI_ID,FALSE); 00231 print_error(NULL, ERROR_CGI_OBJECT_DATA); 00232 document_footer(CGI_ID); 00233 return ERROR; 00234 } 00235 00236 /* initialize report time period to last 24 hours */ 00237 time(&t2); 00238 t1=(time_t)(t2-(60*60*24)); 00239 00240 /* get the arguments passed in the URL */ 00241 process_cgivars(); 00242 00243 document_header(CGI_ID,TRUE); 00244 00245 /* get authentication information */ 00246 get_authentication_information(¤t_authdata); 00247 00248 if(standard_report!=SREPORT_NONE) 00249 determine_standard_report_options(); 00250 00251 if(compute_time_from_parts==TRUE) 00252 compute_report_times(); 00253 00254 /* make sure times are sane, otherwise swap them */ 00255 if(t2<t1){ 00256 t3=t2; 00257 t2=t1; 00258 t1=t3; 00259 } 00260 00261 if(display_header==TRUE){ 00262 00263 /* begin top table */ 00264 printf("<table border=0 width=100%% cellspacing=0 cellpadding=0>\n"); 00265 printf("<tr>\n"); 00266 00267 /* left column of the first row */ 00268 printf("<td align=left valign=top width=33%%>\n"); 00269 00270 snprintf(temp_buffer,sizeof(temp_buffer)-1,"Alert Summary Report"); 00271 temp_buffer[sizeof(temp_buffer)-1]='\x0'; 00272 display_info_table(temp_buffer,FALSE,¤t_authdata, daemon_check); 00273 00274 printf("</td>\n"); 00275 00276 /* center column of top row */ 00277 printf("<td align=center valign=top width=33%%>\n"); 00278 00279 if(generate_report==TRUE){ 00280 00281 printf("<DIV ALIGN=CENTER CLASS='dataTitle'>\n"); 00282 if(display_type==REPORT_TOP_ALERTS) 00283 printf("Top Alert Producers"); 00284 else if(display_type==REPORT_ALERT_TOTALS || display_type==REPORT_HOSTGROUP_ALERT_TOTALS || display_type==REPORT_SERVICEGROUP_ALERT_TOTALS || display_type==REPORT_HOST_ALERT_TOTALS || display_type==REPORT_SERVICE_ALERT_TOTALS) 00285 printf("Alert Totals"); 00286 else 00287 printf("Most Recent Alerts"); 00288 00289 if(show_all_hostgroups==FALSE) 00290 printf(" For Hostgroup '%s'",target_hostgroup_name); 00291 else if(show_all_servicegroups==FALSE) 00292 printf(" For Servicegroup '%s'",target_servicegroup_name); 00293 else if(show_all_hosts==FALSE) 00294 printf(" For Host '%s'",target_host_name); 00295 00296 printf("</DIV>\n"); 00297 00298 printf("<BR>\n"); 00299 00300 get_time_string(&t1,start_timestring,sizeof(start_timestring)-1,SHORT_DATE_TIME); 00301 get_time_string(&t2,end_timestring,sizeof(end_timestring)-1,SHORT_DATE_TIME); 00302 printf("<div align=center class='reportRange'>%s to %s</div>\n",start_timestring,end_timestring); 00303 00304 get_time_breakdown((time_t)(t2-t1),&days,&hours,&minutes,&seconds); 00305 printf("<div align=center class='reportDuration'>Duration: %dd %dh %dm %ds</div>\n",days,hours,minutes,seconds); 00306 } 00307 00308 printf("</td>\n"); 00309 00310 /* right hand column of top row */ 00311 printf("<td align=right valign=bottom width=33%%>\n"); 00312 00313 if(generate_report==TRUE){ 00314 00315 printf("<table border=0>\n"); 00316 00317 printf("<tr>\n"); 00318 printf("<td valign=top align=left class='optBoxTitle' colspan=2>Report Options Summary:</td>\n"); 00319 printf("</tr>\n"); 00320 00321 printf("<tr>\n"); 00322 printf("<td valign=top align=left class='optBoxItem'>Alert Types:</td>\n"); 00323 printf("<td valign=top align=left class='optBoxValue'>\n"); 00324 if(alert_types & AE_HOST_ALERT) 00325 printf("Host"); 00326 if(alert_types & AE_SERVICE_ALERT) 00327 printf("%sService",(alert_types & AE_HOST_ALERT)?" & ":""); 00328 printf(" Alerts</td>\n"); 00329 printf("</tr>\n"); 00330 00331 printf("<tr>\n"); 00332 printf("<td valign=top align=left class='optBoxItem'>State Types:</td>\n"); 00333 printf("<td valign=top align=left class='optBoxValue'>"); 00334 if(state_types & AE_SOFT_STATE) 00335 printf("Soft"); 00336 if(state_types & AE_HARD_STATE) 00337 printf("%sHard",(state_types & AE_SOFT_STATE)?" & ":""); 00338 printf(" States</td>\n"); 00339 printf("</tr>\n"); 00340 00341 printf("<tr>\n"); 00342 printf("<td valign=top align=left class='optBoxItem'>Host States:</td>\n"); 00343 printf("<td valign=top align=left class='optBoxValue'>"); 00344 x=0; 00345 if(host_states & AE_HOST_UP){ 00346 printf("Up"); 00347 x=1; 00348 } 00349 if(host_states & AE_HOST_DOWN){ 00350 printf("%sDown",(x==1)?", ":""); 00351 x=1; 00352 } 00353 if(host_states & AE_HOST_UNREACHABLE) 00354 printf("%sUnreachable",(x==1)?", ":""); 00355 if(x==0) 00356 printf("None"); 00357 printf("</td>\n"); 00358 printf("</tr>\n"); 00359 00360 printf("<tr>\n"); 00361 printf("<td valign=top align=left class='optBoxItem'>Service States:</td>\n"); 00362 printf("<td valign=top align=left class='optBoxValue'>"); 00363 x=0; 00364 if(service_states & AE_SERVICE_OK){ 00365 printf("Ok"); 00366 x=1; 00367 } 00368 if(service_states & AE_SERVICE_WARNING){ 00369 printf("%sWarning",(x==1)?", ":""); 00370 x=1; 00371 } 00372 if(service_states & AE_SERVICE_UNKNOWN){ 00373 printf("%sUnknown",(x==1)?", ":""); 00374 x=1; 00375 } 00376 if(service_states & AE_SERVICE_CRITICAL) 00377 printf("%sCritical",(x==1)?", ":""); 00378 if(x==0) 00379 printf("None"); 00380 printf("</td>\n"); 00381 printf("</tr>\n"); 00382 00383 printf("<tr>\n"); 00384 printf("<td valign=top align=left colspan=2 class='optBoxItem'>\n"); 00385 printf("<form action='%s' method='GET'>\n",SUMMARY_CGI); 00386 printf("<input type='submit' name='btnSubmit' value='Generate New Report'>\n"); 00387 printf("</form>\n"); 00388 printf("</td>\n"); 00389 printf("</tr>\n"); 00390 00391 /* display context-sensitive help */ 00392 printf("<tr><td></td><td align=right valign=bottom>\n"); 00393 if(display_type==REPORT_TOP_ALERTS) 00394 display_context_help(CONTEXTHELP_SUMMARY_ALERT_PRODUCERS); 00395 else if(display_type==REPORT_ALERT_TOTALS) 00396 display_context_help(CONTEXTHELP_SUMMARY_ALERT_TOTALS); 00397 else if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) 00398 display_context_help(CONTEXTHELP_SUMMARY_HOSTGROUP_ALERT_TOTALS); 00399 else if(display_type==REPORT_HOST_ALERT_TOTALS) 00400 display_context_help(CONTEXTHELP_SUMMARY_HOST_ALERT_TOTALS); 00401 else if(display_type==REPORT_SERVICE_ALERT_TOTALS) 00402 display_context_help(CONTEXTHELP_SUMMARY_SERVICE_ALERT_TOTALS); 00403 else if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) 00404 display_context_help(CONTEXTHELP_SUMMARY_SERVICEGROUP_ALERT_TOTALS); 00405 else 00406 display_context_help(CONTEXTHELP_SUMMARY_RECENT_ALERTS); 00407 printf("</td></tr>\n"); 00408 00409 printf("</table>\n"); 00410 } 00411 00412 else{ 00413 printf("<table border=0>\n"); 00414 00415 printf("<tr><td></td><td align=right valign=bottom>\n"); 00416 display_context_help(CONTEXTHELP_SUMMARY_MENU); 00417 printf("</td></tr>\n"); 00418 00419 printf("</table>\n"); 00420 } 00421 00422 printf("</td>\n"); 00423 00424 /* end of top table */ 00425 printf("</tr>\n"); 00426 printf("</table>\n"); 00427 } 00428 00429 00430 /*********************************/ 00431 /****** GENERATE THE REPORT ******/ 00432 /*********************************/ 00433 00434 if(generate_report==TRUE){ 00435 read_archived_event_data(); 00436 display_report(); 00437 } 00438 00439 /* ask user for report options */ 00440 else{ 00441 00442 time(¤t_time); 00443 t=localtime(¤t_time); 00444 00445 start_day=1; 00446 start_year=t->tm_year+1900; 00447 end_day=t->tm_mday; 00448 end_year=t->tm_year+1900; 00449 00450 printf("<DIV ALIGN=CENTER CLASS='dateSelectTitle'>Standard Reports:</DIV>\n"); 00451 printf("<DIV ALIGN=CENTER>\n"); 00452 printf("<form method=\"get\" action=\"%s\">\n",SUMMARY_CGI); 00453 00454 printf("<input type='hidden' name='report' value='1'>\n"); 00455 00456 printf("<table border=0 cellpadding=5>\n"); 00457 00458 printf("<tr><td class='reportSelectSubTitle' align=right>Report Type:</td>\n"); 00459 printf("<td class='reportSelectItem'>\n"); 00460 printf("<select name='standardreport'>\n"); 00461 printf("<option value=%d>25 Most Recent Hard Alerts\n",SREPORT_RECENT_ALERTS); 00462 printf("<option value=%d>25 Most Recent Hard Host Alerts\n",SREPORT_RECENT_HOST_ALERTS); 00463 printf("<option value=%d>25 Most Recent Hard Service Alerts\n",SREPORT_RECENT_SERVICE_ALERTS); 00464 printf("<option value=%d>Top 25 Hard Host Alert Producers\n",SREPORT_TOP_HOST_ALERTS); 00465 printf("<option value=%d>Top 25 Hard Service Alert Producers\n",SREPORT_TOP_SERVICE_ALERTS); 00466 printf("</select>\n"); 00467 printf("</td></tr>\n"); 00468 00469 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Create Summary Report!'></td></tr>\n"); 00470 00471 printf("</table>\n"); 00472 00473 printf("</form>\n"); 00474 printf("</DIV>\n"); 00475 00476 printf("<DIV ALIGN=CENTER CLASS='dateSelectTitle'>Custom Report Options:</DIV>\n"); 00477 printf("<DIV ALIGN=CENTER>\n"); 00478 printf("<form method=\"get\" action=\"%s\">\n",SUMMARY_CGI); 00479 00480 printf("<input type='hidden' name='report' value='1'>\n"); 00481 00482 printf("<table border=0 cellpadding=5>\n"); 00483 00484 printf("<tr><td class='reportSelectSubTitle' align=right>Report Type:</td>\n"); 00485 printf("<td class='reportSelectItem'>\n"); 00486 printf("<select name='displaytype'>\n"); 00487 printf("<option value=%d>Most Recent Alerts\n",REPORT_RECENT_ALERTS); 00488 printf("<option value=%d>Alert Totals\n",REPORT_ALERT_TOTALS); 00489 printf("<option value=%d>Alert Totals By Hostgroup\n",REPORT_HOSTGROUP_ALERT_TOTALS); 00490 printf("<option value=%d>Alert Totals By Host\n",REPORT_HOST_ALERT_TOTALS); 00491 printf("<option value=%d>Alert Totals By Servicegroup\n",REPORT_SERVICEGROUP_ALERT_TOTALS); 00492 printf("<option value=%d>Alert Totals By Service\n",REPORT_SERVICE_ALERT_TOTALS); 00493 printf("<option value=%d>Top Alert Producers\n",REPORT_TOP_ALERTS); 00494 printf("</select>\n"); 00495 printf("</td></tr>\n"); 00496 00497 printf("<tr>"); 00498 printf("<td valign=top class='reportSelectSubTitle'>Report Period:</td>\n"); 00499 printf("<td valign=top align=left class='optBoxItem'>\n"); 00500 printf("<select name='timeperiod'>\n"); 00501 printf("<option value=today>Today\n"); 00502 printf("<option value=last24hours>Last 24 Hours\n"); 00503 printf("<option value=yesterday>Yesterday\n"); 00504 printf("<option value=thisweek>This Week\n"); 00505 printf("<option value=last7days SELECTED>Last 7 Days\n"); 00506 printf("<option value=lastweek>Last Week\n"); 00507 printf("<option value=thismonth>This Month\n"); 00508 printf("<option value=last31days>Last 31 Days\n"); 00509 printf("<option value=lastmonth>Last Month\n"); 00510 printf("<option value=thisyear>This Year\n"); 00511 printf("<option value=lastyear>Last Year\n"); 00512 printf("<option value=custom>* CUSTOM REPORT PERIOD *\n"); 00513 printf("</select>\n"); 00514 printf("</td>\n"); 00515 printf("</tr>\n"); 00516 00517 printf("<tr><td valign=top class='reportSelectSubTitle'>If Custom Report Period...</td></tr>\n"); 00518 00519 printf("<tr>"); 00520 printf("<td valign=top class='reportSelectSubTitle'>Start Date (Inclusive):</td>\n"); 00521 printf("<td align=left valign=top class='reportSelectItem'>"); 00522 printf("<select name='smon'>\n"); 00523 printf("<option value='1' %s>January\n",(t->tm_mon==0)?"SELECTED":""); 00524 printf("<option value='2' %s>February\n",(t->tm_mon==1)?"SELECTED":""); 00525 printf("<option value='3' %s>March\n",(t->tm_mon==2)?"SELECTED":""); 00526 printf("<option value='4' %s>April\n",(t->tm_mon==3)?"SELECTED":""); 00527 printf("<option value='5' %s>May\n",(t->tm_mon==4)?"SELECTED":""); 00528 printf("<option value='6' %s>June\n",(t->tm_mon==5)?"SELECTED":""); 00529 printf("<option value='7' %s>July\n",(t->tm_mon==6)?"SELECTED":""); 00530 printf("<option value='8' %s>August\n",(t->tm_mon==7)?"SELECTED":""); 00531 printf("<option value='9' %s>September\n",(t->tm_mon==8)?"SELECTED":""); 00532 printf("<option value='10' %s>October\n",(t->tm_mon==9)?"SELECTED":""); 00533 printf("<option value='11' %s>November\n",(t->tm_mon==10)?"SELECTED":""); 00534 printf("<option value='12' %s>December\n",(t->tm_mon==11)?"SELECTED":""); 00535 printf("</select>\n "); 00536 printf("<input type='text' size='2' maxlength='2' name='sday' value='%d'> ",start_day); 00537 printf("<input type='text' size='4' maxlength='4' name='syear' value='%d'>",start_year); 00538 printf("<input type='hidden' name='shour' value='0'>\n"); 00539 printf("<input type='hidden' name='smin' value='0'>\n"); 00540 printf("<input type='hidden' name='ssec' value='0'>\n"); 00541 printf("</td>\n"); 00542 printf("</tr>\n"); 00543 00544 printf("<tr>"); 00545 printf("<td valign=top class='reportSelectSubTitle'>End Date (Inclusive):</td>\n"); 00546 printf("<td align=left valign=top class='reportSelectItem'>"); 00547 printf("<select name='emon'>\n"); 00548 printf("<option value='1' %s>January\n",(t->tm_mon==0)?"SELECTED":""); 00549 printf("<option value='2' %s>February\n",(t->tm_mon==1)?"SELECTED":""); 00550 printf("<option value='3' %s>March\n",(t->tm_mon==2)?"SELECTED":""); 00551 printf("<option value='4' %s>April\n",(t->tm_mon==3)?"SELECTED":""); 00552 printf("<option value='5' %s>May\n",(t->tm_mon==4)?"SELECTED":""); 00553 printf("<option value='6' %s>June\n",(t->tm_mon==5)?"SELECTED":""); 00554 printf("<option value='7' %s>July\n",(t->tm_mon==6)?"SELECTED":""); 00555 printf("<option value='8' %s>August\n",(t->tm_mon==7)?"SELECTED":""); 00556 printf("<option value='9' %s>September\n",(t->tm_mon==8)?"SELECTED":""); 00557 printf("<option value='10' %s>October\n",(t->tm_mon==9)?"SELECTED":""); 00558 printf("<option value='11' %s>November\n",(t->tm_mon==10)?"SELECTED":""); 00559 printf("<option value='12' %s>December\n",(t->tm_mon==11)?"SELECTED":""); 00560 printf("</select>\n "); 00561 printf("<input type='text' size='2' maxlength='2' name='eday' value='%d'> ",end_day); 00562 printf("<input type='text' size='4' maxlength='4' name='eyear' value='%d'>",end_year); 00563 printf("<input type='hidden' name='ehour' value='24'>\n"); 00564 printf("<input type='hidden' name='emin' value='0'>\n"); 00565 printf("<input type='hidden' name='esec' value='0'>\n"); 00566 printf("</td>\n"); 00567 printf("</tr>\n"); 00568 00569 printf("<tr><td colspan=2><br></td></tr>\n"); 00570 00571 printf("<tr><td class='reportSelectSubTitle' valign=center>Limit To Hostgroup:</td><td align=left valign=center class='reportSelectItem'>\n"); 00572 printf("<select name='hostgroup'>\n"); 00573 printf("<option value='all'>** ALL HOSTGROUPS **\n"); 00574 for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next){ 00575 if(is_authorized_for_hostgroup(temp_hostgroup,¤t_authdata)==TRUE) 00576 printf("<option value='%s'>%s\n",escape_string(temp_hostgroup->group_name),temp_hostgroup->group_name); 00577 } 00578 printf("</select>\n"); 00579 printf("</td></tr>\n"); 00580 00581 printf("<tr><td class='reportSelectSubTitle' valign=center>Limit To Servicegroup:</td><td align=left valign=center class='reportSelectItem'>\n"); 00582 printf("<select name='servicegroup'>\n"); 00583 printf("<option value='all'>** ALL SERVICEGROUPS **\n"); 00584 for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next){ 00585 if(is_authorized_for_servicegroup(temp_servicegroup,¤t_authdata)==TRUE) 00586 printf("<option value='%s'>%s\n",escape_string(temp_servicegroup->group_name),temp_servicegroup->group_name); 00587 } 00588 printf("</select>\n"); 00589 printf("</td></tr>\n"); 00590 00591 printf("<tr><td class='reportSelectSubTitle' valign=center>Limit To Host:</td><td align=left valign=center class='reportSelectItem'>\n"); 00592 printf("<select name='host'>\n"); 00593 printf("<option value='all'>** ALL HOSTS **\n"); 00594 00595 for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next){ 00596 if(is_authorized_for_host(temp_host,¤t_authdata)==TRUE) 00597 printf("<option value='%s'>%s\n",escape_string(temp_host->name),temp_host->name); 00598 } 00599 printf("</select>\n"); 00600 printf("</td></tr>\n"); 00601 00602 printf("<tr><td class='reportSelectSubTitle' align=right>Alert Types:</td>\n"); 00603 printf("<td class='reportSelectItem'>\n"); 00604 printf("<select name='alerttypes'>\n"); 00605 printf("<option value=%d %s>Host and Service Alerts\n",AE_HOST_ALERT+AE_SERVICE_ALERT,(alert_types==AE_HOST_ALERT+AE_SERVICE_ALERT)?"SELECTED":""); 00606 printf("<option value=%d %s>Host Alerts\n",AE_HOST_ALERT,(alert_types==AE_HOST_ALERT)?"SELECTED":""); 00607 printf("<option value=%d %s>Service Alerts\n",AE_SERVICE_ALERT,(alert_types==AE_SERVICE_ALERT)?"SELECTED":""); 00608 printf("</select>\n"); 00609 printf("</td></tr>\n"); 00610 00611 printf("<tr><td class='reportSelectSubTitle' align=right>State Types:</td>\n"); 00612 printf("<td class='reportSelectItem'>\n"); 00613 printf("<select name='statetypes'>\n"); 00614 printf("<option value=%d %s>Hard and Soft States\n",AE_HARD_STATE+AE_SOFT_STATE,(state_types==AE_HARD_STATE+AE_SOFT_STATE)?"SELECTED":""); 00615 printf("<option value=%d %s>Hard States\n",AE_HARD_STATE,(state_types==AE_HARD_STATE)?"SELECTED":""); 00616 printf("<option value=%d %s>Soft States\n",AE_SOFT_STATE,(state_types==AE_SOFT_STATE)?"SELECTED":""); 00617 printf("</select>\n"); 00618 printf("</td></tr>\n"); 00619 00620 printf("<tr><td class='reportSelectSubTitle' align=right>Host States:</td>\n"); 00621 printf("<td class='reportSelectItem'>\n"); 00622 printf("<select name='hoststates'>\n"); 00623 printf("<option value=%d>All Host States\n",AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE); 00624 printf("<option value=%d>Host Problem States\n",AE_HOST_DOWN+AE_HOST_UNREACHABLE); 00625 printf("<option value=%d>Host Up States\n",AE_HOST_UP); 00626 printf("<option value=%d>Host Down States\n",AE_HOST_DOWN); 00627 printf("<option value=%d>Host Unreachable States\n",AE_HOST_UNREACHABLE); 00628 printf("</select>\n"); 00629 printf("</td></tr>\n"); 00630 00631 printf("<tr><td class='reportSelectSubTitle' align=right>Service States:</td>\n"); 00632 printf("<td class='reportSelectItem'>\n"); 00633 printf("<select name='servicestates'>\n"); 00634 printf("<option value=%d>All Service States\n",AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL); 00635 printf("<option value=%d>Service Problem States\n",AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL); 00636 printf("<option value=%d>Service Ok States\n",AE_SERVICE_OK); 00637 printf("<option value=%d>Service Warning States\n",AE_SERVICE_WARNING); 00638 printf("<option value=%d>Service Unknown States\n",AE_SERVICE_UNKNOWN); 00639 printf("<option value=%d>Service Critical States\n",AE_SERVICE_CRITICAL); 00640 printf("</select>\n"); 00641 printf("</td></tr>\n"); 00642 00643 printf("<tr><td class='reportSelectSubTitle' align=right>Max List Items:</td>\n"); 00644 printf("<td class='reportSelectItem'>\n"); 00645 printf("<input type='text' name='limit' size='3' maxlength='3' value='%d'>\n",item_limit); 00646 printf("</td></tr>\n"); 00647 00648 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Create Summary Report!'></td></tr>\n"); 00649 00650 printf("</table>\n"); 00651 00652 printf("</form>\n"); 00653 printf("</DIV>\n"); 00654 } 00655 00656 00657 document_footer(CGI_ID); 00658 00659 /* free all other allocated memory */ 00660 free_memory(); 00661 free_event_list(); 00662 free_producer_list(); 00663 00664 return OK; 00665 } 00666 00667 int process_cgivars(void){ 00668 char **variables; 00669 int error=FALSE; 00670 int x; 00671 00672 variables=getcgivars(); 00673 00674 for(x=0;variables[x]!=NULL;x++){ 00675 00676 /* do some basic length checking on the variable identifier to prevent buffer overflows */ 00677 if(strlen(variables[x])>=MAX_INPUT_BUFFER-1){ 00678 x++; 00679 continue; 00680 } 00681 00682 /* we found first time argument */ 00683 else if(!strcmp(variables[x],"t1")){ 00684 x++; 00685 if(variables[x]==NULL){ 00686 error=TRUE; 00687 break; 00688 } 00689 00690 t1=(time_t)strtoul(variables[x],NULL,10); 00691 timeperiod_type=TIMEPERIOD_CUSTOM; 00692 compute_time_from_parts=FALSE; 00693 } 00694 00695 /* we found first time argument */ 00696 else if(!strcmp(variables[x],"t2")){ 00697 x++; 00698 if(variables[x]==NULL){ 00699 error=TRUE; 00700 break; 00701 } 00702 00703 t2=(time_t)strtoul(variables[x],NULL,10); 00704 timeperiod_type=TIMEPERIOD_CUSTOM; 00705 compute_time_from_parts=FALSE; 00706 } 00707 00708 /* we found the standard timeperiod argument */ 00709 else if(!strcmp(variables[x],"timeperiod")){ 00710 x++; 00711 if(variables[x]==NULL){ 00712 error=TRUE; 00713 break; 00714 } 00715 00716 if(!strcmp(variables[x],"today")) 00717 timeperiod_type=TIMEPERIOD_TODAY; 00718 else if(!strcmp(variables[x],"yesterday")) 00719 timeperiod_type=TIMEPERIOD_YESTERDAY; 00720 else if(!strcmp(variables[x],"thisweek")) 00721 timeperiod_type=TIMEPERIOD_THISWEEK; 00722 else if(!strcmp(variables[x],"lastweek")) 00723 timeperiod_type=TIMEPERIOD_LASTWEEK; 00724 else if(!strcmp(variables[x],"thismonth")) 00725 timeperiod_type=TIMEPERIOD_THISMONTH; 00726 else if(!strcmp(variables[x],"lastmonth")) 00727 timeperiod_type=TIMEPERIOD_LASTMONTH; 00728 else if(!strcmp(variables[x],"thisquarter")) 00729 timeperiod_type=TIMEPERIOD_THISQUARTER; 00730 else if(!strcmp(variables[x],"lastquarter")) 00731 timeperiod_type=TIMEPERIOD_LASTQUARTER; 00732 else if(!strcmp(variables[x],"thisyear")) 00733 timeperiod_type=TIMEPERIOD_THISYEAR; 00734 else if(!strcmp(variables[x],"lastyear")) 00735 timeperiod_type=TIMEPERIOD_LASTYEAR; 00736 else if(!strcmp(variables[x],"last24hours")) 00737 timeperiod_type=TIMEPERIOD_LAST24HOURS; 00738 else if(!strcmp(variables[x],"last7days")) 00739 timeperiod_type=TIMEPERIOD_LAST7DAYS; 00740 else if(!strcmp(variables[x],"last31days")) 00741 timeperiod_type=TIMEPERIOD_LAST31DAYS; 00742 else if(!strcmp(variables[x],"custom")) 00743 timeperiod_type=TIMEPERIOD_CUSTOM; 00744 else 00745 continue; 00746 00747 convert_timeperiod_to_times(timeperiod_type,&t1,&t2); 00748 compute_time_from_parts=FALSE; 00749 } 00750 00751 /* we found the CSV output option */ 00752 else if(!strcmp(variables[x],"csvoutput")){ 00753 display_header=FALSE; 00754 content_type=CSV_CONTENT; 00755 } 00756 00757 /* we found the JSON output option */ 00758 else if(!strcmp(variables[x],"jsonoutput")){ 00759 display_header=FALSE; 00760 content_type=JSON_CONTENT; 00761 } 00762 00763 /* we found the embed option */ 00764 else if(!strcmp(variables[x],"embedded")) 00765 embedded=TRUE; 00766 00767 /* we found the noheader option */ 00768 else if(!strcmp(variables[x],"noheader")) 00769 display_header=FALSE; 00770 00771 /* we found the nodaemoncheck option */ 00772 else if(!strcmp(variables[x],"nodaemoncheck")) 00773 daemon_check=FALSE; 00774 00775 /* we found time argument */ 00776 else if(!strcmp(variables[x],"smon")){ 00777 x++; 00778 if(variables[x]==NULL){ 00779 error=TRUE; 00780 break; 00781 } 00782 00783 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00784 continue; 00785 00786 start_month=atoi(variables[x]); 00787 timeperiod_type=TIMEPERIOD_CUSTOM; 00788 compute_time_from_parts=TRUE; 00789 } 00790 00791 /* we found time argument */ 00792 else if(!strcmp(variables[x],"sday")){ 00793 x++; 00794 if(variables[x]==NULL){ 00795 error=TRUE; 00796 break; 00797 } 00798 00799 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00800 continue; 00801 00802 start_day=atoi(variables[x]); 00803 timeperiod_type=TIMEPERIOD_CUSTOM; 00804 compute_time_from_parts=TRUE; 00805 } 00806 00807 /* we found time argument */ 00808 else if(!strcmp(variables[x],"syear")){ 00809 x++; 00810 if(variables[x]==NULL){ 00811 error=TRUE; 00812 break; 00813 } 00814 00815 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00816 continue; 00817 00818 start_year=atoi(variables[x]); 00819 timeperiod_type=TIMEPERIOD_CUSTOM; 00820 compute_time_from_parts=TRUE; 00821 } 00822 00823 /* we found time argument */ 00824 else if(!strcmp(variables[x],"smin")){ 00825 x++; 00826 if(variables[x]==NULL){ 00827 error=TRUE; 00828 break; 00829 } 00830 00831 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00832 continue; 00833 00834 start_minute=atoi(variables[x]); 00835 timeperiod_type=TIMEPERIOD_CUSTOM; 00836 compute_time_from_parts=TRUE; 00837 } 00838 00839 /* we found time argument */ 00840 else if(!strcmp(variables[x],"ssec")){ 00841 x++; 00842 if(variables[x]==NULL){ 00843 error=TRUE; 00844 break; 00845 } 00846 00847 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00848 continue; 00849 00850 start_second=atoi(variables[x]); 00851 timeperiod_type=TIMEPERIOD_CUSTOM; 00852 compute_time_from_parts=TRUE; 00853 } 00854 00855 /* we found time argument */ 00856 else if(!strcmp(variables[x],"shour")){ 00857 x++; 00858 if(variables[x]==NULL){ 00859 error=TRUE; 00860 break; 00861 } 00862 00863 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00864 continue; 00865 00866 start_hour=atoi(variables[x]); 00867 timeperiod_type=TIMEPERIOD_CUSTOM; 00868 compute_time_from_parts=TRUE; 00869 } 00870 00871 00872 /* we found time argument */ 00873 else if(!strcmp(variables[x],"emon")){ 00874 x++; 00875 if(variables[x]==NULL){ 00876 error=TRUE; 00877 break; 00878 } 00879 00880 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00881 continue; 00882 00883 end_month=atoi(variables[x]); 00884 timeperiod_type=TIMEPERIOD_CUSTOM; 00885 compute_time_from_parts=TRUE; 00886 } 00887 00888 /* we found time argument */ 00889 else if(!strcmp(variables[x],"eday")){ 00890 x++; 00891 if(variables[x]==NULL){ 00892 error=TRUE; 00893 break; 00894 } 00895 00896 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00897 continue; 00898 00899 end_day=atoi(variables[x]); 00900 timeperiod_type=TIMEPERIOD_CUSTOM; 00901 compute_time_from_parts=TRUE; 00902 } 00903 00904 /* we found time argument */ 00905 else if(!strcmp(variables[x],"eyear")){ 00906 x++; 00907 if(variables[x]==NULL){ 00908 error=TRUE; 00909 break; 00910 } 00911 00912 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00913 continue; 00914 00915 end_year=atoi(variables[x]); 00916 timeperiod_type=TIMEPERIOD_CUSTOM; 00917 compute_time_from_parts=TRUE; 00918 } 00919 00920 /* we found time argument */ 00921 else if(!strcmp(variables[x],"emin")){ 00922 x++; 00923 if(variables[x]==NULL){ 00924 error=TRUE; 00925 break; 00926 } 00927 00928 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00929 continue; 00930 00931 end_minute=atoi(variables[x]); 00932 timeperiod_type=TIMEPERIOD_CUSTOM; 00933 compute_time_from_parts=TRUE; 00934 } 00935 00936 /* we found time argument */ 00937 else if(!strcmp(variables[x],"esec")){ 00938 x++; 00939 if(variables[x]==NULL){ 00940 error=TRUE; 00941 break; 00942 } 00943 00944 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00945 continue; 00946 00947 end_second=atoi(variables[x]); 00948 timeperiod_type=TIMEPERIOD_CUSTOM; 00949 compute_time_from_parts=TRUE; 00950 } 00951 00952 /* we found time argument */ 00953 else if(!strcmp(variables[x],"ehour")){ 00954 x++; 00955 if(variables[x]==NULL){ 00956 error=TRUE; 00957 break; 00958 } 00959 00960 if(timeperiod_type!=TIMEPERIOD_CUSTOM) 00961 continue; 00962 00963 end_hour=atoi(variables[x]); 00964 timeperiod_type=TIMEPERIOD_CUSTOM; 00965 compute_time_from_parts=TRUE; 00966 } 00967 00968 /* we found the item limit argument */ 00969 else if(!strcmp(variables[x],"limit")){ 00970 x++; 00971 if(variables[x]==NULL){ 00972 error=TRUE; 00973 break; 00974 } 00975 00976 item_limit=atoi(variables[x]); 00977 } 00978 00979 /* we found the state types argument */ 00980 else if(!strcmp(variables[x],"statetypes")){ 00981 x++; 00982 if(variables[x]==NULL){ 00983 error=TRUE; 00984 break; 00985 } 00986 00987 state_types=atoi(variables[x]); 00988 } 00989 00990 /* we found the alert types argument */ 00991 else if(!strcmp(variables[x],"alerttypes")){ 00992 x++; 00993 if(variables[x]==NULL){ 00994 error=TRUE; 00995 break; 00996 } 00997 00998 alert_types=atoi(variables[x]); 00999 } 01000 01001 /* we found the host states argument */ 01002 else if(!strcmp(variables[x],"hoststates")){ 01003 x++; 01004 if(variables[x]==NULL){ 01005 error=TRUE; 01006 break; 01007 } 01008 01009 host_states=atoi(variables[x]); 01010 } 01011 01012 /* we found the service states argument */ 01013 else if(!strcmp(variables[x],"servicestates")){ 01014 x++; 01015 if(variables[x]==NULL){ 01016 error=TRUE; 01017 break; 01018 } 01019 01020 service_states=atoi(variables[x]); 01021 } 01022 01023 /* we found the generate report argument */ 01024 else if(!strcmp(variables[x],"report")){ 01025 x++; 01026 if(variables[x]==NULL){ 01027 error=TRUE; 01028 break; 01029 } 01030 01031 generate_report=(atoi(variables[x])>0)?TRUE:FALSE; 01032 } 01033 01034 01035 /* we found the display type argument */ 01036 else if(!strcmp(variables[x],"displaytype")){ 01037 x++; 01038 if(variables[x]==NULL){ 01039 error=TRUE; 01040 break; 01041 } 01042 01043 display_type=atoi(variables[x]); 01044 } 01045 01046 /* we found the standard report argument */ 01047 else if(!strcmp(variables[x],"standardreport")){ 01048 x++; 01049 if(variables[x]==NULL){ 01050 error=TRUE; 01051 break; 01052 } 01053 01054 standard_report=atoi(variables[x]); 01055 } 01056 01057 /* we found the hostgroup argument */ 01058 else if(!strcmp(variables[x],"hostgroup")){ 01059 x++; 01060 if(variables[x]==NULL){ 01061 error=TRUE; 01062 break; 01063 } 01064 01065 if((target_hostgroup_name=(char *)strdup(variables[x]))==NULL) 01066 target_hostgroup_name=""; 01067 strip_html_brackets(target_hostgroup_name); 01068 01069 if(!strcmp(target_hostgroup_name,"all")) 01070 show_all_hostgroups=TRUE; 01071 else{ 01072 show_all_hostgroups=FALSE; 01073 target_hostgroup=find_hostgroup(target_hostgroup_name); 01074 } 01075 } 01076 01077 /* we found the servicegroup argument */ 01078 else if(!strcmp(variables[x],"servicegroup")){ 01079 x++; 01080 if(variables[x]==NULL){ 01081 error=TRUE; 01082 break; 01083 } 01084 01085 if((target_servicegroup_name=(char *)strdup(variables[x]))==NULL) 01086 target_servicegroup_name=""; 01087 strip_html_brackets(target_servicegroup_name); 01088 01089 if(!strcmp(target_servicegroup_name,"all")) 01090 show_all_servicegroups=TRUE; 01091 else{ 01092 show_all_servicegroups=FALSE; 01093 target_servicegroup=find_servicegroup(target_servicegroup_name); 01094 } 01095 } 01096 01097 /* we found the host argument */ 01098 else if(!strcmp(variables[x],"host")){ 01099 x++; 01100 if(variables[x]==NULL){ 01101 error=TRUE; 01102 break; 01103 } 01104 01105 if((target_host_name=(char *)strdup(variables[x]))==NULL) 01106 target_host_name=""; 01107 strip_html_brackets(target_host_name); 01108 01109 if(!strcmp(target_host_name,"all")) 01110 show_all_hosts=TRUE; 01111 else{ 01112 show_all_hosts=FALSE; 01113 target_host=find_host(target_host_name); 01114 } 01115 } 01116 } 01117 01118 /* free memory allocated to the CGI variables */ 01119 free_cgivars(variables); 01120 01121 return error; 01122 } 01123 01124 /* reads log files for archived event data */ 01125 void read_archived_event_data(void){ 01126 char filename[MAX_FILENAME_LENGTH]; 01127 int oldest_archive=0; 01128 int newest_archive=0; 01129 int current_archive=0; 01130 01131 /* determine oldest archive to use when scanning for data */ 01132 oldest_archive=determine_archive_to_use_from_time(t1); 01133 01134 /* determine most recent archive to use when scanning for data */ 01135 newest_archive=determine_archive_to_use_from_time(t2); 01136 01137 if(oldest_archive<newest_archive) 01138 oldest_archive=newest_archive; 01139 01140 /* add host filter */ 01141 add_log_filter(LOGENTRY_HOST_UP,LOGFILTER_INCLUDE); 01142 add_log_filter(LOGENTRY_HOST_DOWN,LOGFILTER_INCLUDE); 01143 add_log_filter(LOGENTRY_HOST_UNREACHABLE,LOGFILTER_INCLUDE); 01144 add_log_filter(LOGENTRY_HOST_RECOVERY,LOGFILTER_INCLUDE); 01145 01146 /* add service filter */ 01147 add_log_filter(LOGENTRY_SERVICE_OK,LOGFILTER_INCLUDE); 01148 add_log_filter(LOGENTRY_SERVICE_WARNING,LOGFILTER_INCLUDE); 01149 add_log_filter(LOGENTRY_SERVICE_CRITICAL,LOGFILTER_INCLUDE); 01150 add_log_filter(LOGENTRY_SERVICE_UNKNOWN,LOGFILTER_INCLUDE); 01151 add_log_filter(LOGENTRY_SERVICE_RECOVERY,LOGFILTER_INCLUDE); 01152 01153 /* read in all the necessary archived logs (from most recent to earliest) */ 01154 for(current_archive=newest_archive;current_archive<=oldest_archive;current_archive++){ 01155 01156 /* get the name of the log file that contains this archive */ 01157 get_log_archive_to_use(current_archive,filename,sizeof(filename)-1); 01158 01159 /* scan the log file for archived state data */ 01160 scan_log_file_for_archived_event_data(filename); 01161 } 01162 01163 free_log_filters(); 01164 01165 return; 01166 } 01167 01168 /* grabs archived event data from a log file */ 01169 void scan_log_file_for_archived_event_data(char *filename){ 01170 char entry_host_name[MAX_INPUT_BUFFER]; 01171 char entry_svc_description[MAX_INPUT_BUFFER]; 01172 char *temp_buffer; 01173 char *plugin_output; 01174 int state; 01175 int state_type; 01176 int status; 01177 logentry *temp_entry=NULL; 01178 01179 /* read log entries */ 01180 status=get_log_entries(filename,NULL,FALSE,t1,t2); 01181 01182 if (status==READLOG_OK) { 01183 01184 for(temp_entry=entry_list;temp_entry!=NULL;temp_entry=temp_entry->next) { 01185 01186 /* get the timestamp */ 01187 if(temp_entry->timestamp<t1 || temp_entry->timestamp>t2) 01188 continue; 01189 01190 switch(temp_entry->type){ 01191 01192 /* host alerts */ 01193 case LOGENTRY_HOST_DOWN: 01194 case LOGENTRY_HOST_UNREACHABLE: 01195 case LOGENTRY_HOST_RECOVERY: 01196 case LOGENTRY_HOST_UP: 01197 01198 /* get host name */ 01199 temp_buffer=my_strtok(temp_entry->entry_text,":"); 01200 temp_buffer=my_strtok(NULL,";"); 01201 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name)); 01202 entry_host_name[sizeof(entry_host_name)-1]='\x0'; 01203 01204 /* state type */ 01205 if(strstr(temp_entry->entry_text,";SOFT;")) 01206 state_type=AE_SOFT_STATE; 01207 else 01208 state_type=AE_HARD_STATE; 01209 01210 /* get the plugin output */ 01211 temp_buffer=my_strtok(NULL,";"); 01212 temp_buffer=my_strtok(NULL,";"); 01213 temp_buffer=my_strtok(NULL,";"); 01214 plugin_output=my_strtok(NULL,"\n"); 01215 01216 /* state */ 01217 if(temp_entry->type==LOGENTRY_HOST_DOWN) 01218 state=AE_HOST_DOWN; 01219 else if(temp_entry->type==LOGENTRY_HOST_UNREACHABLE) 01220 state=AE_HOST_UNREACHABLE; 01221 else if(temp_entry->type==LOGENTRY_HOST_RECOVERY || temp_entry->type==LOGENTRY_HOST_UP) 01222 state=AE_HOST_UP; 01223 else 01224 break; 01225 01226 add_archived_event(AE_HOST_ALERT,temp_entry->timestamp,state,state_type,entry_host_name,NULL,plugin_output); 01227 01228 break; 01229 01230 01231 /* service alerts */ 01232 case LOGENTRY_SERVICE_CRITICAL: 01233 case LOGENTRY_SERVICE_WARNING: 01234 case LOGENTRY_SERVICE_UNKNOWN: 01235 case LOGENTRY_SERVICE_RECOVERY: 01236 case LOGENTRY_SERVICE_OK: 01237 01238 /* get host name */ 01239 temp_buffer=my_strtok(temp_entry->entry_text,":"); 01240 temp_buffer=my_strtok(NULL,";"); 01241 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name)); 01242 entry_host_name[sizeof(entry_host_name)-1]='\x0'; 01243 01244 /* get service description */ 01245 temp_buffer=my_strtok(NULL,";"); 01246 strncpy(entry_svc_description,(temp_buffer==NULL)?"":temp_buffer,sizeof(entry_svc_description)); 01247 entry_svc_description[sizeof(entry_svc_description)-1]='\x0'; 01248 01249 /* state type */ 01250 if(strstr(temp_entry->entry_text,";SOFT;")) 01251 state_type=AE_SOFT_STATE; 01252 else 01253 state_type=AE_HARD_STATE; 01254 01255 /* get the plugin output */ 01256 temp_buffer=my_strtok(NULL,";"); 01257 temp_buffer=my_strtok(NULL,";"); 01258 temp_buffer=my_strtok(NULL,";"); 01259 plugin_output=my_strtok(NULL,"\n"); 01260 01261 /* state */ 01262 if(temp_entry->type==LOGENTRY_SERVICE_CRITICAL) 01263 state=AE_SERVICE_CRITICAL; 01264 else if(temp_entry->type==LOGENTRY_SERVICE_WARNING) 01265 state=AE_SERVICE_UNKNOWN; 01266 else if(temp_entry->type==LOGENTRY_SERVICE_UNKNOWN) 01267 state=AE_SERVICE_WARNING; 01268 else if(temp_entry->type==LOGENTRY_SERVICE_RECOVERY || temp_entry->type==LOGENTRY_SERVICE_OK) 01269 state=AE_SERVICE_OK; 01270 else 01271 break; 01272 01273 add_archived_event(AE_SERVICE_ALERT,temp_entry->timestamp,state,state_type,entry_host_name,entry_svc_description,plugin_output); 01274 01275 break; 01276 } 01277 01278 } 01279 } 01280 01281 /* free memory */ 01282 free_log_entries(); 01283 01284 return; 01285 } 01286 01287 void compute_report_times(void){ 01288 time_t current_time; 01289 struct tm *st; 01290 struct tm *et; 01291 01292 /* get the current time */ 01293 time(¤t_time); 01294 01295 st=localtime(¤t_time); 01296 01297 st->tm_sec=start_second; 01298 st->tm_min=start_minute; 01299 st->tm_hour=start_hour; 01300 st->tm_mday=start_day; 01301 st->tm_mon=start_month-1; 01302 st->tm_year=start_year-1900; 01303 st->tm_isdst=-1; 01304 01305 t1=mktime(st); 01306 01307 et=localtime(¤t_time); 01308 01309 et->tm_sec=end_second; 01310 et->tm_min=end_minute; 01311 et->tm_hour=end_hour; 01312 et->tm_mday=end_day; 01313 et->tm_mon=end_month-1; 01314 et->tm_year=end_year-1900; 01315 et->tm_isdst=-1; 01316 01317 t2=mktime(et); 01318 } 01319 01320 void free_event_list(void){ 01321 archived_event *this_event=NULL; 01322 archived_event *next_event=NULL; 01323 01324 for(this_event=event_list;this_event!=NULL;){ 01325 next_event=this_event->next; 01326 if(this_event->host_name!=NULL) 01327 free(this_event->host_name); 01328 if(this_event->service_description!=NULL) 01329 free(this_event->service_description); 01330 if(this_event->event_info!=NULL) 01331 free(this_event->event_info); 01332 free(this_event); 01333 this_event=next_event; 01334 } 01335 01336 event_list=NULL; 01337 01338 return; 01339 } 01340 01341 /* adds an archived event entry to the list in memory */ 01342 void add_archived_event(int event_type, time_t time_stamp, int entry_type, int state_type, char *host_name, char *svc_description, char *event_info){ 01343 archived_event *new_event=NULL; 01344 service *temp_service=NULL; 01345 host *temp_host; 01346 01347 01348 /* check timestamp sanity */ 01349 if(time_stamp<t1 || time_stamp>t2) 01350 return; 01351 01352 /* check alert type (host or service alert) */ 01353 if(!(alert_types & event_type)) 01354 return; 01355 01356 /* check state type (soft or hard state) */ 01357 if(!(state_types & state_type)) 01358 return; 01359 01360 /* check state (host or service state) */ 01361 if(event_type==AE_HOST_ALERT){ 01362 if(!(host_states & entry_type)) 01363 return; 01364 }else{ 01365 if(!(service_states & entry_type)) 01366 return; 01367 } 01368 01369 /* find the host this entry is associated with */ 01370 temp_host=find_host(host_name); 01371 01372 /* check hostgroup match (valid filter for all reports) */ 01373 if(show_all_hostgroups==FALSE && is_host_member_of_hostgroup(target_hostgroup,temp_host)==FALSE) 01374 return; 01375 01376 /* check host match (valid filter for some reports) */ 01377 if(show_all_hosts==FALSE && (display_type==REPORT_RECENT_ALERTS || display_type==REPORT_HOST_ALERT_TOTALS || display_type==REPORT_SERVICE_ALERT_TOTALS)){ 01378 if(target_host==NULL || temp_host==NULL) 01379 return; 01380 if(strcmp(target_host->name,temp_host->name)) 01381 return; 01382 } 01383 01384 /* check servicegroup math (valid filter for all reports) */ 01385 if(event_type==AE_SERVICE_ALERT){ 01386 temp_service=find_service(host_name,svc_description); 01387 if(show_all_servicegroups==FALSE && is_service_member_of_servicegroup(target_servicegroup,temp_service)==FALSE) 01388 return; 01389 }else{ 01390 if(show_all_servicegroups==FALSE && is_host_member_of_servicegroup(target_servicegroup,temp_host)==FALSE) 01391 return; 01392 } 01393 01394 /* check authorization */ 01395 if(event_type==AE_SERVICE_ALERT){ 01396 if(is_authorized_for_service(temp_service,¤t_authdata)==FALSE) 01397 return; 01398 }else{ 01399 if(is_authorized_for_host(temp_host,¤t_authdata)==FALSE) 01400 return; 01401 } 01402 01403 #ifdef DEBUG 01404 if(event_type==AE_HOST_ALERT) 01405 printf("Adding host alert (%s) @ %lu<BR>\n",host_name,(unsigned long)time_stamp); 01406 else 01407 printf("Adding service alert (%s/%s) @ %lu<BR>\n",host_name,svc_description,(unsigned long)time_stamp); 01408 #endif 01409 01410 /* allocate memory for the new entry */ 01411 new_event=(archived_event *)malloc(sizeof(archived_event)); 01412 if(new_event==NULL) 01413 return; 01414 01415 /* allocate memory for the host name */ 01416 if(host_name!=NULL){ 01417 new_event->host_name=(char *)malloc(strlen(host_name)+1); 01418 if(new_event->host_name!=NULL) 01419 strcpy(new_event->host_name,host_name); 01420 }else 01421 new_event->host_name=NULL; 01422 01423 /* allocate memory for the service description */ 01424 if(svc_description!=NULL){ 01425 new_event->service_description=(char *)malloc(strlen(svc_description)+1); 01426 if(new_event->service_description!=NULL) 01427 strcpy(new_event->service_description,svc_description); 01428 }else 01429 new_event->service_description=NULL; 01430 01431 /* allocate memory for the event info */ 01432 if(event_info!=NULL){ 01433 new_event->event_info=(char *)malloc(strlen(event_info)+1); 01434 if(new_event->event_info!=NULL) 01435 strcpy(new_event->event_info,event_info); 01436 }else 01437 new_event->event_info=NULL; 01438 01439 new_event->event_type=event_type; 01440 new_event->time_stamp=time_stamp; 01441 new_event->entry_type=entry_type; 01442 new_event->state_type=state_type; 01443 01444 01445 /* add the new entry to the list in memory */ 01446 new_event->next=NULL; 01447 new_event->next=event_list; 01448 event_list=new_event; 01449 01450 total_items++; 01451 01452 return; 01453 } 01454 01455 void sort_archive_states(void) { 01456 archived_event *temp_list=NULL; 01457 archived_event *new_event=NULL; 01458 archived_event *last_event=NULL; 01459 archived_event *next_event=NULL; 01460 archived_event *temp_event=NULL; 01461 01462 temp_list=NULL; 01463 for(new_event=event_list;new_event!=NULL;){ 01464 next_event=new_event->next; 01465 01466 last_event=temp_list; 01467 for(temp_event=temp_list;temp_event!=NULL;temp_event=temp_event->next){ 01468 if(new_event->time_stamp>=temp_event->time_stamp){ 01469 new_event->next=temp_event; 01470 if(temp_event==temp_list) 01471 temp_list=new_event; 01472 else 01473 last_event->next=new_event; 01474 break; 01475 } else 01476 last_event=temp_event; 01477 } 01478 01479 if(temp_list==NULL){ 01480 new_event->next=NULL; 01481 temp_list=new_event; 01482 } 01483 else if(temp_event==NULL){ 01484 new_event->next=NULL; 01485 last_event->next=new_event; 01486 } 01487 01488 new_event=next_event; 01489 } 01490 event_list=temp_list; 01491 01492 return; 01493 } 01494 01495 01496 /* determines standard report options */ 01497 void determine_standard_report_options(void){ 01498 01499 /* report over last 7 days */ 01500 convert_timeperiod_to_times(TIMEPERIOD_LAST7DAYS,&t1,&t2); 01501 compute_time_from_parts=FALSE; 01502 01503 /* common options */ 01504 state_types=AE_HARD_STATE; 01505 item_limit=25; 01506 01507 /* report-specific options */ 01508 switch(standard_report){ 01509 01510 case SREPORT_RECENT_ALERTS: 01511 display_type=REPORT_RECENT_ALERTS; 01512 alert_types=AE_HOST_ALERT+AE_SERVICE_ALERT; 01513 host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE; 01514 service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL; 01515 break; 01516 01517 case SREPORT_RECENT_HOST_ALERTS: 01518 display_type=REPORT_RECENT_ALERTS; 01519 alert_types=AE_HOST_ALERT; 01520 host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE; 01521 break; 01522 01523 case SREPORT_RECENT_SERVICE_ALERTS: 01524 display_type=REPORT_RECENT_ALERTS; 01525 alert_types=AE_SERVICE_ALERT; 01526 service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL; 01527 break; 01528 01529 case SREPORT_TOP_HOST_ALERTS: 01530 display_type=REPORT_TOP_ALERTS; 01531 alert_types=AE_HOST_ALERT; 01532 host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE; 01533 break; 01534 01535 case SREPORT_TOP_SERVICE_ALERTS: 01536 display_type=REPORT_TOP_ALERTS; 01537 alert_types=AE_SERVICE_ALERT; 01538 service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL; 01539 break; 01540 01541 default: 01542 break; 01543 } 01544 01545 return; 01546 } 01547 01548 /* displays report */ 01549 void display_report(void){ 01550 hostgroup *temp_hostgroup; 01551 host *temp_host; 01552 service *temp_service; 01553 servicegroup* temp_servicegroup; 01554 01555 if(display_type==REPORT_TOP_ALERTS) { 01556 display_top_alerts(); 01557 return; 01558 } 01559 01560 if(display_type==REPORT_RECENT_ALERTS) { 01561 display_recent_alerts(); 01562 return; 01563 } 01564 01565 if(content_type==JSON_CONTENT) { 01566 if(display_type==REPORT_ALERT_TOTALS) 01567 printf("\"overall_alert_totals\": [\n"); 01568 if(display_type==REPORT_HOST_ALERT_TOTALS) 01569 printf("\"alert_totals_by_host\": {\n"); 01570 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) 01571 printf("\"alert_totals_by_hostgroup\": {\n"); 01572 if(display_type==REPORT_SERVICE_ALERT_TOTALS) 01573 printf("\"alert_totals_by_service\": {\n"); 01574 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) 01575 printf("\"alert_totals_by_servicegroup\": {\n"); 01576 01577 }else if(content_type==CSV_CONTENT) { 01578 if(display_type==REPORT_HOST_ALERT_TOTALS || display_type==REPORT_SERVICE_ALERT_TOTALS) 01579 printf("%sHOST_NAME%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01580 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) 01581 printf("%sHOSTGROUP_NAME%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01582 if(display_type==REPORT_SERVICE_ALERT_TOTALS) 01583 printf("%sSERVICE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01584 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) 01585 printf("%sSERVICEGROUP_NAME%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01586 01587 /* Host Alerts Data */ 01588 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS){ 01589 printf("%sHOST_UP_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01590 printf("%sHOST_UP_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01591 printf("%sHOST_UP_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01592 printf("%sHOST_DOWN_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01593 printf("%sHOST_DOWN_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01594 printf("%sHOST_DOWN_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01595 printf("%sHOST_UNREACHABLE_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01596 printf("%sHOST_UNREACHABLE_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01597 printf("%sHOST_UNREACHABLE_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01598 printf("%sHOST_ALL_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01599 printf("%sHOST_ALL_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01600 printf("%sHOST_ALL_TOTAL%s",csv_data_enclosure,csv_data_enclosure); 01601 } 01602 01603 /* Service Alerts Head */ 01604 if(alert_types & AE_SERVICE_ALERT){ 01605 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS) 01606 printf("%s",csv_delimiter); 01607 printf("%sSERVICE_OK_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01608 printf("%sSERVICE_OK_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01609 printf("%sSERVICE_OK_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01610 printf("%sSERVICE_WARNING_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01611 printf("%sSERVICE_WARNING_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01612 printf("%sSERVICE_WARNING_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01613 printf("%sSERVICE_UNKNOWN_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01614 printf("%sSERVICE_UNKNOWN_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01615 printf("%sSERVICE_UNKNOWN_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01616 printf("%sSERVICE_CRITICAL_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01617 printf("%sSERVICE_CRITICAL_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01618 printf("%sSERVICE_CRITICAL_TOTAL%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01619 printf("%sSERVICE_ALL_SOFT%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01620 printf("%sSERVICE_ALL_HARD%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01621 printf("%sSERVICE_ALL_TOTAL%s\n",csv_data_enclosure,csv_data_enclosure); 01622 } else { 01623 printf("\n"); 01624 } 01625 } else { 01626 printf("<BR>\n"); 01627 01628 printf("<DIV ALIGN=CENTER>\n"); 01629 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>"); 01630 if(display_type==REPORT_ALERT_TOTALS) 01631 printf("Overall Totals"); 01632 if(display_type==REPORT_HOST_ALERT_TOTALS) 01633 printf("Totals By Host"); 01634 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) 01635 printf("Totals By Hostgroup"); 01636 if(display_type==REPORT_SERVICE_ALERT_TOTALS) 01637 printf("Totals By Service"); 01638 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) 01639 printf("Totals By Servicegroup"); 01640 01641 printf("</DIV>\n"); 01642 01643 /* add export to csv link */ 01644 printf("<DIV class='csv_export_link'><A HREF='%s' target='_blank'>Export to CSV</A></DIV>\n",get_export_csv_link(SUMMARY_CGI)); 01645 } 01646 01647 if(display_type==REPORT_ALERT_TOTALS) { 01648 display_alerts(); 01649 } 01650 if(display_type==REPORT_HOST_ALERT_TOTALS) { 01651 if(show_all_hosts==FALSE) 01652 display_alerts(); 01653 else{ 01654 for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next) { 01655 target_host=temp_host; 01656 display_alerts(); 01657 } 01658 } 01659 } 01660 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) { 01661 if(show_all_hostgroups==FALSE) 01662 display_alerts(); 01663 else{ 01664 for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next) { 01665 target_hostgroup=temp_hostgroup; 01666 display_alerts(); 01667 } 01668 } 01669 } 01670 if(display_type==REPORT_SERVICE_ALERT_TOTALS) { 01671 for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next) { 01672 target_service=temp_service; 01673 display_alerts(); 01674 } 01675 } 01676 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) { 01677 if(show_all_servicegroups==FALSE) 01678 display_alerts(); 01679 else{ 01680 for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next) { 01681 target_servicegroup=temp_servicegroup; 01682 display_alerts(); 01683 } 01684 } 01685 } 01686 01687 if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT) 01688 printf("</DIV>\n"); 01689 else if (content_type==JSON_CONTENT) { 01690 printf("\n]\n"); 01691 if(display_type!=REPORT_ALERT_TOTALS) 01692 printf("\n}\n"); 01693 } 01694 01695 return; 01696 } 01697 01698 /* displays recent alerts */ 01699 void display_recent_alerts(void){ 01700 archived_event *temp_event; 01701 int current_item=0; 01702 int odd=0; 01703 int json_start=TRUE; 01704 char *status_bgclass=""; 01705 char *status=""; 01706 char date_time[MAX_DATETIME_LENGTH]; 01707 01708 host *temp_host=NULL; 01709 service *temp_service=NULL; 01710 01711 if(content_type==JSON_CONTENT) 01712 printf("\"recent_alerts\": [\n"); 01713 else if(content_type==CSV_CONTENT) { 01714 printf("%sTIME%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01715 printf("%sALERT_TYPE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01716 printf("%sHOST%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01717 printf("%sSERVICE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01718 printf("%sSTATE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01719 printf("%sSTATE_TYPE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 01720 printf("%sINFORMATION%s\n",csv_data_enclosure,csv_data_enclosure); 01721 } else { 01722 printf("<BR>\n"); 01723 01724 if(item_limit<=0 || total_items<=item_limit || total_items==0) 01725 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying all %d matching alerts\n",total_items); 01726 else 01727 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying most recent %d of %d total matching alerts\n",item_limit,total_items); 01728 01729 printf("<DIV ALIGN=CENTER>\n"); 01730 printf("<TABLE BORDER=0 CLASS='data'>\n"); 01731 01732 /* add export to csv link */ 01733 printf("<TR><TD colspan='7'><DIV class='csv_export_link'><A HREF='%s' target='_blank'>Export to CSV</A></DIV></TD></TR>\n",get_export_csv_link(SUMMARY_CGI)); 01734 01735 printf("<TR><TH CLASS='data'>Time</TH><TH CLASS='data'>Alert Type</TH><TH CLASS='data'>Host</TH><TH CLASS='data'>Service</TH><TH CLASS='data'>State</TH><TH CLASS='data'>State Type</TH><TH CLASS='data'>Information</TH></TR>\n"); 01736 } 01737 01738 sort_archive_states(); 01739 01740 for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next,current_item++){ 01741 01742 if(current_item>=item_limit && item_limit>0) 01743 break; 01744 01745 if(odd) 01746 odd=0; 01747 else 01748 odd=1; 01749 01750 /* find the host */ 01751 temp_host=find_host(temp_event->host_name); 01752 01753 /* find the service */ 01754 temp_service=find_service(temp_event->host_name,temp_event->service_description); 01755 01756 get_time_string(&temp_event->time_stamp,date_time,(int)sizeof(date_time),SHORT_DATE_TIME); 01757 01758 if(content_type==JSON_CONTENT) { 01759 // always add a comma, except for the first line 01760 if (json_start==FALSE) 01761 printf(",\n"); 01762 json_start=FALSE; 01763 printf("{ \"time\": \"%s\", ",date_time); 01764 printf("\"alert_type\": \"%s\", ",(temp_event->event_type==AE_HOST_ALERT)?"Host Alert":"Service Alert"); 01765 printf("\"host\": \"%s\", ",(temp_host->display_name!=NULL)?json_encode(temp_host->display_name):json_encode(temp_host->name)); 01766 if (temp_event->event_type==AE_HOST_ALERT) 01767 printf("\"service\": null, "); 01768 else 01769 printf("\"service\": \"%s\", ",(temp_service->display_name!=NULL)?json_encode(temp_service->display_name):json_encode(temp_service->description)); 01770 }else if(content_type==CSV_CONTENT) { 01771 printf("%s%s%s%s",csv_data_enclosure,date_time,csv_data_enclosure,csv_delimiter); 01772 printf("%s%s%s%s",csv_data_enclosure,(temp_event->event_type==AE_HOST_ALERT)?"Host Alert":"Service Alert",csv_data_enclosure,csv_delimiter); 01773 printf("%s%s%s%s",csv_data_enclosure,(temp_host->display_name!=NULL)?temp_host->display_name:temp_host->name,csv_data_enclosure,csv_delimiter); 01774 printf("%s%s%s%s",csv_data_enclosure,(temp_event->event_type==AE_HOST_ALERT)?"":(temp_service->display_name!=NULL)?temp_service->display_name:temp_service->description,csv_data_enclosure,csv_delimiter); 01775 } else { 01776 printf("<tr CLASS='data%s'>",(odd)?"Even":"Odd"); 01777 01778 printf("<td CLASS='data%s'>%s</td>",(odd)?"Even":"Odd",date_time); 01779 01780 printf("<td CLASS='data%s'>%s</td>",(odd)?"Even":"Odd",(temp_event->event_type==AE_HOST_ALERT)?"Host Alert":"Service Alert"); 01781 01782 printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s'>%s</a></td>",(odd)?"Even":"Odd",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_event->host_name),(temp_host->display_name!=NULL)?temp_host->display_name:temp_host->name); 01783 01784 if(temp_event->event_type==AE_HOST_ALERT) 01785 printf("<td CLASS='data%s'>N/A</td>",(odd)?"Even":"Odd"); 01786 else{ 01787 printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s",(odd)?"Even":"Odd",EXTINFO_CGI,DISPLAY_SERVICE_INFO,url_encode(temp_event->host_name)); 01788 printf("&service=%s'>%s</a></td>",url_encode(temp_event->service_description),(temp_service->display_name!=NULL)?temp_service->display_name:temp_service->description); 01789 } 01790 01791 } 01792 01793 switch(temp_event->entry_type){ 01794 case AE_HOST_UP: 01795 status_bgclass="hostUP"; 01796 status="UP"; 01797 break; 01798 case AE_HOST_DOWN: 01799 status_bgclass="hostDOWN"; 01800 status="DOWN"; 01801 break; 01802 case AE_HOST_UNREACHABLE: 01803 status_bgclass="hostUNREACHABLE"; 01804 status="UNREACHABLE"; 01805 break; 01806 case AE_SERVICE_OK: 01807 status_bgclass="serviceOK"; 01808 status="OK"; 01809 break; 01810 case AE_SERVICE_WARNING: 01811 status_bgclass="serviceWARNING"; 01812 status="WARNING"; 01813 break; 01814 case AE_SERVICE_UNKNOWN: 01815 status_bgclass="serviceUNKNOWN"; 01816 status="UNKNOWN"; 01817 break; 01818 case AE_SERVICE_CRITICAL: 01819 status_bgclass="serviceCRITICAL"; 01820 status="CRITICAL"; 01821 break; 01822 default: 01823 status_bgclass=(odd)?"Even":"Odd"; 01824 status="???"; 01825 break; 01826 } 01827 01828 if(content_type==JSON_CONTENT) { 01829 printf("\"state\": \"%s\", ",status); 01830 printf("\"state_type\": \"%s\", ",(temp_event->state_type==AE_SOFT_STATE)?"SOFT":"HARD"); 01831 printf("\"information\": \"%s\"}",json_encode(temp_event->event_info)); 01832 }else if(content_type==CSV_CONTENT) { 01833 printf("%s%s%s%s",csv_data_enclosure,status,csv_data_enclosure,csv_delimiter); 01834 printf("%s%s%s%s",csv_data_enclosure,(temp_event->state_type==AE_SOFT_STATE)?"SOFT":"HARD",csv_data_enclosure,csv_delimiter); 01835 printf("%s%s%s\n",csv_data_enclosure,temp_event->event_info,csv_data_enclosure); 01836 } else { 01837 printf("<td CLASS='%s'>%s</td>",status_bgclass,status); 01838 01839 printf("<td CLASS='data%s'>%s</td>",(odd)?"Even":"Odd",(temp_event->state_type==AE_SOFT_STATE)?"SOFT":"HARD"); 01840 01841 printf("<td CLASS='data%s'>%s</td>",(odd)?"Even":"Odd",temp_event->event_info); 01842 01843 printf("</tr>\n"); 01844 } 01845 } 01846 01847 if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){ 01848 printf("</TABLE>\n"); 01849 printf("</DIV>\n"); 01850 }else if (content_type==JSON_CONTENT) 01851 printf("\n]\n"); 01852 01853 01854 return; 01855 } 01856 01857 /* find a specific alert producer */ 01858 alert_producer *find_producer(int type, char *hname, char *sdesc){ 01859 alert_producer *temp_producer; 01860 01861 for(temp_producer=producer_list;temp_producer!=NULL;temp_producer=temp_producer->next){ 01862 01863 if(temp_producer->producer_type!=type) 01864 continue; 01865 if(hname!=NULL && strcmp(hname,temp_producer->host_name)) 01866 continue; 01867 if(sdesc!=NULL && strcmp(sdesc,temp_producer->service_description)) 01868 continue; 01869 01870 return temp_producer; 01871 } 01872 01873 return NULL; 01874 } 01875 01876 /* adds a new producer to the list in memory */ 01877 alert_producer *add_producer(int producer_type, char *host_name, char *service_description){ 01878 alert_producer *new_producer=NULL; 01879 01880 /* allocate memory for the new entry */ 01881 new_producer=(alert_producer *)malloc(sizeof(alert_producer)); 01882 if(new_producer==NULL) 01883 return NULL; 01884 01885 /* allocate memory for the host name */ 01886 if(host_name!=NULL){ 01887 new_producer->host_name=(char *)malloc(strlen(host_name)+1); 01888 if(new_producer->host_name!=NULL) 01889 strcpy(new_producer->host_name,host_name); 01890 } 01891 else 01892 new_producer->host_name=NULL; 01893 01894 /* allocate memory for the service description */ 01895 if(service_description!=NULL){ 01896 new_producer->service_description=(char *)malloc(strlen(service_description)+1); 01897 if(new_producer->service_description!=NULL) 01898 strcpy(new_producer->service_description,service_description); 01899 } 01900 else 01901 new_producer->service_description=NULL; 01902 01903 new_producer->producer_type=producer_type; 01904 new_producer->total_alerts=0; 01905 01906 /* add the new entry to the list in memory, sorted by time */ 01907 new_producer->next=producer_list; 01908 producer_list=new_producer; 01909 01910 return new_producer; 01911 } 01912 01913 void free_producer_list(void){ 01914 alert_producer *this_producer=NULL; 01915 alert_producer *next_producer=NULL; 01916 01917 for(this_producer=producer_list;this_producer!=NULL;){ 01918 next_producer=this_producer->next; 01919 if(this_producer->host_name!=NULL) 01920 free(this_producer->host_name); 01921 if(this_producer->service_description!=NULL) 01922 free(this_producer->service_description); 01923 free(this_producer); 01924 this_producer=next_producer; 01925 } 01926 01927 producer_list=NULL; 01928 01929 return; 01930 } 01931 01932 /* displays top alerts */ 01933 void display_top_alerts(void){ 01934 archived_event *temp_event=NULL; 01935 alert_producer *temp_producer=NULL; 01936 alert_producer *next_producer=NULL; 01937 alert_producer *last_producer=NULL; 01938 alert_producer *new_producer=NULL; 01939 alert_producer *temp_list=NULL; 01940 int producer_type=AE_HOST_PRODUCER; 01941 int current_item=0; 01942 int odd=0; 01943 int json_start=TRUE; 01944 char *bgclass=""; 01945 01946 /* process all events */ 01947 for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){ 01948 01949 producer_type=(temp_event->event_type==AE_HOST_ALERT)?AE_HOST_PRODUCER:AE_SERVICE_PRODUCER; 01950 01951 /* see if we already have a record for the producer */ 01952 temp_producer=find_producer(producer_type,temp_event->host_name,temp_event->service_description); 01953 01954 /* if not, add a record */ 01955 if(temp_producer==NULL) 01956 temp_producer=add_producer(producer_type,temp_event->host_name,temp_event->service_description); 01957 01958 /* producer record could not be added */ 01959 if(temp_producer==NULL) 01960 continue; 01961 01962 /* update stats for producer */ 01963 temp_producer->total_alerts++; 01964 } 01965 01966 01967 /* sort the producer list by total alerts (descending) */ 01968 total_items=0; 01969 temp_list=NULL; 01970 for(new_producer=producer_list;new_producer!=NULL;){ 01971 next_producer=new_producer->next; 01972 01973 last_producer=temp_list; 01974 for(temp_producer=temp_list;temp_producer!=NULL;temp_producer=temp_producer->next){ 01975 if(new_producer->total_alerts>=temp_producer->total_alerts){ 01976 new_producer->next=temp_producer; 01977 if(temp_producer==temp_list) 01978 temp_list=new_producer; 01979 else 01980 last_producer->next=new_producer; 01981 break; 01982 } else 01983 last_producer=temp_producer; 01984 } 01985 01986 if(temp_list==NULL){ 01987 new_producer->next=NULL; 01988 temp_list=new_producer; 01989 } 01990 else if(temp_producer==NULL){ 01991 new_producer->next=NULL; 01992 last_producer->next=new_producer; 01993 } 01994 01995 new_producer=next_producer; 01996 total_items++; 01997 } 01998 producer_list=temp_list; 01999 02000 02001 if(content_type==JSON_CONTENT) { 02002 printf("\"top_alert_producers\": [\n"); 02003 }else if(content_type==CSV_CONTENT) { 02004 printf("%sRANK%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 02005 printf("%sPRODUCER_TYPE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 02006 printf("%sHOST%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 02007 printf("%sSERVICE%s%s",csv_data_enclosure,csv_data_enclosure,csv_delimiter); 02008 printf("%sTOTAL_ALERTS%s\n",csv_data_enclosure,csv_data_enclosure); 02009 }else{ 02010 printf("<BR>\n"); 02011 02012 if(item_limit<=0 || total_items<=item_limit || total_items==0) 02013 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying all %d matching alert producers\n",total_items); 02014 else 02015 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying top %d of %d total matching alert producers\n",item_limit,total_items); 02016 02017 printf("<DIV ALIGN=CENTER>\n"); 02018 printf("<TABLE BORDER=0 CLASS='data'>\n"); 02019 02020 /* add export to csv link */ 02021 printf("<TR><TD colspan='5'><DIV class='csv_export_link'><A HREF='%s' target='_blank'>Export to CSV</A></DIV></TD></TR>\n",get_export_csv_link(SUMMARY_CGI)); 02022 02023 printf("<TR><TH CLASS='data'>Rank</TH><TH CLASS='data'>Producer Type</TH><TH CLASS='data'>Host</TH><TH CLASS='data'>Service</TH><TH CLASS='data'>Total Alerts</TH></TR>\n"); 02024 } 02025 02026 02027 /* display top producers */ 02028 for(temp_producer=producer_list;temp_producer!=NULL;temp_producer=temp_producer->next){ 02029 02030 if(current_item>=item_limit && item_limit>0 && content_type!=CSV_CONTENT) 02031 break; 02032 02033 current_item++; 02034 02035 if(odd){ 02036 odd=0; 02037 bgclass="Odd"; 02038 }else{ 02039 odd=1; 02040 bgclass="Even"; 02041 } 02042 02043 if(content_type==JSON_CONTENT) { 02044 // always add a comma, except for the first line 02045 if (json_start==FALSE) 02046 printf(",\n"); 02047 json_start=FALSE; 02048 printf("{ \"rank\": %d, ",current_item); 02049 printf(" \"producer_type\": \"%s\", ",(temp_producer->producer_type==AE_HOST_PRODUCER)?"Host":"Service"); 02050 printf(" \"host\": \"%s\", ",json_encode(temp_producer->host_name)); 02051 if (temp_producer->producer_type==AE_HOST_PRODUCER) 02052 printf(" \"service\": null, "); 02053 else 02054 printf(" \"service\": \"%s\", ",json_encode(temp_producer->service_description)); 02055 printf(" \"total_alerts\": %d}",temp_producer->total_alerts); 02056 }else if(content_type==CSV_CONTENT) { 02057 printf("%s%d%s%s",csv_data_enclosure,current_item,csv_data_enclosure,csv_delimiter); 02058 printf("%s%s%s%s",csv_data_enclosure,(temp_producer->producer_type==AE_HOST_PRODUCER)?"Host":"Service",csv_data_enclosure,csv_delimiter); 02059 printf("%s%s%s%s",csv_data_enclosure,temp_producer->host_name,csv_data_enclosure,csv_delimiter); 02060 printf("%s%s%s%s",csv_data_enclosure,(temp_producer->producer_type==AE_HOST_PRODUCER)?"N/A":temp_producer->service_description,csv_data_enclosure,csv_delimiter); 02061 printf("%s%d%s\n",csv_data_enclosure,temp_producer->total_alerts,csv_data_enclosure); 02062 }else{ 02063 printf("<tr CLASS='data%s'>",bgclass); 02064 02065 printf("<td CLASS='data%s'>#%d</td>",bgclass,current_item); 02066 02067 printf("<td CLASS='data%s'>%s</td>",bgclass,(temp_producer->producer_type==AE_HOST_PRODUCER)?"Host":"Service"); 02068 02069 printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s'>%s</a></td>",bgclass,EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_producer->host_name),temp_producer->host_name); 02070 02071 if(temp_producer->producer_type==AE_HOST_PRODUCER) 02072 printf("<td CLASS='data%s'>N/A</td>",bgclass); 02073 else{ 02074 printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s",bgclass,EXTINFO_CGI,DISPLAY_SERVICE_INFO,url_encode(temp_producer->host_name)); 02075 printf("&service=%s'>%s</a></td>",url_encode(temp_producer->service_description),temp_producer->service_description); 02076 } 02077 02078 printf("<td CLASS='data%s'>%d</td>",bgclass,temp_producer->total_alerts); 02079 02080 printf("</tr>\n"); 02081 } 02082 } 02083 02084 if(content_type!=CSV_CONTENT && content_type!=JSON_CONTENT){ 02085 printf("</TABLE>\n"); 02086 printf("</DIV>\n"); 02087 }else if (content_type==JSON_CONTENT) 02088 printf("\n]\n"); 02089 02090 return; 02091 } 02092 02093 /* displays alert totals */ 02094 void display_alerts(void){ 02095 int hard_host_up_alerts=0; 02096 int soft_host_up_alerts=0; 02097 int hard_host_down_alerts=0; 02098 int soft_host_down_alerts=0; 02099 int hard_host_unreachable_alerts=0; 02100 int soft_host_unreachable_alerts=0; 02101 int hard_service_ok_alerts=0; 02102 int soft_service_ok_alerts=0; 02103 int hard_service_warning_alerts=0; 02104 int soft_service_warning_alerts=0; 02105 int hard_service_unknown_alerts=0; 02106 int soft_service_unknown_alerts=0; 02107 int hard_service_critical_alerts=0; 02108 int soft_service_critical_alerts=0; 02109 02110 int json_start=TRUE; 02111 02112 archived_event *temp_event; 02113 host *temp_host; 02114 service *temp_service; 02115 02116 if(display_type==REPORT_HOST_ALERT_TOTALS) { 02117 if(target_host==NULL) 02118 return; 02119 02120 /* make sure the user is authorized to view this host */ 02121 if(is_authorized_for_host(target_host,¤t_authdata)==FALSE) 02122 return; 02123 02124 if(show_all_hostgroups==FALSE && target_hostgroup!=NULL){ 02125 if(is_host_member_of_hostgroup(target_hostgroup,target_host)==FALSE) 02126 return; 02127 } 02128 02129 if(content_type==JSON_CONTENT) { 02130 if(json_list_start==FALSE) 02131 printf("],\n"); 02132 json_list_start=FALSE; 02133 printf("\"host_name\": \"%s\",\n",json_encode(target_host->name)); 02134 printf("\"report\": [\n"); 02135 } 02136 } 02137 02138 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) { 02139 if(target_hostgroup==NULL) 02140 return; 02141 02142 /* make sure the user is authorized to view this hostgroup */ 02143 if(is_authorized_for_hostgroup(target_hostgroup,¤t_authdata)==FALSE) 02144 return; 02145 02146 if(content_type==JSON_CONTENT) { 02147 if(json_list_start==FALSE) 02148 printf("],\n"); 02149 json_list_start=FALSE; 02150 printf("\"hostgroup_name\": \"%s\",\n",json_encode(target_hostgroup->group_name)); 02151 printf("\"report\": [\n"); 02152 } 02153 } 02154 if(display_type==REPORT_SERVICE_ALERT_TOTALS) { 02155 if(target_service==NULL) 02156 return; 02157 02158 /* make sure the user is authorized to view this service */ 02159 if(is_authorized_for_service(target_service,¤t_authdata)==FALSE) 02160 return; 02161 02162 if(show_all_hostgroups==FALSE && target_hostgroup!=NULL){ 02163 temp_host=find_host(target_service->host_name); 02164 if(is_host_member_of_hostgroup(target_hostgroup,temp_host)==FALSE) 02165 return; 02166 } 02167 02168 if(show_all_hosts==FALSE && target_host!=NULL){ 02169 if(strcmp(target_host->name,target_service->host_name)) 02170 return; 02171 } 02172 02173 if(content_type==JSON_CONTENT) { 02174 if(json_list_start==FALSE) 02175 printf("],\n"); 02176 json_list_start=FALSE; 02177 printf("\"host_name\": \"%s\",\n",json_encode(target_service->host_name)); 02178 printf("\"service\": \"%s\",\n",json_encode(target_service->description)); 02179 printf("\"report\": [\n"); 02180 } 02181 02182 } 02183 02184 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) { 02185 if(target_servicegroup==NULL) 02186 return; 02187 02188 /* make sure the user is authorized to view this servicegroup */ 02189 if(is_authorized_for_servicegroup(target_servicegroup,¤t_authdata)==FALSE) 02190 return; 02191 02192 if(content_type==JSON_CONTENT) { 02193 if(json_list_start==FALSE) 02194 printf("],\n"); 02195 json_list_start=FALSE; 02196 printf("\"servicegroup_name\": \"%s\",\n",json_encode(target_servicegroup->group_name)); 02197 printf("\"report\": [\n"); 02198 } 02199 } 02200 02201 /* process all events */ 02202 for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){ 02203 02204 if(display_type==REPORT_HOST_ALERT_TOTALS) { 02205 if(strcmp(temp_event->host_name,target_host->name)) 02206 continue; 02207 } 02208 02209 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) { 02210 temp_host=find_host(temp_event->host_name); 02211 if(is_host_member_of_hostgroup(target_hostgroup,temp_host)==FALSE) 02212 continue; 02213 } 02214 02215 if(display_type==REPORT_SERVICE_ALERT_TOTALS) { 02216 if(temp_event->event_type!=AE_SERVICE_ALERT) 02217 continue; 02218 02219 if(strcmp(temp_event->host_name,target_service->host_name) || strcmp(temp_event->service_description,target_service->description)) 02220 continue; 02221 } 02222 02223 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) { 02224 if(temp_event->event_type==AE_HOST_ALERT){ 02225 temp_host=find_host(temp_event->host_name); 02226 if(is_host_member_of_servicegroup(target_servicegroup,temp_host)==FALSE) 02227 continue; 02228 } else{ 02229 temp_service=find_service(temp_event->host_name,temp_event->service_description); 02230 if(is_service_member_of_servicegroup(target_servicegroup,temp_service)==FALSE) 02231 continue; 02232 } 02233 } 02234 02235 /* host alerts */ 02236 if(temp_event->event_type==AE_HOST_ALERT){ 02237 if(temp_event->state_type==AE_SOFT_STATE){ 02238 if(temp_event->entry_type==AE_HOST_UP) 02239 soft_host_up_alerts++; 02240 else if(temp_event->entry_type==AE_HOST_DOWN) 02241 soft_host_down_alerts++; 02242 else if(temp_event->entry_type==AE_HOST_UNREACHABLE) 02243 soft_host_unreachable_alerts++; 02244 } else{ 02245 if(temp_event->entry_type==AE_HOST_UP) 02246 hard_host_up_alerts++; 02247 else if(temp_event->entry_type==AE_HOST_DOWN) 02248 hard_host_down_alerts++; 02249 else if(temp_event->entry_type==AE_HOST_UNREACHABLE) 02250 hard_host_unreachable_alerts++; 02251 } 02252 } 02253 02254 /* service alerts */ 02255 else{ 02256 if(temp_event->state_type==AE_SOFT_STATE){ 02257 if(temp_event->entry_type==AE_SERVICE_OK) 02258 soft_service_ok_alerts++; 02259 else if(temp_event->entry_type==AE_SERVICE_WARNING) 02260 soft_service_warning_alerts++; 02261 else if(temp_event->entry_type==AE_SERVICE_UNKNOWN) 02262 soft_service_unknown_alerts++; 02263 else if(temp_event->entry_type==AE_SERVICE_CRITICAL) 02264 soft_service_critical_alerts++; 02265 }else{ 02266 if(temp_event->entry_type==AE_SERVICE_OK) 02267 hard_service_ok_alerts++; 02268 else if(temp_event->entry_type==AE_SERVICE_WARNING) 02269 hard_service_warning_alerts++; 02270 else if(temp_event->entry_type==AE_SERVICE_UNKNOWN) 02271 hard_service_unknown_alerts++; 02272 else if(temp_event->entry_type==AE_SERVICE_CRITICAL) 02273 hard_service_critical_alerts++; 02274 } 02275 } 02276 } 02277 02278 02279 if(content_type==JSON_CONTENT) { 02280 // always add a comma, except for the first line 02281 if (json_start==FALSE) 02282 printf(",\n"); 02283 json_start=FALSE; 02284 02285 /* Host Alerts Data */ 02286 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS){ 02287 printf("{ \"host_up_soft\": %d, ",soft_host_up_alerts); 02288 printf("\"host_up_hard\": %d, ",hard_host_up_alerts); 02289 printf("\"host_up_total\": %d, ",soft_host_up_alerts+hard_host_up_alerts); 02290 printf("\"host_down_soft\": %d, ",soft_host_down_alerts); 02291 printf("\"host_down_hard\": %d, ",hard_host_down_alerts); 02292 printf("\"host_down_total\": %d, ",soft_host_down_alerts+hard_host_down_alerts); 02293 printf("\"host_unreachable_soft\": %d, ",soft_host_unreachable_alerts); 02294 printf("\"host_unreachable_hard\": %d, ",hard_host_unreachable_alerts); 02295 printf("\"host_unreachable_total\": %d, ",soft_host_unreachable_alerts+hard_host_unreachable_alerts); 02296 printf("\"host_all_soft\": %d, ",soft_host_up_alerts+soft_host_down_alerts+soft_host_unreachable_alerts); 02297 printf("\"host_all_hard\": %d, ",hard_host_up_alerts+hard_host_down_alerts+hard_host_unreachable_alerts); 02298 printf("\"host_all_total\": %d",soft_host_up_alerts+hard_host_up_alerts+soft_host_down_alerts+hard_host_down_alerts+soft_host_unreachable_alerts+hard_host_unreachable_alerts); 02299 } 02300 02301 /* Service Alerts Data */ 02302 if(alert_types & AE_SERVICE_ALERT){ 02303 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS) 02304 printf(", "); 02305 else 02306 printf("{ "); 02307 02308 printf("\"service_ok_soft\": %d, ",soft_service_ok_alerts); 02309 printf("\"service_ok_hard\": %d, ",hard_service_ok_alerts); 02310 printf("\"service_ok_total\": %d, ",soft_service_ok_alerts+hard_service_ok_alerts); 02311 printf("\"service_warning_soft\": %d, ",soft_service_warning_alerts); 02312 printf("\"service_warning_hard\": %d, ",hard_service_warning_alerts); 02313 printf("\"service_warning_total\": %d, ",soft_service_warning_alerts+hard_service_warning_alerts); 02314 printf("\"service_unknown_soft\": %d, ",soft_service_unknown_alerts); 02315 printf("\"service_unknown_hard\": %d, ",hard_service_unknown_alerts); 02316 printf("\"service_unknown_total\": %d, ",soft_service_unknown_alerts+hard_service_unknown_alerts); 02317 printf("\"service_critical_soft\": %d, ",soft_service_critical_alerts); 02318 printf("\"service_critical_hard\": %d, ",hard_service_critical_alerts); 02319 printf("\"service_critical_total\": %d, ",soft_service_critical_alerts+hard_service_critical_alerts); 02320 printf("\"service_all_soft\": %d, ",soft_service_ok_alerts+soft_service_warning_alerts+soft_service_unknown_alerts+soft_service_critical_alerts); 02321 printf("\"service_all_hard\": %d, ",hard_service_ok_alerts+hard_service_warning_alerts+hard_service_unknown_alerts+hard_service_critical_alerts); 02322 printf("\"service_all_total\": %d}",soft_service_ok_alerts+soft_service_warning_alerts+soft_service_unknown_alerts+soft_service_critical_alerts+hard_service_ok_alerts+hard_service_warning_alerts+hard_service_unknown_alerts+hard_service_critical_alerts); 02323 } else { 02324 printf("}"); 02325 } 02326 02327 }else if(content_type==CSV_CONTENT) { 02328 if(display_type==REPORT_HOST_ALERT_TOTALS) 02329 printf("%s%s%s%s",csv_data_enclosure,target_host->name,csv_data_enclosure,csv_delimiter); 02330 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) 02331 printf("%s%s%s%s",csv_data_enclosure,target_hostgroup->group_name,csv_data_enclosure,csv_delimiter); 02332 if(display_type==REPORT_SERVICE_ALERT_TOTALS) { 02333 printf("%s%s%s%s",csv_data_enclosure,target_service->host_name,csv_data_enclosure,csv_delimiter); 02334 printf("%s%s%s%s",csv_data_enclosure,target_service->description,csv_data_enclosure,csv_delimiter); 02335 } 02336 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) 02337 printf("%s%s%s%s",csv_data_enclosure,target_servicegroup->group_name,csv_data_enclosure,csv_delimiter); 02338 02339 /* Host Alerts Data */ 02340 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS){ 02341 printf("%s%d%s%s",csv_data_enclosure,soft_host_up_alerts,csv_data_enclosure,csv_delimiter); 02342 printf("%s%d%s%s",csv_data_enclosure,hard_host_up_alerts,csv_data_enclosure,csv_delimiter); 02343 printf("%s%d%s%s",csv_data_enclosure,soft_host_up_alerts+hard_host_up_alerts,csv_data_enclosure,csv_delimiter); 02344 printf("%s%d%s%s",csv_data_enclosure,soft_host_down_alerts,csv_data_enclosure,csv_delimiter); 02345 printf("%s%d%s%s",csv_data_enclosure,hard_host_down_alerts,csv_data_enclosure,csv_delimiter); 02346 printf("%s%d%s%s",csv_data_enclosure,soft_host_down_alerts+hard_host_down_alerts,csv_data_enclosure,csv_delimiter); 02347 printf("%s%d%s%s",csv_data_enclosure,soft_host_unreachable_alerts,csv_data_enclosure,csv_delimiter); 02348 printf("%s%d%s%s",csv_data_enclosure,hard_host_unreachable_alerts,csv_data_enclosure,csv_delimiter); 02349 printf("%s%d%s%s",csv_data_enclosure,soft_host_unreachable_alerts+hard_host_unreachable_alerts,csv_data_enclosure,csv_delimiter); 02350 printf("%s%d%s%s",csv_data_enclosure,soft_host_up_alerts+soft_host_down_alerts+soft_host_unreachable_alerts,csv_data_enclosure,csv_delimiter); 02351 printf("%s%d%s%s",csv_data_enclosure,hard_host_up_alerts+hard_host_down_alerts+hard_host_unreachable_alerts,csv_data_enclosure,csv_delimiter); 02352 printf("%s%d%s",csv_data_enclosure,soft_host_up_alerts+hard_host_up_alerts+soft_host_down_alerts+hard_host_down_alerts+soft_host_unreachable_alerts+hard_host_unreachable_alerts,csv_data_enclosure); 02353 } 02354 02355 /* Service Alerts Data */ 02356 if(alert_types & AE_SERVICE_ALERT){ 02357 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS) 02358 printf("%s",csv_delimiter); 02359 printf("%s%d%s%s",csv_data_enclosure,soft_service_ok_alerts,csv_data_enclosure,csv_delimiter); 02360 printf("%s%d%s%s",csv_data_enclosure,hard_service_ok_alerts,csv_data_enclosure,csv_delimiter); 02361 printf("%s%d%s%s",csv_data_enclosure,soft_service_ok_alerts+hard_service_ok_alerts,csv_data_enclosure,csv_delimiter); 02362 printf("%s%d%s%s",csv_data_enclosure,soft_service_warning_alerts,csv_data_enclosure,csv_delimiter); 02363 printf("%s%d%s%s",csv_data_enclosure,hard_service_warning_alerts,csv_data_enclosure,csv_delimiter); 02364 printf("%s%d%s%s",csv_data_enclosure,soft_service_warning_alerts+hard_service_warning_alerts,csv_data_enclosure,csv_delimiter); 02365 printf("%s%d%s%s",csv_data_enclosure,soft_service_unknown_alerts,csv_data_enclosure,csv_delimiter); 02366 printf("%s%d%s%s",csv_data_enclosure,hard_service_unknown_alerts,csv_data_enclosure,csv_delimiter); 02367 printf("%s%d%s%s",csv_data_enclosure,soft_service_unknown_alerts+hard_service_unknown_alerts,csv_data_enclosure,csv_delimiter); 02368 printf("%s%d%s%s",csv_data_enclosure,soft_service_critical_alerts,csv_data_enclosure,csv_delimiter); 02369 printf("%s%d%s%s",csv_data_enclosure,hard_service_critical_alerts,csv_data_enclosure,csv_delimiter); 02370 printf("%s%d%s%s",csv_data_enclosure,soft_service_critical_alerts+hard_service_critical_alerts,csv_data_enclosure,csv_delimiter); 02371 printf("%s%d%s%s",csv_data_enclosure,soft_service_ok_alerts+soft_service_warning_alerts+soft_service_unknown_alerts+soft_service_critical_alerts,csv_data_enclosure,csv_delimiter); 02372 printf("%s%d%s%s",csv_data_enclosure,hard_service_ok_alerts+hard_service_warning_alerts+hard_service_unknown_alerts+hard_service_critical_alerts,csv_data_enclosure,csv_delimiter); 02373 printf("%s%d%s\n",csv_data_enclosure,soft_service_ok_alerts+soft_service_warning_alerts+soft_service_unknown_alerts+soft_service_critical_alerts+hard_service_ok_alerts+hard_service_warning_alerts+hard_service_unknown_alerts+hard_service_critical_alerts,csv_data_enclosure); 02374 } else { 02375 printf("\n"); 02376 } 02377 }else{ 02378 printf("<BR>\n"); 02379 printf("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 CLASS='reportDataEven'><TR><TD>\n"); 02380 printf("<TABLE BORDER=0>\n"); 02381 02382 printf("<TR><TD COLSPAN=2 ALIGN=CENTER CLASS='dataSubTitle'>"); 02383 if(display_type==REPORT_HOST_ALERT_TOTALS) 02384 printf("Host '%s' (%s)",target_host->name,target_host->alias); 02385 02386 if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS) 02387 printf("Hostgroup '%s' (%s)",target_hostgroup->group_name,target_hostgroup->alias); 02388 02389 if(display_type==REPORT_SERVICE_ALERT_TOTALS) 02390 printf("Service '%s' on Host '%s'",target_service->description,target_service->host_name); 02391 02392 if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS) 02393 printf("Servicegroup '%s' (%s)",target_servicegroup->group_name,target_servicegroup->alias); 02394 printf("</TD></TR>\n"); 02395 02396 printf("<TR>\n"); 02397 02398 if(alert_types & AE_HOST_ALERT && display_type!=REPORT_SERVICE_ALERT_TOTALS){ 02399 02400 printf("<TD ALIGN=CENTER VALIGN=TOP>\n"); 02401 02402 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Host Alerts</DIV>\n"); 02403 02404 printf("<DIV ALIGN=CENTER>\n"); 02405 printf("<TABLE BORDER=0 CLASS='data'>\n"); 02406 printf("<TR><TH CLASS='data'>State</TH><TH CLASS='data'>Soft Alerts</TH><TH CLASS='data'>Hard Alerts</TH><TH CLASS='data'>Total Alerts</TH></TR>\n"); 02407 02408 printf("<TR CLASS='dataOdd'><TD CLASS='hostUP'>UP</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD></TR>\n",soft_host_up_alerts,hard_host_up_alerts,soft_host_up_alerts+hard_host_up_alerts); 02409 printf("<TR CLASS='dataEven'><TD CLASS='hostDOWN'>DOWN</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD></TR>\n",soft_host_down_alerts,hard_host_down_alerts,soft_host_down_alerts+hard_host_down_alerts); 02410 printf("<TR CLASS='dataOdd'><TD CLASS='hostUNREACHABLE'>UNREACHABLE</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD></TR>\n",soft_host_unreachable_alerts,hard_host_unreachable_alerts,soft_host_unreachable_alerts+hard_host_unreachable_alerts); 02411 printf("<TR CLASS='dataEven'><TD CLASS='dataEven'>All States</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'><B>%d</B></TD></TR>\n",soft_host_up_alerts+soft_host_down_alerts+soft_host_unreachable_alerts,hard_host_up_alerts+hard_host_down_alerts+hard_host_unreachable_alerts,soft_host_up_alerts+hard_host_up_alerts+soft_host_down_alerts+hard_host_down_alerts+soft_host_unreachable_alerts+hard_host_unreachable_alerts); 02412 02413 printf("</TABLE>\n"); 02414 printf("</DIV>\n"); 02415 02416 printf("</TD>\n"); 02417 } 02418 02419 if(alert_types & AE_SERVICE_ALERT){ 02420 02421 printf("<TD ALIGN=CENTER VALIGN=TOP>\n"); 02422 02423 printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Service Alerts</DIV>\n"); 02424 02425 printf("<DIV ALIGN=CENTER>\n"); 02426 printf("<TABLE BORDER=0 CLASS='data'>\n"); 02427 printf("<TR><TH CLASS='data'>State</TH><TH CLASS='data'>Soft Alerts</TH><TH CLASS='data'>Hard Alerts</TH><TH CLASS='data'>Total Alerts</TH></TR>\n"); 02428 02429 printf("<TR CLASS='dataOdd'><TD CLASS='serviceOK'>OK</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD></TR>\n",soft_service_ok_alerts,hard_service_ok_alerts,soft_service_ok_alerts+hard_service_ok_alerts); 02430 printf("<TR CLASS='dataEven'><TD CLASS='serviceWARNING'>WARNING</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD></TR>\n",soft_service_warning_alerts,hard_service_warning_alerts,soft_service_warning_alerts+hard_service_warning_alerts); 02431 printf("<TR CLASS='dataOdd'><TD CLASS='serviceUNKNOWN'>UNKNOWN</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD></TR>\n",soft_service_unknown_alerts,hard_service_unknown_alerts,soft_service_unknown_alerts+hard_service_unknown_alerts); 02432 printf("<TR CLASS='dataEven'><TD CLASS='serviceCRITICAL'>CRITICAL</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD><TD CLASS='dataEven'>%d</TD></TR>\n",soft_service_critical_alerts,hard_service_critical_alerts,soft_service_critical_alerts+hard_service_critical_alerts); 02433 printf("<TR CLASS='dataOdd'><TD CLASS='dataOdd'>All States</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'>%d</TD><TD CLASS='dataOdd'><B>%d</B></TD></TR>\n",soft_service_ok_alerts+soft_service_warning_alerts+soft_service_unknown_alerts+soft_service_critical_alerts,hard_service_ok_alerts+hard_service_warning_alerts+hard_service_unknown_alerts+hard_service_critical_alerts,soft_service_ok_alerts+soft_service_warning_alerts+soft_service_unknown_alerts+soft_service_critical_alerts+hard_service_ok_alerts+hard_service_warning_alerts+hard_service_unknown_alerts+hard_service_critical_alerts); 02434 02435 printf("</TABLE>\n"); 02436 printf("</DIV>\n"); 02437 02438 printf("</TD>\n"); 02439 } 02440 02441 printf("</TR>\n"); 02442 02443 printf("</TABLE>\n"); 02444 printf("</TD></TR></TABLE>\n"); 02445 } 02446 02447 return; 02448 }