Logo Search packages:      
Sourcecode: nagios3 version File versions  Download package

summary.c

/**************************************************************************
 *
 * SUMMARY.C -  Nagios Alert Summary CGI
 *
 * Copyright (c) 2002-2008 Ethan Galstad (nagios@nagios.org)
 * Last Modified: 01-23-2008
 *
 * License:
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *************************************************************************/

#include "../include/config.h"
#include "../include/common.h"
#include "../include/objects.h"
#include "../include/comments.h"
#include "../include/statusdata.h"

#include "../include/cgiutils.h"
#include "../include/getcgi.h"
#include "../include/cgiauth.h"


extern char main_config_file[MAX_FILENAME_LENGTH];
extern char url_html_path[MAX_FILENAME_LENGTH];
extern char url_images_path[MAX_FILENAME_LENGTH];
extern char url_stylesheets_path[MAX_FILENAME_LENGTH];

extern host *host_list;
extern hostgroup *hostgroup_list;
extern service *service_list;
extern servicegroup *servicegroup_list;

extern int       log_rotation_method;


/* output types */
#define HTML_OUTPUT             0
#define CSV_OUTPUT              1

/* custom report types */
#define REPORT_NONE                    0
#define REPORT_RECENT_ALERTS           1
#define REPORT_ALERT_TOTALS            2
#define REPORT_TOP_ALERTS              3
#define REPORT_HOSTGROUP_ALERT_TOTALS  4 
#define REPORT_HOST_ALERT_TOTALS       5
#define REPORT_SERVICE_ALERT_TOTALS    6
#define REPORT_SERVICEGROUP_ALERT_TOTALS 7

/* standard report types */
#define SREPORT_NONE                   0
#define SREPORT_RECENT_ALERTS          1
#define SREPORT_RECENT_HOST_ALERTS     2
#define SREPORT_RECENT_SERVICE_ALERTS  3
#define SREPORT_TOP_HOST_ALERTS        4
#define SREPORT_TOP_SERVICE_ALERTS     5

/* standard report times */
#define TIMEPERIOD_CUSTOM     0
#define TIMEPERIOD_TODAY      1
#define TIMEPERIOD_YESTERDAY  2
#define TIMEPERIOD_THISWEEK   3
#define TIMEPERIOD_LASTWEEK   4
#define TIMEPERIOD_THISMONTH  5
#define TIMEPERIOD_LASTMONTH  6
#define TIMEPERIOD_THISQUARTER      7
#define TIMEPERIOD_LASTQUARTER      8
#define TIMEPERIOD_THISYEAR   9
#define TIMEPERIOD_LASTYEAR   10
#define TIMEPERIOD_LAST24HOURS      11
#define TIMEPERIOD_LAST7DAYS  12
#define TIMEPERIOD_LAST31DAYS 13

#define AE_SOFT_STATE           1
#define AE_HARD_STATE           2

#define AE_HOST_ALERT           1
#define AE_SERVICE_ALERT        2

#define AE_HOST_PRODUCER        1
#define AE_SERVICE_PRODUCER     2

#define AE_HOST_DOWN            1
#define AE_HOST_UNREACHABLE     2
#define AE_HOST_UP              4
#define AE_SERVICE_WARNING      8
#define AE_SERVICE_UNKNOWN      16
#define AE_SERVICE_CRITICAL     32
#define AE_SERVICE_OK           64

typedef struct archived_event_struct{
      time_t  time_stamp;
      int     event_type;
      int     entry_type;
      char    *host_name;
      char    *service_description;
      int     state;
      int     state_type;
      char    *event_info;
      struct archived_event_struct *next;
        }archived_event;

typedef struct alert_producer_struct{
      int     producer_type;
      char    *host_name;
      char    *service_description;
      int     total_alerts;
      struct alert_producer_struct *next;
        }alert_producer;


void read_archived_event_data(void);
void scan_log_file_for_archived_event_data(char *);
void convert_timeperiod_to_times(int);
void compute_report_times(void);
void determine_standard_report_options(void);
void add_archived_event(int,time_t,int,int,char *,char *,char *);
alert_producer *find_producer(int,char *,char *);
alert_producer *add_producer(int,char *,char *);
void free_event_list(void);
void free_producer_list(void);

void display_report(void);
void display_recent_alerts(void);
void display_alert_totals(void);
void display_hostgroup_alert_totals(void);
void display_specific_hostgroup_alert_totals(hostgroup *);
void display_servicegroup_alert_totals(void);
void display_specific_servicegroup_alert_totals(servicegroup *);
void display_host_alert_totals(void);
void display_specific_host_alert_totals(host *);
void display_service_alert_totals(void);
void display_specific_service_alert_totals(service *);
void display_top_alerts(void);

void document_header(int);
void document_footer(void);
int process_cgivars(void);


archived_event *event_list=NULL;
alert_producer *producer_list=NULL;

authdata current_authdata;

time_t t1;
time_t t2;

int start_second=0;
int start_minute=0;
int start_hour=0;
int start_day=1;
int start_month=1;
int start_year=2000;
int end_second=0;
int end_minute=0;
int end_hour=24;
int end_day=1;
int end_month=1;
int end_year=2000;

int compute_time_from_parts=FALSE;
int timeperiod_type=TIMEPERIOD_CUSTOM;

int state_types=AE_HARD_STATE+AE_SOFT_STATE;
int alert_types=AE_HOST_ALERT+AE_SERVICE_ALERT;
int host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE;
int service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL;

int show_all_hostgroups=TRUE;
int show_all_servicegroups=TRUE;
int show_all_hosts=TRUE;

char *target_hostgroup_name="";
char *target_servicegroup_name="";
char *target_host_name="";
hostgroup *target_hostgroup=NULL;
servicegroup *target_servicegroup=NULL;
host *target_host=NULL;

int earliest_archive=0;
int item_limit=25;
int total_items=0;

int embedded=FALSE;
int display_header=TRUE;

int output_format=HTML_OUTPUT;
int display_type=REPORT_RECENT_ALERTS;
int standard_report=SREPORT_NONE;
int generate_report=FALSE;



