Icinga-core 1.4.0
next gen monitoring
cgi/summary.c
Go to the documentation of this file.
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(&current_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,&current_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)?" &amp; ":"");
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)?" &amp; ":"");
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(&current_time);
00443                 t=localtime(&current_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,&current_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,&current_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,&current_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(&current_time);
01294 
01295         st=localtime(&current_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(&current_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,&current_authdata)==FALSE)
01397                         return;
01398         }else{
01399                 if(is_authorized_for_host(temp_host,&current_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,&current_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,&current_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,&current_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,&current_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 }
 All Data Structures Files Functions Variables Typedefs Defines