int main(int argc, char **argv){
      int result=OK;
      char temp_buffer[MAX_INPUT_BUFFER];
      char start_timestring[MAX_DATETIME_LENGTH];
      char end_timestring[MAX_DATETIME_LENGTH];
      host *temp_host;
      int days, hours, minutes, seconds;
      hostgroup *temp_hostgroup;
      servicegroup *temp_servicegroup;
      time_t t3;
      time_t current_time;
      struct tm *t;
      int x;

      /* reset internal CGI variables */
      reset_cgi_vars();
      
      /* read the CGI configuration file */
      result=read_cgi_config_file(get_cgi_config_location());
      if(result==ERROR){
            document_header(FALSE);
            cgi_config_file_error(get_cgi_config_location());
            document_footer();
            return ERROR;
              }

      /* read the main configuration file */
      result=read_main_config_file(main_config_file);
      if(result==ERROR){
            document_header(FALSE);
            main_config_file_error(main_config_file);
            document_footer();
            return ERROR;
              }

      /* read all object configuration data */
      result=read_all_object_configuration_data(main_config_file,READ_ALL_OBJECT_DATA);
      if(result==ERROR){
            document_header(FALSE);
            object_data_error();
            document_footer();
            return ERROR;
                }

      /* initialize report time period to last 24 hours */
      time(&t2);
      t1=(time_t)(t2-(60*60*24));

      /* get the arguments passed in the URL */
      process_cgivars();

      document_header(TRUE);

      /* get authentication information */
      get_authentication_information(&current_authdata);

      if(standard_report!=SREPORT_NONE)
            determine_standard_report_options();

      if(compute_time_from_parts==TRUE)
            compute_report_times();

      /* make sure times are sane, otherwise swap them */
      if(t2<t1){
            t3=t2;
            t2=t1;
            t1=t3;
              }
                  
      if(display_header==TRUE){

            /* begin top table */
            printf("<table border=0 width=100%% cellspacing=0 cellpadding=0>\n");
            printf("<tr>\n");

            /* left column of the first row */
            printf("<td align=left valign=top width=33%%>\n");

            snprintf(temp_buffer,sizeof(temp_buffer)-1,"Alert Summary Report");
            temp_buffer[sizeof(temp_buffer)-1]='\x0';
            display_info_table(temp_buffer,FALSE,&current_authdata);

            printf("</td>\n");

            /* center column of top row */
            printf("<td align=center valign=top width=33%%>\n");

            if(generate_report==TRUE){

                  printf("<DIV ALIGN=CENTER CLASS='dataTitle'>\n");
                  if(display_type==REPORT_TOP_ALERTS)
                        printf("Top Alert Producers");
                  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)
                        printf("Alert Totals");
                  else
                        printf("Most Recent Alerts");

                  if(show_all_hostgroups==FALSE)
                        printf(" For Hostgroup '%s'",target_hostgroup_name);
                  else if(show_all_servicegroups==FALSE)
                        printf(" For Servicegroup '%s'",target_servicegroup_name);
                  else if(show_all_hosts==FALSE)
                        printf(" For Host '%s'",target_host_name);

                  printf("</DIV>\n");

                  printf("<BR>\n");

                  get_time_string(&t1,start_timestring,sizeof(start_timestring)-1,SHORT_DATE_TIME);
                  get_time_string(&t2,end_timestring,sizeof(end_timestring)-1,SHORT_DATE_TIME);
                  printf("<div align=center class='reportRange'>%s to %s</div>\n",start_timestring,end_timestring);

                  get_time_breakdown((time_t)(t2-t1),&days,&hours,&minutes,&seconds);
                  printf("<div align=center class='reportDuration'>Duration: %dd %dh %dm %ds</div>\n",days,hours,minutes,seconds);
                    }

            printf("</td>\n");

            /* right hand column of top row */
            printf("<td align=right valign=bottom width=33%%>\n");

            if(generate_report==TRUE){

                  printf("<table border=0>\n");

                  printf("<tr>\n");
                  printf("<td valign=top align=left class='optBoxTitle' colspan=2>Report Options Summary:</td>\n");
                  printf("</tr>\n");

                  printf("<tr>\n");
                  printf("<td valign=top align=left class='optBoxItem'>Alert Types:</td>\n");
                  printf("<td valign=top align=left class='optBoxValue'>\n");
                  if(alert_types & AE_HOST_ALERT)
                        printf("Host");
                  if(alert_types & AE_SERVICE_ALERT)
                        printf("%sService",(alert_types & AE_HOST_ALERT)?" &amp; ":"");
                  printf(" Alerts</td>\n");
                  printf("</tr>\n");

                  printf("<tr>\n");
                  printf("<td valign=top align=left class='optBoxItem'>State Types:</td>\n");
                  printf("<td valign=top align=left class='optBoxValue'>");
                  if(state_types & AE_SOFT_STATE)
                        printf("Soft");
                  if(state_types & AE_HARD_STATE)
                        printf("%sHard",(state_types & AE_SOFT_STATE)?" &amp; ":"");
                  printf(" States</td>\n");
                  printf("</tr>\n");

                  printf("<tr>\n");
                  printf("<td valign=top align=left class='optBoxItem'>Host States:</td>\n");
                  printf("<td valign=top align=left class='optBoxValue'>");
                  x=0;
                  if(host_states & AE_HOST_UP){
                        printf("Up");
                        x=1;
                          }
                  if(host_states & AE_HOST_DOWN){
                        printf("%sDown",(x==1)?", ":"");
                        x=1;
                          }
                  if(host_states & AE_HOST_UNREACHABLE)
                        printf("%sUnreachable",(x==1)?", ":"");
                  if(x==0)
                        printf("None");
                  printf("</td>\n");
                  printf("</tr>\n");

                  printf("<tr>\n");
                  printf("<td valign=top align=left class='optBoxItem'>Service States:</td>\n");
                  printf("<td valign=top align=left class='optBoxValue'>");
                  x=0;
                  if(service_states & AE_SERVICE_OK){
                        printf("Ok");
                        x=1;
                          }
                  if(service_states & AE_SERVICE_WARNING){
                        printf("%sWarning",(x==1)?", ":"");
                        x=1;
                          }
                  if(service_states & AE_SERVICE_UNKNOWN){
                        printf("%sUnknown",(x==1)?", ":"");
                        x=1;
                          }
                  if(service_states & AE_SERVICE_CRITICAL)
                        printf("%sCritical",(x==1)?", ":"");
                  if(x==0)
                        printf("None");
                  printf("</td>\n");
                  printf("</tr>\n");

                  printf("<tr>\n");
                  printf("<td valign=top align=left colspan=2 class='optBoxItem'>\n");
                  printf("<form action='%s' method='GET'>\n",SUMMARY_CGI);
                  printf("<input type='submit' name='btnSubmit' value='Generate New Report'>\n");
                  printf("</form>\n");
                  printf("</td>\n");
                  printf("</tr>\n");

                  /* display context-sensitive help */
                  printf("<tr><td></td><td align=right valign=bottom>\n");
                  if(display_type==REPORT_TOP_ALERTS)
                        display_context_help(CONTEXTHELP_SUMMARY_ALERT_PRODUCERS);
                  else if(display_type==REPORT_ALERT_TOTALS)
                        display_context_help(CONTEXTHELP_SUMMARY_ALERT_TOTALS);
                  else if(display_type==REPORT_HOSTGROUP_ALERT_TOTALS)
                        display_context_help(CONTEXTHELP_SUMMARY_HOSTGROUP_ALERT_TOTALS);
                  else if(display_type==REPORT_HOST_ALERT_TOTALS)
                        display_context_help(CONTEXTHELP_SUMMARY_HOST_ALERT_TOTALS);
                  else if(display_type==REPORT_SERVICE_ALERT_TOTALS)
                        display_context_help(CONTEXTHELP_SUMMARY_SERVICE_ALERT_TOTALS);
                  else if(display_type==REPORT_SERVICEGROUP_ALERT_TOTALS)
                        display_context_help(CONTEXTHELP_SUMMARY_SERVICEGROUP_ALERT_TOTALS);
                  else
                        display_context_help(CONTEXTHELP_SUMMARY_RECENT_ALERTS);
                  printf("</td></tr>\n");

                  printf("</table>\n");
                    }

            else{
                  printf("<table border=0>\n");

                  printf("<tr><td></td><td align=right valign=bottom>\n");
                  display_context_help(CONTEXTHELP_SUMMARY_MENU);
                  printf("</td></tr>\n");

                  printf("</table>\n");
                    }

            printf("</td>\n");

            /* end of top table */
            printf("</tr>\n");
            printf("</table>\n");
              }


      /*********************************/
      /****** GENERATE THE REPORT ******/
      /*********************************/

      if(generate_report==TRUE){
            read_archived_event_data();
            display_report();
              }

      /* ask user for report options */
      else{

            time(&current_time);
            t=localtime(&current_time);

            start_day=1;
            start_year=t->tm_year+1900;
            end_day=t->tm_mday;
            end_year=t->tm_year+1900;

            printf("<DIV ALIGN=CENTER CLASS='dateSelectTitle'>Standard Reports:</DIV>\n");
            printf("<DIV ALIGN=CENTER>\n");
              printf("<form method=\"get\" action=\"%s\">\n",SUMMARY_CGI);

            printf("<input type='hidden' name='report' value='1'>\n");

            printf("<table border=0 cellpadding=5>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>Report Type:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<select name='standardreport'>\n");
            printf("<option value=%d>25 Most Recent Hard Alerts\n",SREPORT_RECENT_ALERTS);
            printf("<option value=%d>25 Most Recent Hard Host Alerts\n",SREPORT_RECENT_HOST_ALERTS);
            printf("<option value=%d>25 Most Recent Hard Service Alerts\n",SREPORT_RECENT_SERVICE_ALERTS);
            printf("<option value=%d>Top 25 Hard Host Alert Producers\n",SREPORT_TOP_HOST_ALERTS);
            printf("<option value=%d>Top 25 Hard Service Alert Producers\n",SREPORT_TOP_SERVICE_ALERTS);
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Create Summary Report!'></td></tr>\n");

            printf("</table>\n");

            printf("</form>\n");
            printf("</DIV>\n");

            printf("<DIV ALIGN=CENTER CLASS='dateSelectTitle'>Custom Report Options:</DIV>\n");
            printf("<DIV ALIGN=CENTER>\n");
              printf("<form method=\"get\" action=\"%s\">\n",SUMMARY_CGI);

            printf("<input type='hidden' name='report' value='1'>\n");

            printf("<table border=0 cellpadding=5>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>Report Type:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<select name='displaytype'>\n");
            printf("<option value=%d>Most Recent Alerts\n",REPORT_RECENT_ALERTS);
            printf("<option value=%d>Alert Totals\n",REPORT_ALERT_TOTALS);
            printf("<option value=%d>Alert Totals By Hostgroup\n",REPORT_HOSTGROUP_ALERT_TOTALS);
            printf("<option value=%d>Alert Totals By Host\n",REPORT_HOST_ALERT_TOTALS);
            printf("<option value=%d>Alert Totals By Servicegroup\n",REPORT_SERVICEGROUP_ALERT_TOTALS);
            printf("<option value=%d>Alert Totals By Service\n",REPORT_SERVICE_ALERT_TOTALS);
            printf("<option value=%d>Top Alert Producers\n",REPORT_TOP_ALERTS);
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr>");
            printf("<td valign=top class='reportSelectSubTitle'>Report Period:</td>\n");
            printf("<td valign=top align=left class='optBoxItem'>\n");
            printf("<select name='timeperiod'>\n");
            printf("<option value=today>Today\n");
            printf("<option value=last24hours>Last 24 Hours\n");
            printf("<option value=yesterday>Yesterday\n");
            printf("<option value=thisweek>This Week\n");
            printf("<option value=last7days SELECTED>Last 7 Days\n");
            printf("<option value=lastweek>Last Week\n");
            printf("<option value=thismonth>This Month\n");
            printf("<option value=last31days>Last 31 Days\n");
            printf("<option value=lastmonth>Last Month\n");
            printf("<option value=thisyear>This Year\n");
            printf("<option value=lastyear>Last Year\n");
            printf("<option value=custom>* CUSTOM REPORT PERIOD *\n");
            printf("</select>\n");
            printf("</td>\n");
            printf("</tr>\n");

            printf("<tr><td valign=top class='reportSelectSubTitle'>If Custom Report Period...</td></tr>\n");

            printf("<tr>");
            printf("<td valign=top class='reportSelectSubTitle'>Start Date (Inclusive):</td>\n");
            printf("<td align=left valign=top class='reportSelectItem'>");
            printf("<select name='smon'>\n");
            printf("<option value='1' %s>January\n",(t->tm_mon==0)?"SELECTED":"");
            printf("<option value='2' %s>February\n",(t->tm_mon==1)?"SELECTED":"");
            printf("<option value='3' %s>March\n",(t->tm_mon==2)?"SELECTED":"");
            printf("<option value='4' %s>April\n",(t->tm_mon==3)?"SELECTED":"");
            printf("<option value='5' %s>May\n",(t->tm_mon==4)?"SELECTED":"");
            printf("<option value='6' %s>June\n",(t->tm_mon==5)?"SELECTED":"");
            printf("<option value='7' %s>July\n",(t->tm_mon==6)?"SELECTED":"");
            printf("<option value='8' %s>August\n",(t->tm_mon==7)?"SELECTED":"");
            printf("<option value='9' %s>September\n",(t->tm_mon==8)?"SELECTED":"");
            printf("<option value='10' %s>October\n",(t->tm_mon==9)?"SELECTED":"");
            printf("<option value='11' %s>November\n",(t->tm_mon==10)?"SELECTED":"");
            printf("<option value='12' %s>December\n",(t->tm_mon==11)?"SELECTED":"");
            printf("</select>\n ");
            printf("<input type='text' size='2' maxlength='2' name='sday' value='%d'> ",start_day);
            printf("<input type='text' size='4' maxlength='4' name='syear' value='%d'>",start_year);
            printf("<input type='hidden' name='shour' value='0'>\n");
            printf("<input type='hidden' name='smin' value='0'>\n");
            printf("<input type='hidden' name='ssec' value='0'>\n");
            printf("</td>\n");
            printf("</tr>\n");

            printf("<tr>");
            printf("<td valign=top class='reportSelectSubTitle'>End Date (Inclusive):</td>\n");
            printf("<td align=left valign=top class='reportSelectItem'>");
            printf("<select name='emon'>\n");
            printf("<option value='1' %s>January\n",(t->tm_mon==0)?"SELECTED":"");
            printf("<option value='2' %s>February\n",(t->tm_mon==1)?"SELECTED":"");
            printf("<option value='3' %s>March\n",(t->tm_mon==2)?"SELECTED":"");
            printf("<option value='4' %s>April\n",(t->tm_mon==3)?"SELECTED":"");
            printf("<option value='5' %s>May\n",(t->tm_mon==4)?"SELECTED":"");
            printf("<option value='6' %s>June\n",(t->tm_mon==5)?"SELECTED":"");
            printf("<option value='7' %s>July\n",(t->tm_mon==6)?"SELECTED":"");
            printf("<option value='8' %s>August\n",(t->tm_mon==7)?"SELECTED":"");
            printf("<option value='9' %s>September\n",(t->tm_mon==8)?"SELECTED":"");
            printf("<option value='10' %s>October\n",(t->tm_mon==9)?"SELECTED":"");
            printf("<option value='11' %s>November\n",(t->tm_mon==10)?"SELECTED":"");
            printf("<option value='12' %s>December\n",(t->tm_mon==11)?"SELECTED":"");
            printf("</select>\n ");
            printf("<input type='text' size='2' maxlength='2' name='eday' value='%d'> ",end_day);
            printf("<input type='text' size='4' maxlength='4' name='eyear' value='%d'>",end_year);
            printf("<input type='hidden' name='ehour' value='24'>\n");
            printf("<input type='hidden' name='emin' value='0'>\n");
            printf("<input type='hidden' name='esec' value='0'>\n");
            printf("</td>\n");
            printf("</tr>\n");

            printf("<tr><td colspan=2><br></td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' valign=center>Limit To Hostgroup:</td><td align=left valign=center class='reportSelectItem'>\n");
            printf("<select name='hostgroup'>\n");
            printf("<option value='all'>** ALL HOSTGROUPS **\n");
            for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next){
                  if(is_authorized_for_hostgroup(temp_hostgroup,&current_authdata)==TRUE)
                        printf("<option value='%s'>%s\n",temp_hostgroup->group_name,temp_hostgroup->group_name);
                    }
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' valign=center>Limit To Servicegroup:</td><td align=left valign=center class='reportSelectItem'>\n");
            printf("<select name='servicegroup'>\n");
            printf("<option value='all'>** ALL SERVICEGROUPS **\n");
            for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next){
                  if(is_authorized_for_servicegroup(temp_servicegroup,&current_authdata)==TRUE)
                        printf("<option value='%s'>%s\n",temp_servicegroup->group_name,temp_servicegroup->group_name);
                    }
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' valign=center>Limit To Host:</td><td align=left valign=center class='reportSelectItem'>\n");
            printf("<select name='host'>\n");
            printf("<option value='all'>** ALL HOSTS **\n");

            for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next){
                  if(is_authorized_for_host(temp_host,&current_authdata)==TRUE)
                        printf("<option value='%s'>%s\n",temp_host->name,temp_host->name);
                    }
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>Alert Types:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<select name='alerttypes'>\n");
            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":"");
            printf("<option value=%d %s>Host Alerts\n",AE_HOST_ALERT,(alert_types==AE_HOST_ALERT)?"SELECTED":"");
            printf("<option value=%d %s>Service Alerts\n",AE_SERVICE_ALERT,(alert_types==AE_SERVICE_ALERT)?"SELECTED":"");
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>State Types:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<select name='statetypes'>\n");
            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":"");
            printf("<option value=%d %s>Hard States\n",AE_HARD_STATE,(state_types==AE_HARD_STATE)?"SELECTED":"");
            printf("<option value=%d %s>Soft States\n",AE_SOFT_STATE,(state_types==AE_SOFT_STATE)?"SELECTED":"");
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>Host States:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<select name='hoststates'>\n");
            printf("<option value=%d>All Host States\n",AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE);
            printf("<option value=%d>Host Problem States\n",AE_HOST_DOWN+AE_HOST_UNREACHABLE);
            printf("<option value=%d>Host Up States\n",AE_HOST_UP);
            printf("<option value=%d>Host Down States\n",AE_HOST_DOWN);
            printf("<option value=%d>Host Unreachable States\n",AE_HOST_UNREACHABLE);
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>Service States:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<select name='servicestates'>\n");
            printf("<option value=%d>All Service States\n",AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL);
            printf("<option value=%d>Service Problem States\n",AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL);
            printf("<option value=%d>Service Ok States\n",AE_SERVICE_OK);
            printf("<option value=%d>Service Warning States\n",AE_SERVICE_WARNING);
            printf("<option value=%d>Service Unknown States\n",AE_SERVICE_UNKNOWN);
            printf("<option value=%d>Service Critical States\n",AE_SERVICE_CRITICAL);
            printf("</select>\n");
            printf("</td></tr>\n");

            printf("<tr><td class='reportSelectSubTitle' align=right>Max List Items:</td>\n");
            printf("<td class='reportSelectItem'>\n");
            printf("<input type='text' name='limit' size='3' maxlength='3' value='%d'>\n",item_limit);
            printf("</td></tr>\n");

            printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Create Summary Report!'></td></tr>\n");

            printf("</table>\n");

            printf("</form>\n");
            printf("</DIV>\n");
              }


      document_footer();

      /* free all other allocated memory */
      free_memory();
      free_event_list();
      free_producer_list();

      return OK;
        }



void document_header(int use_stylesheet){
      char date_time[MAX_DATETIME_LENGTH];
      time_t current_time;
      time_t expire_time;

      printf("Cache-Control: no-store\r\n");
      printf("Pragma: no-cache\r\n");

      time(&current_time);
      get_time_string(&current_time,date_time,sizeof(date_time),HTTP_DATE_TIME);
      printf("Last-Modified: %s\r\n",date_time);

      expire_time=(time_t)0;
      get_time_string(&expire_time,date_time,sizeof(date_time),HTTP_DATE_TIME);
      printf("Expires: %s\r\n",date_time);

      if(output_format==HTML_OUTPUT)
            printf("Content-type: text/html\r\n\r\n");
      else{
            printf("Content-type: text/plain\r\n\r\n");
            return;
              }

      if(embedded==TRUE || output_format==CSV_OUTPUT)
            return;

      printf("<html>\n");
      printf("<head>\n");
      printf("<link rel=\"shortcut icon\" href=\"%sfavicon.ico\" type=\"image/ico\">\n",url_images_path);
      printf("<title>\n");
      printf("Nagios Event Summary\n");
      printf("</title>\n");

      if(use_stylesheet==TRUE){
            printf("<LINK REL='stylesheet' TYPE='text/css' HREF='%s%s'>\n",url_stylesheets_path,COMMON_CSS);
            printf("<LINK REL='stylesheet' TYPE='text/css' HREF='%s%s'>\n",url_stylesheets_path,SUMMARY_CSS);
              }
      
      printf("</head>\n");

      printf("<BODY CLASS='summary'>\n");

      /* include user SSI header */
      include_ssi_files(SUMMARY_CGI,SSI_HEADER);

      return;
        }



void document_footer(void){

      if(output_format!=HTML_OUTPUT)
            return;

      if(embedded==TRUE)
            return;

      /* include user SSI footer */
      include_ssi_files(SUMMARY_CGI,SSI_FOOTER);

      printf("</body>\n");
      printf("</html>\n");

      return;
        }



int process_cgivars(void){
      char **variables;
      int error=FALSE;
      int x;

      variables=getcgivars();

      for(x=0;variables[x]!=NULL;x++){

            /* do some basic length checking on the variable identifier to prevent buffer overflows */
            if(strlen(variables[x])>=MAX_INPUT_BUFFER-1){
                  x++;
                  continue;
                    }

            /* we found first time argument */
            else if(!strcmp(variables[x],"t1")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  t1=(time_t)strtoul(variables[x],NULL,10);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=FALSE;
                    }

            /* we found first time argument */
            else if(!strcmp(variables[x],"t2")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  t2=(time_t)strtoul(variables[x],NULL,10);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=FALSE;
                    }

            /* we found the standard timeperiod argument */
            else if(!strcmp(variables[x],"timeperiod")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(!strcmp(variables[x],"today"))
                        timeperiod_type=TIMEPERIOD_TODAY;
                  else if(!strcmp(variables[x],"yesterday"))
                        timeperiod_type=TIMEPERIOD_YESTERDAY;
                  else if(!strcmp(variables[x],"thisweek"))
                        timeperiod_type=TIMEPERIOD_THISWEEK;
                  else if(!strcmp(variables[x],"lastweek"))
                        timeperiod_type=TIMEPERIOD_LASTWEEK;
                  else if(!strcmp(variables[x],"thismonth"))
                        timeperiod_type=TIMEPERIOD_THISMONTH;
                  else if(!strcmp(variables[x],"lastmonth"))
                        timeperiod_type=TIMEPERIOD_LASTMONTH;
                  else if(!strcmp(variables[x],"thisquarter"))
                        timeperiod_type=TIMEPERIOD_THISQUARTER;
                  else if(!strcmp(variables[x],"lastquarter"))
                        timeperiod_type=TIMEPERIOD_LASTQUARTER;
                  else if(!strcmp(variables[x],"thisyear"))
                        timeperiod_type=TIMEPERIOD_THISYEAR;
                  else if(!strcmp(variables[x],"lastyear"))
                        timeperiod_type=TIMEPERIOD_LASTYEAR;
                  else if(!strcmp(variables[x],"last24hours"))
                        timeperiod_type=TIMEPERIOD_LAST24HOURS;
                  else if(!strcmp(variables[x],"last7days"))
                        timeperiod_type=TIMEPERIOD_LAST7DAYS;
                  else if(!strcmp(variables[x],"last31days"))
                        timeperiod_type=TIMEPERIOD_LAST31DAYS;
                  else if(!strcmp(variables[x],"custom"))
                        timeperiod_type=TIMEPERIOD_CUSTOM;
                  else
                        continue;

                  convert_timeperiod_to_times(timeperiod_type);
                  compute_time_from_parts=FALSE;
                    }

            /* we found the embed option */
            else if(!strcmp(variables[x],"embedded"))
                  embedded=TRUE;

            /* we found the noheader option */
            else if(!strcmp(variables[x],"noheader"))
                  display_header=FALSE;

            /* we found time argument */
            else if(!strcmp(variables[x],"smon")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  start_month=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"sday")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  start_day=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"syear")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  start_year=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"smin")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  start_minute=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"ssec")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  start_second=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"shour")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  start_hour=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }


            /* we found time argument */
            else if(!strcmp(variables[x],"emon")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  end_month=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"eday")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  end_day=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"eyear")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  end_year=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"emin")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  end_minute=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"esec")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  end_second=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found time argument */
            else if(!strcmp(variables[x],"ehour")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if(timeperiod_type!=TIMEPERIOD_CUSTOM)
                        continue;

                  end_hour=atoi(variables[x]);
                  timeperiod_type=TIMEPERIOD_CUSTOM;
                  compute_time_from_parts=TRUE;
                    }

            /* we found the item limit argument */
            else if(!strcmp(variables[x],"limit")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  item_limit=atoi(variables[x]);
                    }

            /* we found the state types argument */
            else if(!strcmp(variables[x],"statetypes")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  state_types=atoi(variables[x]);
                    }

            /* we found the alert types argument */
            else if(!strcmp(variables[x],"alerttypes")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  alert_types=atoi(variables[x]);
                    }

            /* we found the host states argument */
            else if(!strcmp(variables[x],"hoststates")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  host_states=atoi(variables[x]);
                    }

            /* we found the service states argument */
            else if(!strcmp(variables[x],"servicestates")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  service_states=atoi(variables[x]);
                    }

            /* we found the generate report argument */
            else if(!strcmp(variables[x],"report")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  generate_report=(atoi(variables[x])>0)?TRUE:FALSE;
                    }


            /* we found the display type argument */
            else if(!strcmp(variables[x],"displaytype")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  display_type=atoi(variables[x]);
                    }

            /* we found the standard report argument */
            else if(!strcmp(variables[x],"standardreport")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  standard_report=atoi(variables[x]);
                    }

            /* we found the hostgroup argument */
            else if(!strcmp(variables[x],"hostgroup")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if((target_hostgroup_name=(char *)strdup(variables[x]))==NULL)
                        target_hostgroup_name="";
                  strip_html_brackets(target_hostgroup_name);

                  if(!strcmp(target_hostgroup_name,"all"))
                        show_all_hostgroups=TRUE;
                  else{
                        show_all_hostgroups=FALSE;
                        target_hostgroup=find_hostgroup(target_hostgroup_name);
                          }
                    }

            /* we found the servicegroup argument */
            else if(!strcmp(variables[x],"servicegroup")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if((target_servicegroup_name=(char *)strdup(variables[x]))==NULL)
                        target_servicegroup_name="";
                  strip_html_brackets(target_servicegroup_name);

                  if(!strcmp(target_servicegroup_name,"all"))
                        show_all_servicegroups=TRUE;
                  else{
                        show_all_servicegroups=FALSE;
                        target_servicegroup=find_servicegroup(target_servicegroup_name);
                          }
                    }

            /* we found the host argument */
            else if(!strcmp(variables[x],"host")){
                  x++;
                  if(variables[x]==NULL){
                        error=TRUE;
                        break;
                          }

                  if((target_host_name=(char *)strdup(variables[x]))==NULL)
                        target_host_name="";
                  strip_html_brackets(target_host_name);

                  if(!strcmp(target_host_name,"all"))
                        show_all_hosts=TRUE;
                  else{
                        show_all_hosts=FALSE;
                        target_host=find_host(target_host_name);
                          }
                    }
              }

      /* free memory allocated to the CGI variables */
      free_cgivars(variables);

      return error;
        }


      
/* reads log files for archived event data */
void read_archived_event_data(void){
      char filename[MAX_FILENAME_LENGTH];
      int oldest_archive=0;
      int newest_archive=0;
      int current_archive=0;

      /* determine oldest archive to use when scanning for data */
      oldest_archive=determine_archive_to_use_from_time(t1);

      /* determine most recent archive to use when scanning for data */
      newest_archive=determine_archive_to_use_from_time(t2);

      if(oldest_archive<newest_archive)
            oldest_archive=newest_archive;

      /* read in all the necessary archived logs (from most recent to earliest) */
      for(current_archive=newest_archive;current_archive<=oldest_archive;current_archive++){

            /* get the name of the log file that contains this archive */
            get_log_archive_to_use(current_archive,filename,sizeof(filename)-1);

            /* scan the log file for archived state data */
            scan_log_file_for_archived_event_data(filename);
              }

      return;
        }



/* grabs archived event data from a log file */
void scan_log_file_for_archived_event_data(char *filename){
      char *input=NULL;
      char *input2=NULL;
      char entry_host_name[MAX_INPUT_BUFFER];
      char entry_svc_description[MAX_INPUT_BUFFER];
      int state;
      int state_type;
      char *temp_buffer;
      char *plugin_output;
      time_t time_stamp;
      mmapfile *thefile;


      if((thefile=mmap_fopen(filename))==NULL)
            return;

      while(1){

            /* free memory */
            free(input);
            free(input2);
            input=NULL;
            input2=NULL;

            /* read the next line */
            if((input=mmap_fgets(thefile))==NULL)
                  break;

            strip(input);

            if((input2=strdup(input))==NULL)
                  continue;

            /* get the timestamp */
            temp_buffer=my_strtok(input2,"]");
            time_stamp=(temp_buffer==NULL)?(time_t)0:(time_t)strtoul(temp_buffer+1,NULL,10);
            if(time_stamp<t1 || time_stamp>t2)
                  continue;
            
            /* host alerts */
            if(strstr(input,"HOST ALERT:")){

                  /* get host name */
                  temp_buffer=my_strtok(NULL,":");
                  temp_buffer=my_strtok(NULL,";");
                  strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
                  entry_host_name[sizeof(entry_host_name)-1]='\x0';

                  /* state type */
                  if(strstr(input,";SOFT;"))
                        state_type=AE_SOFT_STATE;
                  else
                        state_type=AE_HARD_STATE;
                        
                  /* get the plugin output */
                  temp_buffer=my_strtok(NULL,";");
                  temp_buffer=my_strtok(NULL,";");
                  temp_buffer=my_strtok(NULL,";");
                  plugin_output=my_strtok(NULL,"\n");

                  /* state */
                  if(strstr(input,";DOWN;"))
                        state=AE_HOST_DOWN;
                  else if(strstr(input,";UNREACHABLE;"))
                        state=AE_HOST_UNREACHABLE;
                  else if(strstr(input,";RECOVERY") || strstr(input,";UP;"))
                        state=AE_HOST_UP;
                  else
                        continue;

                  add_archived_event(AE_HOST_ALERT,time_stamp,state,state_type,entry_host_name,NULL,plugin_output);
                    }

            /* service alerts */
            if(strstr(input,"SERVICE ALERT:")){

                  /* get host name */
                  temp_buffer=my_strtok(NULL,":");
                  temp_buffer=my_strtok(NULL,";");
                  strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
                  entry_host_name[sizeof(entry_host_name)-1]='\x0';

                  /* get service description */
                  temp_buffer=my_strtok(NULL,";");
                  strncpy(entry_svc_description,(temp_buffer==NULL)?"":temp_buffer,sizeof(entry_svc_description));
                  entry_svc_description[sizeof(entry_svc_description)-1]='\x0';

                  /* state type */
                  if(strstr(input,";SOFT;"))
                        state_type=AE_SOFT_STATE;
                  else
                        state_type=AE_HARD_STATE;

                  /* get the plugin output */
                  temp_buffer=my_strtok(NULL,";");
                  temp_buffer=my_strtok(NULL,";");
                  temp_buffer=my_strtok(NULL,";");
                  plugin_output=my_strtok(NULL,"\n");

                  /* state */
                  if(strstr(input,";WARNING;"))
                        state=AE_SERVICE_WARNING;
                  else if(strstr(input,";UNKNOWN;"))
                        state=AE_SERVICE_UNKNOWN;
                  else if(strstr(input,";CRITICAL;"))
                        state=AE_SERVICE_CRITICAL;
                  else if(strstr(input,";RECOVERY") || strstr(input,";OK;"))
                        state=AE_SERVICE_OK;
                  else
                        continue;

                  add_archived_event(AE_SERVICE_ALERT,time_stamp,state,state_type,entry_host_name,entry_svc_description,plugin_output);
                    }
              }

      /* free memory and close the file */
      free(input);
      free(input2);
      mmap_fclose(thefile);
      
      return;
        }
      



void convert_timeperiod_to_times(int type){
      time_t current_time;
      struct tm *t;

      /* get the current time */
      time(&current_time);

      t=localtime(&current_time);

      t->tm_sec=0;
      t->tm_min=0;
      t->tm_hour=0;

      switch(type){
      case TIMEPERIOD_LAST24HOURS:
            t1=current_time-(60*60*24);
            t2=current_time;
            break;
      case TIMEPERIOD_TODAY:
            t1=mktime(t);
            t2=current_time;
            break;
      case TIMEPERIOD_YESTERDAY:
            t1=(time_t)(mktime(t)-(60*60*24));
            t2=(time_t)mktime(t);
            break;
      case TIMEPERIOD_THISWEEK:
            t1=(time_t)(mktime(t)-(60*60*24*t->tm_wday));
            t2=current_time;
            break;
      case TIMEPERIOD_LASTWEEK:
            t1=(time_t)(mktime(t)-(60*60*24*t->tm_wday)-(60*60*24*7));
            t2=(time_t)(mktime(t)-(60*60*24*t->tm_wday));
            break;
      case TIMEPERIOD_THISMONTH:
            t->tm_mday=1;
            t1=mktime(t);
            t2=current_time;
            break;
      case TIMEPERIOD_LASTMONTH:
            t->tm_mday=1;
            t2=mktime(t);
            if(t->tm_mon==0){
                  t->tm_mon=11;
                  t->tm_year--;
                    }
            else
                  t->tm_mon--;
            t1=mktime(t);
            break;
      case TIMEPERIOD_THISQUARTER:
            /* not implemented */
            break;
      case TIMEPERIOD_LASTQUARTER:
            /* not implemented */
            break;
      case TIMEPERIOD_THISYEAR:
            t->tm_mon=0;
            t->tm_mday=1;
            t1=mktime(t);
            t2=current_time;
            break;
      case TIMEPERIOD_LASTYEAR:
            t->tm_mon=0;
            t->tm_mday=1;
            t2=mktime(t);
            t->tm_year--;
            t1=mktime(t);
            break;
      case TIMEPERIOD_LAST7DAYS:
            t2=current_time;
            t1=current_time-(7*24*60*60);
            break;
      case TIMEPERIOD_LAST31DAYS:
            t2=current_time;
            t1=current_time-(31*24*60*60);
            break;
      default:
            break;
              }

      return;
        }



void compute_report_times(void){
      time_t current_time;
      struct tm *st;
      struct tm *et;

      /* get the current time */
      time(&current_time);

      st=localtime(&current_time);

      st->tm_sec=start_second;
      st->tm_min=start_minute;
      st->tm_hour=start_hour;
      st->tm_mday=start_day;
      st->tm_mon=start_month-1;
      st->tm_year=start_year-1900;

      t1=mktime(st);

      et=localtime(&current_time);

      et->tm_sec=end_second;
      et->tm_min=end_minute;
      et->tm_hour=end_hour;
      et->tm_mday=end_day;
      et->tm_mon=end_month-1;
      et->tm_year=end_year-1900;

      t2=mktime(et);
        }



void free_event_list(void){
      archived_event *this_event=NULL;
      archived_event *next_event=NULL;

      for(this_event=event_list;this_event!=NULL;){
            next_event=this_event->next;
            if(this_event->host_name!=NULL)
                  free(this_event->host_name);
            if(this_event->service_description!=NULL)
                  free(this_event->service_description);
            if(this_event->event_info!=NULL)
                  free(this_event->event_info);
            free(this_event);
            this_event=next_event;
              }

      event_list=NULL;

      return;
        }


/* adds an archived event entry to the list in memory */
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){
      archived_event *last_event=NULL;
      archived_event *temp_event=NULL;
      archived_event *new_event=NULL;
      service *temp_service=NULL;
      host *temp_host;


      /* check timestamp sanity */
      if(time_stamp<t1 || time_stamp>t2)
            return;

      /* check alert type (host or service alert) */
      if(!(alert_types & event_type))
            return;

      /* check state type (soft or hard state) */
      if(!(state_types & state_type))
            return;

      /* check state (host or service state) */
      if(event_type==AE_HOST_ALERT){
            if(!(host_states & entry_type))
                  return;
              }
      else{
            if(!(service_states & entry_type))
                  return;
              }
            
      /* find the host this entry is associated with */
      temp_host=find_host(host_name);

      /* check hostgroup match (valid filter for all reports) */
      if(show_all_hostgroups==FALSE && is_host_member_of_hostgroup(target_hostgroup,temp_host)==FALSE)
            return;

      /* check host match (valid filter for some reports) */
      if(show_all_hosts==FALSE && (display_type==REPORT_RECENT_ALERTS || display_type==REPORT_HOST_ALERT_TOTALS || display_type==REPORT_SERVICE_ALERT_TOTALS)){
            if(target_host==NULL || temp_host==NULL)
                  return;
            if(strcmp(target_host->name,temp_host->name))
                  return;
              }

      /* check servicegroup math (valid filter for all reports) */
      if(event_type==AE_SERVICE_ALERT){
            temp_service=find_service(host_name,svc_description);
            if(show_all_servicegroups==FALSE && is_service_member_of_servicegroup(target_servicegroup,temp_service)==FALSE)
                  return;
               }
      else{
            if(show_all_servicegroups==FALSE && is_host_member_of_servicegroup(target_servicegroup,temp_host)==FALSE)
                  return;
               }

      /* check authorization */
      if(event_type==AE_SERVICE_ALERT){
            if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
                  return;
              }
      else{
            if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
                  return;
              }

#ifdef DEBUG
      if(event_type==AE_HOST_ALERT)
            printf("Adding host alert (%s) @ %lu<BR>\n",host_name,(unsigned long)time_stamp);
      else
            printf("Adding service alert (%s/%s) @ %lu<BR>\n",host_name,svc_description,(unsigned long)time_stamp);
#endif

      /* allocate memory for the new entry */
      new_event=(archived_event *)malloc(sizeof(archived_event));
      if(new_event==NULL)
            return;

      /* allocate memory for the host name */
      if(host_name!=NULL){
            new_event->host_name=(char *)malloc(strlen(host_name)+1);
            if(new_event->host_name!=NULL)
                  strcpy(new_event->host_name,host_name);
              }
      else 
            new_event->host_name=NULL;

      /* allocate memory for the service description */
      if(svc_description!=NULL){
            new_event->service_description=(char *)malloc(strlen(svc_description)+1);
            if(new_event->service_description!=NULL)
                  strcpy(new_event->service_description,svc_description);
              }
      else 
            new_event->service_description=NULL;

      /* allocate memory for the event info */
      if(event_info!=NULL){
            new_event->event_info=(char *)malloc(strlen(event_info)+1);
            if(new_event->event_info!=NULL)
                  strcpy(new_event->event_info,event_info);
              }
      else 
            new_event->event_info=NULL;

      new_event->event_type=event_type;
      new_event->time_stamp=time_stamp;
      new_event->entry_type=entry_type;
      new_event->state_type=state_type;


      /* add the new entry to the list in memory, sorted by time */
      last_event=event_list;
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){
            if(new_event->time_stamp>=temp_event->time_stamp){
                  new_event->next=temp_event;
                  if(temp_event==event_list)
                        event_list=new_event;
                  else
                        last_event->next=new_event;
                  break;
                    }
            else
                  last_event=temp_event;
              }
      if(event_list==NULL){
            new_event->next=NULL;
            event_list=new_event;
              }
      else if(temp_event==NULL){
            new_event->next=NULL;
            last_event->next=new_event;
              }

      total_items++;

      return;
        }



/* determines standard report options */
void determine_standard_report_options(void){

      /* report over last 7 days */
      convert_timeperiod_to_times(TIMEPERIOD_LAST7DAYS);
      compute_time_from_parts=FALSE;

      /* common options */
      state_types=AE_HARD_STATE;
      item_limit=25;

      /* report-specific options */
      switch(standard_report){

      case SREPORT_RECENT_ALERTS:
            display_type=REPORT_RECENT_ALERTS;
            alert_types=AE_HOST_ALERT+AE_SERVICE_ALERT;
            host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE;
            service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL;
            break;

      case SREPORT_RECENT_HOST_ALERTS:
            display_type=REPORT_RECENT_ALERTS;
            alert_types=AE_HOST_ALERT;
            host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE;
            break;

      case SREPORT_RECENT_SERVICE_ALERTS:
            display_type=REPORT_RECENT_ALERTS;
            alert_types=AE_SERVICE_ALERT;
            service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL;
            break;

      case SREPORT_TOP_HOST_ALERTS:
            display_type=REPORT_TOP_ALERTS;
            alert_types=AE_HOST_ALERT;
            host_states=AE_HOST_UP+AE_HOST_DOWN+AE_HOST_UNREACHABLE;
            break;

      case SREPORT_TOP_SERVICE_ALERTS:
            display_type=REPORT_TOP_ALERTS;
            alert_types=AE_SERVICE_ALERT;
            service_states=AE_SERVICE_OK+AE_SERVICE_WARNING+AE_SERVICE_UNKNOWN+AE_SERVICE_CRITICAL;
            break;

      default:
            break;
              }

      return;
        }



/* displays report */
void display_report(void){

      switch(display_type){

      case REPORT_ALERT_TOTALS:
            display_alert_totals();
            break;

      case REPORT_HOSTGROUP_ALERT_TOTALS:
            display_hostgroup_alert_totals();
            break;

      case REPORT_HOST_ALERT_TOTALS:
            display_host_alert_totals();
            break;

      case REPORT_SERVICEGROUP_ALERT_TOTALS:
            display_servicegroup_alert_totals();
            break;

      case REPORT_SERVICE_ALERT_TOTALS:
            display_service_alert_totals();
            break;

      case REPORT_TOP_ALERTS:
            display_top_alerts();
            break;

      default:
            display_recent_alerts();
            break;
              }

      return;
        }


/* displays recent alerts */
void display_recent_alerts(void){
      archived_event *temp_event;
      int current_item=0;
      int odd=0;
      char *bgclass="";
      char *status_bgclass="";
      char *status="";
      char date_time[MAX_DATETIME_LENGTH];



      printf("<BR>\n");

      if(item_limit<=0 || total_items<=item_limit || total_items==0)
            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying all %d matching alerts\n",total_items);
      else
            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying most recent %d of %d total matching alerts\n",item_limit,total_items);

      printf("<DIV ALIGN=CENTER>\n");
      printf("<TABLE BORDER=0 CLASS='data'>\n");
      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");


      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next,current_item++){

            if(current_item>=item_limit && item_limit>0)
                  break;

            if(odd){
                  odd=0;
                  bgclass="Odd";
                      }
            else{
                  odd=1;
                  bgclass="Even";
                      }

            printf("<tr CLASS='data%s'>",bgclass);

            get_time_string(&temp_event->time_stamp,date_time,(int)sizeof(date_time),SHORT_DATE_TIME);
            printf("<td CLASS='data%s'>%s</td>",bgclass,date_time);

            printf("<td CLASS='data%s'>%s</td>",bgclass,(temp_event->event_type==AE_HOST_ALERT)?"Host Alert":"Service Alert");

            printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s'>%s</a></td>",bgclass,EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_event->host_name),temp_event->host_name);

            if(temp_event->event_type==AE_HOST_ALERT)
                  printf("<td CLASS='data%s'>N/A</td>",bgclass);
            else{
                  printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s",bgclass,EXTINFO_CGI,DISPLAY_SERVICE_INFO,url_encode(temp_event->host_name));
                  printf("&service=%s'>%s</a></td>",url_encode(temp_event->service_description),temp_event->service_description);
                    }

            switch(temp_event->entry_type){
            case AE_HOST_UP:
                  status_bgclass="hostUP";
                  status="UP";
                  break;
            case AE_HOST_DOWN:
                  status_bgclass="hostDOWN";
                  status="DOWN";
                  break;
            case AE_HOST_UNREACHABLE:
                  status_bgclass="hostUNREACHABLE";
                  status="UNREACHABLE";
                  break;
            case AE_SERVICE_OK:
                  status_bgclass="serviceOK";
                  status="OK";
                  break;
            case AE_SERVICE_WARNING:
                  status_bgclass="serviceWARNING";
                  status="WARNING";
                  break;
            case AE_SERVICE_UNKNOWN:
                  status_bgclass="serviceUNKNOWN";
                  status="UNKNOWN";
                  break;
            case AE_SERVICE_CRITICAL:
                  status_bgclass="serviceCRITICAL";
                  status="CRITICAL";
                  break;
            default:
                  status_bgclass=bgclass;
                  status="???";
                  break;
                    }

            printf("<td CLASS='%s'>%s</td>",status_bgclass,status);

            printf("<td CLASS='data%s'>%s</td>",bgclass,(temp_event->state_type==AE_SOFT_STATE)?"SOFT":"HARD");

            printf("<td CLASS='data%s'>%s</td>",bgclass,temp_event->event_info);

            printf("</tr>\n");
              }

      printf("</TABLE>\n");
      printf("</DIV>\n");

      return;
        }



/* displays alerts totals */
void display_alert_totals(void){
      int hard_host_up_alerts=0;
      int soft_host_up_alerts=0;
      int hard_host_down_alerts=0;
      int soft_host_down_alerts=0;
      int hard_host_unreachable_alerts=0;
      int soft_host_unreachable_alerts=0;
      int hard_service_ok_alerts=0;
      int soft_service_ok_alerts=0;
      int hard_service_warning_alerts=0;
      int soft_service_warning_alerts=0;
      int hard_service_unknown_alerts=0;
      int soft_service_unknown_alerts=0;
      int hard_service_critical_alerts=0;
      int soft_service_critical_alerts=0;
      archived_event *temp_event;


      /************************/
      /**** OVERALL TOTALS ****/
      /************************/

      /* process all events */
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){

            /* host alerts */
            if(temp_event->event_type==AE_HOST_ALERT){
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_HOST_UP)
                              soft_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              soft_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              soft_host_unreachable_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_HOST_UP)
                              hard_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              hard_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              hard_host_unreachable_alerts++;
                          }
                    }

            /* service alerts */
            else{
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              soft_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              soft_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              soft_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              soft_service_critical_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              hard_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              hard_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              hard_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              hard_service_critical_alerts++;
                          }
                    }
              }

      printf("<BR>\n");

      printf("<DIV ALIGN=CENTER>\n");
      printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Overall Totals</DIV>\n");
      printf("<BR>\n");
      printf("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 CLASS='reportDataOdd'><TR><TD>\n");
      printf("<TABLE BORDER=0>\n");
      printf("<TR>\n");

      if(alert_types & AE_HOST_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Host Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      if(alert_types & AE_SERVICE_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Service Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      printf("</TR>\n");
      printf("</TABLE>\n");
      printf("</TD></TR></TABLE>\n");
      printf("</DIV>\n");

      return;
        }



/* displays hostgroup alert totals  */
void display_hostgroup_alert_totals(void){
      hostgroup *temp_hostgroup;

      /**************************/
      /**** HOSTGROUP TOTALS ****/
      /**************************/

      printf("<BR>\n");

      printf("<DIV ALIGN=CENTER>\n");
      printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Totals By Hostgroup</DIV>\n");

      if(show_all_hostgroups==FALSE)
            display_specific_hostgroup_alert_totals(target_hostgroup);
      else{
            for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next)
                  display_specific_hostgroup_alert_totals(temp_hostgroup);
              }

      printf("</DIV>\n");
      
      return;
        }


/* displays alert totals for a specific hostgroup */
void display_specific_hostgroup_alert_totals(hostgroup *grp){
      int hard_host_up_alerts=0;
      int soft_host_up_alerts=0;
      int hard_host_down_alerts=0;
      int soft_host_down_alerts=0;
      int hard_host_unreachable_alerts=0;
      int soft_host_unreachable_alerts=0;
      int hard_service_ok_alerts=0;
      int soft_service_ok_alerts=0;
      int hard_service_warning_alerts=0;
      int soft_service_warning_alerts=0;
      int hard_service_unknown_alerts=0;
      int soft_service_unknown_alerts=0;
      int hard_service_critical_alerts=0;
      int soft_service_critical_alerts=0;
      archived_event *temp_event;
      host *temp_host;

      if(grp==NULL)
            return;

      /* make sure the user is authorized to view this hostgroup */
      if(is_authorized_for_hostgroup(grp,&current_authdata)==FALSE)
            return;

      /* process all events */
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){

            temp_host=find_host(temp_event->host_name);
            if(is_host_member_of_hostgroup(grp,temp_host)==FALSE)
                  continue;

            /* host alerts */
            if(temp_event->event_type==AE_HOST_ALERT){
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_HOST_UP)
                              soft_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              soft_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              soft_host_unreachable_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_HOST_UP)
                              hard_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              hard_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              hard_host_unreachable_alerts++;
                          }
                    }

            /* service alerts */
            else{
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              soft_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              soft_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              soft_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              soft_service_critical_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              hard_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              hard_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              hard_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              hard_service_critical_alerts++;
                          }
                    }
              }


      printf("<BR>\n");
      printf("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 CLASS='reportDataEven'><TR><TD>\n");
      printf("<TABLE BORDER=0>\n");

      printf("<TR><TD COLSPAN=2 ALIGN=CENTER CLASS='dataSubTitle'>Hostgroup '%s' (%s)</TD></TR>\n",grp->group_name,grp->alias);

      printf("<TR>\n");

      if(alert_types & AE_HOST_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Host Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      if(alert_types & AE_SERVICE_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Service Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      printf("</TR>\n");

      printf("</TABLE>\n");
      printf("</TD></TR></TABLE>\n");

      return;
        }



/* displays host alert totals  */
void display_host_alert_totals(void){
      host *temp_host;

      /*********************/
      /**** HOST TOTALS ****/
      /*********************/

      printf("<BR>\n");

      printf("<DIV ALIGN=CENTER>\n");
      printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Totals By Host</DIV>\n");

      if(show_all_hosts==FALSE)
            display_specific_host_alert_totals(target_host);
      else{
            for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next)
                  display_specific_host_alert_totals(temp_host);
              }

      printf("</DIV>\n");
      
      return;
        }


/* displays alert totals for a specific host */
void display_specific_host_alert_totals(host *hst){
      int hard_host_up_alerts=0;
      int soft_host_up_alerts=0;
      int hard_host_down_alerts=0;
      int soft_host_down_alerts=0;
      int hard_host_unreachable_alerts=0;
      int soft_host_unreachable_alerts=0;
      int hard_service_ok_alerts=0;
      int soft_service_ok_alerts=0;
      int hard_service_warning_alerts=0;
      int soft_service_warning_alerts=0;
      int hard_service_unknown_alerts=0;
      int soft_service_unknown_alerts=0;
      int hard_service_critical_alerts=0;
      int soft_service_critical_alerts=0;
      archived_event *temp_event;

      if(hst==NULL)
            return;

      /* make sure the user is authorized to view this host */
      if(is_authorized_for_host(hst,&current_authdata)==FALSE)
            return;

      if(show_all_hostgroups==FALSE && target_hostgroup!=NULL){
            if(is_host_member_of_hostgroup(target_hostgroup,hst)==FALSE)
                  return;
              }

      /* process all events */
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){

            if(strcmp(temp_event->host_name,hst->name))
                  continue;

            /* host alerts */
            if(temp_event->event_type==AE_HOST_ALERT){
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_HOST_UP)
                              soft_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              soft_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              soft_host_unreachable_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_HOST_UP)
                              hard_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              hard_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              hard_host_unreachable_alerts++;
                          }
                    }

            /* service alerts */
            else{
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              soft_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              soft_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              soft_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              soft_service_critical_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              hard_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              hard_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              hard_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              hard_service_critical_alerts++;
                          }
                    }
              }


      printf("<BR>\n");
      printf("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 CLASS='reportDataEven'><TR><TD>\n");
      printf("<TABLE BORDER=0>\n");

      printf("<TR><TD COLSPAN=2 ALIGN=CENTER CLASS='dataSubTitle'>Host '%s' (%s)</TD></TR>\n",hst->name,hst->alias);

      printf("<TR>\n");

      if(alert_types & AE_HOST_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Host Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      if(alert_types & AE_SERVICE_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Service Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      printf("</TR>\n");

      printf("</TABLE>\n");
      printf("</TD></TR></TABLE>\n");

      return;
        }


/* displays servicegroup alert totals  */
void display_servicegroup_alert_totals(void){
      servicegroup *temp_servicegroup;

      /**************************/
      /**** SERVICEGROUP TOTALS ****/
      /**************************/

      printf("<BR>\n");

      printf("<DIV ALIGN=CENTER>\n");
      printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Totals By Servicegroup</DIV>\n");

      if(show_all_servicegroups==FALSE)
            display_specific_servicegroup_alert_totals(target_servicegroup);
      else{
            for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next)
                  display_specific_servicegroup_alert_totals(temp_servicegroup);
              }

      printf("</DIV>\n");
      
      return;
        }


/* displays alert totals for a specific servicegroup */
void display_specific_servicegroup_alert_totals(servicegroup *grp){
      int hard_host_up_alerts=0;
      int soft_host_up_alerts=0;
      int hard_host_down_alerts=0;
      int soft_host_down_alerts=0;
      int hard_host_unreachable_alerts=0;
      int soft_host_unreachable_alerts=0;
      int hard_service_ok_alerts=0;
      int soft_service_ok_alerts=0;
      int hard_service_warning_alerts=0;
      int soft_service_warning_alerts=0;
      int hard_service_unknown_alerts=0;
      int soft_service_unknown_alerts=0;
      int hard_service_critical_alerts=0;
      int soft_service_critical_alerts=0;
      archived_event *temp_event;
      host *temp_host;
      service *temp_service;

      if(grp==NULL)
            return;

      /* make sure the user is authorized to view this servicegroup */
      if(is_authorized_for_servicegroup(grp,&current_authdata)==FALSE)
            return;

      /* process all events */
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){

            if(temp_event->event_type==AE_HOST_ALERT){

                  temp_host=find_host(temp_event->host_name);
                  if(is_host_member_of_servicegroup(grp,temp_host)==FALSE)
                        continue;
                    }
            else{

                  temp_service=find_service(temp_event->host_name,temp_event->service_description);
                  if(is_service_member_of_servicegroup(grp,temp_service)==FALSE)
                        continue;
                    }

            /* host alerts */
            if(temp_event->event_type==AE_HOST_ALERT){
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_HOST_UP)
                              soft_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              soft_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              soft_host_unreachable_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_HOST_UP)
                              hard_host_up_alerts++;
                        else if(temp_event->entry_type==AE_HOST_DOWN)
                              hard_host_down_alerts++;
                        else if(temp_event->entry_type==AE_HOST_UNREACHABLE)
                              hard_host_unreachable_alerts++;
                          }
                    }

            /* service alerts */
            else{
                  if(temp_event->state_type==AE_SOFT_STATE){
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              soft_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              soft_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              soft_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              soft_service_critical_alerts++;
                          }
                  else{
                        if(temp_event->entry_type==AE_SERVICE_OK)
                              hard_service_ok_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_WARNING)
                              hard_service_warning_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                              hard_service_unknown_alerts++;
                        else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                              hard_service_critical_alerts++;
                          }
                    }
              }


      printf("<BR>\n");
      printf("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 CLASS='reportDataEven'><TR><TD>\n");
      printf("<TABLE BORDER=0>\n");

      printf("<TR><TD COLSPAN=2 ALIGN=CENTER CLASS='dataSubTitle'>Servicegroup '%s' (%s)</TD></TR>\n",grp->group_name,grp->alias);

      printf("<TR>\n");

      if(alert_types & AE_HOST_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Host Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      if(alert_types & AE_SERVICE_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Service Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      printf("</TR>\n");

      printf("</TABLE>\n");
      printf("</TD></TR></TABLE>\n");

      return;
        }



/* displays service alert totals  */
void display_service_alert_totals(void){
      service *temp_service;

      /************************/
      /**** SERVICE TOTALS ****/
      /************************/

      printf("<BR>\n");

      printf("<DIV ALIGN=CENTER>\n");
      printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Totals By Service</DIV>\n");

      for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next)
            display_specific_service_alert_totals(temp_service);

      printf("</DIV>\n");
      
      return;
        }


/* displays alert totals for a specific service */
void display_specific_service_alert_totals(service *svc){
      int hard_service_ok_alerts=0;
      int soft_service_ok_alerts=0;
      int hard_service_warning_alerts=0;
      int soft_service_warning_alerts=0;
      int hard_service_unknown_alerts=0;
      int soft_service_unknown_alerts=0;
      int hard_service_critical_alerts=0;
      int soft_service_critical_alerts=0;
      archived_event *temp_event;
      host *temp_host;

      if(svc==NULL)
            return;

      /* make sure the user is authorized to view this service */
      if(is_authorized_for_service(svc,&current_authdata)==FALSE)
            return;

      if(show_all_hostgroups==FALSE && target_hostgroup!=NULL){
            temp_host=find_host(svc->host_name);
            if(is_host_member_of_hostgroup(target_hostgroup,temp_host)==FALSE)
                  return;
              }

      if(show_all_hosts==FALSE && target_host!=NULL){
            if(strcmp(target_host->name,svc->host_name))
                  return;
              }

      /* process all events */
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){

            if(temp_event->event_type!=AE_SERVICE_ALERT)
                  continue;

            if(strcmp(temp_event->host_name,svc->host_name) || strcmp(temp_event->service_description,svc->description))
                  continue;

            /* service alerts */
            if(temp_event->state_type==AE_SOFT_STATE){
                  if(temp_event->entry_type==AE_SERVICE_OK)
                        soft_service_ok_alerts++;
                  else if(temp_event->entry_type==AE_SERVICE_WARNING)
                        soft_service_warning_alerts++;
                  else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                        soft_service_unknown_alerts++;
                  else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                        soft_service_critical_alerts++;
                    }
            else{
                  if(temp_event->entry_type==AE_SERVICE_OK)
                        hard_service_ok_alerts++;
                  else if(temp_event->entry_type==AE_SERVICE_WARNING)
                        hard_service_warning_alerts++;
                  else if(temp_event->entry_type==AE_SERVICE_UNKNOWN)
                        hard_service_unknown_alerts++;
                  else if(temp_event->entry_type==AE_SERVICE_CRITICAL)
                        hard_service_critical_alerts++;
                    }
              }


      printf("<BR>\n");
      printf("<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 CLASS='reportDataEven'><TR><TD>\n");
      printf("<TABLE BORDER=0>\n");

      printf("<TR><TD COLSPAN=2 ALIGN=CENTER CLASS='dataSubTitle'>Service '%s' on Host '%s'</TD></TR>\n",svc->description,svc->host_name);

      printf("<TR>\n");

      if(alert_types & AE_SERVICE_ALERT){

            printf("<TD ALIGN=CENTER VALIGN=TOP>\n");

            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Service Alerts</DIV>\n");

            printf("<DIV ALIGN=CENTER>\n");
            printf("<TABLE BORDER=0 CLASS='data'>\n");
            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");

            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);
            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);
            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);
            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);
            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);

            printf("</TABLE>\n");
            printf("</DIV>\n");

            printf("</TD>\n");
              }

      printf("</TR>\n");

      printf("</TABLE>\n");
      printf("</TD></TR></TABLE>\n");

      return;
        }


/* find a specific alert producer */
alert_producer *find_producer(int type, char *hname, char *sdesc){
      alert_producer *temp_producer;

      for(temp_producer=producer_list;temp_producer!=NULL;temp_producer=temp_producer->next){

            if(temp_producer->producer_type!=type)
                  continue;
            if(hname!=NULL && strcmp(hname,temp_producer->host_name))
                  continue;
            if(sdesc!=NULL && strcmp(sdesc,temp_producer->service_description))
                  continue;

            return temp_producer;
              }

      return NULL;
        }


/* adds a new producer to the list in memory */
alert_producer *add_producer(int producer_type, char *host_name, char *service_description){
      alert_producer *new_producer=NULL;

      /* allocate memory for the new entry */
      new_producer=(alert_producer *)malloc(sizeof(alert_producer));
      if(new_producer==NULL)
            return NULL;

      /* allocate memory for the host name */
      if(host_name!=NULL){
            new_producer->host_name=(char *)malloc(strlen(host_name)+1);
            if(new_producer->host_name!=NULL)
                  strcpy(new_producer->host_name,host_name);
              }
      else 
            new_producer->host_name=NULL;

      /* allocate memory for the service description */
      if(service_description!=NULL){
            new_producer->service_description=(char *)malloc(strlen(service_description)+1);
            if(new_producer->service_description!=NULL)
                  strcpy(new_producer->service_description,service_description);
              }
      else 
            new_producer->service_description=NULL;

      new_producer->producer_type=producer_type;
      new_producer->total_alerts=0;

      /* add the new entry to the list in memory, sorted by time */
      new_producer->next=producer_list;
      producer_list=new_producer;

      return new_producer;
        }



void free_producer_list(void){
      alert_producer *this_producer=NULL;
      alert_producer *next_producer=NULL;

      for(this_producer=producer_list;this_producer!=NULL;){
            next_producer=this_producer->next;
            if(this_producer->host_name!=NULL)
                  free(this_producer->host_name);
            if(this_producer->service_description!=NULL)
                  free(this_producer->service_description);
            free(this_producer);
            this_producer=next_producer;
              }

      producer_list=NULL;

      return;
        }



/* displays top alerts */
void display_top_alerts(void){
      archived_event *temp_event=NULL;
      alert_producer *temp_producer=NULL;
      alert_producer *next_producer=NULL;
      alert_producer *last_producer=NULL;
      alert_producer *new_producer=NULL;
      alert_producer *temp_list=NULL;
      int producer_type=AE_HOST_PRODUCER;
      int current_item=0;
      int odd=0;
      char *bgclass="";

      /* process all events */
      for(temp_event=event_list;temp_event!=NULL;temp_event=temp_event->next){
            
            producer_type=(temp_event->event_type==AE_HOST_ALERT)?AE_HOST_PRODUCER:AE_SERVICE_PRODUCER;

            /* see if we already have a record for the producer */
            temp_producer=find_producer(producer_type,temp_event->host_name,temp_event->service_description);

            /* if not, add a record */
            if(temp_producer==NULL)
                  temp_producer=add_producer(producer_type,temp_event->host_name,temp_event->service_description);

            /* producer record could not be added */
            if(temp_producer==NULL)
                  continue;

            /* update stats for producer */
            temp_producer->total_alerts++;
              }


      /* sort the producer list by total alerts (descending) */
      total_items=0;
      temp_list=NULL;
      for(new_producer=producer_list;new_producer!=NULL;){
            next_producer=new_producer->next;

            last_producer=temp_list;
            for(temp_producer=temp_list;temp_producer!=NULL;temp_producer=temp_producer->next){
                  if(new_producer->total_alerts>=temp_producer->total_alerts){
                        new_producer->next=temp_producer;
                        if(temp_producer==temp_list)
                              temp_list=new_producer;
                        else
                              last_producer->next=new_producer;
                        break;
                            }
                  else
                        last_producer=temp_producer;
                      }
            if(temp_list==NULL){
                  new_producer->next=NULL;
                  temp_list=new_producer;
                      }
            else if(temp_producer==NULL){
                  new_producer->next=NULL;
                  last_producer->next=new_producer;
                      }

            new_producer=next_producer;
            total_items++;
              }
      producer_list=temp_list;


      printf("<BR>\n");

      if(item_limit<=0 || total_items<=item_limit || total_items==0)
            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying all %d matching alert producers\n",total_items);
      else
            printf("<DIV ALIGN=CENTER CLASS='dataSubTitle'>Displaying top %d of %d total matching alert producers\n",item_limit,total_items);

      printf("<DIV ALIGN=CENTER>\n");
      printf("<TABLE BORDER=0 CLASS='data'>\n");
      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");



      /* display top producers */
      for(temp_producer=producer_list;temp_producer!=NULL;temp_producer=temp_producer->next){

            if(current_item>=item_limit && item_limit>0)
                  break;

            current_item++;

            if(odd){
                  odd=0;
                  bgclass="Odd";
                      }
            else{
                  odd=1;
                  bgclass="Even";
                      }

            printf("<tr CLASS='data%s'>",bgclass);

            printf("<td CLASS='data%s'>#%d</td>",bgclass,current_item);

            printf("<td CLASS='data%s'>%s</td>",bgclass,(temp_producer->producer_type==AE_HOST_PRODUCER)?"Host":"Service");

            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);

            if(temp_producer->producer_type==AE_HOST_PRODUCER)
                  printf("<td CLASS='data%s'>N/A</td>",bgclass);
            else{
                  printf("<td CLASS='data%s'><a href='%s?type=%d&host=%s",bgclass,EXTINFO_CGI,DISPLAY_SERVICE_INFO,url_encode(temp_producer->host_name));
                  printf("&service=%s'>%s</a></td>",url_encode(temp_producer->service_description),temp_producer->service_description);
                    }

            printf("<td CLASS='data%s'>%d</td>",bgclass,temp_producer->total_alerts);

            printf("</tr>\n");
              }

      printf("</TABLE>\n");
      printf("</DIV>\n");

      return;
        }

Generated by  Doxygen 1.6.0   Back to index