Icinga-core 1.4.0
next gen monitoring
cgi/avail.c
Go to the documentation of this file.
00001 /**************************************************************************
00002  *
00003  * AVAIL.C -  Icinga Availability CGI
00004  *
00005  * Copyright (c) 2000-2010 Ethan Galstad (egalstad@nagios.org)
00006  * Copyright (c) 2009-2011 Icinga Development Team (http://www.icinga.org)
00007  *
00008  * License:
00009  *
00010  * This program is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License version 2 as
00012  * published by the Free Software Foundation.
00013  *
00014  * This program is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  * GNU General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU General Public License
00020  * along with this program; if not, write to the Free Software
00021  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00022  *************************************************************************/
00023 
00024 #include "../include/config.h"
00025 #include "../include/common.h"
00026 #include "../include/objects.h"
00027 #include "../include/comments.h"
00028 #include "../include/statusdata.h"
00029 #include "../include/readlogs.h"
00030 
00031 #include "../include/cgiutils.h"
00032 #include "../include/cgiauth.h"
00033 #include "../include/getcgi.h"
00034 
00035 
00036 extern char main_config_file[MAX_FILENAME_LENGTH];
00037 extern char url_html_path[MAX_FILENAME_LENGTH];
00038 extern char url_images_path[MAX_FILENAME_LENGTH];
00039 extern char url_stylesheets_path[MAX_FILENAME_LENGTH];
00040 extern char url_js_path[MAX_FILENAME_LENGTH];
00041 
00042 extern host      *host_list;
00043 extern hostgroup *hostgroup_list;
00044 extern servicegroup *servicegroup_list;
00045 extern service   *service_list;
00046 extern timeperiod *timeperiod_list;
00047 extern logentry  *entry_list;
00048 
00049 extern int       log_rotation_method;
00050 
00051 #ifndef max
00052 #define max(a,b)  (((a) > (b)) ? (a) : (b))
00053 #endif
00054 #ifndef min
00055 #define min(a,b)  (((a) < (b)) ? (a) : (b))
00056 #endif
00057 
00058 /* archived state types */
00059 #define AS_CURRENT_STATE        -1   /* special case for initial assumed state */
00060 #define AS_NO_DATA              0
00061 #define AS_PROGRAM_END          1
00062 #define AS_PROGRAM_START        2
00063 #define AS_HOST_UP              3
00064 #define AS_HOST_DOWN            4
00065 #define AS_HOST_UNREACHABLE     5
00066 #define AS_SVC_OK               6
00067 #define AS_SVC_UNKNOWN          7
00068 #define AS_SVC_WARNING          8
00069 #define AS_SVC_CRITICAL         9
00070 
00071 #define AS_SVC_DOWNTIME_START   10
00072 #define AS_SVC_DOWNTIME_END     11
00073 #define AS_HOST_DOWNTIME_START  12
00074 #define AS_HOST_DOWNTIME_END    13
00075 
00076 #define AS_SOFT_STATE           1
00077 #define AS_HARD_STATE           2
00078 
00079 
00080 /* display types */
00081 #define DISPLAY_NO_AVAIL        0
00082 #define DISPLAY_HOSTGROUP_AVAIL 1
00083 #define DISPLAY_HOST_AVAIL      2
00084 #define DISPLAY_SERVICE_AVAIL   3
00085 #define DISPLAY_SERVICEGROUP_AVAIL 4
00086 
00087 /* subject types */
00088 #define HOST_SUBJECT            0
00089 #define SERVICE_SUBJECT         1
00090 
00091 #define MIN_TIMESTAMP_SPACING   10
00092 
00093 #define MAX_ARCHIVE_SPREAD      65
00094 #define MAX_ARCHIVE             65
00095 #define MAX_ARCHIVE_BACKTRACKS  60
00096 
00097 authdata current_authdata;
00098 
00099 typedef struct archived_state_struct{
00100         time_t  time_stamp;
00101         int     entry_type;
00102         int     state_type;
00103         char    *state_info;
00104         int     processed_state;
00105         struct archived_state_struct *misc_ptr;
00106         struct archived_state_struct *next;
00107         }archived_state;
00108 
00109 typedef struct avail_subject_struct{
00110         int type;
00111         char *host_name;
00112         char *service_description;
00113         archived_state *as_list;        /* archived state list */
00114         archived_state *as_list_tail;
00115         archived_state *sd_list;        /* scheduled downtime list */
00116         int last_known_state;
00117         time_t earliest_time;
00118         time_t latest_time;
00119         int earliest_state;
00120         int latest_state;
00121 
00122         unsigned long time_up;
00123         unsigned long time_down;
00124         unsigned long time_unreachable;
00125         unsigned long time_ok;
00126         unsigned long time_warning;
00127         unsigned long time_unknown;
00128         unsigned long time_critical;
00129 
00130         unsigned long scheduled_time_up;
00131         unsigned long scheduled_time_down;
00132         unsigned long scheduled_time_unreachable;
00133         unsigned long scheduled_time_ok;
00134         unsigned long scheduled_time_warning;
00135         unsigned long scheduled_time_unknown;
00136         unsigned long scheduled_time_critical;
00137         unsigned long scheduled_time_indeterminate;
00138 
00139         unsigned long time_indeterminate_nodata;
00140         unsigned long time_indeterminate_notrunning;
00141 
00142         struct avail_subject_struct *next;
00143         }avail_subject;
00144 
00145 avail_subject *subject_list=NULL;
00146 
00147 time_t t1;
00148 time_t t2;
00149 
00150 int display_type=DISPLAY_NO_AVAIL;
00151 int timeperiod_type=TIMEPERIOD_LAST24HOURS;
00152 int show_log_entries=FALSE;
00153 int full_log_entries=FALSE;
00154 int show_scheduled_downtime=TRUE;
00155 
00156 int start_second=0;
00157 int start_minute=0;
00158 int start_hour=0;
00159 int start_day=1;
00160 int start_month=1;
00161 int start_year=2000;
00162 int end_second=0;
00163 int end_minute=0;
00164 int end_hour=24;
00165 int end_day=1;
00166 int end_month=1;
00167 int end_year=2000;
00168 
00169 int get_date_parts=FALSE;
00170 int select_hostgroups=FALSE;
00171 int select_hosts=FALSE;
00172 int select_servicegroups=FALSE;
00173 int select_services=FALSE;
00174 
00175 int compute_time_from_parts=FALSE;
00176 
00177 int show_all_hostgroups=FALSE;
00178 int show_all_hosts=FALSE;
00179 int show_all_servicegroups=FALSE;
00180 int show_all_services=FALSE;
00181 
00182 int assume_initial_states=TRUE;
00183 int assume_state_retention=TRUE;
00184 int assume_states_during_notrunning=TRUE;
00185 int initial_assumed_host_state=AS_NO_DATA;
00186 int initial_assumed_service_state=AS_NO_DATA;
00187 int include_soft_states=FALSE;
00188 
00189 char *hostgroup_name="";
00190 char *host_name="";
00191 char *servicegroup_name="";
00192 char *service_desc="";
00193 
00194 void create_subject_list(void);
00195 void add_subject(int,char *,char *);
00196 avail_subject *find_subject(int,char *,char *);
00197 void compute_availability(void);
00198 void compute_subject_availability(avail_subject *,time_t);
00199 void compute_subject_availability_times(int,int,time_t,time_t,time_t,avail_subject *,archived_state *);
00200 void compute_subject_downtime(avail_subject *,time_t);
00201 void compute_subject_downtime_times(time_t,time_t,avail_subject *,archived_state *);
00202 void compute_subject_downtime_part_times(time_t,time_t,int,avail_subject *);
00203 void display_hostgroup_availability(void);
00204 void display_specific_hostgroup_availability(hostgroup *);
00205 void display_servicegroup_availability(void);
00206 void display_specific_servicegroup_availability(servicegroup *);
00207 void display_host_availability(void);
00208 void display_service_availability(void);
00209 void write_log_entries(avail_subject *);
00210 
00211 void get_running_average(double *,double,int);
00212 
00213 void host_report_url(char *,char *);
00214 void service_report_url(char *,char *,char *);
00215 void compute_report_times(void);
00216 
00217 int convert_host_state_to_archived_state(int);
00218 int convert_service_state_to_archived_state(int);
00219 void add_global_archived_state(int,int,time_t,char *);
00220 void add_archived_state(int,int,time_t,char *,avail_subject *);
00221 void add_scheduled_downtime(int,time_t,avail_subject *);
00222 void free_availability_data(void);
00223 void free_archived_state_list(archived_state *);
00224 void read_archived_state_data(void);
00225 void scan_log_file_for_archived_state_data(char *);
00226 unsigned long calculate_total_time(time_t,time_t);
00227 
00228 int process_cgivars(void);
00229 
00230 int backtrack_archives=2;
00231 int earliest_archive=0;
00232 int json_list_start=TRUE;
00233 
00234 extern int embedded;
00235 extern int display_header;
00236 extern int daemon_check;
00237 extern int content_type;
00238 extern int refresh;
00239 
00240 extern char *csv_delimiter;
00241 extern char *csv_data_enclosure;
00242 
00243 timeperiod *current_timeperiod=NULL;
00244 
00245 int CGI_ID=AVAIL_CGI_ID;
00246 
00247 int main(int argc, char **argv){
00248         int result=OK;
00249         char temp_buffer[MAX_INPUT_BUFFER];
00250         char start_timestring[MAX_DATETIME_LENGTH];
00251         char end_timestring[MAX_DATETIME_LENGTH];
00252         host *temp_host;
00253         service *temp_service;
00254         int is_authorized=TRUE;
00255         time_t report_start_time;
00256         time_t report_end_time;
00257         int days, hours, minutes, seconds;
00258         hostgroup *temp_hostgroup;
00259         servicegroup *temp_servicegroup;
00260         timeperiod *temp_timeperiod;
00261         time_t t3;
00262         time_t current_time;
00263         struct tm *t;
00264         char *firsthostpointer;
00265 
00266         /* reset internal CGI variables */
00267         reset_cgi_vars();
00268 
00269         /* read the CGI configuration file */
00270         result=read_cgi_config_file(get_cgi_config_location());
00271         if(result==ERROR){
00272                 document_header(CGI_ID,FALSE);
00273                 print_error(get_cgi_config_location(), ERROR_CGI_CFG_FILE);
00274                 document_footer(CGI_ID);
00275                 return ERROR;
00276                 }
00277 
00278         /* read the main configuration file */
00279         result=read_main_config_file(main_config_file);
00280         if(result==ERROR){
00281                 document_header(CGI_ID,FALSE);
00282                 print_error(main_config_file, ERROR_CGI_MAIN_CFG);
00283                 document_footer(CGI_ID);
00284                 return ERROR;
00285                 }
00286 
00287         /* read all object configuration data */
00288         result=read_all_object_configuration_data(main_config_file,READ_ALL_OBJECT_DATA);
00289         if(result==ERROR){
00290                 document_header(CGI_ID,FALSE);
00291                 print_error(NULL, ERROR_CGI_OBJECT_DATA);
00292                 document_footer(CGI_ID);
00293                 return ERROR;
00294                 }
00295 
00296         /* read all status data */
00297         result=read_all_status_data(get_cgi_config_location(),READ_ALL_STATUS_DATA);
00298         if(result==ERROR && daemon_check==TRUE){
00299                 document_header(CGI_ID,FALSE);
00300                 print_error(NULL, ERROR_CGI_STATUS_DATA);
00301                 document_footer(CGI_ID);
00302                 return ERROR;
00303                 }
00304 
00305         /* initialize time period to last 24 hours */
00306         time(&current_time);
00307         t2=current_time;
00308         t1=(time_t)(current_time-(60*60*24));
00309 
00310         /* default number of backtracked archives */
00311         switch(log_rotation_method){
00312         case LOG_ROTATION_MONTHLY:
00313                 backtrack_archives=1;
00314                 break;
00315         case LOG_ROTATION_WEEKLY:
00316                 backtrack_archives=2;
00317                 break;
00318         case LOG_ROTATION_DAILY:
00319                 backtrack_archives=4;
00320                 break;
00321         case LOG_ROTATION_HOURLY:
00322                 backtrack_archives=8;
00323                 break;
00324         default:
00325                 backtrack_archives=2;
00326                 break;
00327                 }
00328 
00329         /* get the arguments passed in the URL */
00330         process_cgivars();
00331 
00332         document_header(CGI_ID,TRUE);
00333 
00334         /* get authentication information */
00335         get_authentication_information(&current_authdata);
00336 
00337 
00338         if(compute_time_from_parts==TRUE)
00339                 compute_report_times();
00340 
00341         /* make sure times are sane, otherwise swap them */
00342         if(t2<t1){
00343                 t3=t2;
00344                 t2=t1;
00345                 t1=t3;
00346                 }
00347 
00348         /* don't let user create reports in the future */
00349         if(t2>current_time){
00350                 t2=current_time;
00351                 if(t1>t2)
00352                         t1=t2-(60*60*24);
00353                 }
00354 
00355         if(display_header==TRUE){
00356 
00357                 /* begin top table */
00358                 printf("<table border=0 width=100%% cellspacing=0 cellpadding=0>\n");
00359                 printf("<tr>\n");
00360 
00361                 /* left column of the first row */
00362                 printf("<td align=left valign=top width=33%%>\n");
00363 
00364                 switch(display_type){
00365                 case DISPLAY_HOST_AVAIL:
00366                         snprintf(temp_buffer,sizeof(temp_buffer)-1,"Host Availability Report");
00367                         break;
00368                 case DISPLAY_SERVICE_AVAIL:
00369                         snprintf(temp_buffer,sizeof(temp_buffer)-1,"Service Availability Report");
00370                         break;
00371                 case DISPLAY_HOSTGROUP_AVAIL:
00372                         snprintf(temp_buffer,sizeof(temp_buffer)-1,"Hostgroup Availability Report");
00373                         break;
00374                 case DISPLAY_SERVICEGROUP_AVAIL:
00375                         snprintf(temp_buffer,sizeof(temp_buffer)-1,"Servicegroup Availability Report");
00376                         break;
00377                 default:
00378                         snprintf(temp_buffer,sizeof(temp_buffer)-1,"Availability Report");
00379                         break;
00380                         }
00381                 temp_buffer[sizeof(temp_buffer)-1]='\x0';
00382                 display_info_table(temp_buffer,FALSE,&current_authdata, daemon_check);
00383 
00384                 if(((display_type==DISPLAY_HOST_AVAIL && show_all_hosts==FALSE) || (display_type==DISPLAY_SERVICE_AVAIL && show_all_services==FALSE)) && get_date_parts==FALSE){
00385 
00386                         printf("<TABLE BORDER=1 CELLPADDING=0 CELLSPACING=0 CLASS='linkBox'>\n");
00387                         printf("<TR><TD CLASS='linkBox'>\n");
00388 
00389                         if(display_type==DISPLAY_HOST_AVAIL && show_all_hosts==FALSE){
00390                                 host_report_url("all","View Availability Report For All Hosts");
00391                                 printf("<BR>\n");
00392 #ifdef USE_TRENDS
00393                                 printf("<a href='%s?host=%s&t1=%lu&t2=%lu&assumestateretention=%s&assumeinitialstates=%s&includesoftstates=%s&assumestatesduringnotrunning=%s&initialassumedhoststate=%d&backtrack=%d'>View Trends For This Host</a><BR>\n",TRENDS_CGI,url_encode(host_name),t1,t2,(include_soft_states==TRUE)?"yes":"no",(assume_state_retention==TRUE)?"yes":"no",(assume_initial_states==TRUE)?"yes":"no",(assume_states_during_notrunning==TRUE)?"yes":"no",initial_assumed_host_state,backtrack_archives);
00394 #endif
00395 #ifdef USE_HISTOGRAM
00396                                 printf("<a href='%s?host=%s&t1=%lu&t2=%lu&assumestateretention=%s'>View Alert Histogram For This Host</a><BR>\n",HISTOGRAM_CGI,url_encode(host_name),t1,t2,(assume_state_retention==TRUE)?"yes":"no");
00397 #endif
00398                                 printf("<a href='%s?host=%s'>View Status Detail For This Host</a><BR>\n",STATUS_CGI,url_encode(host_name));
00399                                 printf("<a href='%s?host=%s'>View Alert History For This Host</a><BR>\n",HISTORY_CGI,url_encode(host_name));
00400                                 printf("<a href='%s?host=%s'>View Notifications For This Host</a><BR>\n",NOTIFICATIONS_CGI,url_encode(host_name));
00401                                 }
00402                         else if(display_type==DISPLAY_SERVICE_AVAIL && show_all_services==FALSE){
00403                                 host_report_url(host_name,"View Availability Report For This Host");
00404                                 printf("<BR>\n");
00405                                 service_report_url("null","all","View Availability Report For All Services");
00406                                 printf("<BR>\n");
00407 #ifdef USE_TRENDS
00408                                 printf("<a href='%s?host=%s",TRENDS_CGI,url_encode(host_name));
00409                                 printf("&service=%s&t1=%lu&t2=%lu&assumestateretention=%s&includesoftstates=%s&assumeinitialstates=%s&assumestatesduringnotrunning=%s&initialassumedservicestate=%d&backtrack=%d'>View Trends For This Service</a><BR>\n",url_encode(service_desc),t1,t2,(include_soft_states==TRUE)?"yes":"no",(assume_state_retention==TRUE)?"yes":"no",(assume_initial_states==TRUE)?"yes":"no",(assume_states_during_notrunning==TRUE)?"yes":"no",initial_assumed_service_state,backtrack_archives);
00410 #endif
00411 #ifdef USE_HISTOGRAM
00412                                 printf("<a href='%s?host=%s",HISTOGRAM_CGI,url_encode(host_name));
00413                                 printf("&service=%s&t1=%lu&t2=%lu&assumestateretention=%s'>View Alert Histogram For This Service</a><BR>\n",url_encode(service_desc),t1,t2,(assume_state_retention==TRUE)?"yes":"no");
00414 #endif
00415                                 printf("<A HREF='%s?host=%s&",HISTORY_CGI,url_encode(host_name));
00416                                 printf("service=%s'>View Alert History For This Service</A><BR>\n",url_encode(service_desc));
00417                                 printf("<A HREF='%s?host=%s&",NOTIFICATIONS_CGI,url_encode(host_name));
00418                                 printf("service=%s'>View Notifications For This Service</A><BR>\n",url_encode(service_desc));
00419                                 }
00420 
00421                         printf("</TD></TR>\n");
00422                         printf("</TABLE>\n");
00423                         }
00424 
00425                 printf("</td>\n");
00426 
00427                 /* center column of top row */
00428                 printf("<td align=center valign=top width=33%%>\n");
00429 
00430                 if(display_type!=DISPLAY_NO_AVAIL && get_date_parts==FALSE){
00431 
00432                         /* find the host */
00433                         temp_host=find_host(host_name);
00434 
00435                         /* find the service */
00436                         temp_service=find_service(host_name,service_desc);
00437 
00438                         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>\n");
00439                         if(display_type==DISPLAY_HOST_AVAIL){
00440                                 if(show_all_hosts==TRUE)
00441                                         printf("All Hosts");
00442                                 else
00443                                         printf("Host '%s'",(temp_host->display_name!=NULL)?temp_host->display_name:temp_host->name);
00444                                 }
00445                         else if(display_type==DISPLAY_SERVICE_AVAIL){
00446                                 if(show_all_services==TRUE)
00447                                         printf("All Services");
00448                                 else
00449                                         printf("Service '%s' On Host '%s'",(temp_service->display_name!=NULL)?temp_service->display_name:temp_service->description,(temp_host->display_name!=NULL)?temp_host->display_name:temp_host->name);
00450                                 }
00451                         else if(display_type==DISPLAY_HOSTGROUP_AVAIL){
00452                                 if(show_all_hostgroups==TRUE)
00453                                         printf("All Hostgroups");
00454                                 else
00455                                         printf("Hostgroup '%s'",hostgroup_name);
00456                                 }
00457                         else if(display_type==DISPLAY_SERVICEGROUP_AVAIL){
00458                                 if(show_all_servicegroups==TRUE)
00459                                         printf("All Servicegroups");
00460                                 else
00461                                         printf("Servicegroup '%s'",servicegroup_name);
00462                                 }
00463                         printf("</DIV>\n");
00464 
00465                         printf("<BR>\n");
00466 
00467                         printf("<IMG SRC='%s%s' BORDER=0 ALT='Availability Report' TITLE='Availability Report'>\n",url_images_path,TRENDS_ICON);
00468 
00469                         printf("<BR CLEAR=ALL>\n");
00470 
00471                         get_time_string(&t1,start_timestring,sizeof(start_timestring)-1,SHORT_DATE_TIME);
00472                         get_time_string(&t2,end_timestring,sizeof(end_timestring)-1,SHORT_DATE_TIME);
00473                         printf("<div align=center class='reportRange'>%s to %s</div>\n",start_timestring,end_timestring);
00474 
00475                         get_time_breakdown((time_t)(t2-t1),&days,&hours,&minutes,&seconds);
00476                         printf("<div align=center class='reportDuration'>Duration: %dd %dh %dm %ds</div>\n",days,hours,minutes,seconds);
00477                         }
00478 
00479                 printf("</td>\n");
00480 
00481                 /* right hand column of top row */
00482                 printf("<td align=right valign=bottom width=33%%>\n");
00483 
00484                 printf("<form method=\"GET\" action=\"%s\">\n",AVAIL_CGI);
00485                 printf("<table border=0 CLASS='optBox'>\n");
00486 
00487                 if(display_type!=DISPLAY_NO_AVAIL && get_date_parts==FALSE){
00488 
00489                         printf("<tr><td valign=top align=left class='optBoxItem'>First assumed %s state:</td><td valign=top align=left class='optBoxItem'>%s</td></tr>\n",(display_type==DISPLAY_SERVICE_AVAIL)?"service":"host",(display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_HOSTGROUP_AVAIL || display_type==DISPLAY_SERVICEGROUP_AVAIL)?"First assumed service state":"");
00490                         printf("<tr>\n");
00491                         printf("<td valign=top align=left class='optBoxItem'>\n");
00492 
00493                         printf("<input type='hidden' name='t1' value='%lu'>\n",(unsigned long)t1);
00494                         printf("<input type='hidden' name='t2' value='%lu'>\n",(unsigned long)t2);
00495                         if(show_log_entries==TRUE)
00496                                 printf("<input type='hidden' name='show_log_entries' value=''>\n");
00497                         if(full_log_entries==TRUE)
00498                                 printf("<input type='hidden' name='full_log_entries' value=''>\n");
00499                         if(display_type==DISPLAY_HOSTGROUP_AVAIL)
00500                                 printf("<input type='hidden' name='hostgroup' value='%s'>\n",escape_string(hostgroup_name));
00501                         if(display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_SERVICE_AVAIL)
00502                                 printf("<input type='hidden' name='host' value='%s'>\n",escape_string(host_name));
00503                         if(display_type==DISPLAY_SERVICE_AVAIL)
00504                                 printf("<input type='hidden' name='service' value='%s'>\n",escape_string(service_desc));
00505                         if(display_type==DISPLAY_SERVICEGROUP_AVAIL)
00506                                 printf("<input type='hidden' name='servicegroup' value='%s'>\n",escape_string(servicegroup_name));
00507 
00508                         printf("<input type='hidden' name='assumeinitialstates' value='%s'>\n",(assume_initial_states==TRUE)?"yes":"no");
00509                         printf("<input type='hidden' name='assumestateretention' value='%s'>\n",(assume_state_retention==TRUE)?"yes":"no");
00510                         printf("<input type='hidden' name='assumestatesduringnotrunning' value='%s'>\n",(assume_states_during_notrunning==TRUE)?"yes":"no");
00511                         printf("<input type='hidden' name='includesoftstates' value='%s'>\n",(include_soft_states==TRUE)?"yes":"no");
00512 
00513                         if(display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_HOSTGROUP_AVAIL || display_type==DISPLAY_SERVICEGROUP_AVAIL){
00514                                 printf("<select name='initialassumedhoststate'>\n");
00515                                 printf("<option value=%d %s>Unspecified\n",AS_NO_DATA,(initial_assumed_host_state==AS_NO_DATA)?"SELECTED":"");
00516                                 printf("<option value=%d %s>Current State\n",AS_CURRENT_STATE,(initial_assumed_host_state==AS_CURRENT_STATE)?"SELECTED":"");
00517                                 printf("<option value=%d %s>Host Up\n",AS_HOST_UP,(initial_assumed_host_state==AS_HOST_UP)?"SELECTED":"");
00518                                 printf("<option value=%d %s>Host Down\n",AS_HOST_DOWN,(initial_assumed_host_state==AS_HOST_DOWN)?"SELECTED":"");
00519                                 printf("<option value=%d %s>Host Unreachable\n",AS_HOST_UNREACHABLE,(initial_assumed_host_state==AS_HOST_UNREACHABLE)?"SELECTED":"");
00520                                 printf("</select>\n");
00521                                 }
00522                         else{
00523                                 printf("<input type='hidden' name='initialassumedhoststate' value='%d'>",initial_assumed_host_state);
00524                                 printf("<select name='initialassumedservicestate'>\n");
00525                                 printf("<option value=%d %s>Unspecified\n",AS_NO_DATA,(initial_assumed_service_state==AS_NO_DATA)?"SELECTED":"");
00526                                 printf("<option value=%d %s>Current State\n",AS_CURRENT_STATE,(initial_assumed_service_state==AS_CURRENT_STATE)?"SELECTED":"");
00527                                 printf("<option value=%d %s>Service Ok\n",AS_SVC_OK,(initial_assumed_service_state==AS_SVC_OK)?"SELECTED":"");
00528                                 printf("<option value=%d %s>Service Warning\n",AS_SVC_WARNING,(initial_assumed_service_state==AS_SVC_WARNING)?"SELECTED":"");
00529                                 printf("<option value=%d %s>Service Unknown\n",AS_SVC_UNKNOWN,(initial_assumed_service_state==AS_SVC_UNKNOWN)?"SELECTED":"");
00530                                 printf("<option value=%d %s>Service Critical\n",AS_SVC_CRITICAL,(initial_assumed_service_state==AS_SVC_CRITICAL)?"SELECTED":"");
00531                                 printf("</select>\n");
00532                                 }
00533                         printf("</td>\n");
00534                         printf("<td CLASS='optBoxItem'>\n");
00535                         if(display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_HOSTGROUP_AVAIL || display_type==DISPLAY_SERVICEGROUP_AVAIL){
00536                                 printf("<select name='initialassumedservicestate'>\n");
00537                                 printf("<option value=%d %s>Unspecified\n",AS_NO_DATA,(initial_assumed_service_state==AS_NO_DATA)?"SELECTED":"");
00538                                 printf("<option value=%d %s>Current State\n",AS_CURRENT_STATE,(initial_assumed_service_state==AS_CURRENT_STATE)?"SELECTED":"");
00539                                 printf("<option value=%d %s>Service Ok\n",AS_SVC_OK,(initial_assumed_service_state==AS_SVC_OK)?"SELECTED":"");
00540                                 printf("<option value=%d %s>Service Warning\n",AS_SVC_WARNING,(initial_assumed_service_state==AS_SVC_WARNING)?"SELECTED":"");
00541                                 printf("<option value=%d %s>Service Unknown\n",AS_SVC_UNKNOWN,(initial_assumed_service_state==AS_SVC_UNKNOWN)?"SELECTED":"");
00542                                 printf("<option value=%d %s>Service Critical\n",AS_SVC_CRITICAL,(initial_assumed_service_state==AS_SVC_CRITICAL)?"SELECTED":"");
00543                                 printf("</select>\n");
00544                                 }
00545                         printf("</td>\n");
00546                         printf("</tr>\n");
00547 
00548                         printf("<tr><td valign=top align=left class='optBoxItem'>Report period:</td><td valign=top align=left class='optBoxItem'>Backtracked archives:</td></tr>\n");
00549                         printf("<tr>\n");
00550                         printf("<td valign=top align=left class='optBoxItem'>\n");
00551                         printf("<select name='timeperiod'>\n");
00552                         printf("<option SELECTED>[ Current time range ]\n");
00553                         printf("<option value=today %s>Today\n",(timeperiod_type==TIMEPERIOD_TODAY)?"SELECTED":"");
00554                         printf("<option value=last24hours %s>Last 24 Hours\n",(timeperiod_type==TIMEPERIOD_LAST24HOURS)?"SELECTED":"");
00555                         printf("<option value=yesterday %s>Yesterday\n",(timeperiod_type==TIMEPERIOD_YESTERDAY)?"SELECTED":"");
00556                         printf("<option value=thisweek %s>This Week\n",(timeperiod_type==TIMEPERIOD_THISWEEK)?"SELECTED":"");
00557                         printf("<option value=last7days %s>Last 7 Days\n",(timeperiod_type==TIMEPERIOD_LAST7DAYS)?"SELECTED":"");
00558                         printf("<option value=lastweek %s>Last Week\n",(timeperiod_type==TIMEPERIOD_LASTWEEK)?"SELECTED":"");
00559                         printf("<option value=thismonth %s>This Month\n",(timeperiod_type==TIMEPERIOD_THISMONTH)?"SELECTED":"");
00560                         printf("<option value=last31days %s>Last 31 Days\n",(timeperiod_type==TIMEPERIOD_LAST31DAYS)?"SELECTED":"");
00561                         printf("<option value=lastmonth %s>Last Month\n",(timeperiod_type==TIMEPERIOD_LASTMONTH)?"SELECTED":"");
00562                         printf("<option value=thisyear %s>This Year\n",(timeperiod_type==TIMEPERIOD_THISYEAR)?"SELECTED":"");
00563                         printf("<option value=lastyear %s>Last Year\n",(timeperiod_type==TIMEPERIOD_LASTYEAR)?"SELECTED":"");
00564                         printf("</select>\n");
00565                         printf("</td>\n");
00566                         printf("<td valign=top align=left CLASS='optBoxItem'>\n");
00567                         printf("<input type='text' size='2' maxlength='2' name='backtrack' value='%d'>\n",backtrack_archives);
00568                         printf("</td>\n");
00569                         printf("</tr>\n");
00570 
00571                         printf("<tr><td valign=top align=left></td>\n");
00572                         printf("<td valign=top align=left CLASS='optBoxItem'>\n");
00573                         printf("<input type='submit' value='Update'>\n");
00574                         printf("</td>\n");
00575                         printf("</tr>\n");
00576                         }
00577 
00578                 /* display context-sensitive help */
00579                 printf("<tr><td></td><td align=right valign=bottom>\n");
00580                 if(get_date_parts==TRUE)
00581                         display_context_help(CONTEXTHELP_AVAIL_MENU5);
00582                 else if(select_hostgroups==TRUE)
00583                         display_context_help(CONTEXTHELP_AVAIL_MENU2);
00584                 else if(select_hosts==TRUE)
00585                         display_context_help(CONTEXTHELP_AVAIL_MENU3);
00586                 else if(select_services==TRUE)
00587                         display_context_help(CONTEXTHELP_AVAIL_MENU4);
00588                 else if(display_type==DISPLAY_HOSTGROUP_AVAIL)
00589                         display_context_help(CONTEXTHELP_AVAIL_HOSTGROUP);
00590                 else if(display_type==DISPLAY_HOST_AVAIL)
00591                         display_context_help(CONTEXTHELP_AVAIL_HOST);
00592                 else if(display_type==DISPLAY_SERVICE_AVAIL)
00593                         display_context_help(CONTEXTHELP_AVAIL_SERVICE);
00594                 else if(display_type==DISPLAY_SERVICEGROUP_AVAIL)
00595                         display_context_help(CONTEXTHELP_AVAIL_SERVICEGROUP);
00596                 else
00597                         display_context_help(CONTEXTHELP_AVAIL_MENU1);
00598                 printf("</td></tr>\n");
00599 
00600                 printf("</table>\n");
00601                 printf("</form>\n");
00602 
00603                 printf("</td>\n");
00604 
00605                 /* end of top table */
00606                 printf("</tr>\n");
00607                 printf("</table>\n");
00608                 }
00609 
00610 
00611 
00612 
00613         /* step 3 - ask user for report date range */
00614         if(get_date_parts==TRUE){
00615 
00616                 time(&current_time);
00617                 t=localtime(&current_time);
00618 
00619                 start_day=1;
00620                 start_year=t->tm_year+1900;
00621                 end_day=t->tm_mday;
00622                 end_year=t->tm_year+1900;
00623 
00624                 printf("<P><DIV ALIGN=CENTER CLASS='dateSelectTitle'>Step 3: Select Report Options</DIV></p>\n");
00625 
00626                 printf("<P><DIV ALIGN=CENTER>\n");
00627 
00628                 printf("<form method=\"get\" action=\"%s\">\n",AVAIL_CGI);
00629                 printf("<input type='hidden' name='show_log_entries' value=''>\n");
00630                 if(display_type==DISPLAY_HOSTGROUP_AVAIL)
00631                         printf("<input type='hidden' name='hostgroup' value='%s'>\n",escape_string(hostgroup_name));
00632                 if(display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_SERVICE_AVAIL)
00633                         printf("<input type='hidden' name='host' value='%s'>\n",escape_string(host_name));
00634                 if(display_type==DISPLAY_SERVICE_AVAIL)
00635                         printf("<input type='hidden' name='service' value='%s'>\n",escape_string(service_desc));
00636                 if(display_type==DISPLAY_SERVICEGROUP_AVAIL)
00637                         printf("<input type='hidden' name='servicegroup' value='%s'>\n",escape_string(servicegroup_name));
00638 
00639                 printf("<table border=0 cellpadding=5>\n");
00640 
00641                 printf("<tr>");
00642                 printf("<td valign=top class='reportSelectSubTitle'>Report Period:</td>\n");
00643                 printf("<td valign=top align=left class='optBoxItem'>\n");
00644                 printf("<select name='timeperiod'>\n");
00645                 printf("<option value=today>Today\n");
00646                 printf("<option value=last24hours>Last 24 Hours\n");
00647                 printf("<option value=yesterday>Yesterday\n");
00648                 printf("<option value=thisweek>This Week\n");
00649                 printf("<option value=last7days SELECTED>Last 7 Days\n");
00650                 printf("<option value=lastweek>Last Week\n");
00651                 printf("<option value=thismonth>This Month\n");
00652                 printf("<option value=last31days>Last 31 Days\n");
00653                 printf("<option value=lastmonth>Last Month\n");
00654                 printf("<option value=thisyear>This Year\n");
00655                 printf("<option value=lastyear>Last Year\n");
00656                 printf("<option value=custom>* CUSTOM REPORT PERIOD *\n");
00657                 printf("</select>\n");
00658                 printf("</td>\n");
00659                 printf("</tr>\n");
00660 
00661                 printf("<tr><td valign=top class='reportSelectSubTitle'>If Custom Report Period...</td></tr>\n");
00662 
00663                 printf("<tr>");
00664                 printf("<td valign=top class='reportSelectSubTitle'>Start Date (Inclusive):</td>\n");
00665                 printf("<td align=left valign=top class='reportSelectItem'>");
00666                 printf("<select name='smon'>\n");
00667                 printf("<option value='1' %s>January\n",(t->tm_mon==0)?"SELECTED":"");
00668                 printf("<option value='2' %s>February\n",(t->tm_mon==1)?"SELECTED":"");
00669                 printf("<option value='3' %s>March\n",(t->tm_mon==2)?"SELECTED":"");
00670                 printf("<option value='4' %s>April\n",(t->tm_mon==3)?"SELECTED":"");
00671                 printf("<option value='5' %s>May\n",(t->tm_mon==4)?"SELECTED":"");
00672                 printf("<option value='6' %s>June\n",(t->tm_mon==5)?"SELECTED":"");
00673                 printf("<option value='7' %s>July\n",(t->tm_mon==6)?"SELECTED":"");
00674                 printf("<option value='8' %s>August\n",(t->tm_mon==7)?"SELECTED":"");
00675                 printf("<option value='9' %s>September\n",(t->tm_mon==8)?"SELECTED":"");
00676                 printf("<option value='10' %s>October\n",(t->tm_mon==9)?"SELECTED":"");
00677                 printf("<option value='11' %s>November\n",(t->tm_mon==10)?"SELECTED":"");
00678                 printf("<option value='12' %s>December\n",(t->tm_mon==11)?"SELECTED":"");
00679                 printf("</select>\n ");
00680                 printf("<input type='text' size='2' maxlength='2' name='sday' value='%d'> ",start_day);
00681                 printf("<input type='text' size='4' maxlength='4' name='syear' value='%d'>",start_year);
00682                 printf("<input type='hidden' name='shour' value='0'>\n");
00683                 printf("<input type='hidden' name='smin' value='0'>\n");
00684                 printf("<input type='hidden' name='ssec' value='0'>\n");
00685                 printf("</td>\n");
00686                 printf("</tr>\n");
00687 
00688                 printf("<tr>");
00689                 printf("<td valign=top class='reportSelectSubTitle'>End Date (Inclusive):</td>\n");
00690                 printf("<td align=left valign=top class='reportSelectItem'>");
00691                 printf("<select name='emon'>\n");
00692                 printf("<option value='1' %s>January\n",(t->tm_mon==0)?"SELECTED":"");
00693                 printf("<option value='2' %s>February\n",(t->tm_mon==1)?"SELECTED":"");
00694                 printf("<option value='3' %s>March\n",(t->tm_mon==2)?"SELECTED":"");
00695                 printf("<option value='4' %s>April\n",(t->tm_mon==3)?"SELECTED":"");
00696                 printf("<option value='5' %s>May\n",(t->tm_mon==4)?"SELECTED":"");
00697                 printf("<option value='6' %s>June\n",(t->tm_mon==5)?"SELECTED":"");
00698                 printf("<option value='7' %s>July\n",(t->tm_mon==6)?"SELECTED":"");
00699                 printf("<option value='8' %s>August\n",(t->tm_mon==7)?"SELECTED":"");
00700                 printf("<option value='9' %s>September\n",(t->tm_mon==8)?"SELECTED":"");
00701                 printf("<option value='10' %s>October\n",(t->tm_mon==9)?"SELECTED":"");
00702                 printf("<option value='11' %s>November\n",(t->tm_mon==10)?"SELECTED":"");
00703                 printf("<option value='12' %s>December\n",(t->tm_mon==11)?"SELECTED":"");
00704                 printf("</select>\n ");
00705                 printf("<input type='text' size='2' maxlength='2' name='eday' value='%d'> ",end_day);
00706                 printf("<input type='text' size='4' maxlength='4' name='eyear' value='%d'>",end_year);
00707                 printf("<input type='hidden' name='ehour' value='24'>\n");
00708                 printf("<input type='hidden' name='emin' value='0'>\n");
00709                 printf("<input type='hidden' name='esec' value='0'>\n");
00710                 printf("</td>\n");
00711                 printf("</tr>\n");
00712 
00713                 printf("<tr><td colspan=2><br></td></tr>\n");
00714 
00715                 printf("<tr>");
00716                 printf("<td valign=top class='reportSelectSubTitle'>Report time Period:</td>\n");
00717                 printf("<td valign=top align=left class='optBoxItem'>\n");
00718                 printf("<select name='rpttimeperiod'>\n");
00719                 printf("<option value=\"\">None\n");
00720                 /* check all the time periods... */
00721                 for(temp_timeperiod=timeperiod_list;temp_timeperiod!=NULL;temp_timeperiod=temp_timeperiod->next)
00722                         printf("<option value=%s>%s\n",escape_string(temp_timeperiod->name),temp_timeperiod->name);
00723                 printf("</select>\n");
00724                 printf("</td>\n");
00725                 printf("</tr>\n");
00726                 printf("<tr><td colspan=2><br></td></tr>\n");
00727 
00728                 printf("<tr><td class='reportSelectSubTitle' align=right>Assume Initial States:</td>\n");
00729                 printf("<td class='reportSelectItem'>\n");
00730                 printf("<select name='assumeinitialstates'>\n");
00731                 printf("<option value=yes>Yes\n");
00732                 printf("<option value=no>No\n");
00733                 printf("</select>\n");
00734                 printf("</td></tr>\n");
00735 
00736                 printf("<tr><td class='reportSelectSubTitle' align=right>Assume State Retention:</td>\n");
00737                 printf("<td class='reportSelectItem'>\n");
00738                 printf("<select name='assumestateretention'>\n");
00739                 printf("<option value=yes>Yes\n");
00740                 printf("<option value=no>No\n");
00741                 printf("</select>\n");
00742                 printf("</td></tr>\n");
00743 
00744                 printf("<tr><td class='reportSelectSubTitle' align=right>Assume States During Program Downtime:</td>\n");
00745                 printf("<td class='reportSelectItem'>\n");
00746                 printf("<select name='assumestatesduringnotrunning'>\n");
00747                 printf("<option value=yes>Yes\n");
00748                 printf("<option value=no>No\n");
00749                 printf("</select>\n");
00750                 printf("</td></tr>\n");
00751 
00752                 printf("<tr><td class='reportSelectSubTitle' align=right>Include Soft States:</td>\n");
00753                 printf("<td class='reportSelectItem'>\n");
00754                 printf("<select name='includesoftstates'>\n");
00755                 printf("<option value=yes>Yes\n");
00756                 printf("<option value=no SELECTED>No\n");
00757                 printf("</select>\n");
00758                 printf("</td></tr>\n");
00759 
00760                 if(display_type!=DISPLAY_SERVICE_AVAIL){
00761                         printf("<tr><td class='reportSelectSubTitle' align=right>First Assumed Host State:</td>\n");
00762                         printf("<td class='reportSelectItem'>\n");
00763                         printf("<select name='initialassumedhoststate'>\n");
00764                         printf("<option value=%d>Unspecified\n",AS_NO_DATA);
00765                         printf("<option value=%d>Current State\n",AS_CURRENT_STATE);
00766                         printf("<option value=%d>Host Up\n",AS_HOST_UP);
00767                         printf("<option value=%d>Host Down\n",AS_HOST_DOWN);
00768                         printf("<option value=%d>Host Unreachable\n",AS_HOST_UNREACHABLE);
00769                         printf("</select>\n");
00770                         printf("</td></tr>\n");
00771                         }
00772 
00773                 printf("<tr><td class='reportSelectSubTitle' align=right>First Assumed Service State:</td>\n");
00774                 printf("<td class='reportSelectItem'>\n");
00775                 printf("<select name='initialassumedservicestate'>\n");
00776                 printf("<option value=%d>Unspecified\n",AS_NO_DATA);
00777                 printf("<option value=%d>Current State\n",AS_CURRENT_STATE);
00778                 printf("<option value=%d>Service Ok\n",AS_SVC_OK);
00779                 printf("<option value=%d>Service Warning\n",AS_SVC_WARNING);
00780                 printf("<option value=%d>Service Unknown\n",AS_SVC_UNKNOWN);
00781                 printf("<option value=%d>Service Critical\n",AS_SVC_CRITICAL);
00782                 printf("</select>\n");
00783                 printf("</td></tr>\n");
00784 
00785                 printf("<tr><td class='reportSelectSubTitle' align=right>Backtracked Archives (To Scan For Initial States):</td>\n");
00786                 printf("<td class='reportSelectItem'>\n");
00787                 printf("<input type='text' name='backtrack' size='2' maxlength='2' value='%d'>\n",backtrack_archives);
00788                 printf("</td></tr>\n");
00789 
00790                 /* CSV Output is available in all selections */
00791                 printf("<tr>");
00792                 printf("<td valign=top class='reportSelectSubTitle'>Output in CSV Format:</td>\n");
00793                 printf("<td valign=top class='reportSelectItem'>");
00794                 printf("<input type='checkbox' name='csvoutput' value=''>\n");
00795                 printf("</td>\n");
00796                 printf("</tr>\n");
00797 
00798                 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Create Availability Report!'></td></tr>\n");
00799 
00800                 printf("</table>\n");
00801 
00802                 printf("</form>\n");
00803                 printf("</DIV></P>\n");
00804                 }
00805 
00806 
00807         /* step 2 - the user wants to select a hostgroup */
00808         else if(select_hostgroups==TRUE){
00809                 printf("<p><div align=center class='reportSelectTitle'>Step 2: Select Hostgroup</div></p>\n");
00810 
00811                 printf("<p><div align=center>\n");
00812 
00813                 printf("<form method=\"get\" action=\"%s\">\n",AVAIL_CGI);
00814                 printf("<input type='hidden' name='get_date_parts'>\n");
00815 
00816                 printf("<table border=0 cellpadding=5>\n");
00817 
00818                 printf("<tr><td class='reportSelectSubTitle' valign=center>Hostgroup(s):</td><td align=left valign=center class='reportSelectItem'>\n");
00819                 printf("<select name='hostgroup'>\n");
00820                 printf("<option value='all'>** ALL HOSTGROUPS **\n");
00821                 for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next){
00822                         if(is_authorized_for_hostgroup(temp_hostgroup,&current_authdata)==TRUE)
00823                                 printf("<option value='%s'>%s\n",escape_string(temp_hostgroup->group_name),temp_hostgroup->group_name);
00824                         }
00825                 printf("</select>\n");
00826                 printf("</td></tr>\n");
00827 
00828                 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Continue to Step 3'></td></tr>\n");
00829 
00830                 printf("</table>\n");
00831 
00832                 printf("</form>\n");
00833 
00834                 printf("</div></p>\n");
00835                 }
00836 
00837         /* step 2 - the user wants to select a host */
00838         else if(select_hosts==TRUE){
00839                 printf("<p><div align=center class='reportSelectTitle'>Step 2: Select Host</div></p>\n");
00840 
00841                 printf("<p><div align=center>\n");
00842 
00843                 printf("<form method=\"get\" action=\"%s\">\n",AVAIL_CGI);
00844                 printf("<input type='hidden' name='get_date_parts'>\n");
00845 
00846                 printf("<table border=0 cellpadding=5>\n");
00847 
00848                 printf("<tr><td class='reportSelectSubTitle' valign=center>Host(s):</td><td align=left valign=center class='reportSelectItem'>\n");
00849                 printf("<select name='host'>\n");
00850                 printf("<option value='all'>** ALL HOSTS **\n");
00851                 for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next){
00852                         if(is_authorized_for_host(temp_host,&current_authdata)==TRUE)
00853                                 printf("<option value='%s'>%s\n",escape_string(temp_host->name),(temp_host->display_name!=NULL)?temp_host->display_name:temp_host->name);
00854                         }
00855                 printf("</select>\n");
00856                 printf("</td></tr>\n");
00857 
00858                 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Continue to Step 3'></td></tr>\n");
00859 
00860                 printf("</table>\n");
00861 
00862                 printf("</form>\n");
00863 
00864                 printf("</div></p>\n");
00865 
00866                 }
00867 
00868         /* step 2 - the user wants to select a servicegroup */
00869         else if(select_servicegroups==TRUE){
00870                 printf("<p><div align=center class='reportSelectTitle'>Step 2: Select Servicegroup</div></p>\n");
00871 
00872                 printf("<p><div align=center>\n");
00873 
00874                 printf("<form method=\"get\" action=\"%s\">\n",AVAIL_CGI);
00875                 printf("<input type='hidden' name='get_date_parts'>\n");
00876 
00877                 printf("<table border=0 cellpadding=5>\n");
00878 
00879                 printf("<tr><td class='reportSelectSubTitle' valign=center>Servicegroup(s):</td><td align=left valign=center class='reportSelectItem'>\n");
00880                 printf("<select name='servicegroup'>\n");
00881                 printf("<option value='all'>** ALL SERVICEGROUPS **\n");
00882                 for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next){
00883                         if(is_authorized_for_servicegroup(temp_servicegroup,&current_authdata)==TRUE)
00884                                 printf("<option value='%s'>%s\n",escape_string(temp_servicegroup->group_name),temp_servicegroup->group_name);
00885                         }
00886                 printf("</select>\n");
00887                 printf("</td></tr>\n");
00888 
00889                 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Continue to Step 3'></td></tr>\n");
00890 
00891                 printf("</table>\n");
00892 
00893                 printf("</form>\n");
00894 
00895                 printf("</div></p>\n");
00896                 }
00897 
00898         /* step 2 - the user wants to select a service */
00899         else if(select_services==TRUE){
00900 
00901                 printf("<SCRIPT LANGUAGE='JavaScript'>\n");
00902                 printf("function gethostname(hostindex){\n");
00903                 printf("hostnames=[\"all\"");
00904 
00905                 firsthostpointer=NULL;
00906                 for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){
00907                         if(is_authorized_for_service(temp_service,&current_authdata)==TRUE){
00908                                 if(!firsthostpointer)
00909                                         firsthostpointer=temp_service->host_name;
00910                                 printf(", \"%s\"",temp_service->host_name);
00911                                 }
00912                         }
00913 
00914                 printf(" ]\n");
00915                 printf("return hostnames[hostindex];\n");
00916                 printf("}\n");
00917                 printf("</SCRIPT>\n");
00918 
00919                 printf("<p><div align=center class='reportSelectTitle'>Step 2: Select Service</div></p>\n");
00920 
00921                 printf("<p><div align=center>\n");
00922 
00923                 printf("<form method=\"get\" action=\"%s\" name='serviceform'>\n",AVAIL_CGI);
00924                 printf("<input type='hidden' name='get_date_parts'>\n");
00925                 printf("<input type='hidden' name='host' value='%s'>\n",(firsthostpointer==NULL)?"unknown":(char *)escape_string(firsthostpointer));
00926 
00927                 printf("<table border=0 cellpadding=5>\n");
00928 
00929                 printf("<tr><td class='reportSelectSubTitle' valign=center>Service(s):</td><td align=left valign=center class='reportSelectItem'>\n");
00930                 printf("<select name='service' onFocus='document.serviceform.host.value=gethostname(this.selectedIndex);' onChange='document.serviceform.host.value=gethostname(this.selectedIndex);'>\n");
00931                 printf("<option value='all'>** ALL SERVICES **\n");
00932                 for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){
00933                         if(is_authorized_for_service(temp_service,&current_authdata)==TRUE)
00934                                 printf("<option value='%s'>%s;%s\n",escape_string(temp_service->description),temp_service->host_name,(temp_service->display_name!=NULL)?temp_service->display_name:temp_service->description);
00935                         }
00936 
00937                 printf("</select>\n");
00938                 printf("</td></tr>\n");
00939 
00940                 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Continue to Step 3'></td></tr>\n");
00941 
00942                 printf("</table>\n");
00943 
00944                 printf("</form>\n");
00945 
00946                 printf("</div></p>\n");
00947 
00948                 }
00949 
00950 
00951         /* generate availability report */
00952         else if(display_type!=DISPLAY_NO_AVAIL){
00953 
00954                 /* check authorization */
00955                 is_authorized=TRUE;
00956                 if((display_type==DISPLAY_HOST_AVAIL && show_all_hosts==FALSE) || (display_type==DISPLAY_SERVICE_AVAIL && show_all_services==FALSE)){
00957 
00958                         if(display_type==DISPLAY_HOST_AVAIL && show_all_hosts==FALSE)
00959                                 is_authorized=is_authorized_for_host(find_host(host_name),&current_authdata);
00960                         else
00961                                 is_authorized=is_authorized_for_service(find_service(host_name,service_desc),&current_authdata);
00962                         }
00963 
00964                 if(is_authorized==FALSE) {
00965                         if (display_type==DISPLAY_HOST_AVAIL)
00966                                 print_generic_error_message("It appears as though you are not authorized to view information for the specified host...",NULL,0);
00967                         else
00968                                 print_generic_error_message("It appears as though you are not authorized to view information for the specified service...",NULL,0);
00969 
00970                 }else{
00971 
00972                         time(&report_start_time);
00973 
00974                         /* create list of subjects to collect availability data for */
00975                         create_subject_list();
00976 
00977                         /* read in all necessary archived state data */
00978                         read_archived_state_data();
00979 
00980                         /* compute availability data */
00981                         compute_availability();
00982 
00983                         time(&report_end_time);
00984 
00985                         if(content_type==HTML_CONTENT){
00986                                 get_time_breakdown((time_t)(report_end_time-report_start_time),&days,&hours,&minutes,&seconds);
00987                                 printf("<div align=center class='reportTime'>[ Availability report completed in %d min %d sec ]</div>\n",minutes,seconds);
00988                                 printf("<BR><BR>\n");
00989                         }
00990 
00991                         /* display availability data */
00992                         if(display_type==DISPLAY_HOST_AVAIL)
00993                                 display_host_availability();
00994                         else if(display_type==DISPLAY_SERVICE_AVAIL)
00995                                 display_service_availability();
00996                         else if(display_type==DISPLAY_HOSTGROUP_AVAIL)
00997                                 display_hostgroup_availability();
00998                         else if(display_type==DISPLAY_SERVICEGROUP_AVAIL)
00999                                 display_servicegroup_availability();
01000 
01001                         /* free memory allocated to availability data */
01002                         free_availability_data();
01003                         }
01004                 }
01005 
01006 
01007         /* step 1 - ask the user what kind of report they want */
01008         else{
01009 
01010                 printf("<p><div align=center class='reportSelectTitle'>Step 1: Select Report Type</div></p>\n");
01011 
01012                 printf("<p><div align=center>\n");
01013 
01014                 printf("<form method=\"get\" action=\"%s\">\n",AVAIL_CGI);
01015 
01016                 printf("<table border=0 cellpadding=5>\n");
01017 
01018                 printf("<tr><td class='reportSelectSubTitle' align=right>Type:</td>\n");
01019                 printf("<td class='reportSelectItem'>\n");
01020                 printf("<select name='report_type'>\n");
01021                 printf("<option value=hostgroups>Hostgroup(s)\n");
01022                 printf("<option value=hosts>Host(s)\n");
01023                 printf("<option value=servicegroups>Servicegroup(s)\n");
01024                 printf("<option value=services>Service(s)\n");
01025                 printf("</select>\n");
01026                 printf("</td></tr>\n");
01027 
01028                 printf("<tr><td></td><td align=left class='dateSelectItem'><input type='submit' value='Continue to Step 2'></td></tr>\n");
01029 
01030                 printf("</table>\n");
01031 
01032                 printf("</form>\n");
01033 
01034                 printf("</div></p>\n");
01035                 }
01036 
01037 
01038         document_footer(CGI_ID);
01039 
01040         /* free all other allocated memory */
01041         free_memory();
01042 
01043         return OK;
01044 }
01045 
01046 int process_cgivars(void){
01047         char **variables;
01048         int error=FALSE;
01049         int x;
01050 
01051         variables=getcgivars();
01052 
01053         for(x=0;variables[x]!=NULL;x++){
01054 
01055                 /* do some basic length checking on the variable identifier to prevent buffer overflows */
01056                 if(strlen(variables[x])>=MAX_INPUT_BUFFER-1){
01057                         x++;
01058                         continue;
01059                         }
01060 
01061                 /* we found the hostgroup argument */
01062                 else if(!strcmp(variables[x],"hostgroup")){
01063                         x++;
01064                         if(variables[x]==NULL){
01065                                 error=TRUE;
01066                                 break;
01067                                 }
01068 
01069                         if((hostgroup_name=(char *)strdup(variables[x]))==NULL)
01070                                 hostgroup_name="";
01071                         strip_html_brackets(hostgroup_name);
01072 
01073                         display_type=DISPLAY_HOSTGROUP_AVAIL;
01074                         show_all_hostgroups=(strcmp(hostgroup_name,"all"))?FALSE:TRUE;
01075                         }
01076 
01077                 /* we found the servicegroup argument */
01078                 else if(!strcmp(variables[x],"servicegroup")){
01079                         x++;
01080                         if(variables[x]==NULL){
01081                                 error=TRUE;
01082                                 break;
01083                                 }
01084 
01085                         if((servicegroup_name=(char *)strdup(variables[x]))==NULL)
01086                                 servicegroup_name="";
01087                         strip_html_brackets(servicegroup_name);
01088 
01089                         display_type=DISPLAY_SERVICEGROUP_AVAIL;
01090                         show_all_servicegroups=(strcmp(servicegroup_name,"all"))?FALSE:TRUE;
01091                         }
01092 
01093                 /* we found the host argument */
01094                 else if(!strcmp(variables[x],"host")){
01095                         x++;
01096                         if(variables[x]==NULL){
01097                                 error=TRUE;
01098                                 break;
01099                                 }
01100 
01101                         if((host_name=(char *)strdup(variables[x]))==NULL)
01102                                 host_name="";
01103                         strip_html_brackets(host_name);
01104 
01105                         display_type=DISPLAY_HOST_AVAIL;
01106                         show_all_hosts=(strcmp(host_name,"all"))?FALSE:TRUE;
01107                         }
01108 
01109                 /* we found the service description argument */
01110                 else if(!strcmp(variables[x],"service")){
01111                         x++;
01112                         if(variables[x]==NULL){
01113                                 error=TRUE;
01114                                 break;
01115                                 }
01116 
01117                         if((service_desc=(char *)strdup(variables[x]))==NULL)
01118                                 service_desc="";
01119                         strip_html_brackets(service_desc);
01120 
01121                         display_type=DISPLAY_SERVICE_AVAIL;
01122                         show_all_services=(strcmp(service_desc,"all"))?FALSE:TRUE;
01123                         }
01124 
01125                 /* we found first time argument */
01126                 else if(!strcmp(variables[x],"t1")){
01127                         x++;
01128                         if(variables[x]==NULL){
01129                                 error=TRUE;
01130                                 break;
01131                                 }
01132 
01133                         t1=(time_t)strtoul(variables[x],NULL,10);
01134                         timeperiod_type=TIMEPERIOD_CUSTOM;
01135                         compute_time_from_parts=FALSE;
01136                         }
01137 
01138                 /* we found first time argument */
01139                 else if(!strcmp(variables[x],"t2")){
01140                         x++;
01141                         if(variables[x]==NULL){
01142                                 error=TRUE;
01143                                 break;
01144                                 }
01145 
01146                         t2=(time_t)strtoul(variables[x],NULL,10);
01147                         timeperiod_type=TIMEPERIOD_CUSTOM;
01148                         compute_time_from_parts=FALSE;
01149                         }
01150 
01151                 /* we found the assume initial states option */
01152                 else if(!strcmp(variables[x],"assumeinitialstates")){
01153                         x++;
01154                         if(variables[x]==NULL){
01155                                 error=TRUE;
01156                                 break;
01157                                 }
01158 
01159                         if(!strcmp(variables[x],"yes"))
01160                                 assume_initial_states=TRUE;
01161                         else
01162                                 assume_initial_states=FALSE;
01163                         }
01164 
01165                 /* we found the assume state during program not running option */
01166                 else if(!strcmp(variables[x],"assumestatesduringnotrunning")){
01167                         x++;
01168                         if(variables[x]==NULL){
01169                                 error=TRUE;
01170                                 break;
01171                                 }
01172 
01173                         if(!strcmp(variables[x],"yes"))
01174                                 assume_states_during_notrunning=TRUE;
01175                         else
01176                                 assume_states_during_notrunning=FALSE;
01177                         }
01178 
01179                 /* we found the initial assumed host state option */
01180                 else if(!strcmp(variables[x],"initialassumedhoststate")){
01181                         x++;
01182                         if(variables[x]==NULL){
01183                                 error=TRUE;
01184                                 break;
01185                                 }
01186 
01187                         initial_assumed_host_state=atoi(variables[x]);
01188                         }
01189 
01190                 /* we found the initial assumed service state option */
01191                 else if(!strcmp(variables[x],"initialassumedservicestate")){
01192                         x++;
01193                         if(variables[x]==NULL){
01194                                 error=TRUE;
01195                                 break;
01196                                 }
01197 
01198                         initial_assumed_service_state=atoi(variables[x]);
01199                         }
01200 
01201                 /* we found the assume state retention option */
01202                 else if(!strcmp(variables[x],"assumestateretention")){
01203                         x++;
01204                         if(variables[x]==NULL){
01205                                 error=TRUE;
01206                                 break;
01207                                 }
01208 
01209                         if(!strcmp(variables[x],"yes"))
01210                                 assume_state_retention=TRUE;
01211                         else
01212                                 assume_state_retention=FALSE;
01213                         }
01214 
01215                 /* we found the include soft states option */
01216                 else if(!strcmp(variables[x],"includesoftstates")){
01217                         x++;
01218                         if(variables[x]==NULL){
01219                                 error=TRUE;
01220                                 break;
01221                                 }
01222 
01223                         if(!strcmp(variables[x],"yes"))
01224                                 include_soft_states=TRUE;
01225                         else
01226                                 include_soft_states=FALSE;
01227                         }
01228 
01229                 /* we found the backtrack archives argument */
01230                 else if(!strcmp(variables[x],"backtrack")){
01231                         x++;
01232                         if(variables[x]==NULL){
01233                                 error=TRUE;
01234                                 break;
01235                                 }
01236 
01237                         backtrack_archives=atoi(variables[x]);
01238                         if(backtrack_archives<0)
01239                                 backtrack_archives=0;
01240                         if(backtrack_archives>MAX_ARCHIVE_BACKTRACKS)
01241                                 backtrack_archives=MAX_ARCHIVE_BACKTRACKS;
01242 
01243 #ifdef DEBUG
01244                         printf("BACKTRACK ARCHIVES: %d\n",backtrack_archives);
01245 #endif
01246                         }
01247 
01248                 /* we found the standard timeperiod argument */
01249                 else if(!strcmp(variables[x],"timeperiod")){
01250                         x++;
01251                         if(variables[x]==NULL){
01252                                 error=TRUE;
01253                                 break;
01254                                 }
01255 
01256                         if(!strcmp(variables[x],"today"))
01257                                 timeperiod_type=TIMEPERIOD_TODAY;
01258                         else if(!strcmp(variables[x],"yesterday"))
01259                                 timeperiod_type=TIMEPERIOD_YESTERDAY;
01260                         else if(!strcmp(variables[x],"thisweek"))
01261                                 timeperiod_type=TIMEPERIOD_THISWEEK;
01262                         else if(!strcmp(variables[x],"lastweek"))
01263                                 timeperiod_type=TIMEPERIOD_LASTWEEK;
01264                         else if(!strcmp(variables[x],"thismonth"))
01265                                 timeperiod_type=TIMEPERIOD_THISMONTH;
01266                         else if(!strcmp(variables[x],"lastmonth"))
01267                                 timeperiod_type=TIMEPERIOD_LASTMONTH;
01268                         else if(!strcmp(variables[x],"thisquarter"))
01269                                 timeperiod_type=TIMEPERIOD_THISQUARTER;
01270                         else if(!strcmp(variables[x],"lastquarter"))
01271                                 timeperiod_type=TIMEPERIOD_LASTQUARTER;
01272                         else if(!strcmp(variables[x],"thisyear"))
01273                                 timeperiod_type=TIMEPERIOD_THISYEAR;
01274                         else if(!strcmp(variables[x],"lastyear"))
01275                                 timeperiod_type=TIMEPERIOD_LASTYEAR;
01276                         else if(!strcmp(variables[x],"last24hours"))
01277                                 timeperiod_type=TIMEPERIOD_LAST24HOURS;
01278                         else if(!strcmp(variables[x],"last7days"))
01279                                 timeperiod_type=TIMEPERIOD_LAST7DAYS;
01280                         else if(!strcmp(variables[x],"last31days"))
01281                                 timeperiod_type=TIMEPERIOD_LAST31DAYS;
01282                         else if(!strcmp(variables[x],"custom"))
01283                                 timeperiod_type=TIMEPERIOD_CUSTOM;
01284                         else
01285                                 continue;
01286 
01287                         convert_timeperiod_to_times(timeperiod_type,&t1,&t2);
01288                         compute_time_from_parts=FALSE;
01289                         }
01290 
01291                 /* we found the embed option */
01292                 else if(!strcmp(variables[x],"embedded"))
01293                         embedded=TRUE;
01294 
01295                 /* we found the noheader option */
01296                 else if(!strcmp(variables[x],"noheader"))
01297                         display_header=FALSE;
01298 
01299                 /* we found the CSV output option */
01300                 else if(!strcmp(variables[x],"csvoutput")){
01301                         display_header=FALSE;
01302                         content_type=CSV_CONTENT;
01303                 }
01304 
01305                 /* we found the JSON output option */
01306                 else if(!strcmp(variables[x],"jsonoutput")){
01307                         display_header=FALSE;
01308                         content_type=JSON_CONTENT;
01309                 }
01310 
01311                 /* we found the log entries option  */
01312                 else if(!strcmp(variables[x],"show_log_entries"))
01313                         show_log_entries=TRUE;
01314 
01315                 /* we found the full log entries option */
01316                 else if(!strcmp(variables[x],"full_log_entries"))
01317                         full_log_entries=TRUE;
01318 
01319                 /* we found the get date parts option */
01320                 else if(!strcmp(variables[x],"get_date_parts"))
01321                         get_date_parts=TRUE;
01322 
01323                 /* we found the report type selection option */
01324                 else if(!strcmp(variables[x],"report_type")){
01325                         x++;
01326                         if(variables[x]==NULL){
01327                                 error=TRUE;
01328                                 break;
01329                                 }
01330                         if(!strcmp(variables[x],"hostgroups"))
01331                                 select_hostgroups=TRUE;
01332                         else if(!strcmp(variables[x],"servicegroups"))
01333                                 select_servicegroups=TRUE;
01334                         else if(!strcmp(variables[x],"hosts"))
01335                                 select_hosts=TRUE;
01336                         else
01337                                 select_services=TRUE;
01338                         }
01339 
01340                 /* we found time argument */
01341                 else if(!strcmp(variables[x],"smon")){
01342                         x++;
01343                         if(variables[x]==NULL){
01344                                 error=TRUE;
01345                                 break;
01346                                 }
01347 
01348                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01349                                 continue;
01350 
01351                         start_month=atoi(variables[x]);
01352                         timeperiod_type=TIMEPERIOD_CUSTOM;
01353                         compute_time_from_parts=TRUE;
01354                         }
01355 
01356                 /* we found time argument */
01357                 else if(!strcmp(variables[x],"sday")){
01358                         x++;
01359                         if(variables[x]==NULL){
01360                                 error=TRUE;
01361                                 break;
01362                                 }
01363 
01364                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01365                                 continue;
01366 
01367                         start_day=atoi(variables[x]);
01368                         timeperiod_type=TIMEPERIOD_CUSTOM;
01369                         compute_time_from_parts=TRUE;
01370                         }
01371 
01372                 /* we found time argument */
01373                 else if(!strcmp(variables[x],"syear")){
01374                         x++;
01375                         if(variables[x]==NULL){
01376                                 error=TRUE;
01377                                 break;
01378                                 }
01379 
01380                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01381                                 continue;
01382 
01383                         start_year=atoi(variables[x]);
01384                         timeperiod_type=TIMEPERIOD_CUSTOM;
01385                         compute_time_from_parts=TRUE;
01386                         }
01387 
01388                 /* we found time argument */
01389                 else if(!strcmp(variables[x],"smin")){
01390                         x++;
01391                         if(variables[x]==NULL){
01392                                 error=TRUE;
01393                                 break;
01394                                 }
01395 
01396                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01397                                 continue;
01398 
01399                         start_minute=atoi(variables[x]);
01400                         timeperiod_type=TIMEPERIOD_CUSTOM;
01401                         compute_time_from_parts=TRUE;
01402                         }
01403 
01404                 /* we found time argument */
01405                 else if(!strcmp(variables[x],"ssec")){
01406                         x++;
01407                         if(variables[x]==NULL){
01408                                 error=TRUE;
01409                                 break;
01410                                 }
01411 
01412                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01413                                 continue;
01414 
01415                         start_second=atoi(variables[x]);
01416                         timeperiod_type=TIMEPERIOD_CUSTOM;
01417                         compute_time_from_parts=TRUE;
01418                         }
01419 
01420                 /* we found time argument */
01421                 else if(!strcmp(variables[x],"shour")){
01422                         x++;
01423                         if(variables[x]==NULL){
01424                                 error=TRUE;
01425                                 break;
01426                                 }
01427 
01428                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01429                                 continue;
01430 
01431                         start_hour=atoi(variables[x]);
01432                         timeperiod_type=TIMEPERIOD_CUSTOM;
01433                         compute_time_from_parts=TRUE;
01434                         }
01435 
01436 
01437                 /* we found time argument */
01438                 else if(!strcmp(variables[x],"emon")){
01439                         x++;
01440                         if(variables[x]==NULL){
01441                                 error=TRUE;
01442                                 break;
01443                                 }
01444 
01445                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01446                                 continue;
01447 
01448                         end_month=atoi(variables[x]);
01449                         timeperiod_type=TIMEPERIOD_CUSTOM;
01450                         compute_time_from_parts=TRUE;
01451                         }
01452 
01453                 /* we found time argument */
01454                 else if(!strcmp(variables[x],"eday")){
01455                         x++;
01456                         if(variables[x]==NULL){
01457                                 error=TRUE;
01458                                 break;
01459                                 }
01460 
01461                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01462                                 continue;
01463 
01464                         end_day=atoi(variables[x]);
01465                         timeperiod_type=TIMEPERIOD_CUSTOM;
01466                         compute_time_from_parts=TRUE;
01467                         }
01468 
01469                 /* we found time argument */
01470                 else if(!strcmp(variables[x],"eyear")){
01471                         x++;
01472                         if(variables[x]==NULL){
01473                                 error=TRUE;
01474                                 break;
01475                                 }
01476 
01477                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01478                                 continue;
01479 
01480                         end_year=atoi(variables[x]);
01481                         timeperiod_type=TIMEPERIOD_CUSTOM;
01482                         compute_time_from_parts=TRUE;
01483                         }
01484 
01485                 /* we found time argument */
01486                 else if(!strcmp(variables[x],"emin")){
01487                         x++;
01488                         if(variables[x]==NULL){
01489                                 error=TRUE;
01490                                 break;
01491                                 }
01492 
01493                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01494                                 continue;
01495 
01496                         end_minute=atoi(variables[x]);
01497                         timeperiod_type=TIMEPERIOD_CUSTOM;
01498                         compute_time_from_parts=TRUE;
01499                         }
01500 
01501                 /* we found time argument */
01502                 else if(!strcmp(variables[x],"esec")){
01503                         x++;
01504                         if(variables[x]==NULL){
01505                                 error=TRUE;
01506                                 break;
01507                                 }
01508 
01509                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01510                                 continue;
01511 
01512                         end_second=atoi(variables[x]);
01513                         timeperiod_type=TIMEPERIOD_CUSTOM;
01514                         compute_time_from_parts=TRUE;
01515                         }
01516 
01517                 /* we found time argument */
01518                 else if(!strcmp(variables[x],"ehour")){
01519                         x++;
01520                         if(variables[x]==NULL){
01521                                 error=TRUE;
01522                                 break;
01523                                 }
01524 
01525                         if(timeperiod_type!=TIMEPERIOD_CUSTOM)
01526                                 continue;
01527 
01528                         end_hour=atoi(variables[x]);
01529                         timeperiod_type=TIMEPERIOD_CUSTOM;
01530                         compute_time_from_parts=TRUE;
01531                         }
01532 
01533                 /* we found the show scheduled downtime option */
01534                 else if(!strcmp(variables[x],"showscheduleddowntime")){
01535                         x++;
01536                         if(variables[x]==NULL){
01537                                 error=TRUE;
01538                                 break;
01539                                 }
01540 
01541                         if(!strcmp(variables[x],"yes"))
01542                                 show_scheduled_downtime=TRUE;
01543                         else
01544                                 show_scheduled_downtime=FALSE;
01545                         }
01546 
01547                 /* we found the report timeperiod option */
01548                 else if(!strcmp(variables[x],"rpttimeperiod")){
01549                         timeperiod *temp_timeperiod;
01550                         x++;
01551                         if(variables[x]==NULL){
01552                                 error=TRUE;
01553                                 break;
01554                                 }
01555 
01556                         for(temp_timeperiod=timeperiod_list;temp_timeperiod!=NULL;temp_timeperiod=temp_timeperiod->next){
01557                                 if(!strcmp(url_encode(temp_timeperiod->name),variables[x])){
01558                                         current_timeperiod=temp_timeperiod;
01559                                         break;
01560                                         }
01561                                 }
01562                         }
01563 
01564                 /* we found the nodaemoncheck option */
01565                 else if(!strcmp(variables[x],"nodaemoncheck"))
01566                         daemon_check=FALSE;
01567 
01568                 }
01569 
01570         /* free memory allocated to the CGI variables */
01571         free_cgivars(variables);
01572 
01573         return error;
01574 }
01575 
01576 
01577 
01578 /* computes availability data for all subjects */
01579 void compute_availability(void){
01580         avail_subject *temp_subject;
01581         time_t current_time;
01582 
01583         time(&current_time);
01584 
01585         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
01586                 compute_subject_availability(temp_subject,current_time);
01587                 compute_subject_downtime(temp_subject,current_time);
01588                 }
01589 
01590         return;
01591 }
01592 
01593 
01594 
01595 /* computes availability data for a given subject */
01596 void compute_subject_availability(avail_subject *subject, time_t current_time){
01597         archived_state *temp_as;
01598         archived_state *last_as;
01599         time_t a;
01600         time_t b;
01601         int current_state=AS_NO_DATA;
01602         int have_some_real_data=FALSE;
01603         hoststatus *hststatus=NULL;
01604         servicestatus *svcstatus=NULL;
01605         int first_real_state=AS_NO_DATA;
01606         time_t initial_assumed_time;
01607         int initial_assumed_state=AS_NO_DATA;
01608         int error;
01609 
01610 
01611         /* if left hand of graph is after current time, we can't do anything at all.... */
01612         if(t1>current_time)
01613                 return;
01614 
01615         /* get current state of host or service if possible */
01616         if(subject->type==HOST_SUBJECT)
01617                 hststatus=find_hoststatus(subject->host_name);
01618         else
01619                 svcstatus=find_servicestatus(subject->host_name,subject->service_description);
01620 
01621 
01622         /************************************/
01623         /* INSERT CURRENT STATE (IF WE CAN) */
01624         /************************************/
01625 
01626         /* if current time DOES NOT fall within graph bounds, so we can't do anything as far as assuming current state */
01627 
01628         /* if we don't have any data, assume current state (if possible) */
01629         if(subject->as_list==NULL && current_time>t1 && current_time<=t2){
01630 
01631                 /* we don't have any historical information, but the current time falls within the reporting period, so use */
01632                 /* the current status of the host/service as the starting data */
01633                 if(subject->type==HOST_SUBJECT){
01634                         if(hststatus!=NULL){
01635 
01636                                 if(hststatus->status==HOST_DOWN)
01637                                         subject->last_known_state=AS_HOST_DOWN;
01638                                 else if(hststatus->status==HOST_UNREACHABLE)
01639                                         subject->last_known_state=AS_HOST_UNREACHABLE;
01640                                 else if(hststatus->status==HOST_UP)
01641                                         subject->last_known_state=AS_HOST_UP;
01642                                 else
01643                                         subject->last_known_state=AS_NO_DATA;
01644 
01645                                 if(subject->last_known_state!=AS_NO_DATA){
01646 
01647                                         /* add a dummy archived state item, so something can get graphed */
01648                                         add_archived_state(subject->last_known_state,AS_HARD_STATE,t1,"Current Host State Assumed (Faked Log Entry)",subject);
01649 
01650                                         /* use the current state as the last known real state */
01651                                         first_real_state=subject->last_known_state;
01652                                         }
01653                                 }
01654                         }
01655                 else{
01656                         if(svcstatus!=NULL){
01657 
01658                                 if(svcstatus->status==SERVICE_OK)
01659                                         subject->last_known_state=AS_SVC_OK;
01660                                 else if(svcstatus->status==SERVICE_WARNING)
01661                                         subject->last_known_state=AS_SVC_WARNING;
01662                                 else if(svcstatus->status==SERVICE_CRITICAL)
01663                                         subject->last_known_state=AS_SVC_CRITICAL;
01664                                 else if(svcstatus->status==SERVICE_UNKNOWN)
01665                                         subject->last_known_state=AS_SVC_UNKNOWN;
01666                                 else
01667                                         subject->last_known_state=AS_NO_DATA;
01668 
01669                                 if(subject->last_known_state!=AS_NO_DATA){
01670 
01671                                         /* add a dummy archived state item, so something can get graphed */
01672                                         add_archived_state(subject->last_known_state,AS_HARD_STATE,t1,"Current Service State Assumed (Faked Log Entry)",subject);
01673 
01674                                         /* use the current state as the last known real state */
01675                                         first_real_state=subject->last_known_state;
01676                                         }
01677                                 }
01678                         }
01679                 }
01680 
01681 
01682 
01683         /******************************************/
01684         /* INSERT FIRST ASSUMED STATE (IF WE CAN) */
01685         /******************************************/
01686 
01687         if((subject->type==HOST_SUBJECT && initial_assumed_host_state!=AS_NO_DATA) || (subject->type==SERVICE_SUBJECT && initial_assumed_service_state!=AS_NO_DATA)){
01688 
01689                 /* see if its okay to assume initial state for this subject */
01690                 error=FALSE;
01691                 if(subject->type==SERVICE_SUBJECT){
01692                         if(initial_assumed_service_state!=AS_SVC_OK && initial_assumed_service_state!=AS_SVC_WARNING && initial_assumed_service_state!=AS_SVC_UNKNOWN && initial_assumed_service_state!=AS_SVC_CRITICAL && initial_assumed_service_state!=AS_CURRENT_STATE)
01693                                 error=TRUE;
01694                         else
01695                                 initial_assumed_state=initial_assumed_service_state;
01696                         if(initial_assumed_service_state==AS_CURRENT_STATE && svcstatus==NULL)
01697                                 error=TRUE;
01698                         }
01699                 else{
01700                         if(initial_assumed_host_state!=AS_HOST_UP && initial_assumed_host_state!=AS_HOST_DOWN && initial_assumed_host_state!=AS_HOST_UNREACHABLE && initial_assumed_host_state!=AS_CURRENT_STATE)
01701                                 error=TRUE;
01702                         else
01703                                 initial_assumed_state=initial_assumed_host_state;
01704                         if(initial_assumed_host_state==AS_CURRENT_STATE && hststatus==NULL)
01705                                 error=TRUE;
01706                         }
01707 
01708                 /* get the current state if applicable */
01709                 if(((subject->type==HOST_SUBJECT && initial_assumed_host_state==AS_CURRENT_STATE) || (subject->type==SERVICE_SUBJECT && initial_assumed_service_state==AS_CURRENT_STATE)) && error==FALSE){
01710                         if(subject->type==SERVICE_SUBJECT){
01711                                 switch(svcstatus->status){
01712                                 case SERVICE_OK:
01713                                         initial_assumed_state=AS_SVC_OK;
01714                                         break;
01715                                 case SERVICE_WARNING:
01716                                         initial_assumed_state=AS_SVC_WARNING;
01717                                         break;
01718                                 case SERVICE_UNKNOWN:
01719                                         initial_assumed_state=AS_SVC_UNKNOWN;
01720                                         break;
01721                                 case SERVICE_CRITICAL:
01722                                         initial_assumed_state=AS_SVC_CRITICAL;
01723                                         break;
01724                                 default:
01725                                         error=TRUE;
01726                                         break;
01727                                         }
01728                                 }
01729                         else{
01730                                 switch(hststatus->status){
01731                                 case HOST_DOWN:
01732                                         initial_assumed_state=AS_HOST_DOWN;
01733                                         break;
01734                                 case HOST_UNREACHABLE:
01735                                         initial_assumed_state=AS_HOST_UNREACHABLE;
01736                                         break;
01737                                 case HOST_UP:
01738                                         initial_assumed_state=AS_HOST_UP;
01739                                         break;
01740                                 default:
01741                                         error=TRUE;
01742                                         break;
01743                                         }
01744                                 }
01745                         }
01746 
01747                 if(error==FALSE){
01748 
01749                         /* add this assumed state entry before any entries in the list and <= t1 */
01750                         if(subject->as_list==NULL)
01751                                 initial_assumed_time=t1;
01752                         else if(subject->as_list->time_stamp>t1)
01753                                 initial_assumed_time=t1;
01754                         else
01755                                 initial_assumed_time=subject->as_list->time_stamp-1;
01756 
01757                         if(subject->type==HOST_SUBJECT)
01758                                 add_archived_state(initial_assumed_state,AS_HARD_STATE,initial_assumed_time,"First Host State Assumed (Faked Log Entry)",subject);
01759                         else
01760                                 add_archived_state(initial_assumed_state,AS_HARD_STATE,initial_assumed_time,"First Service State Assumed (Faked Log Entry)",subject);
01761                         }
01762                 }
01763 
01764 
01765 
01766 
01767         /**************************************/
01768         /* BAIL OUT IF WE DON'T HAVE ANYTHING */
01769         /**************************************/
01770 
01771         have_some_real_data=FALSE;
01772         for(temp_as=subject->as_list;temp_as!=NULL;temp_as=temp_as->next){
01773                 if(temp_as->entry_type!=AS_NO_DATA && temp_as->entry_type!=AS_PROGRAM_START && temp_as->entry_type!=AS_PROGRAM_END){
01774                         have_some_real_data=TRUE;
01775                         break;
01776                         }
01777                 }
01778         if(have_some_real_data==FALSE)
01779                 return;
01780 
01781 
01782 
01783 
01784         last_as=NULL;
01785         subject->earliest_time=t2;
01786         subject->latest_time=t1;
01787 
01788 
01789 #ifdef DEBUG
01790         printf("--- BEGINNING/MIDDLE SECTION ---<BR>\n");
01791 #endif
01792 
01793         /**********************************/
01794         /*    BEGINNING/MIDDLE SECTION    */
01795         /**********************************/
01796 
01797         for(temp_as=subject->as_list;temp_as!=NULL;temp_as=temp_as->next){
01798 
01799                 /* keep this as last known state if this is the first entry or if it occurs before the starting point of the graph */
01800                 if((temp_as->time_stamp<=t1 || temp_as==subject->as_list) && (temp_as->entry_type!=AS_NO_DATA && temp_as->entry_type!=AS_PROGRAM_END && temp_as->entry_type!=AS_PROGRAM_START)){
01801                         subject->last_known_state=temp_as->entry_type;
01802 #ifdef DEBUG
01803                         printf("SETTING LAST KNOWN STATE=%d<br>\n",subject->last_known_state);
01804 #endif
01805                         }
01806 
01807                 /* skip this entry if it occurs before the starting point of the graph */
01808                 if(temp_as->time_stamp<=t1){
01809 #ifdef DEBUG
01810                         printf("SKIPPING PRE-EVENT: %d @ %lu<br>\n",temp_as->entry_type,temp_as->time_stamp);
01811 #endif
01812                         last_as=temp_as;
01813                         continue;
01814                         }
01815 
01816                 /* graph this span if we're not on the first item */
01817                 if(last_as!=NULL){
01818 
01819                         a=last_as->time_stamp;
01820                         b=temp_as->time_stamp;
01821 
01822                         /* we've already passed the last time displayed in the graph */
01823                         if(a>t2)
01824                                 break;
01825 
01826                         /* only graph this data if its on the graph */
01827                         else if(b>t1){
01828 
01829                                 /* clip last time if it exceeds graph limits */
01830                                 if(b>t2)
01831                                         b=t2;
01832 
01833                                 /* clip first time if it precedes graph limits */
01834                                 if(a<t1)
01835                                         a=t1;
01836 
01837                                 /* save this time if its the earliest we've graphed */
01838                                 if(a<subject->earliest_time){
01839                                         subject->earliest_time=a;
01840                                         subject->earliest_state=last_as->entry_type;
01841                                         }
01842 
01843                                 /* save this time if its the latest we've graphed */
01844                                 if(b>subject->latest_time){
01845                                         subject->latest_time=b;
01846                                         subject->latest_state=last_as->entry_type;
01847                                         }
01848 
01849                                 /* compute availability times for this chunk */
01850                                 compute_subject_availability_times(last_as->entry_type,temp_as->entry_type,last_as->time_stamp,a,b,subject,temp_as);
01851 
01852                                 /* return if we've reached the end of the graph limits */
01853                                 if(b>=t2){
01854                                         last_as=temp_as;
01855                                         break;
01856                                         }
01857                                 }
01858                         }
01859 
01860 
01861                 /* keep track of the last item */
01862                 last_as=temp_as;
01863                 }
01864 
01865 
01866 #ifdef DEBUG
01867         printf("--- END SECTION ---<BR>\n");
01868 #endif
01869 
01870         /**********************************/
01871         /*           END SECTION          */
01872         /**********************************/
01873 
01874         if(last_as!=NULL){
01875 
01876                 /* don't process an entry that is beyond the limits of the graph */
01877                 if(last_as->time_stamp<t2){
01878 
01879                         time(&current_time);
01880                         b=current_time;
01881                         if(b>t2)
01882                                 b=t2;
01883 
01884                         a=last_as->time_stamp;
01885                         if(a<t1)
01886                                 a=t1;
01887 
01888                         /* fake the current state (it doesn't really matter for graphing) */
01889                         if(subject->type==HOST_SUBJECT)
01890                                 current_state=AS_HOST_UP;
01891                         else
01892                                 current_state=AS_SVC_OK;
01893 
01894                         /* compute availability times for last state */
01895                         compute_subject_availability_times(last_as->entry_type,current_state,last_as->time_stamp,a,b,subject,last_as);
01896                         }
01897                 }
01898 
01899 
01900         return;
01901 }
01902 
01903 
01904 /* computes availability times */
01905 void compute_subject_availability_times(int first_state,int last_state,time_t real_start_time,time_t start_time,time_t end_time,avail_subject *subject, archived_state *as){
01906         int start_state;
01907         int end_state;
01908         unsigned long state_duration;
01909         struct tm *t;
01910         unsigned long midnight_today;
01911         int weekday;
01912         timerange *temp_timerange;
01913         unsigned long temp_duration;
01914         unsigned long temp_end;
01915         unsigned long temp_start;
01916         unsigned long start;
01917         unsigned long end;
01918 
01919 #ifdef DEBUG
01920         if(subject->type==HOST_SUBJECT)
01921                 printf("HOST '%s'...\n",subject->host_name);
01922         else
01923                 printf("SERVICE '%s' ON HOST '%s'...\n",subject->service_description,subject->host_name);
01924 
01925         printf("COMPUTING %d->%d FROM %lu to %lu (%lu seconds) FOR %s<br>\n",first_state,last_state,start_time,end_time,(end_time-start_time),(subject->type==HOST_SUBJECT)?"HOST":"SERVICE");
01926 #endif
01927 
01928         /* clip times if necessary */
01929         if(start_time<t1)
01930                 start_time=t1;
01931         if(end_time>t2)
01932                 end_time=t2;
01933 
01934         /* make sure this is a valid time */
01935         if(start_time>t2)
01936                 return;
01937         if(end_time<t1)
01938                 return;
01939 
01940         /* MickeM - attempt to handle the current time_period (if any) */
01941         if(current_timeperiod!=NULL){
01942                 t=localtime((time_t *)&start_time);
01943                 state_duration = 0;
01944 
01945                 /* calculate the start of the day (midnight, 00:00 hours) */
01946                 t->tm_sec=0;
01947                 t->tm_min=0;
01948                 t->tm_hour=0;
01949                 t->tm_isdst=-1;
01950                 midnight_today=(unsigned long)mktime(t);
01951                 weekday=t->tm_wday;
01952 
01953                 while(midnight_today<end_time){
01954                         temp_duration=0;
01955                         temp_end=min(86400,end_time-midnight_today);
01956                         temp_start=0;
01957                         if(start_time>midnight_today)
01958                                 temp_start=start_time-midnight_today;
01959 #ifdef DEBUG
01960                         printf("<b>Matching: %ld -> %ld. (%ld -> %ld)</b><br>\n",temp_start, temp_end, midnight_today+temp_start, midnight_today+temp_end);
01961 #endif
01962                         /* check all time ranges for this day of the week */
01963                         for(temp_timerange=current_timeperiod->days[weekday];temp_timerange!=NULL;temp_timerange=temp_timerange->next){
01964 
01965 #ifdef DEBUG
01966                                 printf("<li>Matching in timerange[%d]: %d -> %d (%ld -> %ld)<br>\n",weekday,temp_timerange->range_start,temp_timerange->range_end,temp_start,temp_end);
01967 #endif
01968                                 start=max(temp_timerange->range_start,temp_start);
01969                                 end=min(temp_timerange->range_end,temp_end);
01970 
01971                                 if(start<end){
01972                                         temp_duration+=end-start;
01973 #ifdef DEBUG
01974                                         printf("<li>Matched time: %ld -> %ld = %d<br>\n",start, end, temp_duration);
01975 #endif
01976                                         }
01977 #ifdef DEBUG
01978                                 else
01979                                         printf("<li>Ignored time: %ld -> %ld<br>\n",start, end);
01980 #endif
01981                                 }
01982                         state_duration+=temp_duration;
01983                         temp_start=0;
01984                         midnight_today+=86400;
01985                         if(++weekday>6)
01986                                 weekday=0;
01987                         }
01988                 }
01989 
01990         /* no report timeperiod was selected (assume 24x7) */
01991         else{
01992                 /* calculate time in this state */
01993                 state_duration=(unsigned long)(end_time-start_time);
01994                 }
01995 
01996         /* can't graph if we don't have data... */
01997         if(first_state==AS_NO_DATA || last_state==AS_NO_DATA){
01998                 subject->time_indeterminate_nodata+=state_duration;
01999                 return;
02000                 }
02001         if(first_state==AS_PROGRAM_START && (last_state==AS_PROGRAM_END || last_state==AS_PROGRAM_START)){
02002                 if(assume_initial_states==FALSE){
02003                         subject->time_indeterminate_nodata+=state_duration;
02004                         return;
02005                         }
02006                 }
02007         if(first_state==AS_PROGRAM_END){
02008 
02009                 /* added 7/24/03 */
02010                 if(assume_states_during_notrunning==TRUE){
02011                         first_state=subject->last_known_state;
02012                         }
02013                 else{
02014                         subject->time_indeterminate_notrunning+=state_duration;
02015                         return;
02016                         }
02017                 }
02018 
02019         /* special case if first entry was program start */
02020         if(first_state==AS_PROGRAM_START){
02021 
02022                 if(assume_initial_states==TRUE){
02023 
02024                         if(assume_state_retention==TRUE)
02025                                 start_state=subject->last_known_state;
02026 
02027                         else{
02028                                 if(subject->type==HOST_SUBJECT)
02029                                         start_state=AS_HOST_UP;
02030                                 else
02031                                         start_state=AS_SVC_OK;
02032                                 }
02033                         }
02034                 else
02035                         return;
02036                 }
02037         else{
02038                 start_state=first_state;
02039                 subject->last_known_state=first_state;
02040                 }
02041 
02042         /* special case if last entry was program stop */
02043         if(last_state==AS_PROGRAM_END)
02044                 end_state=first_state;
02045         else
02046                 end_state=last_state;
02047 
02048         /* save "processed state" info */
02049         as->processed_state=start_state;
02050 
02051 #ifdef DEBUG
02052         printf("PASSED TIME CHECKS, CLIPPED VALUES: START=%lu, END=%lu\n",start_time,end_time);
02053 #endif
02054 
02055 
02056         /* add time in this state to running totals */
02057         switch(start_state){
02058         case AS_HOST_UP:
02059                 subject->time_up+=state_duration;
02060                 break;
02061         case AS_HOST_DOWN:
02062                 subject->time_down+=state_duration;
02063                 break;
02064         case AS_HOST_UNREACHABLE:
02065                 subject->time_unreachable+=state_duration;
02066                 break;
02067         case AS_SVC_OK:
02068                 subject->time_ok+=state_duration;
02069                 break;
02070         case AS_SVC_WARNING:
02071                 subject->time_warning+=state_duration;
02072                 break;
02073         case AS_SVC_UNKNOWN:
02074                 subject->time_unknown+=state_duration;
02075                 break;
02076         case AS_SVC_CRITICAL:
02077                 subject->time_critical+=state_duration;
02078                 break;
02079         default:
02080                 break;
02081                 }
02082 
02083         return;
02084 }
02085 
02086 
02087 /* computes downtime data for a given subject */
02088 void compute_subject_downtime(avail_subject *subject, time_t current_time){
02089         archived_state *temp_sd;
02090         time_t start_time;
02091         time_t end_time;
02092         int host_downtime_depth=0;
02093         int service_downtime_depth=0;
02094         int process_chunk=FALSE;
02095 
02096 #ifdef DEBUG2
02097         printf("COMPUTE_SUBJECT_DOWNTIME\n");
02098 #endif
02099 
02100         /* if left hand of graph is after current time, we can't do anything at all.... */
02101         if(t1>current_time)
02102                 return;
02103 
02104         /* no scheduled downtime data for subject... */
02105         if(subject->sd_list==NULL)
02106                 return;
02107 
02108         /* all data we have occurs after last time on graph... */
02109         if(subject->sd_list->time_stamp>=t2)
02110                 return;
02111 
02112         /* initialize pointer */
02113         temp_sd=subject->sd_list;
02114 
02115         /* special case if first entry is the end of scheduled downtime */
02116         if((temp_sd->entry_type==AS_HOST_DOWNTIME_END || temp_sd->entry_type==AS_SVC_DOWNTIME_END) && temp_sd->time_stamp>t1){
02117 
02118 #ifdef DEBUG2
02119                 printf("\tSPECIAL DOWNTIME CASE\n");
02120 #endif
02121                 start_time=t1;
02122                 end_time=(temp_sd->time_stamp>t2)?t2:temp_sd->time_stamp;
02123                 compute_subject_downtime_times(start_time,end_time,subject,NULL);
02124                 temp_sd=temp_sd->next;
02125                 }
02126 
02127         /* process all periods of scheduled downtime */
02128         for(;temp_sd!=NULL;temp_sd=temp_sd->next){
02129 
02130                 /* we've passed graph bounds... */
02131                 if(temp_sd->time_stamp>=t2)
02132                         break;
02133 
02134                 if(temp_sd->entry_type==AS_HOST_DOWNTIME_START)
02135                         host_downtime_depth++;
02136                 else if(temp_sd->entry_type==AS_HOST_DOWNTIME_END)
02137                         host_downtime_depth--;
02138                 else if(temp_sd->entry_type==AS_SVC_DOWNTIME_START)
02139                         service_downtime_depth++;
02140                 else if(temp_sd->entry_type==AS_SVC_DOWNTIME_END)
02141                         service_downtime_depth--;
02142                 else
02143                         continue;
02144 
02145                 process_chunk=FALSE;
02146                 if(temp_sd->entry_type==AS_HOST_DOWNTIME_START || temp_sd->entry_type==AS_SVC_DOWNTIME_START)
02147                         process_chunk=TRUE;
02148                 else if(subject->type==SERVICE_SUBJECT && (host_downtime_depth>0 || service_downtime_depth>0))
02149                         process_chunk=TRUE;
02150 
02151                 /* process this specific "chunk" of scheduled downtime */
02152                 if(process_chunk==TRUE){
02153 
02154                         start_time=temp_sd->time_stamp;
02155                         end_time=(temp_sd->next==NULL)?current_time:temp_sd->next->time_stamp;
02156 
02157                         /* check time sanity */
02158                         if(end_time<=t1)
02159                                 continue;
02160                         if(start_time>=t2)
02161                                 continue;
02162                         if(start_time>=end_time)
02163                                 continue;
02164 
02165                         /* clip time values */
02166                         if(start_time<t1)
02167                                 start_time=t1;
02168                         if(end_time>t2)
02169                                 end_time=t2;
02170 
02171                         compute_subject_downtime_times(start_time,end_time,subject,temp_sd);
02172                         }
02173                 }
02174 
02175         return;
02176 }
02177 
02178 
02179 
02180 /* computes downtime times */
02181 void compute_subject_downtime_times(time_t start_time, time_t end_time, avail_subject *subject, archived_state *sd) {
02182         archived_state *temp_as=NULL;
02183         time_t part_start_time=0L;
02184         time_t part_subject_state=0L;
02185         int saved_status=0;
02186         int saved_stamp=0;
02187         int count=0;
02188         archived_state *temp_before=NULL;
02189         archived_state *last=NULL;
02190 
02191 #ifdef DEBUG2
02192         printf("<P><b>ENTERING COMPUTE_SUBJECT_DOWNTIME_TIMES: start=%lu, end=%lu, t1=%lu, t2=%lu </b></P>",start_time,end_time,t1,t2);
02193 #endif
02194 
02195         /* times are weird, so bail out... */
02196         if(start_time>end_time)
02197                 return;
02198         if(start_time<t1 || end_time>t2)
02199                 return;
02200 
02201         /* find starting point in archived state list */
02202         if(sd==NULL){
02203 #ifdef DEBUG2
02204                 printf("<P>TEMP_AS=SUBJECT->AS_LIST </P>");
02205 #endif
02206                 temp_as=subject->as_list;
02207                 }
02208         else if(sd->misc_ptr==NULL){
02209 #ifdef DEBUG2
02210                 printf("<P>TEMP_AS=SUBJECT->AS_LIST</P>");
02211 #endif
02212                 temp_as=subject->as_list;
02213                 }
02214         else if(sd->misc_ptr->next==NULL){
02215 #ifdef DEBUG2
02216                 printf("<P>TEMP_AS=SD->MISC_PTR</P>");
02217 #endif
02218                 temp_as=sd->misc_ptr;
02219                 }
02220         else{
02221 #ifdef DEBUG2
02222                 printf("<P>TEMP_AS=SD->MISC_PTR->NEXT</P>");
02223 #endif
02224                 temp_as=sd->misc_ptr->next;
02225                 }
02226 
02227         /* initialize values */
02228         part_start_time=start_time;
02229         if(temp_as==NULL)
02230                 part_subject_state=AS_NO_DATA;
02231         else if(temp_as->processed_state==AS_PROGRAM_START || temp_as->processed_state==AS_PROGRAM_END || temp_as->processed_state==AS_NO_DATA){
02232 #ifdef DEBUG2
02233                 printf("<P>ENTRY TYPE #1: %d</P>",temp_as->entry_type);
02234 #endif
02235                 part_subject_state=AS_NO_DATA;
02236                 }
02237         else{
02238 #ifdef DEBUG2
02239                 printf("<P>ENTRY TYPE #2: %d</P>",temp_as->entry_type);
02240 #endif
02241                 part_subject_state=temp_as->processed_state;
02242                 }
02243 
02244 #ifdef DEBUG2
02245         printf("<P>TEMP_AS=%s</P>",(temp_as==NULL)?"NULL":"Not NULL");
02246         printf("<P>SD=%s</P>",(sd==NULL)?"NULL":"Not NULL");
02247 #endif
02248 
02249         /* temp_as now points to first event to possibly "break" this chunk */
02250         for(;temp_as!=NULL;temp_as=temp_as->next){
02251                 count++;
02252                 last=temp_as;
02253 
02254                 if(temp_before==NULL){
02255                         if(last->time_stamp>start_time){
02256                                 if(last->time_stamp>end_time)
02257                                         compute_subject_downtime_part_times(start_time,end_time,part_subject_state,subject);
02258                                 else
02259                                         compute_subject_downtime_part_times(start_time,last->time_stamp,part_subject_state,subject);
02260                                 }
02261                         temp_before=temp_as;
02262                         saved_status=temp_as->entry_type;
02263                         saved_stamp=temp_as->time_stamp;
02264 
02265                         /* check if first time is before schedule downtime */
02266                         if(saved_stamp<start_time)
02267                                 saved_stamp=start_time;
02268 
02269                         continue;
02270                         }
02271 
02272                 /* if status changed, we have to calculate */
02273                 if(saved_status!=temp_as->entry_type){
02274 
02275                         /* is outside schedule time, use end schdule downtime */
02276                         if(temp_as->time_stamp>end_time){
02277                                 if(saved_stamp<start_time)
02278                                         compute_subject_downtime_part_times(start_time,end_time,saved_status,subject);
02279                                 else
02280                                         compute_subject_downtime_part_times(saved_stamp,end_time,saved_status,subject);
02281                                 }
02282                         else{
02283                                 if(saved_stamp<start_time)
02284                                         compute_subject_downtime_part_times(start_time,temp_as->time_stamp,saved_status,subject);
02285                                 else
02286                                         compute_subject_downtime_part_times(saved_stamp,temp_as->time_stamp,saved_status,subject);
02287                                 }
02288                         saved_status=temp_as->entry_type;
02289                         saved_stamp=temp_as->time_stamp;
02290                         }
02291                 }
02292 
02293         /* just one entry inside the scheduled downtime */
02294         if(count==0)
02295                 compute_subject_downtime_part_times(start_time,end_time,part_subject_state,subject);
02296         else{
02297                 /* is outside scheduled time, use end schdule downtime */
02298                 if(last->time_stamp>end_time)
02299                         compute_subject_downtime_part_times(saved_stamp,end_time,saved_status,subject);
02300                 else
02301                         compute_subject_downtime_part_times(saved_stamp,last->time_stamp,saved_status,subject);
02302                 }
02303 
02304         return;
02305 }
02306 
02307 
02308 
02309 /* computes downtime times */
02310 void compute_subject_downtime_part_times(time_t start_time, time_t end_time, int subject_state, avail_subject *subject){
02311         unsigned long state_duration;
02312 
02313 #ifdef DEBUG2
02314         printf("ENTERING COMPUTE_SUBJECT_DOWNTIME_PART_TIMES\n");
02315 #endif
02316 
02317         /* times are weird */
02318         if(start_time>end_time)
02319                 return;
02320 
02321         state_duration=(unsigned long)(end_time-start_time);
02322 
02323         switch(subject_state){
02324         case AS_HOST_UP:
02325                 subject->scheduled_time_up+=state_duration;
02326                 break;
02327         case AS_HOST_DOWN:
02328                 subject->scheduled_time_down+=state_duration;
02329                 break;
02330         case AS_HOST_UNREACHABLE:
02331                 subject->scheduled_time_unreachable+=state_duration;
02332                 break;
02333         case AS_SVC_OK:
02334                 subject->scheduled_time_ok+=state_duration;
02335                 break;
02336         case AS_SVC_WARNING:
02337                 subject->scheduled_time_warning+=state_duration;
02338                 break;
02339         case AS_SVC_UNKNOWN:
02340                 subject->scheduled_time_unknown+=state_duration;
02341                 break;
02342         case AS_SVC_CRITICAL:
02343                 subject->scheduled_time_critical+=state_duration;
02344                 break;
02345         default:
02346                 subject->scheduled_time_indeterminate+=state_duration;
02347                 break;
02348                 }
02349 
02350 #ifdef DEBUG2
02351         printf("\tSUBJECT DOWNTIME: Host '%s', Service '%s', State=%d, Duration=%lu, Start=%lu\n",subject->host_name,(subject->service_description==NULL)?"NULL":subject->service_description,subject_state,state_duration,start_time);
02352 #endif
02353 
02354         return;
02355 }
02356 
02357 
02358 
02359 /* convert current host state to archived state value */
02360 int convert_host_state_to_archived_state(int current_status){
02361 
02362         if(current_status==HOST_UP)
02363                 return AS_HOST_UP;
02364         if(current_status==HOST_DOWN)
02365                 return AS_HOST_DOWN;
02366         if(current_status==HOST_UNREACHABLE)
02367                 return AS_HOST_UNREACHABLE;
02368 
02369         return AS_NO_DATA;
02370 }
02371 
02372 
02373 /* convert current service state to archived state value */
02374 int convert_service_state_to_archived_state(int current_status){
02375 
02376         if(current_status==SERVICE_OK)
02377                 return AS_SVC_OK;
02378         if(current_status==SERVICE_UNKNOWN)
02379                 return AS_SVC_UNKNOWN;
02380         if(current_status==SERVICE_WARNING)
02381                 return AS_SVC_WARNING;
02382         if(current_status==SERVICE_CRITICAL)
02383                 return AS_SVC_CRITICAL;
02384 
02385         return AS_NO_DATA;
02386 }
02387 
02388 
02389 
02390 /* create list of subjects to collect availability data for */
02391 void create_subject_list(void){
02392         hostgroup *temp_hostgroup;
02393         hostsmember *temp_hgmember;
02394         servicegroup *temp_servicegroup;
02395         servicesmember *temp_sgmember;
02396         host *temp_host;
02397         service *temp_service;
02398         char *last_host_name="";
02399 
02400         /* we're displaying one or more hosts */
02401         if(display_type==DISPLAY_HOST_AVAIL && host_name && strcmp(host_name,"")){
02402 
02403                 /* we're only displaying a specific host (and summaries for all services associated with it) */
02404                 if(show_all_hosts==FALSE){
02405                         add_subject(HOST_SUBJECT,host_name,NULL);
02406                         for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next){
02407                                 if(!strcmp(temp_service->host_name,host_name))
02408                                         add_subject(SERVICE_SUBJECT,host_name,temp_service->description);
02409                                 }
02410                         }
02411 
02412                 /* we're displaying all hosts */
02413                 else{
02414                         for(temp_host=host_list;temp_host!=NULL;temp_host=temp_host->next)
02415                                 add_subject(HOST_SUBJECT,temp_host->name,NULL);
02416                         }
02417                 }
02418 
02419         /* we're displaying a specific service */
02420         else if(display_type==DISPLAY_SERVICE_AVAIL && service_desc && strcmp(service_desc,"")){
02421 
02422                 /* we're only displaying a specific service */
02423                 if(show_all_services==FALSE)
02424                         add_subject(SERVICE_SUBJECT,host_name,service_desc);
02425 
02426                 /* we're displaying all services */
02427                 else{
02428                         for(temp_service=service_list;temp_service!=NULL;temp_service=temp_service->next)
02429                                 add_subject(SERVICE_SUBJECT,temp_service->host_name,temp_service->description);
02430                         }
02431                 }
02432 
02433         /* we're displaying one or more hostgroups (the host members of the groups) */
02434         else if(display_type==DISPLAY_HOSTGROUP_AVAIL && hostgroup_name && strcmp(hostgroup_name,"")){
02435 
02436                 /* we're displaying all hostgroups */
02437                 if(show_all_hostgroups==TRUE){
02438                         for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next){
02439                                 for(temp_hgmember=temp_hostgroup->members;temp_hgmember!=NULL;temp_hgmember=temp_hgmember->next)
02440                                         add_subject(HOST_SUBJECT,temp_hgmember->host_name,NULL);
02441                                 }
02442                         }
02443                 /* we're only displaying a specific hostgroup */
02444                 else{
02445                         temp_hostgroup=find_hostgroup(hostgroup_name);
02446                         if(temp_hostgroup!=NULL){
02447                                 for(temp_hgmember=temp_hostgroup->members;temp_hgmember!=NULL;temp_hgmember=temp_hgmember->next)
02448                                         add_subject(HOST_SUBJECT,temp_hgmember->host_name,NULL);
02449                                 }
02450                         }
02451                 }
02452 
02453         /* we're displaying one or more servicegroups (the host and service members of the groups) */
02454         else if(display_type==DISPLAY_SERVICEGROUP_AVAIL && servicegroup_name && strcmp(servicegroup_name,"")){
02455 
02456                 /* we're displaying all servicegroups */
02457                 if(show_all_servicegroups==TRUE){
02458                         for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next){
02459                                 for(temp_sgmember=temp_servicegroup->members;temp_sgmember!=NULL;temp_sgmember=temp_sgmember->next){
02460                                         add_subject(SERVICE_SUBJECT,temp_sgmember->host_name,temp_sgmember->service_description);
02461                                         if(strcmp(last_host_name,temp_sgmember->host_name))
02462                                                 add_subject(HOST_SUBJECT,temp_sgmember->host_name,NULL);
02463                                         last_host_name=temp_sgmember->host_name;
02464                                         }
02465                                 }
02466                         }
02467                 /* we're only displaying a specific servicegroup */
02468                 else{
02469                         temp_servicegroup=find_servicegroup(servicegroup_name);
02470                         if(temp_servicegroup!=NULL){
02471                                 for(temp_sgmember=temp_servicegroup->members;temp_sgmember!=NULL;temp_sgmember=temp_sgmember->next){
02472                                         add_subject(SERVICE_SUBJECT,temp_sgmember->host_name,temp_sgmember->service_description);
02473                                         if(strcmp(last_host_name,temp_sgmember->host_name))
02474                                                 add_subject(HOST_SUBJECT,temp_sgmember->host_name,NULL);
02475                                         last_host_name=temp_sgmember->host_name;
02476                                         }
02477                                 }
02478                         }
02479                 }
02480 
02481         return;
02482 }
02483 
02484 
02485 
02486 /* adds a subject */
02487 void add_subject(int subject_type, char *hn, char *sd){
02488         avail_subject *last_subject=NULL;
02489         avail_subject *temp_subject=NULL;
02490         avail_subject *new_subject=NULL;
02491         int is_authorized=FALSE;
02492 
02493         /* bail if we've already added the subject */
02494         if(find_subject(subject_type,hn,sd))
02495                 return;
02496 
02497         /* see if the user is authorized to see data for this host or service */
02498         if(subject_type==HOST_SUBJECT)
02499                 is_authorized=is_authorized_for_host(find_host(hn),&current_authdata);
02500         else
02501                 is_authorized=is_authorized_for_service(find_service(hn,sd),&current_authdata);
02502         if(is_authorized==FALSE)
02503                 return;
02504 
02505         /* allocate memory for the new entry */
02506         new_subject=(avail_subject *)malloc(sizeof(avail_subject));
02507         if(new_subject==NULL)
02508                 return;
02509 
02510         /* allocate memory for the host name */
02511         if(hn!=NULL){
02512                 new_subject->host_name=(char *)malloc(strlen(hn)+1);
02513                 if(new_subject->host_name!=NULL)
02514                         strcpy(new_subject->host_name,hn);
02515                 }
02516         else
02517                 new_subject->host_name=NULL;
02518 
02519         /* allocate memory for the service description */
02520         if(sd!=NULL){
02521                 new_subject->service_description=(char *)malloc(strlen(sd)+1);
02522                 if(new_subject->service_description!=NULL)
02523                         strcpy(new_subject->service_description,sd);
02524                 }
02525         else
02526                 new_subject->service_description=NULL;
02527 
02528         new_subject->type=subject_type;
02529         new_subject->earliest_state=AS_NO_DATA;
02530         new_subject->latest_state=AS_NO_DATA;
02531         new_subject->time_up=0L;
02532         new_subject->time_down=0L;
02533         new_subject->time_unreachable=0L;
02534         new_subject->time_ok=0L;
02535         new_subject->time_warning=0L;
02536         new_subject->time_unknown=0L;
02537         new_subject->time_critical=0L;
02538         new_subject->scheduled_time_up=0L;
02539         new_subject->scheduled_time_down=0L;
02540         new_subject->scheduled_time_unreachable=0L;
02541         new_subject->scheduled_time_ok=0L;
02542         new_subject->scheduled_time_warning=0L;
02543         new_subject->scheduled_time_unknown=0L;
02544         new_subject->scheduled_time_critical=0L;
02545         new_subject->scheduled_time_indeterminate=0L;
02546         new_subject->time_indeterminate_nodata=0L;
02547         new_subject->time_indeterminate_notrunning=0L;
02548         new_subject->as_list=NULL;
02549         new_subject->as_list_tail=NULL;
02550         new_subject->sd_list=NULL;
02551         new_subject->last_known_state=AS_NO_DATA;
02552 
02553         /* add the new entry to the list in memory, sorted by host name */
02554         last_subject=subject_list;
02555         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
02556                 if(strcmp(new_subject->host_name,temp_subject->host_name)<0){
02557                         new_subject->next=temp_subject;
02558                         if(temp_subject==subject_list)
02559                                 subject_list=new_subject;
02560                         else
02561                                 last_subject->next=new_subject;
02562                         break;
02563                         }
02564                 else
02565                         last_subject=temp_subject;
02566                 }
02567         if(subject_list==NULL){
02568                 new_subject->next=NULL;
02569                 subject_list=new_subject;
02570                 }
02571         else if(temp_subject==NULL){
02572                 new_subject->next=NULL;
02573                 last_subject->next=new_subject;
02574                 }
02575 
02576         return;
02577 }
02578 
02579 
02580 
02581 /* finds a specific subject */
02582 avail_subject *find_subject(int type, char *hn, char *sd){
02583         avail_subject *temp_subject;
02584 
02585         if(hn==NULL)
02586                 return NULL;
02587 
02588         if(type==SERVICE_SUBJECT && sd==NULL)
02589                 return NULL;
02590 
02591         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
02592                 if(temp_subject->type!=type)
02593                         continue;
02594                 if(strcmp(hn,temp_subject->host_name))
02595                         continue;
02596                 if(type==SERVICE_SUBJECT && strcmp(sd,temp_subject->service_description))
02597                         continue;
02598                 return temp_subject;
02599                 }
02600 
02601         return NULL;
02602 }
02603 
02604 
02605 
02606 /* adds an archived state entry to all subjects */
02607 void add_global_archived_state(int entry_type, int state_type, time_t time_stamp, char *state_info){
02608         avail_subject *temp_subject;
02609 
02610         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next)
02611                 add_archived_state(entry_type,state_type,time_stamp,state_info,temp_subject);
02612 
02613         return;
02614 }
02615 
02616 
02617 
02618 
02619 /* adds an archived state entry to a specific subject */
02620 void add_archived_state(int entry_type, int state_type, time_t time_stamp, char *state_info, avail_subject *subject){
02621         archived_state *last_as=NULL;
02622         archived_state *temp_as=NULL;
02623         archived_state *new_as=NULL;
02624 
02625         /* allocate memory for the new entry */
02626         new_as=(archived_state *)malloc(sizeof(archived_state));
02627         if(new_as==NULL)
02628                 return;
02629 
02630         /* allocate memory for the state info */
02631         if(state_info!=NULL){
02632                 new_as->state_info=(char *)malloc(strlen(state_info)+1);
02633                 if(new_as->state_info!=NULL)
02634                         strcpy(new_as->state_info,state_info);
02635                 }
02636         else new_as->state_info=NULL;
02637 
02638         /* initialize the "processed state" value - this gets modified later for most entries */
02639         if(entry_type!=AS_PROGRAM_START && entry_type!=AS_PROGRAM_END && entry_type!=AS_NO_DATA)
02640                 new_as->processed_state=entry_type;
02641         else
02642                 new_as->processed_state=AS_NO_DATA;
02643 
02644         new_as->entry_type=entry_type;
02645         new_as->state_type=state_type;
02646         new_as->time_stamp=time_stamp;
02647         new_as->misc_ptr=NULL;
02648 
02649         /* add the new entry to the list in memory, sorted by time (more recent entries should appear towards end of list) */
02650         last_as=subject->as_list;
02651         for(temp_as=subject->as_list;temp_as!=NULL;temp_as=temp_as->next){
02652                 if(new_as->time_stamp<temp_as->time_stamp){
02653                         new_as->next=temp_as;
02654                         if(temp_as==subject->as_list)
02655                                 subject->as_list=new_as;
02656                         else
02657                                 last_as->next=new_as;
02658                         break;
02659                         }
02660                 else
02661                         last_as=temp_as;
02662                 }
02663         if(subject->as_list==NULL){
02664                 new_as->next=NULL;
02665                 subject->as_list=new_as;
02666                 }
02667         else if(temp_as==NULL){
02668                 new_as->next=NULL;
02669                 last_as->next=new_as;
02670                 }
02671 
02672         /* update "tail" of the list - not really the tail, just last item added */
02673         subject->as_list_tail=new_as;
02674 
02675         return;
02676 }
02677 
02678 
02679 /* adds a scheduled downtime entry to a specific subject */
02680 void add_scheduled_downtime(int state_type, time_t time_stamp, avail_subject *subject){
02681         archived_state *last_sd=NULL;
02682         archived_state *temp_sd=NULL;
02683         archived_state *new_sd=NULL;
02684 
02685         /* allocate memory for the new entry */
02686         new_sd=(archived_state *)malloc(sizeof(archived_state));
02687         if(new_sd==NULL)
02688                 return;
02689 
02690         new_sd->state_info=NULL;
02691         new_sd->processed_state=state_type;
02692         new_sd->entry_type=state_type;
02693         new_sd->time_stamp=time_stamp;
02694         new_sd->misc_ptr=subject->as_list_tail;
02695 
02696         /* add the new entry to the list in memory, sorted by time (more recent entries should appear towards end of list) */
02697         last_sd=subject->sd_list;
02698         for(temp_sd=subject->sd_list;temp_sd!=NULL;temp_sd=temp_sd->next){
02699                 if(new_sd->time_stamp<=temp_sd->time_stamp){
02700                         new_sd->next=temp_sd;
02701                         if(temp_sd==subject->sd_list)
02702                                 subject->sd_list=new_sd;
02703                         else
02704                                 last_sd->next=new_sd;
02705                         break;
02706                         }
02707                 else
02708                         last_sd=temp_sd;
02709                 }
02710         if(subject->sd_list==NULL){
02711                 new_sd->next=NULL;
02712                 subject->sd_list=new_sd;
02713                 }
02714         else if(temp_sd==NULL){
02715                 new_sd->next=NULL;
02716                 last_sd->next=new_sd;
02717                 }
02718 
02719         return;
02720 }
02721 
02722 
02723 /* frees memory allocated to all availability data */
02724 void free_availability_data(void){
02725         avail_subject *this_subject;
02726         avail_subject *next_subject;
02727 
02728         for(this_subject=subject_list;this_subject!=NULL;){
02729                 next_subject=this_subject->next;
02730                 if(this_subject->host_name!=NULL)
02731                         free(this_subject->host_name);
02732                 if(this_subject->service_description!=NULL)
02733                         free(this_subject->service_description);
02734                 free_archived_state_list(this_subject->as_list);
02735                 free_archived_state_list(this_subject->sd_list);
02736                 free(this_subject);
02737                 this_subject=next_subject;
02738         }
02739 
02740         return;
02741 }
02742 
02743 /* frees memory allocated to the archived state list */
02744 void free_archived_state_list(archived_state *as_list){
02745         archived_state *this_as=NULL;
02746         archived_state *next_as=NULL;
02747 
02748         for(this_as=as_list;this_as!=NULL;){
02749                 next_as=this_as->next;
02750                 if(this_as->state_info!=NULL)
02751                         free(this_as->state_info);
02752                 free(this_as);
02753                 this_as=next_as;
02754         }
02755 
02756         as_list=NULL;
02757 
02758         return;
02759 }
02760 
02761 
02762 
02763 /* reads log files for archived state data */
02764 void read_archived_state_data(void){
02765         char filename[MAX_FILENAME_LENGTH];
02766         int oldest_archive=0;
02767         int newest_archive=0;
02768         int current_archive=0;
02769 
02770         /* determine oldest archive to use when scanning for data (include backtracked archives as well) */
02771         oldest_archive=determine_archive_to_use_from_time(t1);
02772         if(log_rotation_method!=LOG_ROTATION_NONE)
02773                 oldest_archive+=backtrack_archives;
02774 
02775         /* determine most recent archive to use when scanning for data */
02776         newest_archive=determine_archive_to_use_from_time(t2);
02777 
02778         if(oldest_archive<newest_archive)
02779                 oldest_archive=newest_archive;
02780 
02781         /* read in all the necessary archived logs (from most recent to earliest) */
02782         for(current_archive=newest_archive;current_archive<=oldest_archive;current_archive++){
02783 #ifdef DEBUG
02784                 printf("Reading archive #%d\n",current_archive);
02785 #endif
02786 
02787                 /* get the name of the log file that contains this archive */
02788                 get_log_archive_to_use(current_archive,filename,sizeof(filename)-1);
02789 
02790 #ifdef DEBUG
02791                 printf("Archive name: '%s'\n",filename);
02792 #endif
02793 
02794                 /* scan the log file for archived state data */
02795                 scan_log_file_for_archived_state_data(filename);
02796         }
02797 
02798         return;
02799 }
02800 
02801 
02802 
02803 /* grabs archives state data from a log file */
02804 void scan_log_file_for_archived_state_data(char *filename){
02805         char entry_host_name[MAX_INPUT_BUFFER];
02806         char entry_service_desc[MAX_INPUT_BUFFER];
02807         char *plugin_output=NULL;
02808         char *temp_buffer=NULL;
02809         avail_subject *temp_subject=NULL;
02810         logentry *temp_entry=NULL;
02811         int state_type=0,status;
02812 
02813         status = get_log_entries(filename,NULL,FALSE,t1-(60*60*24*backtrack_archives),t2);
02814         
02815         if (status==READLOG_OK) {
02816 
02817                 for(temp_entry=entry_list;temp_entry!=NULL;temp_entry=temp_entry->next) {
02818                 
02819                         /* program starts/restarts */
02820                         if(temp_entry->type==LOGENTRY_STARTUP)
02821                                 add_global_archived_state(AS_PROGRAM_START,AS_NO_DATA,temp_entry->timestamp,"Program start");
02822                         if(temp_entry->type==LOGENTRY_RESTART)
02823                                 add_global_archived_state(AS_PROGRAM_START,AS_NO_DATA,temp_entry->timestamp,"Program restart");
02824 
02825                         /* program stops */
02826                         if(temp_entry->type==LOGENTRY_SHUTDOWN)
02827                                 add_global_archived_state(AS_PROGRAM_END,AS_NO_DATA,temp_entry->timestamp,"Normal program termination");
02828                         if(temp_entry->type==LOGENTRY_BAILOUT)
02829                                 add_global_archived_state(AS_PROGRAM_END,AS_NO_DATA,temp_entry->timestamp,"Abnormal program termination");
02830 
02831                         if(display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_HOSTGROUP_AVAIL || display_type==DISPLAY_SERVICEGROUP_AVAIL){
02832 
02833                                 switch(temp_entry->type){
02834 
02835                                         /* normal host alerts and initial/current states */
02836                                         case LOGENTRY_HOST_DOWN:
02837                                         case LOGENTRY_HOST_UNREACHABLE:
02838                                         case LOGENTRY_HOST_RECOVERY:
02839                                         case LOGENTRY_HOST_UP:
02840                                         case LOGENTRY_HOST_INITIAL_STATE:
02841                                         case LOGENTRY_HOST_CURRENT_STATE:
02842 
02843                                                 /* get host name */
02844                                                 temp_buffer=my_strtok(temp_entry->entry_text,":");
02845                                                 temp_buffer=my_strtok(NULL,";");
02846                                                 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
02847                                                 entry_host_name[sizeof(entry_host_name)-1]='\x0';
02848 
02849                                                 /* see if there is a corresponding subject for this host */
02850                                                 temp_subject=find_subject(HOST_SUBJECT,entry_host_name,NULL);
02851                                                 if(temp_subject==NULL)
02852                                                         break;
02853 
02854                                                 /* state types */
02855                                                 if(strstr(temp_entry->entry_text,";SOFT;")){
02856                                                         if(include_soft_states==FALSE)
02857                                                                 break;
02858                                                         state_type=AS_SOFT_STATE;
02859                                                 }
02860                                                 if(strstr(temp_entry->entry_text,";HARD;"))
02861                                                         state_type=AS_HARD_STATE;
02862 
02863                                                 /* get the plugin output */
02864                                                 temp_buffer=my_strtok(NULL,";");
02865                                                 temp_buffer=my_strtok(NULL,";");
02866                                                 temp_buffer=my_strtok(NULL,";");
02867                                                 plugin_output=my_strtok(NULL,"\n");
02868 
02869                                                 if(strstr(temp_entry->entry_text,";DOWN;"))
02870                                                         add_archived_state(AS_HOST_DOWN,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02871                                                 else if(strstr(temp_entry->entry_text,";UNREACHABLE;"))
02872                                                         add_archived_state(AS_HOST_UNREACHABLE,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02873                                                 else if(strstr(temp_entry->entry_text,";RECOVERY;") || strstr(temp_entry->entry_text,";UP;"))
02874                                                         add_archived_state(AS_HOST_UP,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02875                                                 else
02876                                                         add_archived_state(AS_NO_DATA,AS_NO_DATA,temp_entry->timestamp,plugin_output,temp_subject);
02877 
02878                                                 break;
02879 
02880                                         /* scheduled downtime notices */
02881                                         case LOGENTRY_HOST_DOWNTIME_STARTED:
02882                                         case LOGENTRY_HOST_DOWNTIME_STOPPED:
02883                                         case LOGENTRY_HOST_DOWNTIME_CANCELLED:
02884 
02885                                                 /* get host name */
02886                                                 temp_buffer=my_strtok(temp_entry->entry_text,":");
02887                                                 temp_buffer=my_strtok(NULL,";");
02888                                                 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
02889                                                 entry_host_name[sizeof(entry_host_name)-1]='\x0';
02890 
02891                                                 /* see if there is a corresponding subject for this host */
02892                                                 temp_subject=find_subject(HOST_SUBJECT,entry_host_name,NULL);
02893                                                 if(temp_subject==NULL)
02894                                                         break;
02895 
02896                                                 if(show_scheduled_downtime==FALSE)
02897                                                         break;
02898 
02899                                                 if(temp_entry->type==LOGENTRY_HOST_DOWNTIME_STARTED)
02900                                                         add_scheduled_downtime(AS_HOST_DOWNTIME_START,temp_entry->timestamp,temp_subject);
02901                                                 else
02902                                                         add_scheduled_downtime(AS_HOST_DOWNTIME_END,temp_entry->timestamp,temp_subject);
02903 
02904                                                 break;
02905                                 }
02906                         }
02907 
02908                         if(display_type==DISPLAY_SERVICE_AVAIL || display_type==DISPLAY_HOST_AVAIL || display_type==DISPLAY_SERVICEGROUP_AVAIL){
02909 
02910                                 switch(temp_entry->type){
02911 
02912                                         /* normal service alerts and initial/current states */
02913                                         case LOGENTRY_SERVICE_CRITICAL:
02914                                         case LOGENTRY_SERVICE_WARNING:
02915                                         case LOGENTRY_SERVICE_UNKNOWN:
02916                                         case LOGENTRY_SERVICE_RECOVERY:
02917                                         case LOGENTRY_SERVICE_OK:
02918                                         case LOGENTRY_SERVICE_INITIAL_STATE:
02919                                         case LOGENTRY_SERVICE_CURRENT_STATE:
02920                                         
02921                                                 /* get host name */
02922                                                 temp_buffer=my_strtok(temp_entry->entry_text,":");
02923                                                 temp_buffer=my_strtok(NULL,";");
02924                                                 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
02925                                                 entry_host_name[sizeof(entry_host_name)-1]='\x0';
02926 
02927                                                 /* get service description */
02928                                                 temp_buffer=my_strtok(NULL,";");
02929                                                 strncpy(entry_service_desc,(temp_buffer==NULL)?"":temp_buffer,sizeof(entry_service_desc));
02930                                                 entry_service_desc[sizeof(entry_service_desc)-1]='\x0';
02931 
02932                                                 /* see if there is a corresponding subject for this service */
02933                                                 temp_subject=find_subject(SERVICE_SUBJECT,entry_host_name,entry_service_desc);
02934                                                 if(temp_subject==NULL)
02935                                                         break;
02936 
02937                                                 /* state types */
02938                                                 if(strstr(temp_entry->entry_text,";SOFT;")){
02939                                                         if(include_soft_states==FALSE)
02940                                                                 break;
02941                                                         state_type=AS_SOFT_STATE;
02942                                                         }
02943                                                 if(strstr(temp_entry->entry_text,";HARD;"))
02944                                                         state_type=AS_HARD_STATE;
02945 
02946                                                 /* get the plugin output */
02947                                                 temp_buffer=my_strtok(NULL,";");
02948                                                 temp_buffer=my_strtok(NULL,";");
02949                                                 temp_buffer=my_strtok(NULL,";");
02950                                                 plugin_output=my_strtok(NULL,"\n");
02951 
02952                                                 if(strstr(temp_entry->entry_text,";CRITICAL;"))
02953                                                         add_archived_state(AS_SVC_CRITICAL,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02954                                                 else if(strstr(temp_entry->entry_text,";WARNING;"))
02955                                                         add_archived_state(AS_SVC_WARNING,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02956                                                 else if(strstr(temp_entry->entry_text,";UNKNOWN;"))
02957                                                         add_archived_state(AS_SVC_UNKNOWN,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02958                                                 else if(strstr(temp_entry->entry_text,";RECOVERY;") || strstr(temp_entry->entry_text,";OK;"))
02959                                                         add_archived_state(AS_SVC_OK,state_type,temp_entry->timestamp,plugin_output,temp_subject);
02960                                                 else
02961                                                         add_archived_state(AS_NO_DATA,AS_NO_DATA,temp_entry->timestamp,plugin_output,temp_subject);
02962 
02963                                                 break;
02964 
02965                                         /* scheduled service downtime notices */
02966                                         case LOGENTRY_SERVICE_DOWNTIME_STARTED:
02967                                         case LOGENTRY_SERVICE_DOWNTIME_STOPPED:
02968                                         case LOGENTRY_SERVICE_DOWNTIME_CANCELLED:
02969 
02970                                                 /* get host name */
02971                                                 temp_buffer=my_strtok(temp_entry->entry_text,":");
02972                                                 temp_buffer=my_strtok(NULL,";");
02973                                                 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
02974                                                 entry_host_name[sizeof(entry_host_name)-1]='\x0';
02975 
02976                                                 /* get service description */
02977                                                 temp_buffer=my_strtok(NULL,";");
02978                                                 strncpy(entry_service_desc,(temp_buffer==NULL)?"":temp_buffer,sizeof(entry_service_desc));
02979                                                 entry_service_desc[sizeof(entry_service_desc)-1]='\x0';
02980 
02981                                                 /* see if there is a corresponding subject for this service */
02982                                                 temp_subject=find_subject(SERVICE_SUBJECT,entry_host_name,entry_service_desc);
02983                                                 if(temp_subject==NULL)
02984                                                         break;
02985 
02986                                                 if(show_scheduled_downtime==FALSE)
02987                                                         break;
02988 
02989                                                 if(temp_entry->type==LOGENTRY_SERVICE_DOWNTIME_STARTED)
02990                                                         add_scheduled_downtime(AS_SVC_DOWNTIME_START,temp_entry->timestamp,temp_subject);
02991                                                 else
02992                                                         add_scheduled_downtime(AS_SVC_DOWNTIME_END,temp_entry->timestamp,temp_subject);
02993 
02994                                                 break;
02995                                         
02996                                         /* scheduled host downtime notices */
02997                                         case LOGENTRY_HOST_DOWNTIME_STARTED:
02998                                         case LOGENTRY_HOST_DOWNTIME_STOPPED:
02999                                         case LOGENTRY_HOST_DOWNTIME_CANCELLED:
03000 
03001                                                 /* get host name */
03002                                                 temp_buffer=my_strtok(temp_entry->entry_text,":");
03003                                                 temp_buffer=my_strtok(NULL,";");
03004                                                 strncpy(entry_host_name,(temp_buffer==NULL)?"":temp_buffer+1,sizeof(entry_host_name));
03005                                                 entry_host_name[sizeof(entry_host_name)-1]='\x0';
03006 
03007                                                 /* this host downtime entry must be added to all service subjects associated with the host! */
03008                                                 for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
03009 
03010                                                         if(temp_subject->type!=SERVICE_SUBJECT)
03011                                                                 break;
03012 
03013                                                         if(strcmp(temp_subject->host_name,entry_host_name))
03014                                                                 break;
03015 
03016                                                         if(show_scheduled_downtime==FALSE)
03017                                                                 break;
03018 
03019                                                         if(temp_entry->type==LOGENTRY_HOST_DOWNTIME_STARTED)
03020                                                                 add_scheduled_downtime(AS_HOST_DOWNTIME_START,temp_entry->timestamp,temp_subject);
03021                                                         else
03022                                                                 add_scheduled_downtime(AS_HOST_DOWNTIME_END,temp_entry->timestamp,temp_subject);
03023                                                 }
03024 
03025                                                 break;
03026                                 }
03027                         }
03028                 }
03029         }
03030 
03031         free_log_entries();
03032 
03033         return;
03034 }
03035 
03036 
03037 void compute_report_times(void){
03038         time_t current_time;
03039         struct tm *st;
03040         struct tm *et;
03041 
03042         /* get the current time */
03043         time(&current_time);
03044 
03045         st=localtime(&current_time);
03046 
03047         st->tm_sec=start_second;
03048         st->tm_min=start_minute;
03049         st->tm_hour=start_hour;
03050         st->tm_mday=start_day;
03051         st->tm_mon=start_month-1;
03052         st->tm_year=start_year-1900;
03053         st->tm_isdst=-1;
03054 
03055         t1=mktime(st);
03056 
03057         et=localtime(&current_time);
03058 
03059         et->tm_sec=end_second;
03060         et->tm_min=end_minute;
03061         et->tm_hour=end_hour;
03062         et->tm_mday=end_day;
03063         et->tm_mon=end_month-1;
03064         et->tm_year=end_year-1900;
03065         et->tm_isdst=-1;
03066 
03067         t2=mktime(et);
03068 }
03069 
03070 
03071 /* writes log entries to screen */
03072 void write_log_entries(avail_subject *subject){
03073         archived_state *temp_as;
03074         archived_state *temp_sd;
03075         time_t current_time;
03076         char start_date_time[MAX_DATETIME_LENGTH];
03077         char end_date_time[MAX_DATETIME_LENGTH];
03078         char duration[20];
03079         char *bgclass="";
03080         char *ebgclass="";
03081         char *entry_type="";
03082         char *state_type="";
03083         int days;
03084         int hours;
03085         int minutes;
03086         int seconds;
03087         int odd=0;
03088 
03089 
03090         if(content_type!=HTML_CONTENT)
03091                 return;
03092 
03093         if(show_log_entries==FALSE)
03094                 return;
03095 
03096         if(subject==NULL)
03097                 return;
03098 
03099         time(&current_time);
03100 
03101         /* inject all scheduled downtime entries into the main list for display purposes */
03102         for(temp_sd=subject->sd_list;temp_sd!=NULL;temp_sd=temp_sd->next){
03103                 switch(temp_sd->entry_type){
03104                 case AS_SVC_DOWNTIME_START:
03105                 case AS_HOST_DOWNTIME_START:
03106                         entry_type="Start of scheduled downtime";
03107                         break;
03108                 case AS_SVC_DOWNTIME_END:
03109                 case AS_HOST_DOWNTIME_END:
03110                         entry_type="End of scheduled downtime";
03111                         break;
03112                 default:
03113                         entry_type="?";
03114                         break;
03115                         }
03116                 add_archived_state(temp_sd->entry_type,AS_NO_DATA,temp_sd->time_stamp,entry_type,subject);
03117                 }
03118 
03119 
03120         printf("<BR><BR>\n");
03121 
03122         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>%s Log Entries:</DIV>\n",(subject->type==HOST_SUBJECT)?"Host":"Service");
03123 
03124         printf("<DIV ALIGN=CENTER CLASS='infoMessage'>");
03125         if(full_log_entries==TRUE){
03126                 full_log_entries=FALSE;
03127                 if(subject->type==HOST_SUBJECT)
03128                         host_report_url(subject->host_name,"[ View condensed log entries ]");
03129                 else
03130                         service_report_url(subject->host_name,subject->service_description,"[ View condensed log entries ]");
03131                 full_log_entries=TRUE;
03132                 }
03133         else{
03134                 full_log_entries=TRUE;
03135                 if(subject->type==HOST_SUBJECT)
03136                         host_report_url(subject->host_name,"[ View full log entries ]");
03137                 else
03138                         service_report_url(subject->host_name,subject->service_description,"[ View full log entries ]");
03139                 full_log_entries=FALSE;
03140                 }
03141         printf("</DIV>\n");
03142 
03143         printf("<DIV ALIGN=CENTER>\n");
03144 
03145         printf("<table border=1 cellspacing=0 cellpadding=3 class='logEntries'>\n");
03146         printf("<tr><th class='logEntries'>Event Start Time</th><th class='logEntries'>Event End Time</th><th class='logEntries'>Event Duration</th><th class='logEntries'>Event/State Type</th><th class='logEntries'>Event/State Information</th></tr>\n");
03147 
03148         /* write all archived state entries */
03149         for(temp_as=subject->as_list;temp_as!=NULL;temp_as=temp_as->next){
03150 
03151                 if(temp_as->state_type==AS_HARD_STATE)
03152                         state_type=" (HARD)";
03153                 else if(temp_as->state_type==AS_SOFT_STATE)
03154                         state_type=" (SOFT)";
03155                 else
03156                         state_type="";
03157 
03158                 switch(temp_as->entry_type){
03159                 case AS_NO_DATA:
03160                         if(full_log_entries==FALSE)
03161                                 continue;
03162                         entry_type="NO DATA";
03163                         ebgclass="INDETERMINATE";
03164                         break;
03165                 case AS_PROGRAM_END:
03166                         if(full_log_entries==FALSE)
03167                                 continue;
03168                         entry_type="PROGRAM END";
03169                         ebgclass="INDETERMINATE";
03170                         break;
03171                 case AS_PROGRAM_START:
03172                         if(full_log_entries==FALSE)
03173                                 continue;
03174                         entry_type="PROGRAM (RE)START";
03175                         ebgclass="INDETERMINATE";
03176                         break;
03177                 case AS_HOST_UP:
03178                         entry_type="HOST UP";
03179                         ebgclass="UP";
03180                         break;
03181                 case AS_HOST_DOWN:
03182                         entry_type="HOST DOWN";
03183                         ebgclass="DOWN";
03184                         break;
03185                 case AS_HOST_UNREACHABLE:
03186                         entry_type="HOST UNREACHABLE";
03187                         ebgclass="UNREACHABLE";
03188                         break;
03189                 case AS_SVC_OK:
03190                         entry_type="SERVICE OK";
03191                         ebgclass="OK";
03192                         break;
03193                 case AS_SVC_UNKNOWN:
03194                         entry_type="SERVICE UNKNOWN";
03195                         ebgclass="UNKNOWN";
03196                         break;
03197                 case AS_SVC_WARNING:
03198                         entry_type="SERVICE WARNING";
03199                         ebgclass="WARNING";
03200                         break;
03201                 case AS_SVC_CRITICAL:
03202                         entry_type="SERVICE CRITICAL";
03203                         ebgclass="CRITICAL";
03204                         break;
03205                 case AS_SVC_DOWNTIME_START:
03206                         entry_type="SERVICE DOWNTIME START";
03207                         ebgclass="INDETERMINATE";
03208                         break;
03209                 case AS_SVC_DOWNTIME_END:
03210                         entry_type="SERVICE DOWNTIME END";
03211                         ebgclass="INDETERMINATE";
03212                         break;
03213                 case AS_HOST_DOWNTIME_START:
03214                         entry_type="HOST DOWNTIME START";
03215                         ebgclass="INDETERMINATE";
03216                         break;
03217                 case AS_HOST_DOWNTIME_END:
03218                         entry_type="HOST DOWNTIME END";
03219                         ebgclass="INDETERMINATE";
03220                         break;
03221                 default:
03222                         if(full_log_entries==FALSE)
03223                                 continue;
03224                         entry_type="?";
03225                         ebgclass="INDETERMINATE";
03226                         }
03227 
03228                 get_time_string(&(temp_as->time_stamp),start_date_time,sizeof(start_date_time)-1,SHORT_DATE_TIME);
03229                 if(temp_as->next==NULL){
03230                         get_time_string(&t2,end_date_time,sizeof(end_date_time)-1,SHORT_DATE_TIME);
03231                         get_time_breakdown((time_t)(t2-temp_as->time_stamp),&days,&hours,&minutes,&seconds);
03232                         snprintf(duration,sizeof(duration)-1,"%dd %dh %dm %ds+",days,hours,minutes,seconds);
03233                         }
03234                 else{
03235                         get_time_string(&(temp_as->next->time_stamp),end_date_time,sizeof(end_date_time)-1,SHORT_DATE_TIME);
03236                         get_time_breakdown((time_t)(temp_as->next->time_stamp-temp_as->time_stamp),&days,&hours,&minutes,&seconds);
03237                         snprintf(duration,sizeof(duration)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
03238                         }
03239 
03240                 if(odd){
03241                         bgclass="Odd";
03242                         odd=0;
03243                         }
03244                 else{
03245                         bgclass="Even";
03246                         odd=1;
03247                         }
03248 
03249                 printf("<tr class='logEntries%s'>",bgclass);
03250                 printf("<td class='logEntries%s'>%s</td>",bgclass,start_date_time);
03251                 printf("<td class='logEntries%s'>%s</td>",bgclass,end_date_time);
03252                 printf("<td class='logEntries%s'>%s</td>",bgclass,duration);
03253                 printf("<td class='logEntries%s'>%s%s</td>",ebgclass,entry_type,state_type);
03254                 printf("<td class='logEntries%s'>%s</td>",bgclass,(temp_as->state_info==NULL)?"":html_encode(temp_as->state_info,FALSE));
03255                 printf("</tr>\n");
03256                 }
03257 
03258         printf("</table>\n");
03259 
03260         printf("</DIV>\n");
03261 
03262         return;
03263 }
03264 
03265 
03266 
03267 /* display hostgroup availability */
03268 void display_hostgroup_availability(void){
03269         hostgroup *temp_hostgroup;
03270 
03271         /* display data for a specific hostgroup */
03272         if(show_all_hostgroups==FALSE){
03273                 temp_hostgroup=find_hostgroup(hostgroup_name);
03274                 display_specific_hostgroup_availability(temp_hostgroup);
03275                 }
03276 
03277         /* display data for all hostgroups */
03278         else{
03279                 for(temp_hostgroup=hostgroup_list;temp_hostgroup!=NULL;temp_hostgroup=temp_hostgroup->next)
03280                         display_specific_hostgroup_availability(temp_hostgroup);
03281                 }
03282 
03283         return;
03284 }
03285 
03286 
03287 /* display availability for a specific hostgroup */
03288 void display_specific_hostgroup_availability(hostgroup *hg){
03289         unsigned long total_time;
03290         unsigned long time_determinate;
03291         unsigned long time_indeterminate;
03292         avail_subject *temp_subject;
03293         host *temp_host;
03294         char *header[34];
03295         double percent_time_indeterminate=0.0;
03296         double percent_time_up=0.0;
03297         double percent_time_down=0.0;
03298         double percent_time_unreachable=0.0;
03299         double percent_time_up_known=0.0;
03300         double percent_time_down_known=0.0;
03301         double percent_time_unreachable_known=0.0;
03302 
03303         double percent_time_up_scheduled=0.0;
03304         double percent_time_up_unscheduled=0.0;
03305         double percent_time_down_scheduled=0.0;
03306         double percent_time_down_unscheduled=0.0;
03307         double percent_time_unreachable_scheduled=0.0;
03308         double percent_time_unreachable_unscheduled=0.0;
03309         double percent_time_up_scheduled_known=0.0;
03310         double percent_time_up_unscheduled_known=0.0;
03311         double percent_time_down_scheduled_known=0.0;
03312         double percent_time_down_unscheduled_known=0.0;
03313         double percent_time_unreachable_scheduled_known=0.0;
03314         double percent_time_unreachable_unscheduled_known=0.0;
03315 
03316         double percent_time_indeterminate_notrunning=0.0;
03317         double percent_time_indeterminate_nodata=0.0;
03318 
03319         double average_percent_time_up=0.0;
03320         double average_percent_time_up_known=0.0;
03321         double average_percent_time_down=0.0;
03322         double average_percent_time_down_known=0.0;
03323         double average_percent_time_unreachable=0.0;
03324         double average_percent_time_unreachable_known=0.0;
03325         double average_percent_time_indeterminate=0.0;
03326 
03327         int current_subject=0;
03328         int i=0, j=0;
03329         char *bgclass="";
03330         int odd=1;
03331         int json_start=TRUE;
03332         char lower_header[34][100];
03333         int len=0;
03334 
03335         if(hg==NULL)
03336                 return;
03337 
03338         /* the user isn't authorized to view this hostgroup */
03339         if(is_authorized_for_hostgroup(hg,&current_authdata)==FALSE)
03340                 return;
03341 
03342         /* calculate total time during period based on timeperiod used for reporting */
03343         total_time=calculate_total_time(t1,t2);
03344 
03345         header[0] = "HOST_NAME";
03346         header[1] = "TIME_UP_SCHEDULED";
03347         header[2] = "PERCENT_TIME_UP_SCHEDULED";
03348         header[3] = "PERCENT_KNOWN_TIME_UP_SCHEDULED";
03349         header[4] = "TIME_UP_UNSCHEDULED";
03350         header[5] = "PERCENT_TIME_UP_UNSCHEDULED";
03351         header[6] = "PERCENT_KNOWN_TIME_UP_UNSCHEDULED";
03352         header[7] = "TOTAL_TIME_UP";
03353         header[8] = "PERCENT_TOTAL_TIME_UP";
03354         header[9] = "PERCENT_KNOWN_TIME_UP";
03355         header[10] = "TIME_DOWN_SCHEDULED";
03356         header[11] = "PERCENT_TIME_DOWN_SCHEDULED";
03357         header[12] = "PERCENT_KNOWN_TIME_DOWN_SCHEDULED";
03358         header[13] = "TIME_DOWN_UNSCHEDULED";
03359         header[14] = "PERCENT_TIME_DOWN_UNSCHEDULED";
03360         header[15] = "PERCENT_KNOWN_TIME_DOWN_UNSCHEDULED";
03361         header[16] = "TOTAL_TIME_DOWN";
03362         header[17] = "PERCENT_TOTAL_TIME_DOWN";
03363         header[18] = "PERCENT_KNOWN_TIME_DOWN";
03364         header[19] = "TIME_UNREACHABLE_SCHEDULED";
03365         header[20] = "PERCENT_TIME_UNREACHABLE_SCHEDULED";
03366         header[21] = "PERCENT_KNOWN_TIME_UNREACHABLE_SCHEDULED";
03367         header[22] = "TIME_UNREACHABLE_UNSCHEDULED";
03368         header[23] = "PERCENT_TIME_UNREACHABLE_UNSCHEDULED";
03369         header[24] = "PERCENT_KNOWN_TIME_UNREACHABLE_UNSCHEDULED";
03370         header[25] = "TOTAL_TIME_UNREACHABLE";
03371         header[26] = "PERCENT_TOTAL_TIME_UNREACHABLE";
03372         header[27] = "PERCENT_KNOWN_TIME_UNREACHABLE";
03373         header[28] = "TIME_UNDETERMINED_NOT_RUNNING";
03374         header[29] = "PERCENT_TIME_UNDETERMINED_NOT_RUNNING";
03375         header[30] = "TIME_UNDETERMINED_NO_DATA";
03376         header[31] = "PERCENT_TIME_UNDETERMINED_NO_DATA";
03377         header[32] = "TOTAL_TIME_UNDETERMINED";
03378         header[33] = "PERCENT_TOTAL_TIME_UNDETERMINED";
03379 
03380         if(content_type==HTML_CONTENT){
03381                 printf("<BR><BR>\n");
03382                 printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Hostgroup '%s' Host State Breakdowns:</DIV>\n",hg->group_name);
03383 
03384                 printf("<DIV ALIGN=CENTER>\n");
03385                 printf("<TABLE BORDER=0 CLASS='data'>\n");
03386                 printf("<TR><TH CLASS='data'>Host</TH><TH CLASS='data'>%% Time Up</TH><TH CLASS='data'>%% Time Down</TH><TH CLASS='data'>%% Time Unreachable</TH><TH CLASS='data'>%% Time Undetermined</TH></TR>\n");
03387         } else if(content_type==JSON_CONTENT){
03388                 printf("%s\"hostgroup\": \"%s\",\n",(json_list_start==FALSE)?",":"",json_encode(hg->group_name));
03389                 printf("\"host_state_breakdowns\": [\n");
03390                 json_list_start=FALSE;
03391 
03392                 /* converting to lower case */
03393                 for(i=0;i<34;i++) {
03394                         len=(int)strlen(header[i]);
03395                         for(j=0;j<len;j++) {
03396                                 if (header[i][j]=='_')
03397                                         lower_header[i][j]=header[i][j];
03398                                 else
03399                                         lower_header[i][j]=header[i][j]+32;
03400                         }
03401                         lower_header[i][len]='\x0';
03402                 }
03403 
03404         } else if(content_type==CSV_CONTENT){
03405                 printf("%sHOSTGROUP %s HOST_STATE_BREAKDOWNS%s%s\n",csv_data_enclosure,hg->group_name,csv_data_enclosure,csv_delimiter);
03406 
03407                 for(i=0;i<34;i++)
03408                         printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
03409 
03410                 printf("\n");
03411         }
03412 
03413         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
03414 
03415                 if(temp_subject->type!=HOST_SUBJECT)
03416                         continue;
03417 
03418                 temp_host=find_host(temp_subject->host_name);
03419                 if(temp_host==NULL)
03420                         continue;
03421 
03422                 if(is_host_member_of_hostgroup(hg,temp_host)==FALSE)
03423                         continue;
03424 
03425                 current_subject++;
03426 
03427                 /* reset variables */
03428                 percent_time_up=0.0;
03429                 percent_time_down=0.0;
03430                 percent_time_unreachable=0.0;
03431                 percent_time_indeterminate=0.0;
03432                 percent_time_up_known=0.0;
03433                 percent_time_down_known=0.0;
03434                 percent_time_unreachable_known=0.0;
03435 
03436                 time_determinate=temp_subject->time_up+temp_subject->time_down+temp_subject->time_unreachable;
03437                 time_indeterminate=total_time-time_determinate;
03438 
03439                 if(total_time>0){
03440                         percent_time_up=(double)(((double)temp_subject->time_up*100.0)/(double)total_time);
03441                         percent_time_down=(double)(((double)temp_subject->time_down*100.0)/(double)total_time);
03442                         percent_time_unreachable=(double)(((double)temp_subject->time_unreachable*100.0)/(double)total_time);
03443                         percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
03444                         if(time_determinate>0){
03445                                 percent_time_up_known=(double)(((double)temp_subject->time_up*100.0)/(double)time_determinate);
03446                                 percent_time_down_known=(double)(((double)temp_subject->time_down*100.0)/(double)time_determinate);
03447                                 percent_time_unreachable_known=(double)(((double)temp_subject->time_unreachable*100.0)/(double)time_determinate);
03448                                 }
03449                         }
03450 
03451                 if(odd){
03452                         odd=0;
03453                         bgclass="Odd";
03454                         }
03455                 else{
03456                         odd=1;
03457                         bgclass="Even";
03458                         }
03459 
03460                 if(content_type==HTML_CONTENT){
03461 
03462                         printf("<tr CLASS='data%s'><td CLASS='data%s'>",bgclass,bgclass);
03463                         host_report_url(temp_subject->host_name,temp_subject->host_name);
03464                         printf("</td><td CLASS='hostUP'>%2.3f%% (%2.3f%%)</td><td CLASS='hostDOWN'>%2.3f%% (%2.3f%%)</td><td CLASS='hostUNREACHABLE'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",percent_time_up,percent_time_up_known,percent_time_down,percent_time_down_known,percent_time_unreachable,percent_time_unreachable_known,bgclass,percent_time_indeterminate);
03465 
03466                 } else if(content_type==JSON_CONTENT){
03467                         if (json_start!=TRUE)
03468                                 printf(",\n");
03469 
03470                         /* host name */
03471                         printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
03472 
03473                         /* up times */
03474                         printf(" \"%s\": %lu, ",lower_header[1],temp_subject->scheduled_time_up);
03475                         printf(" \"%s\": %2.3f, ",lower_header[2],percent_time_up_scheduled);
03476                         printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_up_scheduled_known);
03477                         printf(" \"%s\": %lu, ",lower_header[4],temp_subject->time_up-temp_subject->scheduled_time_up);
03478                         printf(" \"%s\": %2.3f, ",lower_header[5],percent_time_up_unscheduled);
03479                         printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_up_unscheduled_known);
03480                         printf(" \"%s\": %lu, ",lower_header[7],temp_subject->time_up);
03481                         printf(" \"%s\": %2.3f, ",lower_header[8],percent_time_up);
03482                         printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_up_known);
03483 
03484                         /* down times */
03485                         printf(" \"%s\": %lu, ",lower_header[10],temp_subject->scheduled_time_down);
03486                         printf(" \"%s\": %2.3f, ",lower_header[11],percent_time_down_scheduled);
03487                         printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_down_scheduled_known);
03488                         printf(" \"%s\": %lu, ",lower_header[13],temp_subject->time_down-temp_subject->scheduled_time_down);
03489                         printf(" \"%s\": %2.3f, ",lower_header[14],percent_time_down_unscheduled);
03490                         printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_down_unscheduled_known);
03491                         printf(" \"%s\": %lu, ",lower_header[16],temp_subject->time_down);
03492                         printf(" \"%s\": %2.3f, ",lower_header[17],percent_time_down);
03493                         printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_down_known);
03494 
03495                         /* unreachable times */
03496                         printf(" \"%s\": %lu, ",lower_header[19],temp_subject->scheduled_time_unreachable);
03497                         printf(" \"%s\": %2.3f, ",lower_header[20],percent_time_unreachable_scheduled);
03498                         printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unreachable_scheduled_known);
03499                         printf(" \"%s\": %lu, ",lower_header[22],temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable);
03500                         printf(" \"%s\": %2.3f, ",lower_header[23],percent_time_unreachable_unscheduled);
03501                         printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unreachable_unscheduled_known);
03502                         printf(" \"%s\": %lu, ",lower_header[25],temp_subject->time_unreachable);
03503                         printf(" \"%s\": %2.3f, ",lower_header[26],percent_time_unreachable);
03504                         printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unreachable_known);
03505 
03506                         /* indeterminate times */
03507                         printf(" \"%s\": %lu, ",lower_header[28],temp_subject->time_indeterminate_notrunning);
03508                         printf(" \"%s\": %2.3f, ",lower_header[29],percent_time_indeterminate_notrunning);
03509                         printf(" \"%s\": %lu, ",lower_header[30],temp_subject->time_indeterminate_nodata);
03510                         printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_indeterminate_nodata);
03511                         printf(" \"%s\": %lu, ",lower_header[32],time_indeterminate);
03512                         printf(" \"%s\": %2.3f} ",lower_header[33],percent_time_indeterminate);
03513 
03514                         json_start=FALSE;
03515 
03516                 } else if(content_type==CSV_CONTENT){
03517 
03518                         /* host name */
03519                         printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
03520 
03521                         /* up times */
03522                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
03523                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled,csv_data_enclosure,csv_delimiter);
03524                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled_known,csv_data_enclosure,csv_delimiter);
03525                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up-temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
03526                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled,csv_data_enclosure,csv_delimiter);
03527                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled_known,csv_data_enclosure,csv_delimiter);
03528                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up,csv_data_enclosure,csv_delimiter);
03529                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up,csv_data_enclosure,csv_delimiter);
03530                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_known,csv_data_enclosure,csv_delimiter);
03531 
03532                         /* down times */
03533                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
03534                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled,csv_data_enclosure,csv_delimiter);
03535                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled_known,csv_data_enclosure,csv_delimiter);
03536                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down-temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
03537                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled,csv_data_enclosure,csv_delimiter);
03538                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled_known,csv_data_enclosure,csv_delimiter);
03539                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down,csv_data_enclosure,csv_delimiter);
03540                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down,csv_data_enclosure,csv_delimiter);
03541                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_known,csv_data_enclosure,csv_delimiter);
03542 
03543                         /* unreachable times */
03544                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
03545                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled,csv_data_enclosure,csv_delimiter);
03546                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled_known,csv_data_enclosure,csv_delimiter);
03547                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
03548                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled,csv_data_enclosure,csv_delimiter);
03549                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled_known,csv_data_enclosure,csv_delimiter);
03550                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable,csv_data_enclosure,csv_delimiter);
03551                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable,csv_data_enclosure,csv_delimiter);
03552                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_known,csv_data_enclosure,csv_delimiter);
03553 
03554                         /* indeterminate times */
03555                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
03556                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
03557                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
03558                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
03559                         printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
03560                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
03561 
03562                         printf("\n");
03563                 }
03564 
03565                 get_running_average(&average_percent_time_up,percent_time_up,current_subject);
03566                 get_running_average(&average_percent_time_up_known,percent_time_up_known,current_subject);
03567                 get_running_average(&average_percent_time_down,percent_time_down,current_subject);
03568                 get_running_average(&average_percent_time_down_known,percent_time_down_known,current_subject);
03569                 get_running_average(&average_percent_time_unreachable,percent_time_unreachable,current_subject);
03570                 get_running_average(&average_percent_time_unreachable_known,percent_time_unreachable_known,current_subject);
03571                 get_running_average(&average_percent_time_indeterminate,percent_time_indeterminate,current_subject);
03572         }
03573 
03574 
03575         /* average statistics */
03576         if(odd){
03577                 odd=0;
03578                 bgclass="Odd";
03579         }else{
03580                 odd=1;
03581                 bgclass="Even";
03582         }
03583 
03584         if(content_type==HTML_CONTENT){
03585                 printf("<tr CLASS='data%s'><td CLASS='data%s'>Average</td><td CLASS='hostUP'>%2.3f%% (%2.3f%%)</td><td CLASS='hostDOWN'>%2.3f%% (%2.3f%%)</td><td CLASS='hostUNREACHABLE'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>",bgclass,bgclass,average_percent_time_up,average_percent_time_up_known,average_percent_time_down,average_percent_time_down_known,average_percent_time_unreachable,average_percent_time_unreachable_known,bgclass,average_percent_time_indeterminate);
03586 
03587                 printf("</table>\n");
03588                 printf("</DIV>\n");
03589         }else if (content_type==JSON_CONTENT){
03590                 printf(", { \"average_percent_time_up\": %2.3f, ",average_percent_time_up);
03591                 printf("\"average_percent_time_up_known\": %2.3f, ",average_percent_time_up_known);
03592                 printf("\"average_percent_time_down\": %2.3f, ",average_percent_time_down);
03593                 printf("\"average_percent_time_down_known\": %2.3f, ",average_percent_time_down_known);
03594                 printf("\"average_percent_time_unreachable\": %2.3f, ",average_percent_time_unreachable);
03595                 printf("\"average_percent_time_unreachable_known\": %2.3f, ",average_percent_time_unreachable_known);
03596                 printf("\"average_percent_time_indeterminate\": %2.3f }",average_percent_time_indeterminate);
03597                 printf(" ]\n");
03598         } else if(content_type==CSV_CONTENT){
03599                 /* average */
03600                 /* left for future rework */
03601         }
03602 
03603         return;
03604 }
03605 
03606 
03607 /* display servicegroup availability */
03608 void display_servicegroup_availability(void){
03609         servicegroup *temp_servicegroup;
03610 
03611         /* display data for a specific servicegroup */
03612         if(show_all_servicegroups==FALSE){
03613                 temp_servicegroup=find_servicegroup(servicegroup_name);
03614                 display_specific_servicegroup_availability(temp_servicegroup);
03615                 }
03616 
03617         /* display data for all servicegroups */
03618         else{
03619                 for(temp_servicegroup=servicegroup_list;temp_servicegroup!=NULL;temp_servicegroup=temp_servicegroup->next)
03620                         display_specific_servicegroup_availability(temp_servicegroup);
03621                 }
03622 
03623         return;
03624 }
03625 
03626 
03627 
03628 /* display availability for a specific servicegroup */
03629 void display_specific_servicegroup_availability(servicegroup *sg){
03630         unsigned long total_time;
03631         unsigned long time_determinate;
03632         unsigned long time_indeterminate;
03633         avail_subject *temp_subject;
03634         service *temp_service;
03635         host *temp_host;
03636         double percent_time_ok=0.0;
03637         double percent_time_warning=0.0;
03638         double percent_time_unknown=0.0;
03639         double percent_time_critical=0.0;
03640         double percent_time_indeterminate=0.0;
03641         double percent_time_ok_known=0.0;
03642         double percent_time_warning_known=0.0;
03643         double percent_time_unknown_known=0.0;
03644         double percent_time_critical_known=0.0;
03645 
03646         double percent_time_critical_scheduled=0.0;
03647         double percent_time_critical_unscheduled=0.0;
03648         double percent_time_critical_scheduled_known=0.0;
03649         double percent_time_critical_unscheduled_known=0.0;
03650         double percent_time_unknown_scheduled=0.0;
03651         double percent_time_unknown_unscheduled=0.0;
03652         double percent_time_unknown_scheduled_known=0.0;
03653         double percent_time_unknown_unscheduled_known=0.0;
03654         double percent_time_warning_scheduled=0.0;
03655         double percent_time_warning_unscheduled=0.0;
03656         double percent_time_warning_scheduled_known=0.0;
03657         double percent_time_warning_unscheduled_known=0.0;
03658         double percent_time_ok_scheduled=0.0;
03659         double percent_time_ok_unscheduled=0.0;
03660         double percent_time_ok_scheduled_known=0.0;
03661         double percent_time_ok_unscheduled_known=0.0;
03662 
03663         double percent_time_up=0.0;
03664         double percent_time_down=0.0;
03665         double percent_time_unreachable=0.0;
03666         double percent_time_up_known=0.0;
03667         double percent_time_down_known=0.0;
03668         double percent_time_unreachable_known=0.0;
03669         double percent_time_up_scheduled=0.0;
03670         double percent_time_up_unscheduled=0.0;
03671         double percent_time_down_scheduled=0.0;
03672         double percent_time_down_unscheduled=0.0;
03673         double percent_time_unreachable_scheduled=0.0;
03674         double percent_time_unreachable_unscheduled=0.0;
03675         double percent_time_up_scheduled_known=0.0;
03676         double percent_time_up_unscheduled_known=0.0;
03677         double percent_time_down_scheduled_known=0.0;
03678         double percent_time_down_unscheduled_known=0.0;
03679         double percent_time_unreachable_scheduled_known=0.0;
03680         double percent_time_unreachable_unscheduled_known=0.0;
03681 
03682         double average_percent_time_up=0.0;
03683         double average_percent_time_up_known=0.0;
03684         double average_percent_time_down=0.0;
03685         double average_percent_time_down_known=0.0;
03686         double average_percent_time_unreachable=0.0;
03687         double average_percent_time_unreachable_known=0.0;
03688 
03689         double average_percent_time_ok=0.0;
03690         double average_percent_time_ok_known=0.0;
03691         double average_percent_time_unknown=0.0;
03692         double average_percent_time_unknown_known=0.0;
03693         double average_percent_time_warning=0.0;
03694         double average_percent_time_warning_known=0.0;
03695         double average_percent_time_critical=0.0;
03696         double average_percent_time_critical_known=0.0;
03697         double average_percent_time_indeterminate=0.0;
03698 
03699         int current_subject=0;
03700 
03701         double percent_time_indeterminate_notrunning=0.0;
03702         double percent_time_indeterminate_nodata=0.0;
03703 
03704         int odd=1;
03705         int i=0, j=0;
03706         char *bgclass="";
03707         char last_host[128]="";
03708         char *header[44];
03709         int json_start=TRUE;
03710         char lower_header[44][100];
03711         int len=0;
03712 
03713         if(sg==NULL)
03714                 return;
03715 
03716         /* the user isn't authorized to view this servicegroup */
03717         if(is_authorized_for_servicegroup(sg,&current_authdata)==FALSE)
03718                 return;
03719 
03720         /* calculate total time during period based on timeperiod used for reporting */
03721         total_time=calculate_total_time(t1,t2);
03722 
03723         header[0] = "HOST_NAME";
03724         header[1] = "TIME_UP_SCHEDULED";
03725         header[2] = "PERCENT_TIME_UP_SCHEDULED";
03726         header[3] = "PERCENT_KNOWN_TIME_UP_SCHEDULED";
03727         header[4] = "TIME_UP_UNSCHEDULED";
03728         header[5] = "PERCENT_TIME_UP_UNSCHEDULED";
03729         header[6] = "PERCENT_KNOWN_TIME_UP_UNSCHEDULED";
03730         header[7] = "TOTAL_TIME_UP";
03731         header[8] = "PERCENT_TOTAL_TIME_UP";
03732         header[9] = "PERCENT_KNOWN_TIME_UP";
03733         header[10] = "TIME_DOWN_SCHEDULED";
03734         header[11] = "PERCENT_TIME_DOWN_SCHEDULED";
03735         header[12] = "PERCENT_KNOWN_TIME_DOWN_SCHEDULED";
03736         header[13] = "TIME_DOWN_UNSCHEDULED";
03737         header[14] = "PERCENT_TIME_DOWN_UNSCHEDULED";
03738         header[15] = "PERCENT_KNOWN_TIME_DOWN_UNSCHEDULED";
03739         header[16] = "TOTAL_TIME_DOWN";
03740         header[17] = "PERCENT_TOTAL_TIME_DOWN";
03741         header[18] = "PERCENT_KNOWN_TIME_DOWN";
03742         header[19] = "TIME_UNREACHABLE_SCHEDULED";
03743         header[20] = "PERCENT_TIME_UNREACHABLE_SCHEDULED";
03744         header[21] = "PERCENT_KNOWN_TIME_UNREACHABLE_SCHEDULED";
03745         header[22] = "TIME_UNREACHABLE_UNSCHEDULED";
03746         header[23] = "PERCENT_TIME_UNREACHABLE_UNSCHEDULED";
03747         header[24] = "PERCENT_KNOWN_TIME_UNREACHABLE_UNSCHEDULED";
03748         header[25] = "TOTAL_TIME_UNREACHABLE";
03749         header[26] = "PERCENT_TOTAL_TIME_UNREACHABLE";
03750         header[27] = "PERCENT_KNOWN_TIME_UNREACHABLE";
03751         header[28] = "TIME_UNDETERMINED_NOT_RUNNING";
03752         header[29] = "PERCENT_TIME_UNDETERMINED_NOT_RUNNING";
03753         header[30] = "TIME_UNDETERMINED_NO_DATA";
03754         header[31] = "PERCENT_TIME_UNDETERMINED_NO_DATA";
03755         header[32] = "TOTAL_TIME_UNDETERMINED";
03756         header[33] = "PERCENT_TOTAL_TIME_UNDETERMINED";
03757 
03758         if(content_type==HTML_CONTENT){
03759                 printf("<BR><BR>\n");
03760                 printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Servicegroup '%s' Host State Breakdowns:</DIV>\n",sg->group_name);
03761 
03762                 printf("<DIV ALIGN=CENTER>\n");
03763                 printf("<TABLE BORDER=0 CLASS='data'>\n");
03764                 printf("<TR><TH CLASS='data'>Host</TH><TH CLASS='data'>%% Time Up</TH><TH CLASS='data'>%% Time Down</TH><TH CLASS='data'>%% Time Unreachable</TH><TH CLASS='data'>%% Time Undetermined</TH></TR>\n");
03765         } else if(content_type==JSON_CONTENT){
03766                 printf("%s\"servicegroup\": \"%s\",\n",(json_list_start==FALSE)?",":"",json_encode(sg->group_name));
03767                 printf("\"host_state_breakdowns\": [\n");
03768                 json_list_start=FALSE;
03769 
03770                 /* converting to lower case */
03771                 for(i=0;i<34;i++) {
03772                         len=(int)strlen(header[i]);
03773                         for(j=0;j<len;j++) {
03774                                 if (header[i][j]=='_')
03775                                         lower_header[i][j]=header[i][j];
03776                                 else
03777                                         lower_header[i][j]=header[i][j]+32;
03778                         }
03779                         lower_header[i][len]='\x0';
03780                 }
03781 
03782         } else if(content_type==CSV_CONTENT){
03783                 printf("%sSERVICEGROUP %s HOST_STATE_BREAKDOWNS%s%s\n",csv_data_enclosure,sg->group_name,csv_data_enclosure,csv_delimiter);
03784 
03785 
03786                 for(i=0;i<34;i++)
03787                         printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
03788 
03789                 printf("\n");
03790         }
03791 
03792         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
03793 
03794                 if(temp_subject->type!=HOST_SUBJECT)
03795                         continue;
03796 
03797                 temp_host=find_host(temp_subject->host_name);
03798                 if(temp_host==NULL)
03799                         continue;
03800 
03801                 if(is_host_member_of_servicegroup(sg,temp_host)==FALSE)
03802                         continue;
03803 
03804                 current_subject++;
03805 
03806                 /* reset variables */
03807                 percent_time_up=0.0;
03808                 percent_time_down=0.0;
03809                 percent_time_unreachable=0.0;
03810                 percent_time_indeterminate=0.0;
03811                 percent_time_up_known=0.0;
03812                 percent_time_down_known=0.0;
03813                 percent_time_unreachable_known=0.0;
03814 
03815                 time_determinate=temp_subject->time_up+temp_subject->time_down+temp_subject->time_unreachable;
03816                 time_indeterminate=total_time-time_determinate;
03817 
03818                 if(total_time>0){
03819                         percent_time_up=(double)(((double)temp_subject->time_up*100.0)/(double)total_time);
03820                         percent_time_down=(double)(((double)temp_subject->time_down*100.0)/(double)total_time);
03821                         percent_time_unreachable=(double)(((double)temp_subject->time_unreachable*100.0)/(double)total_time);
03822                         percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
03823                         if(time_determinate>0){
03824                                 percent_time_up_known=(double)(((double)temp_subject->time_up*100.0)/(double)time_determinate);
03825                                 percent_time_down_known=(double)(((double)temp_subject->time_down*100.0)/(double)time_determinate);
03826                                 percent_time_unreachable_known=(double)(((double)temp_subject->time_unreachable*100.0)/(double)time_determinate);
03827                         }
03828                 }
03829 
03830                 if(odd){
03831                         odd=0;
03832                         bgclass="Odd";
03833                 }else{
03834                         odd=1;
03835                         bgclass="Even";
03836                 }
03837 
03838                 if(content_type==HTML_CONTENT){
03839 
03840                         printf("<tr CLASS='data%s'><td CLASS='data%s'>",bgclass,bgclass);
03841                         host_report_url(temp_subject->host_name,temp_subject->host_name);
03842                         printf("</td><td CLASS='hostUP'>%2.3f%% (%2.3f%%)</td><td CLASS='hostDOWN'>%2.3f%% (%2.3f%%)</td><td CLASS='hostUNREACHABLE'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",percent_time_up,percent_time_up_known,percent_time_down,percent_time_down_known,percent_time_unreachable,percent_time_unreachable_known,bgclass,percent_time_indeterminate);
03843 
03844                 } else if(content_type==JSON_CONTENT){
03845                         if (json_start!=TRUE)
03846                                 printf(",\n");
03847 
03848                         /* host name */
03849                         printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
03850 
03851                         /* up times */
03852                         printf(" \"%s\": %lu, ",lower_header[1],temp_subject->scheduled_time_up);
03853                         printf(" \"%s\": %2.3f, ",lower_header[2],percent_time_up_scheduled);
03854                         printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_up_scheduled_known);
03855                         printf(" \"%s\": %lu, ",lower_header[4],temp_subject->time_up-temp_subject->scheduled_time_up);
03856                         printf(" \"%s\": %2.3f, ",lower_header[5],percent_time_up_unscheduled);
03857                         printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_up_unscheduled_known);
03858                         printf(" \"%s\": %lu, ",lower_header[7],temp_subject->time_up);
03859                         printf(" \"%s\": %2.3f, ",lower_header[8],percent_time_up);
03860                         printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_up_known);
03861 
03862                         /* down times */
03863                         printf(" \"%s\": %lu, ",lower_header[10],temp_subject->scheduled_time_down);
03864                         printf(" \"%s\": %2.3f, ",lower_header[11],percent_time_down_scheduled);
03865                         printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_down_scheduled_known);
03866                         printf(" \"%s\": %lu, ",lower_header[13],temp_subject->time_down-temp_subject->scheduled_time_down);
03867                         printf(" \"%s\": %2.3f, ",lower_header[14],percent_time_down_unscheduled);
03868                         printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_down_unscheduled_known);
03869                         printf(" \"%s\": %lu, ",lower_header[16],temp_subject->time_down);
03870                         printf(" \"%s\": %2.3f, ",lower_header[17],percent_time_down);
03871                         printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_down_known);
03872 
03873                         /* unreachable times */
03874                         printf(" \"%s\": %lu, ",lower_header[19],temp_subject->scheduled_time_unreachable);
03875                         printf(" \"%s\": %2.3f, ",lower_header[20],percent_time_unreachable_scheduled);
03876                         printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unreachable_scheduled_known);
03877                         printf(" \"%s\": %lu, ",lower_header[22],temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable);
03878                         printf(" \"%s\": %2.3f, ",lower_header[23],percent_time_unreachable_unscheduled);
03879                         printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unreachable_unscheduled_known);
03880                         printf(" \"%s\": %lu, ",lower_header[25],temp_subject->time_unreachable);
03881                         printf(" \"%s\": %2.3f, ",lower_header[26],percent_time_unreachable);
03882                         printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unreachable_known);
03883 
03884                         /* indeterminate times */
03885                         printf(" \"%s\": %lu, ",lower_header[28],temp_subject->time_indeterminate_notrunning);
03886                         printf(" \"%s\": %2.3f, ",lower_header[29],percent_time_indeterminate_notrunning);
03887                         printf(" \"%s\": %lu, ",lower_header[30],temp_subject->time_indeterminate_nodata);
03888                         printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_indeterminate_nodata);
03889                         printf(" \"%s\": %lu, ",lower_header[32],time_indeterminate);
03890                         printf(" \"%s\": %2.3f} ",lower_header[33],percent_time_indeterminate);
03891 
03892                         json_start=FALSE;
03893 
03894                 } else if(content_type==CSV_CONTENT){
03895 
03896                          /* host name */
03897                          printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
03898 
03899                          /* up times */
03900                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
03901                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled,csv_data_enclosure,csv_delimiter);
03902                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled_known,csv_data_enclosure,csv_delimiter);
03903                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up-temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
03904                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled,csv_data_enclosure,csv_delimiter);
03905                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled_known,csv_data_enclosure,csv_delimiter);
03906                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up,csv_data_enclosure,csv_delimiter);
03907                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up,csv_data_enclosure,csv_delimiter);
03908                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_known,csv_data_enclosure,csv_delimiter);
03909 
03910                          /* down times */
03911                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
03912                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled,csv_data_enclosure,csv_delimiter);
03913                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled_known,csv_data_enclosure,csv_delimiter);
03914                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down-temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
03915                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled,csv_data_enclosure,csv_delimiter);
03916                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled_known,csv_data_enclosure,csv_delimiter);
03917                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down,csv_data_enclosure,csv_delimiter);
03918                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down,csv_data_enclosure,csv_delimiter);
03919                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_known,csv_data_enclosure,csv_delimiter);
03920 
03921                          /* unreachable times */
03922                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
03923                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled,csv_data_enclosure,csv_delimiter);
03924                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled_known,csv_data_enclosure,csv_delimiter);
03925                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
03926                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled,csv_data_enclosure,csv_delimiter);
03927                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled_known,csv_data_enclosure,csv_delimiter);
03928                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable,csv_data_enclosure,csv_delimiter);
03929                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable,csv_data_enclosure,csv_delimiter);
03930                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_known,csv_data_enclosure,csv_delimiter);
03931 
03932                          /* indeterminate times */
03933                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
03934                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
03935                          printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
03936                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
03937                          printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
03938                          printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
03939 
03940                          printf("\n");
03941                 }
03942 
03943                 get_running_average(&average_percent_time_up,percent_time_up,current_subject);
03944                 get_running_average(&average_percent_time_up_known,percent_time_up_known,current_subject);
03945                 get_running_average(&average_percent_time_down,percent_time_down,current_subject);
03946                 get_running_average(&average_percent_time_down_known,percent_time_down_known,current_subject);
03947                 get_running_average(&average_percent_time_unreachable,percent_time_unreachable,current_subject);
03948                 get_running_average(&average_percent_time_unreachable_known,percent_time_unreachable_known,current_subject);
03949                 get_running_average(&average_percent_time_indeterminate,percent_time_indeterminate,current_subject);
03950         }
03951 
03952         /* average statistics */
03953         if(odd){
03954                 odd=0;
03955                 bgclass="Odd";
03956         }else{
03957                 odd=1;
03958                 bgclass="Even";
03959         }
03960 
03961         header[0] = "HOST_NAME";
03962         header[1] = "SERVICE_DESCRIPTION";
03963 
03964         /* ok times */
03965         header[2] = "TIME_OK_SCHEDULED";
03966         header[3] = "PERCENT_TIME_OK_SCHEDULED";
03967         header[4] = "PERCENT_KNOWN_TIME_OK_SCHEDULED";
03968         header[5] = "TIME_OK_UNSCHEDULED";
03969         header[6] = "PERCENT_TIME_OK_UNSCHEDULED";
03970         header[7] = "PERCENT_KNOWN_TIME_OK_UNSCHEDULED";
03971         header[8] = "TOTAL_TIME_OK";
03972         header[9] = "PERCENT_TOTAL_TIME_OK";
03973         header[10] = "PERCENT_KNOWN_TIME_OK";
03974 
03975         /* warning times */
03976         header[11] = "TIME_WARNING_SCHEDULED";
03977         header[12] = "PERCENT_TIME_WARNING_SCHEDULED";
03978         header[13] = "PERCENT_KNOWN_TIME_WARNING_SCHEDULED";
03979         header[14] = "TIME_WARNING_UNSCHEDULED";
03980         header[15] = "PERCENT_TIME_WARNING_UNSCHEDULED";
03981         header[16] = "PERCENT_KNOWN_TIME_WARNING_UNSCHEDULED";
03982         header[17] = "TOTAL_TIME_WARNING";
03983         header[18] = "PERCENT_TOTAL_TIME_WARNING";
03984         header[19] = "PERCENT_KNOWN_TIME_WARNING";
03985 
03986         /* unknown times */
03987         header[20] = "TIME_UNKNOWN_SCHEDULED";
03988         header[21] = "PERCENT_TIME_UNKNOWN_SCHEDULED";
03989         header[22] = "PERCENT_KNOWN_TIME_UNKNOWN_SCHEDULED";
03990         header[23] = "TIME_UNKNOWN_UNSCHEDULED";
03991         header[24] = "PERCENT_TIME_UNKNOWN_UNSCHEDULED";
03992         header[25] = "PERCENT_KNOWN_TIME_UNKNOWN_UNSCHEDULED";
03993         header[26] = "TOTAL_TIME_UNKNOWN";
03994         header[27] = "PERCENT_TOTAL_TIME_UNKNOWN";
03995         header[28] = "PERCENT_KNOWN_TIME_UNKNOWN";
03996 
03997         /* critical times */
03998         header[29] = "TIME_CRITICAL_SCHEDULED";
03999         header[30] = "PERCENT_TIME_CRITICAL_SCHEDULED";
04000         header[31] = "PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED";
04001         header[32] = "TIME_CRITICAL_UNSCHEDULED";
04002         header[33] = "PERCENT_TIME_CRITICAL_UNSCHEDULED";
04003         header[34] = "PERCENT_KNOWN_TIME_CRITICAL_UNSCHEDULED";
04004         header[35] = "TOTAL_TIME_CRITICAL";
04005         header[36] = "PERCENT_TOTAL_TIME_CRITICAL";
04006         header[37] = "PERCENT_KNOWN_TIME_CRITICAL";
04007 
04008         /* indeterminate times */
04009         header[38] = "TIME_UNDETERMINED_NOT_RUNNING";
04010         header[39] = "PERCENT_TIME_UNDETERMINED_NOT_RUNNING";
04011         header[40] = "TIME_UNDETERMINED_NO_DATA";
04012         header[41] = "PERCENT_TIME_UNDETERMINED_NO_DATA";
04013         header[42] = "TOTAL_TIME_UNDETERMINED";
04014         header[43] = "PERCENT_TOTAL_TIME_UNDETERMINED";
04015 
04016         if(content_type==HTML_CONTENT){
04017 
04018                 printf("<tr CLASS='data%s'><td CLASS='data%s'>Average</td><td CLASS='hostUP'>%2.3f%% (%2.3f%%)</td><td CLASS='hostDOWN'>%2.3f%% (%2.3f%%)</td><td CLASS='hostUNREACHABLE'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>",bgclass,bgclass,average_percent_time_up,average_percent_time_up_known,average_percent_time_down,average_percent_time_down_known,average_percent_time_unreachable,average_percent_time_unreachable_known,bgclass,average_percent_time_indeterminate);
04019 
04020                 printf("</table>\n");
04021                 printf("</DIV>\n");
04022 
04023                 printf("<BR>\n");
04024                 printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Servicegroup '%s' Service State Breakdowns:</DIV>\n",sg->group_name);
04025 
04026                 printf("<DIV ALIGN=CENTER>\n");
04027                 printf("<TABLE BORDER=0 CLASS='data'>\n");
04028                 printf("<TR><TH CLASS='data'>Host</TH><TH CLASS='data'>Service</TH><TH CLASS='data'>%% Time OK</TH><TH CLASS='data'>%% Time Warning</TH><TH CLASS='data'>%% Time Unknown</TH><TH CLASS='data'>%% Time Critical</TH><TH CLASS='data'>%% Time Undetermined</TH></TR>\n");
04029 
04030         } else if(content_type==JSON_CONTENT){
04031                 printf(", {\"average_percent_times\": null, ");
04032                 printf("\"average_percent_time_up\": %2.3f, ",average_percent_time_up);
04033                 printf("\"average_percent_time_up_known\": %2.3f, ",average_percent_time_up_known);
04034                 printf("\"average_percent_time_down\": %2.3f, ",average_percent_time_down);
04035                 printf("\"average_percent_time_down_known\": %2.3f, ",average_percent_time_down_known);
04036                 printf("\"average_percent_time_unreachable\": %2.3f, ",average_percent_time_unreachable);
04037                 printf("\"average_percent_time_unreachable_known\": %2.3f, ",average_percent_time_unreachable_known);
04038                 printf("\"average_percent_time_indeterminate\": %2.3f }",average_percent_time_indeterminate);
04039 
04040                 printf("],\n\"servicegroup\": \"%s\",\n",json_encode(sg->group_name));
04041                 printf("\"service_state_breakdowns\": [\n");
04042                 json_list_start=FALSE;
04043 
04044                 /* converting to lower case */
04045                 for(i=0;i<44;i++) {
04046                         len=(int)strlen(header[i]);
04047                         for(j=0;j<len;j++) {
04048                                 if (header[i][j]=='_')
04049                                         lower_header[i][j]=header[i][j];
04050                                 else
04051                                         lower_header[i][j]=header[i][j]+32;
04052                         }
04053                         lower_header[i][len]='\x0';
04054                 }
04055                 json_start=TRUE;
04056         } else if(content_type==CSV_CONTENT){
04057                 printf("%sSERVICEGROUP %s SERVICE_STATE_BREAKDOWNS%s%s\n",csv_data_enclosure,sg->group_name,csv_data_enclosure,csv_delimiter);
04058 
04059                 for(i=0;i<44;i++)
04060                         printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
04061 
04062                 printf("\n");
04063         }
04064 
04065         current_subject=0;
04066         average_percent_time_indeterminate=0.0;
04067 
04068         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
04069 
04070                 if(temp_subject->type!=SERVICE_SUBJECT)
04071                         continue;
04072 
04073                 temp_service=find_service(temp_subject->host_name,temp_subject->service_description);
04074                 if(temp_service==NULL)
04075                         continue;
04076 
04077                 if(is_service_member_of_servicegroup(sg,temp_service)==FALSE)
04078                         continue;
04079 
04080                 current_subject++;
04081 
04082                 time_determinate=temp_subject->time_ok+temp_subject->time_warning+temp_subject->time_unknown+temp_subject->time_critical;
04083                 time_indeterminate=total_time-time_determinate;
04084 
04085                 /* adjust indeterminate time due to insufficient data (not all was caught) */
04086                 temp_subject->time_indeterminate_nodata=time_indeterminate-temp_subject->time_indeterminate_notrunning;
04087 
04088                 /* initialize values */
04089                 percent_time_ok=0.0;
04090                 percent_time_warning=0.0;
04091                 percent_time_unknown=0.0;
04092                 percent_time_critical=0.0;
04093                 percent_time_indeterminate=0.0;
04094                 percent_time_ok_known=0.0;
04095                 percent_time_warning_known=0.0;
04096                 percent_time_unknown_known=0.0;
04097                 percent_time_critical_known=0.0;
04098 
04099                 if(total_time>0){
04100                         percent_time_ok=(double)(((double)temp_subject->time_ok*100.0)/(double)total_time);
04101                         percent_time_warning=(double)(((double)temp_subject->time_warning*100.0)/(double)total_time);
04102                         percent_time_unknown=(double)(((double)temp_subject->time_unknown*100.0)/(double)total_time);
04103                         percent_time_critical=(double)(((double)temp_subject->time_critical*100.0)/(double)total_time);
04104                         percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
04105                         if(time_determinate>0){
04106                                 percent_time_ok_known=(double)(((double)temp_subject->time_ok*100.0)/(double)time_determinate);
04107                                 percent_time_warning_known=(double)(((double)temp_subject->time_warning*100.0)/(double)time_determinate);
04108                                 percent_time_unknown_known=(double)(((double)temp_subject->time_unknown*100.0)/(double)time_determinate);
04109                                 percent_time_critical_known=(double)(((double)temp_subject->time_critical*100.0)/(double)time_determinate);
04110                         }
04111                 }
04112 
04113                 if(odd){
04114                         odd=0;
04115                         bgclass="Odd";
04116                 }else{
04117                         odd=1;
04118                         bgclass="Even";
04119                 }
04120 
04121                 if(content_type==HTML_CONTENT){
04122 
04123                         printf("<tr CLASS='data%s'><td CLASS='data%s'>",bgclass,bgclass);
04124                         if(strcmp(temp_subject->host_name,last_host))
04125                                 host_report_url(temp_subject->host_name,temp_subject->host_name);
04126                         printf("</td><td CLASS='data%s'>",bgclass);
04127                         service_report_url(temp_subject->host_name,temp_subject->service_description,(temp_service->display_name!=NULL)?temp_service->display_name:temp_service->description);
04128                         printf("</td><td CLASS='serviceOK'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceWARNING'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceUNKNOWN'>%2.3f%% (%2.3f%%)</td><td class='serviceCRITICAL'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",percent_time_ok,percent_time_ok_known,percent_time_warning,percent_time_warning_known,percent_time_unknown,percent_time_unknown_known,percent_time_critical,percent_time_critical_known,bgclass,percent_time_indeterminate);
04129 
04130                         strncpy(last_host,temp_subject->host_name,sizeof(last_host)-1);
04131                         last_host[sizeof(last_host)-1]='\x0';
04132 
04133                 } else if(content_type==JSON_CONTENT){
04134                         if (json_start!=TRUE)
04135                                 printf(",\n");
04136 
04137                         /* host name and service description */
04138                         printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
04139                         printf(" \"%s\": \"%s\", ",lower_header[1],json_encode(temp_subject->service_description));
04140 
04141                         /* ok times */
04142                         printf(" \"%s\": %lu, ",lower_header[2],temp_subject->scheduled_time_ok);
04143                         printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_ok_scheduled);
04144                         printf(" \"%s\": %2.3f, ",lower_header[4],percent_time_ok_scheduled_known);
04145                         printf(" \"%s\": %lu, ",lower_header[5],temp_subject->time_ok-temp_subject->scheduled_time_ok);
04146                         printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_ok_unscheduled);
04147                         printf(" \"%s\": %2.3f, ",lower_header[7],percent_time_ok_unscheduled_known);
04148                         printf(" \"%s\": %lu, ",lower_header[8],temp_subject->time_ok);
04149                         printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_ok);
04150                         printf(" \"%s\": %2.3f, ",lower_header[10],percent_time_ok_known);
04151 
04152                         /* warning times */
04153                         printf(" \"%s\": %lu, ",lower_header[11],temp_subject->scheduled_time_warning);
04154                         printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_warning_scheduled);
04155                         printf(" \"%s\": %2.3f, ",lower_header[13],percent_time_warning_scheduled_known);
04156                         printf(" \"%s\": %lu, ",lower_header[14],temp_subject->time_warning-temp_subject->scheduled_time_warning);
04157                         printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_warning_unscheduled);
04158                         printf(" \"%s\": %2.3f, ",lower_header[16],percent_time_warning_unscheduled_known);
04159                         printf(" \"%s\": %lu, ",lower_header[17],temp_subject->time_warning);
04160                         printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_warning);
04161                         printf(" \"%s\": %2.3f, ",lower_header[19],percent_time_warning_known);
04162 
04163                         /* unknown times */
04164                         printf(" \"%s\": %lu, ",lower_header[20],temp_subject->scheduled_time_unknown);
04165                         printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unknown_scheduled);
04166                         printf(" \"%s\": %2.3f, ",lower_header[22],percent_time_unknown_scheduled_known);
04167                         printf(" \"%s\": %lu, ",lower_header[23],temp_subject->time_unknown-temp_subject->scheduled_time_unknown);
04168                         printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unknown_unscheduled);
04169                         printf(" \"%s\": %2.3f, ",lower_header[25],percent_time_unknown_unscheduled_known);
04170                         printf(" \"%s\": %lu, ",lower_header[26],temp_subject->time_unknown);
04171                         printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unknown);
04172                         printf(" \"%s\": %2.3f, ",lower_header[28],percent_time_unknown_known);
04173 
04174                         /* critical times */
04175                         printf(" \"%s\": %lu, ",lower_header[29],temp_subject->scheduled_time_critical);
04176                         printf(" \"%s\": %2.3f, ",lower_header[30],percent_time_critical_scheduled);
04177                         printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_critical_scheduled_known);
04178                         printf(" \"%s\": %lu, ",lower_header[32],temp_subject->time_critical-temp_subject->scheduled_time_critical);
04179                         printf(" \"%s\": %2.3f, ",lower_header[33],percent_time_critical_unscheduled);
04180                         printf(" \"%s\": %2.3f, ",lower_header[34],percent_time_critical_unscheduled_known);
04181                         printf(" \"%s\": %lu, ",lower_header[35],temp_subject->time_critical);
04182                         printf(" \"%s\": %2.3f, ",lower_header[36],percent_time_critical);
04183                         printf(" \"%s\": %2.3f, ",lower_header[37],percent_time_critical_known);
04184 
04185 
04186                         /* indeterminate times */
04187                         printf(" \"%s\": %lu, ",lower_header[38],temp_subject->time_indeterminate_notrunning);
04188                         printf(" \"%s\": %2.3f, ",lower_header[39],percent_time_indeterminate_notrunning);
04189                         printf(" \"%s\": %lu, ",lower_header[40],temp_subject->time_indeterminate_nodata);
04190                         printf(" \"%s\": %2.3f, ",lower_header[41],percent_time_indeterminate_nodata);
04191                         printf(" \"%s\": %lu, ",lower_header[42],time_indeterminate);
04192                         printf(" \"%s\": %2.3f} ",lower_header[43],percent_time_indeterminate);
04193 
04194                         json_start=FALSE;
04195 
04196                 } else if(content_type==CSV_CONTENT){
04197 
04198                         /* host name and service description */
04199                         printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
04200                         printf("%s%s%s%s",csv_data_enclosure,temp_subject->service_description,csv_data_enclosure,csv_delimiter);
04201 
04202                         /* ok times */
04203                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_ok,csv_data_enclosure,csv_delimiter);
04204                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_scheduled,csv_data_enclosure,csv_delimiter);
04205                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_scheduled_known,csv_data_enclosure,csv_delimiter);
04206                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_ok-temp_subject->scheduled_time_ok,csv_data_enclosure,csv_delimiter);
04207                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_unscheduled,csv_data_enclosure,csv_delimiter);
04208                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_unscheduled_known,csv_data_enclosure,csv_delimiter);
04209                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_ok,csv_data_enclosure,csv_delimiter);
04210                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok,csv_data_enclosure,csv_delimiter);
04211                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_known,csv_data_enclosure,csv_delimiter);
04212 
04213                         /* warning times */
04214                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_warning,csv_data_enclosure,csv_delimiter);
04215                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_scheduled,csv_data_enclosure,csv_delimiter);
04216                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_scheduled_known,csv_data_enclosure,csv_delimiter);
04217                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_warning-temp_subject->scheduled_time_warning,csv_data_enclosure,csv_delimiter);
04218                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_unscheduled,csv_data_enclosure,csv_delimiter);
04219                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_unscheduled_known,csv_data_enclosure,csv_delimiter);
04220                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_warning,csv_data_enclosure,csv_delimiter);
04221                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning,csv_data_enclosure,csv_delimiter);
04222                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_known,csv_data_enclosure,csv_delimiter);
04223 
04224                         /* unknown times */
04225                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unknown,csv_data_enclosure,csv_delimiter);
04226                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_scheduled,csv_data_enclosure,csv_delimiter);
04227                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_scheduled_known,csv_data_enclosure,csv_delimiter);
04228                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unknown-temp_subject->scheduled_time_unknown,csv_data_enclosure,csv_delimiter);
04229                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_unscheduled,csv_data_enclosure,csv_delimiter);
04230                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_unscheduled_known,csv_data_enclosure,csv_delimiter);
04231                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unknown,csv_data_enclosure,csv_delimiter);
04232                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown,csv_data_enclosure,csv_delimiter);
04233                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_known,csv_data_enclosure,csv_delimiter);
04234 
04235                         /* critical times */
04236                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_critical,csv_data_enclosure,csv_delimiter);
04237                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_scheduled,csv_data_enclosure,csv_delimiter);
04238                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_scheduled_known,csv_data_enclosure,csv_delimiter);
04239                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_critical-temp_subject->scheduled_time_critical,csv_data_enclosure,csv_delimiter);
04240                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_unscheduled,csv_data_enclosure,csv_delimiter);
04241                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_unscheduled_known,csv_data_enclosure,csv_delimiter);
04242                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_critical,csv_data_enclosure,csv_delimiter);
04243                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical,csv_data_enclosure,csv_delimiter);
04244                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_known,csv_data_enclosure,csv_delimiter);
04245 
04246                         /* indeterminate times */
04247                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
04248                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
04249                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
04250                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
04251                         printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
04252                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
04253 
04254                         printf("\n");
04255                 }
04256 
04257                 get_running_average(&average_percent_time_ok,percent_time_ok,current_subject);
04258                 get_running_average(&average_percent_time_ok_known,percent_time_ok_known,current_subject);
04259                 get_running_average(&average_percent_time_unknown,percent_time_unknown,current_subject);
04260                 get_running_average(&average_percent_time_unknown_known,percent_time_unknown_known,current_subject);
04261                 get_running_average(&average_percent_time_warning,percent_time_warning,current_subject);
04262                 get_running_average(&average_percent_time_warning_known,percent_time_warning_known,current_subject);
04263                 get_running_average(&average_percent_time_critical,percent_time_critical,current_subject);
04264                 get_running_average(&average_percent_time_critical_known,percent_time_critical_known,current_subject);
04265                 get_running_average(&average_percent_time_indeterminate,percent_time_indeterminate,current_subject);
04266         }
04267 
04268         /* display average stats */
04269         if(odd){
04270                 odd=0;
04271                 bgclass="Odd";
04272         }else{
04273                 odd=1;
04274                 bgclass="Even";
04275         }
04276 
04277         if(content_type==HTML_CONTENT){
04278                 printf("<tr CLASS='data%s'><td CLASS='data%s' colspan='2'>Average</td><td CLASS='serviceOK'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceWARNING'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceUNKNOWN'>%2.3f%% (%2.3f%%)</td><td class='serviceCRITICAL'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",bgclass,bgclass,average_percent_time_ok,average_percent_time_ok_known,average_percent_time_warning,average_percent_time_warning_known,average_percent_time_unknown,average_percent_time_unknown_known,average_percent_time_critical,average_percent_time_critical_known,bgclass,average_percent_time_indeterminate);
04279 
04280                 printf("</table>\n");
04281                 printf("</DIV>\n");
04282         }else if (content_type==JSON_CONTENT){
04283                 printf(",{ \"average_percent_time_ok\": %2.3f, ",average_percent_time_ok);
04284                 printf("\"average_percent_time_ok_known\": %2.3f, ",average_percent_time_ok_known);
04285                 printf("\"average_percent_time_warning\": %2.3f, ",average_percent_time_warning);
04286                 printf("\"average_percent_time_warning_known\": %2.3f, ",average_percent_time_warning_known);
04287                 printf("\"average_percent_time_unknown\": %2.3f, ",average_percent_time_unknown);
04288                 printf("\"average_percent_time_unknown_known\": %2.3f, ",average_percent_time_unknown_known);
04289                 printf("\"average_percent_time_critical\": %2.3f, ",average_percent_time_critical);
04290                 printf("\"average_percent_time_critical_known\": %2.3f, ",average_percent_time_critical_known);
04291                 printf("\"average_percent_time_indeterminate\": %2.3f }",average_percent_time_indeterminate);
04292                 printf(" ]\n");
04293         } else if(content_type==CSV_CONTENT){
04294                 /* average */
04295                 /* left for future rework */
04296         }
04297 
04298         return;
04299 }
04300 
04301 
04302 /* display host availability */
04303 void display_host_availability(void){
04304         unsigned long total_time;
04305         unsigned long time_determinate;
04306         unsigned long time_indeterminate;
04307         avail_subject *temp_subject;
04308         host *temp_host;
04309         service *temp_service;
04310         int days, hours, minutes, seconds;
04311         char time_indeterminate_string[48];
04312         char time_determinate_string[48];
04313         char total_time_string[48];
04314         char *header[34];
04315         double percent_time_ok=0.0;
04316         double percent_time_warning=0.0;
04317         double percent_time_unknown=0.0;
04318         double percent_time_critical=0.0;
04319         double percent_time_indeterminate=0.0;
04320         double percent_time_ok_known=0.0;
04321         double percent_time_warning_known=0.0;
04322         double percent_time_unknown_known=0.0;
04323         double percent_time_critical_known=0.0;
04324         char time_up_string[48];
04325         char time_down_string[48];
04326         char time_unreachable_string[48];
04327         double percent_time_up=0.0;
04328         double percent_time_down=0.0;
04329         double percent_time_unreachable=0.0;
04330         double percent_time_up_known=0.0;
04331         double percent_time_down_known=0.0;
04332         double percent_time_unreachable_known=0.0;
04333 
04334         double percent_time_up_scheduled=0.0;
04335         double percent_time_up_unscheduled=0.0;
04336         double percent_time_down_scheduled=0.0;
04337         double percent_time_down_unscheduled=0.0;
04338         double percent_time_unreachable_scheduled=0.0;
04339         double percent_time_unreachable_unscheduled=0.0;
04340         double percent_time_up_scheduled_known=0.0;
04341         double percent_time_up_unscheduled_known=0.0;
04342         double percent_time_down_scheduled_known=0.0;
04343         double percent_time_down_unscheduled_known=0.0;
04344         double percent_time_unreachable_scheduled_known=0.0;
04345         double percent_time_unreachable_unscheduled_known=0.0;
04346         char time_up_scheduled_string[48];
04347         char time_up_unscheduled_string[48];
04348         char time_down_scheduled_string[48];
04349         char time_down_unscheduled_string[48];
04350         char time_unreachable_scheduled_string[48];
04351         char time_unreachable_unscheduled_string[48];
04352 
04353         char time_indeterminate_scheduled_string[48];
04354         char time_indeterminate_unscheduled_string[48];
04355         double percent_time_indeterminate_scheduled=0.0;
04356         double percent_time_indeterminate_unscheduled=0.0;
04357         char time_indeterminate_notrunning_string[48];
04358         char time_indeterminate_nodata_string[48];
04359         double percent_time_indeterminate_notrunning=0.0;
04360         double percent_time_indeterminate_nodata=0.0;
04361 
04362         double average_percent_time_up=0.0;
04363         double average_percent_time_up_known=0.0;
04364         double average_percent_time_down=0.0;
04365         double average_percent_time_down_known=0.0;
04366         double average_percent_time_unreachable=0.0;
04367         double average_percent_time_unreachable_known=0.0;
04368         double average_percent_time_indeterminate=0.0;
04369 
04370         double average_percent_time_ok=0.0;
04371         double average_percent_time_ok_known=0.0;
04372         double average_percent_time_unknown=0.0;
04373         double average_percent_time_unknown_known=0.0;
04374         double average_percent_time_warning=0.0;
04375         double average_percent_time_warning_known=0.0;
04376         double average_percent_time_critical=0.0;
04377         double average_percent_time_critical_known=0.0;
04378 
04379         int current_subject=0;
04380         int i=0, j=0;
04381         char *bgclass="";
04382         int odd=1;
04383         int json_start=TRUE;
04384         char lower_header[34][100];
04385         int len=0;
04386 
04387         /* calculate total time during period based on timeperiod used for reporting */
04388         total_time=calculate_total_time(t1,t2);
04389 
04390 #ifdef DEBUG
04391         printf("Total time: '%ld' seconds<br>\n",total_time);
04392 #endif
04393 
04394         /* fields for csv and json output */
04395         header[0] = "HOST_NAME";
04396         header[1] = "TIME_UP_SCHEDULED";
04397         header[2] = "PERCENT_TIME_UP_SCHEDULED";
04398         header[3] = "PERCENT_KNOWN_TIME_UP_SCHEDULED";
04399         header[4] = "TIME_UP_UNSCHEDULED";
04400         header[5] = "PERCENT_TIME_UP_UNSCHEDULED";
04401         header[6] = "PERCENT_KNOWN_TIME_UP_UNSCHEDULED";
04402         header[7] = "TOTAL_TIME_UP";
04403         header[8] = "PERCENT_TOTAL_TIME_UP";
04404         header[9] = "PERCENT_KNOWN_TIME_UP";
04405         header[10] = "TIME_DOWN_SCHEDULED";
04406         header[11] = "PERCENT_TIME_DOWN_SCHEDULED";
04407         header[12] = "PERCENT_KNOWN_TIME_DOWN_SCHEDULED";
04408         header[13] = "TIME_DOWN_UNSCHEDULED";
04409         header[14] = "PERCENT_TIME_DOWN_UNSCHEDULED";
04410         header[15] = "PERCENT_KNOWN_TIME_DOWN_UNSCHEDULED";
04411         header[16] = "TOTAL_TIME_DOWN";
04412         header[17] = "PERCENT_TOTAL_TIME_DOWN";
04413         header[18] = "PERCENT_KNOWN_TIME_DOWN";
04414         header[19] = "TIME_UNREACHABLE_SCHEDULED";
04415         header[20] = "PERCENT_TIME_UNREACHABLE_SCHEDULED";
04416         header[21] = "PERCENT_KNOWN_TIME_UNREACHABLE_SCHEDULED";
04417         header[22] = "TIME_UNREACHABLE_UNSCHEDULED";
04418         header[23] = "PERCENT_TIME_UNREACHABLE_UNSCHEDULED";
04419         header[24] = "PERCENT_KNOWN_TIME_UNREACHABLE_UNSCHEDULED";
04420         header[25] = "TOTAL_TIME_UNREACHABLE";
04421         header[26] = "PERCENT_TOTAL_TIME_UNREACHABLE";
04422         header[27] = "PERCENT_KNOWN_TIME_UNREACHABLE";
04423         header[28] = "TIME_UNDETERMINED_NOT_RUNNING";
04424         header[29] = "PERCENT_TIME_UNDETERMINED_NOT_RUNNING";
04425         header[30] = "TIME_UNDETERMINED_NO_DATA";
04426         header[31] = "PERCENT_TIME_UNDETERMINED_NO_DATA";
04427         header[32] = "TOTAL_TIME_UNDETERMINED";
04428         header[33] = "PERCENT_TOTAL_TIME_UNDETERMINED";
04429 
04430         if(content_type==JSON_CONTENT){
04431                 /* converting to lower case */
04432                 for(i=0;i<34;i++) {
04433                         len=(int)strlen(header[i]);
04434                         for(j=0;j<len;j++) {
04435                                 if (header[i][j]=='_')
04436                                         lower_header[i][j]=header[i][j];
04437                                 else
04438                                         lower_header[i][j]=header[i][j]+32;
04439                         }
04440                         lower_header[i][len]='\x0';
04441                 }
04442         }
04443 
04444         /* show data for a specific host */
04445         if(show_all_hosts==FALSE){
04446 
04447                 temp_subject=find_subject(HOST_SUBJECT,host_name,NULL);
04448                 if(temp_subject==NULL)
04449                         return;
04450 
04451                 temp_host=find_host(temp_subject->host_name);
04452                 if(temp_host==NULL)
04453                         return;
04454 
04455                 /* the user isn't authorized to view this host */
04456                 if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
04457                         return;
04458 
04459                 time_determinate=temp_subject->time_up+temp_subject->time_down+temp_subject->time_unreachable;
04460                 time_indeterminate=total_time-time_determinate;
04461 
04462                 /* adjust indeterminate time due to insufficient data (not all was caught) */
04463                 temp_subject->time_indeterminate_nodata=time_indeterminate-temp_subject->time_indeterminate_notrunning;
04464 
04465                 /* up times */
04466                 get_time_breakdown(temp_subject->time_up,&days,&hours,&minutes,&seconds);
04467                 snprintf(time_up_string,sizeof(time_up_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04468                 get_time_breakdown(temp_subject->scheduled_time_up,&days,&hours,&minutes,&seconds);
04469                 snprintf(time_up_scheduled_string,sizeof(time_up_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04470                 get_time_breakdown(temp_subject->time_up-temp_subject->scheduled_time_up,&days,&hours,&minutes,&seconds);
04471                 snprintf(time_up_unscheduled_string,sizeof(time_up_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04472 
04473                 /* down times */
04474                 get_time_breakdown(temp_subject->time_down,&days,&hours,&minutes,&seconds);
04475                 snprintf(time_down_string,sizeof(time_down_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04476                 get_time_breakdown(temp_subject->scheduled_time_down,&days,&hours,&minutes,&seconds);
04477                 snprintf(time_down_scheduled_string,sizeof(time_down_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04478                 get_time_breakdown(temp_subject->time_down-temp_subject->scheduled_time_down,&days,&hours,&minutes,&seconds);
04479                 snprintf(time_down_unscheduled_string,sizeof(time_down_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04480 
04481                 /* unreachable times */
04482                 get_time_breakdown(temp_subject->time_unreachable,&days,&hours,&minutes,&seconds);
04483                 snprintf(time_unreachable_string,sizeof(time_unreachable_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04484                 get_time_breakdown(temp_subject->scheduled_time_unreachable,&days,&hours,&minutes,&seconds);
04485                 snprintf(time_unreachable_scheduled_string,sizeof(time_unreachable_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04486                 get_time_breakdown(temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable,&days,&hours,&minutes,&seconds);
04487                 snprintf(time_unreachable_unscheduled_string,sizeof(time_unreachable_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04488 
04489                 /* indeterminate times */
04490                 get_time_breakdown(time_indeterminate,&days,&hours,&minutes,&seconds);
04491                 snprintf(time_indeterminate_string,sizeof(time_indeterminate_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04492                 get_time_breakdown(temp_subject->scheduled_time_indeterminate,&days,&hours,&minutes,&seconds);
04493                 snprintf(time_indeterminate_scheduled_string,sizeof(time_indeterminate_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04494                 get_time_breakdown(time_indeterminate-temp_subject->scheduled_time_indeterminate,&days,&hours,&minutes,&seconds);
04495                 snprintf(time_indeterminate_unscheduled_string,sizeof(time_indeterminate_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04496                 get_time_breakdown(temp_subject->time_indeterminate_notrunning,&days,&hours,&minutes,&seconds);
04497                 snprintf(time_indeterminate_notrunning_string,sizeof(time_indeterminate_notrunning_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04498                 get_time_breakdown(temp_subject->time_indeterminate_nodata,&days,&hours,&minutes,&seconds);
04499                 snprintf(time_indeterminate_nodata_string,sizeof(time_indeterminate_nodata_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04500 
04501                 get_time_breakdown(time_determinate,&days,&hours,&minutes,&seconds);
04502                 snprintf(time_determinate_string,sizeof(time_determinate_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04503 
04504                 get_time_breakdown(total_time,&days,&hours,&minutes,&seconds);
04505                 snprintf(total_time_string,sizeof(total_time_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
04506 
04507                 if(total_time>0){
04508                         percent_time_up=(double)(((double)temp_subject->time_up*100.0)/(double)total_time);
04509                         percent_time_up_scheduled=(double)(((double)temp_subject->scheduled_time_up*100.0)/(double)total_time);
04510                         percent_time_up_unscheduled=percent_time_up-percent_time_up_scheduled;
04511                         percent_time_down=(double)(((double)temp_subject->time_down*100.0)/(double)total_time);
04512                         percent_time_down_scheduled=(double)(((double)temp_subject->scheduled_time_down*100.0)/(double)total_time);
04513                         percent_time_down_unscheduled=percent_time_down-percent_time_down_scheduled;
04514                         percent_time_unreachable=(double)(((double)temp_subject->time_unreachable*100.0)/(double)total_time);
04515                         percent_time_unreachable_scheduled=(double)(((double)temp_subject->scheduled_time_unreachable*100.0)/(double)total_time);
04516                         percent_time_unreachable_unscheduled=percent_time_unreachable-percent_time_unreachable_scheduled;
04517                         percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
04518                         percent_time_indeterminate_scheduled=(double)(((double)temp_subject->scheduled_time_indeterminate*100.0)/(double)total_time);
04519                         percent_time_indeterminate_unscheduled=percent_time_indeterminate-percent_time_indeterminate_scheduled;
04520                         percent_time_indeterminate_notrunning=(double)(((double)temp_subject->time_indeterminate_notrunning*100.0)/(double)total_time);
04521                         percent_time_indeterminate_nodata=(double)(((double)temp_subject->time_indeterminate_nodata*100.0)/(double)total_time);
04522                         if(time_determinate>0){
04523                                 percent_time_up_known=(double)(((double)temp_subject->time_up*100.0)/(double)time_determinate);
04524                                 percent_time_up_scheduled_known=(double)(((double)temp_subject->scheduled_time_up*100.0)/(double)time_determinate);
04525                                 percent_time_up_unscheduled_known=percent_time_up_known-percent_time_up_scheduled_known;
04526                                 percent_time_down_known=(double)(((double)temp_subject->time_down*100.0)/(double)time_determinate);
04527                                 percent_time_down_scheduled_known=(double)(((double)temp_subject->scheduled_time_down*100.0)/(double)time_determinate);
04528                                 percent_time_down_unscheduled_known=percent_time_down_known-percent_time_down_scheduled_known;
04529                                 percent_time_unreachable_known=(double)(((double)temp_subject->time_unreachable*100.0)/(double)time_determinate);
04530                                 percent_time_unreachable_scheduled_known=(double)(((double)temp_subject->scheduled_time_unreachable*100.0)/(double)time_determinate);
04531                                 percent_time_unreachable_unscheduled_known=percent_time_unreachable_known-percent_time_unreachable_scheduled_known;
04532                         }
04533                 }
04534 
04535                 if(content_type==HTML_CONTENT){
04536 
04537                         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Host State Breakdowns:</DIV>\n");
04538 
04539 #ifdef USE_TRENDS
04540                         printf("<p align='center'>\n");
04541                         printf("<a href='%s?host=%s",TRENDS_CGI,url_encode(host_name));
04542                         printf("&t1=%lu&t2=%lu&includesoftstates=%s&assumestateretention=%s&assumeinitialstates=%s&assumestatesduringnotrunning=%s&initialassumedhoststate=%d&backtrack=%d'>",t1,t2,(include_soft_states==TRUE)?"yes":"no",(assume_state_retention==TRUE)?"yes":"no",(assume_initial_states==TRUE)?"yes":"no",(assume_states_during_notrunning==TRUE)?"yes":"no",initial_assumed_host_state,backtrack_archives);
04543                         printf("<img src='%s?createimage&smallimage&host=%s",TRENDS_CGI,url_encode(host_name));
04544                         printf("&t1=%lu&t2=%lu&includesoftstates=%s&assumestateretention=%s&assumeinitialstates=%s&assumestatesduringnotrunning=%s&initialassumedhoststate=%d&backtrack=%d' border=1 alt='Host State Trends' title='Host State Trends' width='500' height='20'>",t1,t2,(include_soft_states==TRUE)?"yes":"no",(assume_state_retention==TRUE)?"yes":"no",(assume_initial_states==TRUE)?"yes":"no",(assume_states_during_notrunning==TRUE)?"yes":"no",initial_assumed_host_state,backtrack_archives);
04545                         printf("</a><br>\n");
04546                         printf("</p>\n");
04547 #endif
04548                         printf("<DIV ALIGN=CENTER>\n");
04549                         printf("<TABLE BORDER=0 CLASS='data'>\n");
04550                         printf("<TR><TH CLASS='data'>State</TH><TH CLASS='data'>Type / Reason</TH><TH CLASS='data'>Time</TH><TH CLASS='data'>%% Total Time</TH><TH CLASS='data'>%% Known Time</TH></TR>\n");
04551 
04552                         /* up times */
04553                         printf("<tr CLASS='dataEven'><td CLASS='hostUP' rowspan=3>UP</td>");
04554                         printf("<td CLASS='dataEven'>Unscheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td class='dataEven'>%2.3f%%</td></tr>\n",time_up_unscheduled_string,percent_time_up,percent_time_up_known);
04555                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Scheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td class='dataEven'>%2.3f%%</td></tr>\n",time_up_scheduled_string,percent_time_up_scheduled,percent_time_up_scheduled_known);
04556                         printf("<tr CLASS='hostUP'><td CLASS='hostUP'>Total</td><td CLASS='hostUP'>%s</td><td CLASS='hostUP'>%2.3f%%</td><td class='hostUP'>%2.3f%%</td></tr>\n",time_up_string,percent_time_up,percent_time_up_known);
04557 
04558                         /* down times */
04559                         printf("<tr CLASS='dataOdd'><td CLASS='hostDOWN' rowspan=3>DOWN</td>");
04560                         printf("<td CLASS='dataOdd'>Unscheduled</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td class='dataOdd'>%2.3f%%</td></tr>\n",time_down_unscheduled_string,percent_time_down_unscheduled,percent_time_down_unscheduled_known);
04561                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd'>Scheduled</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td class='dataOdd'>%2.3f%%</td></tr>\n",time_down_scheduled_string,percent_time_down_scheduled,percent_time_down_scheduled_known);
04562                         printf("<tr CLASS='hostDOWN'><td CLASS='hostDOWN'>Total</td><td CLASS='hostDOWN'>%s</td><td CLASS='hostDOWN'>%2.3f%%</td><td class='hostDOWN'>%2.3f%%</td></tr>\n",time_down_string,percent_time_down,percent_time_down_known);
04563 
04564                         /* unreachable times */
04565                         printf("<tr CLASS='dataEven'><td CLASS='hostUNREACHABLE' rowspan=3>UNREACHABLE</td>");
04566                         printf("<td CLASS='dataEven'>Unscheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td class='dataEven'>%2.3f%%</td></tr>\n",time_unreachable_unscheduled_string,percent_time_unreachable,percent_time_unreachable_known);
04567                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Scheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td class='dataEven'>%2.3f%%</td></tr>\n",time_unreachable_scheduled_string,percent_time_unreachable_scheduled,percent_time_unreachable_scheduled_known);
04568                         printf("<tr CLASS='hostUNREACHABLE'><td CLASS='hostUNREACHABLE'>Total</td><td CLASS='hostUNREACHABLE'>%s</td><td CLASS='hostUNREACHABLE'>%2.3f%%</td><td class='hostUNREACHABLE'>%2.3f%%</td></tr>\n",time_unreachable_string,percent_time_unreachable,percent_time_unreachable_known);
04569 
04570                         /* indeterminate times */
04571                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd' rowspan=3>Undetermined</td>");
04572                         printf("<td CLASS='dataOdd'>%s Not Running</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'></td></tr>\n", PROGRAM_VERSION, time_indeterminate_notrunning_string, percent_time_indeterminate_notrunning);
04573                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd'>Insufficient Data</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'></td></tr>\n",time_indeterminate_nodata_string,percent_time_indeterminate_nodata);
04574                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd'>Total</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'></td></tr>\n",time_indeterminate_string,percent_time_indeterminate);
04575 
04576                         printf("<tr><td colspan=3></td></tr>\n");
04577 
04578                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>All</td><td class='dataEven'>Total</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>100.000%%</td><td CLASS='dataEven'>100.000%%</td></tr>\n",total_time_string);
04579                         printf("</table>\n");
04580                         printf("</DIV>\n");
04581 
04582 
04583 
04584                         /* display state breakdowns for all services on this host */
04585 
04586                         printf("<BR><BR>\n");
04587                         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>State Breakdowns For Host Services:</DIV>\n");
04588 
04589                         printf("<DIV ALIGN=CENTER>\n");
04590                         printf("<TABLE BORDER=0 CLASS='data'>\n");
04591                         printf("<TR><TH CLASS='data'>Service</TH><TH CLASS='data'>%% Time OK</TH><TH CLASS='data'>%% Time Warning</TH><TH CLASS='data'>%% Time Unknown</TH><TH CLASS='data'>%% Time Critical</TH><TH CLASS='data'>%% Time Undetermined</TH></TR>\n");
04592 
04593                         for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
04594 
04595                                 if(temp_subject->type!=SERVICE_SUBJECT)
04596                                         continue;
04597 
04598                                 temp_service=find_service(temp_subject->host_name,temp_subject->service_description);
04599                                 if(temp_service==NULL)
04600                                         continue;
04601 
04602                                 /* the user isn't authorized to view this service */
04603                                 if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
04604                                         continue;
04605 
04606                                 current_subject++;
04607 
04608                                 if(odd){
04609                                         odd=0;
04610                                         bgclass="Odd";
04611                                 }else{
04612                                         odd=1;
04613                                         bgclass="Even";
04614                                 }
04615 
04616                                 /* reset variables */
04617                                 percent_time_ok=0.0;
04618                                 percent_time_warning=0.0;
04619                                 percent_time_unknown=0.0;
04620                                 percent_time_critical=0.0;
04621                                 percent_time_indeterminate=0.0;
04622                                 percent_time_ok_known=0.0;
04623                                 percent_time_warning_known=0.0;
04624                                 percent_time_unknown_known=0.0;
04625                                 percent_time_critical_known=0.0;
04626 
04627                                 time_determinate=temp_subject->time_ok+temp_subject->time_warning+temp_subject->time_unknown+temp_subject->time_critical;
04628                                 time_indeterminate=total_time-time_determinate;
04629 
04630                                 if(total_time>0){
04631                                         percent_time_ok=(double)(((double)temp_subject->time_ok*100.0)/(double)total_time);
04632                                         percent_time_warning=(double)(((double)temp_subject->time_warning*100.0)/(double)total_time);
04633                                         percent_time_unknown=(double)(((double)temp_subject->time_unknown*100.0)/(double)total_time);
04634                                         percent_time_critical=(double)(((double)temp_subject->time_critical*100.0)/(double)total_time);
04635                                         percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
04636                                         if(time_determinate>0){
04637                                                 percent_time_ok_known=(double)(((double)temp_subject->time_ok*100.0)/(double)time_determinate);
04638                                                 percent_time_warning_known=(double)(((double)temp_subject->time_warning*100.0)/(double)time_determinate);
04639                                                 percent_time_unknown_known=(double)(((double)temp_subject->time_unknown*100.0)/(double)time_determinate);
04640                                                 percent_time_critical_known=(double)(((double)temp_subject->time_critical*100.0)/(double)time_determinate);
04641                                         }
04642                                 }
04643 
04644                                 printf("<tr CLASS='data%s'><td CLASS='data%s'>",bgclass,bgclass);
04645                                 service_report_url(temp_subject->host_name,temp_subject->service_description,temp_subject->service_description);
04646                                 printf("</td><td CLASS='serviceOK'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceWARNING'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceUNKNOWN'>%2.3f%% (%2.3f%%)</td><td class='serviceCRITICAL'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",percent_time_ok,percent_time_ok_known,percent_time_warning,percent_time_warning_known,percent_time_unknown,percent_time_unknown_known,percent_time_critical,percent_time_critical_known,bgclass,percent_time_indeterminate);
04647 
04648                                 get_running_average(&average_percent_time_ok,percent_time_ok,current_subject);
04649                                 get_running_average(&average_percent_time_ok_known,percent_time_ok_known,current_subject);
04650                                 get_running_average(&average_percent_time_unknown,percent_time_unknown,current_subject);
04651                                 get_running_average(&average_percent_time_unknown_known,percent_time_unknown_known,current_subject);
04652                                 get_running_average(&average_percent_time_warning,percent_time_warning,current_subject);
04653                                 get_running_average(&average_percent_time_warning_known,percent_time_warning_known,current_subject);
04654                                 get_running_average(&average_percent_time_critical,percent_time_critical,current_subject);
04655                                 get_running_average(&average_percent_time_critical_known,percent_time_critical_known,current_subject);
04656                                 get_running_average(&average_percent_time_indeterminate,percent_time_indeterminate,current_subject);
04657                         }
04658 
04659                         /* display average stats */
04660                         if(odd){
04661                                 odd=0;
04662                                 bgclass="Odd";
04663                         }else{
04664                                 odd=1;
04665                                 bgclass="Even";
04666                         }
04667 
04668                         printf("<tr CLASS='data%s'><td CLASS='data%s'>Average</td><td CLASS='serviceOK'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceWARNING'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceUNKNOWN'>%2.3f%% (%2.3f%%)</td><td class='serviceCRITICAL'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",bgclass,bgclass,average_percent_time_ok,average_percent_time_ok_known,average_percent_time_warning,average_percent_time_warning_known,average_percent_time_unknown,average_percent_time_unknown_known,average_percent_time_critical,average_percent_time_critical_known,bgclass,average_percent_time_indeterminate);
04669 
04670                         printf("</table>\n");
04671                         printf("</DIV>\n");
04672 
04673                 } else if(content_type==JSON_CONTENT){
04674                         printf("\"host_availability\": {\n");
04675                         printf("\"hosts\": [\n");
04676 
04677                         /* host name */
04678                         printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
04679 
04680                         /* up times */
04681                         printf(" \"%s\": %lu, ",lower_header[1],temp_subject->scheduled_time_up);
04682                         printf(" \"%s\": %2.3f, ",lower_header[2],percent_time_up_scheduled);
04683                         printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_up_scheduled_known);
04684                         printf(" \"%s\": %lu, ",lower_header[4],temp_subject->time_up-temp_subject->scheduled_time_up);
04685                         printf(" \"%s\": %2.3f, ",lower_header[5],percent_time_up_unscheduled);
04686                         printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_up_unscheduled_known);
04687                         printf(" \"%s\": %lu, ",lower_header[7],temp_subject->time_up);
04688                         printf(" \"%s\": %2.3f, ",lower_header[8],percent_time_up);
04689                         printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_up_known);
04690 
04691                         /* down times */
04692                         printf(" \"%s\": %lu, ",lower_header[10],temp_subject->scheduled_time_down);
04693                         printf(" \"%s\": %2.3f, ",lower_header[11],percent_time_down_scheduled);
04694                         printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_down_scheduled_known);
04695                         printf(" \"%s\": %lu, ",lower_header[13],temp_subject->time_down-temp_subject->scheduled_time_down);
04696                         printf(" \"%s\": %2.3f, ",lower_header[14],percent_time_down_unscheduled);
04697                         printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_down_unscheduled_known);
04698                         printf(" \"%s\": %lu, ",lower_header[16],temp_subject->time_down);
04699                         printf(" \"%s\": %2.3f, ",lower_header[17],percent_time_down);
04700                         printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_down_known);
04701 
04702                         /* unreachable times */
04703                         printf(" \"%s\": %lu, ",lower_header[19],temp_subject->scheduled_time_unreachable);
04704                         printf(" \"%s\": %2.3f, ",lower_header[20],percent_time_unreachable_scheduled);
04705                         printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unreachable_scheduled_known);
04706                         printf(" \"%s\": %lu, ",lower_header[22],temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable);
04707                         printf(" \"%s\": %2.3f, ",lower_header[23],percent_time_unreachable_unscheduled);
04708                         printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unreachable_unscheduled_known);
04709                         printf(" \"%s\": %lu, ",lower_header[25],temp_subject->time_unreachable);
04710                         printf(" \"%s\": %2.3f, ",lower_header[26],percent_time_unreachable);
04711                         printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unreachable_known);
04712 
04713                         /* indeterminate times */
04714                         printf(" \"%s\": %lu, ",lower_header[28],temp_subject->time_indeterminate_notrunning);
04715                         printf(" \"%s\": %2.3f, ",lower_header[29],percent_time_indeterminate_notrunning);
04716                         printf(" \"%s\": %lu, ",lower_header[30],temp_subject->time_indeterminate_nodata);
04717                         printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_indeterminate_nodata);
04718                         printf(" \"%s\": %lu, ",lower_header[32],time_indeterminate);
04719                         printf(" \"%s\": %2.3f}\n]\n}",lower_header[33],percent_time_indeterminate);
04720 
04721                 } else if(content_type==CSV_CONTENT){
04722 
04723                         for(i=0;i<34;i++)
04724                                 printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
04725 
04726                         printf("\n");
04727 
04728                         /* host name */
04729                         printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
04730 
04731                         /* up times */
04732                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
04733                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled,csv_data_enclosure,csv_delimiter);
04734                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled_known,csv_data_enclosure,csv_delimiter);
04735                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up-temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
04736                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled,csv_data_enclosure,csv_delimiter);
04737                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled_known,csv_data_enclosure,csv_delimiter);
04738                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up,csv_data_enclosure,csv_delimiter);
04739                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up,csv_data_enclosure,csv_delimiter);
04740                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_known,csv_data_enclosure,csv_delimiter);
04741 
04742                         /* down times */
04743                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
04744                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled,csv_data_enclosure,csv_delimiter);
04745                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled_known,csv_data_enclosure,csv_delimiter);
04746                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down-temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
04747                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled,csv_data_enclosure,csv_delimiter);
04748                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled_known,csv_data_enclosure,csv_delimiter);
04749                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down,csv_data_enclosure,csv_delimiter);
04750                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down,csv_data_enclosure,csv_delimiter);
04751                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_known,csv_data_enclosure,csv_delimiter);
04752 
04753                         /* unreachable times */
04754                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
04755                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled,csv_data_enclosure,csv_delimiter);
04756                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled_known,csv_data_enclosure,csv_delimiter);
04757                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
04758                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled,csv_data_enclosure,csv_delimiter);
04759                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled_known,csv_data_enclosure,csv_delimiter);
04760                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable,csv_data_enclosure,csv_delimiter);
04761                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable,csv_data_enclosure,csv_delimiter);
04762                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_known,csv_data_enclosure,csv_delimiter);
04763 
04764                         /* indeterminate times */
04765                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
04766                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
04767                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
04768                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
04769                         printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
04770                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
04771 
04772                         printf("\n");
04773                 }
04774 
04775                 /* write log entries for the host */
04776                 temp_subject=find_subject(HOST_SUBJECT,host_name,NULL);
04777                 write_log_entries(temp_subject);
04778         }
04779 
04780 
04781         /* display data for all hosts */
04782         else{
04783 
04784                 if(content_type==HTML_CONTENT){
04785 
04786                         printf("<BR><BR>\n");
04787                         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Host State Breakdowns:</DIV>\n");
04788 
04789                         printf("<DIV ALIGN=CENTER>\n");
04790                         printf("<TABLE BORDER=0 CLASS='data'>\n");
04791                         printf("<TR><TH CLASS='data'>Host</TH><TH CLASS='data'>%% Time Up</TH><TH CLASS='data'>%% Time Down</TH><TH CLASS='data'>%% Time Unreachable</TH><TH CLASS='data'>%% Time Undetermined</TH></TR>\n");
04792                 } else if(content_type==JSON_CONTENT){
04793                         printf("\"host_availability\": {\n");
04794                         printf("\"hosts\": [\n");
04795                 }else if(content_type==CSV_CONTENT){
04796 
04797                         for(i=0;i<34;i++)
04798                                 printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
04799 
04800                         printf("\n");
04801                 }
04802 
04803 
04804                 for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
04805 
04806                         if(temp_subject->type!=HOST_SUBJECT)
04807                                 continue;
04808 
04809                         temp_host=find_host(temp_subject->host_name);
04810                         if(temp_host==NULL)
04811                                 continue;
04812 
04813                         /* the user isn't authorized to view this host */
04814                         if(is_authorized_for_host(temp_host,&current_authdata)==FALSE)
04815                                 continue;
04816 
04817                         current_subject++;
04818 
04819                         time_determinate=temp_subject->time_up+temp_subject->time_down+temp_subject->time_unreachable;
04820                         time_indeterminate=total_time-time_determinate;
04821 
04822                         /* adjust indeterminate time due to insufficient data (not all was caught) */
04823                         temp_subject->time_indeterminate_nodata=time_indeterminate-temp_subject->time_indeterminate_notrunning;
04824 
04825                         /* initialize values */
04826                         percent_time_up=0.0;
04827                         percent_time_up_scheduled=0.0;
04828                         percent_time_up_unscheduled=0.0;
04829                         percent_time_down=0.0;
04830                         percent_time_down_scheduled=0.0;
04831                         percent_time_down_unscheduled=0.0;
04832                         percent_time_unreachable=0.0;
04833                         percent_time_unreachable_scheduled=0.0;
04834                         percent_time_unreachable_unscheduled=0.0;
04835                         percent_time_indeterminate=0.0;
04836                         percent_time_indeterminate_scheduled=0.0;
04837                         percent_time_indeterminate_unscheduled=0.0;
04838                         percent_time_indeterminate_notrunning=0.0;
04839                         percent_time_indeterminate_nodata=0.0;
04840                         percent_time_up_known=0.0;
04841                         percent_time_up_scheduled_known=0.0;
04842                         percent_time_up_unscheduled_known=0.0;
04843                         percent_time_down_known=0.0;
04844                         percent_time_down_scheduled_known=0.0;
04845                         percent_time_down_unscheduled_known=0.0;
04846                         percent_time_unreachable_known=0.0;
04847                         percent_time_unreachable_scheduled_known=0.0;
04848                         percent_time_unreachable_unscheduled_known=0.0;
04849 
04850                         if(total_time>0){
04851                                 percent_time_up=(double)(((double)temp_subject->time_up*100.0)/(double)total_time);
04852                                 percent_time_up_scheduled=(double)(((double)temp_subject->scheduled_time_up*100.0)/(double)total_time);
04853                                 percent_time_up_unscheduled=percent_time_up-percent_time_up_scheduled;
04854                                 percent_time_down=(double)(((double)temp_subject->time_down*100.0)/(double)total_time);
04855                                 percent_time_down_scheduled=(double)(((double)temp_subject->scheduled_time_down*100.0)/(double)total_time);
04856                                 percent_time_down_unscheduled=percent_time_down-percent_time_down_scheduled;
04857                                 percent_time_unreachable=(double)(((double)temp_subject->time_unreachable*100.0)/(double)total_time);
04858                                 percent_time_unreachable_scheduled=(double)(((double)temp_subject->scheduled_time_unreachable*100.0)/(double)total_time);
04859                                 percent_time_unreachable_unscheduled=percent_time_unreachable-percent_time_unreachable_scheduled;
04860                                 percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
04861                                 percent_time_indeterminate_scheduled=(double)(((double)temp_subject->scheduled_time_indeterminate*100.0)/(double)total_time);
04862                                 percent_time_indeterminate_unscheduled=percent_time_indeterminate-percent_time_indeterminate_scheduled;
04863                                 percent_time_indeterminate_notrunning=(double)(((double)temp_subject->time_indeterminate_notrunning*100.0)/(double)total_time);
04864                                 percent_time_indeterminate_nodata=(double)(((double)temp_subject->time_indeterminate_nodata*100.0)/(double)total_time);
04865                                 if(time_determinate>0){
04866                                         percent_time_up_known=(double)(((double)temp_subject->time_up*100.0)/(double)time_determinate);
04867                                         percent_time_up_scheduled_known=(double)(((double)temp_subject->scheduled_time_up*100.0)/(double)time_determinate);
04868                                         percent_time_up_unscheduled_known=percent_time_up_known-percent_time_up_scheduled_known;
04869                                         percent_time_down_known=(double)(((double)temp_subject->time_down*100.0)/(double)time_determinate);
04870                                         percent_time_down_scheduled_known=(double)(((double)temp_subject->scheduled_time_down*100.0)/(double)time_determinate);
04871                                         percent_time_down_unscheduled_known=percent_time_down_known-percent_time_down_scheduled_known;
04872                                         percent_time_unreachable_known=(double)(((double)temp_subject->time_unreachable*100.0)/(double)time_determinate);
04873                                         percent_time_unreachable_scheduled_known=(double)(((double)temp_subject->scheduled_time_unreachable*100.0)/(double)time_determinate);
04874                                         percent_time_unreachable_unscheduled_known=percent_time_unreachable_known-percent_time_unreachable_scheduled_known;
04875                                 }
04876                         }
04877 
04878                         if(content_type==HTML_CONTENT){
04879 
04880                                 if(odd){
04881                                         odd=0;
04882                                         bgclass="Odd";
04883                                 }else{
04884                                         odd=1;
04885                                         bgclass="Even";
04886                                 }
04887 
04888                                 printf("<tr CLASS='data%s'><td CLASS='data%s'>",bgclass,bgclass);
04889                                 host_report_url(temp_subject->host_name,temp_subject->host_name);
04890                                 printf("</td><td CLASS='hostUP'>%2.3f%% (%2.3f%%)</td><td CLASS='hostDOWN'>%2.3f%% (%2.3f%%)</td><td CLASS='hostUNREACHABLE'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",percent_time_up,percent_time_up_known,percent_time_down,percent_time_down_known,percent_time_unreachable,percent_time_unreachable_known,bgclass,percent_time_indeterminate);
04891                         } else if(content_type==JSON_CONTENT){
04892                                 if (json_start!=TRUE)
04893                                         printf(",\n");
04894 
04895                                 /* host name */
04896                                 printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
04897 
04898                                 /* up times */
04899                                 printf(" \"%s\": %lu, ",lower_header[1],temp_subject->scheduled_time_up);
04900                                 printf(" \"%s\": %2.3f, ",lower_header[2],percent_time_up_scheduled);
04901                                 printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_up_scheduled_known);
04902                                 printf(" \"%s\": %lu, ",lower_header[4],temp_subject->time_up-temp_subject->scheduled_time_up);
04903                                 printf(" \"%s\": %2.3f, ",lower_header[5],percent_time_up_unscheduled);
04904                                 printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_up_unscheduled_known);
04905                                 printf(" \"%s\": %lu, ",lower_header[7],temp_subject->time_up);
04906                                 printf(" \"%s\": %2.3f, ",lower_header[8],percent_time_up);
04907                                 printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_up_known);
04908 
04909                                 /* down times */
04910                                 printf(" \"%s\": %lu, ",lower_header[10],temp_subject->scheduled_time_down);
04911                                 printf(" \"%s\": %2.3f, ",lower_header[11],percent_time_down_scheduled);
04912                                 printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_down_scheduled_known);
04913                                 printf(" \"%s\": %lu, ",lower_header[13],temp_subject->time_down-temp_subject->scheduled_time_down);
04914                                 printf(" \"%s\": %2.3f, ",lower_header[14],percent_time_down_unscheduled);
04915                                 printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_down_unscheduled_known);
04916                                 printf(" \"%s\": %lu, ",lower_header[16],temp_subject->time_down);
04917                                 printf(" \"%s\": %2.3f, ",lower_header[17],percent_time_down);
04918                                 printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_down_known);
04919 
04920                                 /* unreachable times */
04921                                 printf(" \"%s\": %lu, ",lower_header[19],temp_subject->scheduled_time_unreachable);
04922                                 printf(" \"%s\": %2.3f, ",lower_header[20],percent_time_unreachable_scheduled);
04923                                 printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unreachable_scheduled_known);
04924                                 printf(" \"%s\": %lu, ",lower_header[22],temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable);
04925                                 printf(" \"%s\": %2.3f, ",lower_header[23],percent_time_unreachable_unscheduled);
04926                                 printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unreachable_unscheduled_known);
04927                                 printf(" \"%s\": %lu, ",lower_header[25],temp_subject->time_unreachable);
04928                                 printf(" \"%s\": %2.3f, ",lower_header[26],percent_time_unreachable);
04929                                 printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unreachable_known);
04930 
04931                                 /* indeterminate times */
04932                                 printf(" \"%s\": %lu, ",lower_header[28],temp_subject->time_indeterminate_notrunning);
04933                                 printf(" \"%s\": %2.3f, ",lower_header[29],percent_time_indeterminate_notrunning);
04934                                 printf(" \"%s\": %lu, ",lower_header[30],temp_subject->time_indeterminate_nodata);
04935                                 printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_indeterminate_nodata);
04936                                 printf(" \"%s\": %lu, ",lower_header[32],time_indeterminate);
04937                                 printf(" \"%s\": %2.3f} ",lower_header[33],percent_time_indeterminate);
04938 
04939                                 json_start=FALSE;
04940 
04941                         } else if(content_type==CSV_CONTENT){
04942 
04943                                 /* host name */
04944                                 printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
04945 
04946                                 /* up times */
04947                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
04948                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled,csv_data_enclosure,csv_delimiter);
04949                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_scheduled_known,csv_data_enclosure,csv_delimiter);
04950                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up-temp_subject->scheduled_time_up,csv_data_enclosure,csv_delimiter);
04951                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled,csv_data_enclosure,csv_delimiter);
04952                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_unscheduled_known,csv_data_enclosure,csv_delimiter);
04953                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_up,csv_data_enclosure,csv_delimiter);
04954                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up,csv_data_enclosure,csv_delimiter);
04955                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_up_known,csv_data_enclosure,csv_delimiter);
04956 
04957                                 /* down times */
04958                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
04959                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled,csv_data_enclosure,csv_delimiter);
04960                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_scheduled_known,csv_data_enclosure,csv_delimiter);
04961                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down-temp_subject->scheduled_time_down,csv_data_enclosure,csv_delimiter);
04962                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled,csv_data_enclosure,csv_delimiter);
04963                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_unscheduled_known,csv_data_enclosure,csv_delimiter);
04964                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_down,csv_data_enclosure,csv_delimiter);
04965                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down,csv_data_enclosure,csv_delimiter);
04966                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_down_known,csv_data_enclosure,csv_delimiter);
04967 
04968                                 /* unreachable times */
04969                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
04970                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled,csv_data_enclosure,csv_delimiter);
04971                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_scheduled_known,csv_data_enclosure,csv_delimiter);
04972                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable-temp_subject->scheduled_time_unreachable,csv_data_enclosure,csv_delimiter);
04973                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled,csv_data_enclosure,csv_delimiter);
04974                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_unscheduled_known,csv_data_enclosure,csv_delimiter);
04975                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unreachable,csv_data_enclosure,csv_delimiter);
04976                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable,csv_data_enclosure,csv_delimiter);
04977                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unreachable_known,csv_data_enclosure,csv_delimiter);
04978 
04979                                 /* indeterminate times */
04980                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
04981                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
04982                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
04983                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
04984                                 printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
04985                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
04986                                 
04987                                 printf("\n");
04988                         }
04989 
04990                         get_running_average(&average_percent_time_up,percent_time_up,current_subject);
04991                         get_running_average(&average_percent_time_up_known,percent_time_up_known,current_subject);
04992                         get_running_average(&average_percent_time_down,percent_time_down,current_subject);
04993                         get_running_average(&average_percent_time_down_known,percent_time_down_known,current_subject);
04994                         get_running_average(&average_percent_time_unreachable,percent_time_unreachable,current_subject);
04995                         get_running_average(&average_percent_time_unreachable_known,percent_time_unreachable_known,current_subject);
04996                         get_running_average(&average_percent_time_indeterminate,percent_time_indeterminate,current_subject);
04997                 }
04998 
04999                 if(content_type==HTML_CONTENT){
05000 
05001                         /* average statistics */
05002                         if(odd){
05003                                 odd=0;
05004                                 bgclass="Odd";
05005                         }else{
05006                                 odd=1;
05007                                 bgclass="Even";
05008                         }
05009                         printf("<tr CLASS='data%s'><td CLASS='data%s'>Average</td><td CLASS='hostUP'>%2.3f%% (%2.3f%%)</td><td CLASS='hostDOWN'>%2.3f%% (%2.3f%%)</td><td CLASS='hostUNREACHABLE'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>",bgclass,bgclass,average_percent_time_up,average_percent_time_up_known,average_percent_time_down,average_percent_time_down_known,average_percent_time_unreachable,average_percent_time_unreachable_known,bgclass,average_percent_time_indeterminate);
05010 
05011                         printf("</table>\n");
05012                         printf("</DIV>\n");
05013                 }else if (content_type==JSON_CONTENT){
05014                         printf(",{ \"average_percent_time_up\": %2.3f, ",average_percent_time_up);
05015                         printf("\"average_percent_time_up_known\": %2.3f, ",average_percent_time_up_known);
05016                         printf("\"average_percent_time_down\": %2.3f, ",average_percent_time_down);
05017                         printf("\"average_percent_time_down_known\": %2.3f, ",average_percent_time_down_known);
05018                         printf("\"average_percent_time_unreachable\": %2.3f, ",average_percent_time_unreachable);
05019                         printf("\"average_percent_time_unreachable_known\": %2.3f, ",average_percent_time_unreachable_known);
05020                         printf("\"average_percent_time_indeterminate\": %2.3f }",average_percent_time_indeterminate);
05021                         printf(" ] }\n");
05022                 } else if(content_type==CSV_CONTENT){
05023                         /* average */
05024                         /* left for future rework */
05025                 }
05026         }
05027 
05028         return;
05029 }
05030 
05031 
05032 /* display service availability */
05033 void display_service_availability(void){
05034         unsigned long total_time;
05035         unsigned long time_determinate;
05036         unsigned long time_indeterminate;
05037         avail_subject *temp_subject;
05038         service *temp_service;
05039         int days, hours, minutes, seconds;
05040         char time_ok_string[48];
05041         char time_warning_string[48];
05042         char time_unknown_string[48];
05043         char time_critical_string[48];
05044         char time_indeterminate_string[48];
05045         char time_determinate_string[48];
05046         char total_time_string[48];
05047         double percent_time_ok=0.0;
05048         double percent_time_warning=0.0;
05049         double percent_time_unknown=0.0;
05050         double percent_time_critical=0.0;
05051         double percent_time_indeterminate=0.0;
05052         double percent_time_ok_known=0.0;
05053         double percent_time_warning_known=0.0;
05054         double percent_time_unknown_known=0.0;
05055         double percent_time_critical_known=0.0;
05056 
05057         char time_critical_scheduled_string[48];
05058         char time_critical_unscheduled_string[48];
05059         double percent_time_critical_scheduled=0.0;
05060         double percent_time_critical_unscheduled=0.0;
05061         double percent_time_critical_scheduled_known=0.0;
05062         double percent_time_critical_unscheduled_known=0.0;
05063         char time_unknown_scheduled_string[48];
05064         char time_unknown_unscheduled_string[48];
05065         double percent_time_unknown_scheduled=0.0;
05066         double percent_time_unknown_unscheduled=0.0;
05067         double percent_time_unknown_scheduled_known=0.0;
05068         double percent_time_unknown_unscheduled_known=0.0;
05069         char time_warning_scheduled_string[48];
05070         char time_warning_unscheduled_string[48];
05071         double percent_time_warning_scheduled=0.0;
05072         double percent_time_warning_unscheduled=0.0;
05073         double percent_time_warning_scheduled_known=0.0;
05074         double percent_time_warning_unscheduled_known=0.0;
05075         char time_ok_scheduled_string[48];
05076         char time_ok_unscheduled_string[48];
05077         double percent_time_ok_scheduled=0.0;
05078         double percent_time_ok_unscheduled=0.0;
05079         double percent_time_ok_scheduled_known=0.0;
05080         double percent_time_ok_unscheduled_known=0.0;
05081 
05082         double average_percent_time_ok=0.0;
05083         double average_percent_time_ok_known=0.0;
05084         double average_percent_time_unknown=0.0;
05085         double average_percent_time_unknown_known=0.0;
05086         double average_percent_time_warning=0.0;
05087         double average_percent_time_warning_known=0.0;
05088         double average_percent_time_critical=0.0;
05089         double average_percent_time_critical_known=0.0;
05090         double average_percent_time_indeterminate=0.0;
05091 
05092         int current_subject=0;
05093 
05094         char time_indeterminate_scheduled_string[48];
05095         char time_indeterminate_unscheduled_string[48];
05096         double percent_time_indeterminate_scheduled=0.0;
05097         double percent_time_indeterminate_unscheduled=0.0;
05098         char time_indeterminate_notrunning_string[48];
05099         char time_indeterminate_nodata_string[48];
05100         double percent_time_indeterminate_notrunning=0.0;
05101         double percent_time_indeterminate_nodata=0.0;
05102 
05103         int odd=1;
05104         int i=0, j=0;
05105         char *bgclass="";
05106         char last_host[128]="";
05107         char *header[44];
05108         int json_start=TRUE;
05109         char lower_header[44][100];
05110         int len=0;
05111 
05112 
05113         /* calculate total time during period based on timeperiod used for reporting */
05114         total_time=calculate_total_time(t1,t2);
05115 
05116         /* fields for csv and json output */
05117         header[0] = "HOST_NAME";
05118         header[1] = "SERVICE_DESCRIPTION";
05119 
05120         /* ok times */
05121         header[2] = "TIME_OK_SCHEDULED";
05122         header[3] = "PERCENT_TIME_OK_SCHEDULED";
05123         header[4] = "PERCENT_KNOWN_TIME_OK_SCHEDULED";
05124         header[5] = "TIME_OK_UNSCHEDULED";
05125         header[6] = "PERCENT_TIME_OK_UNSCHEDULED";
05126         header[7] = "PERCENT_KNOWN_TIME_OK_UNSCHEDULED";
05127         header[8] = "TOTAL_TIME_OK";
05128         header[9] = "PERCENT_TOTAL_TIME_OK";
05129         header[10] = "PERCENT_KNOWN_TIME_OK";
05130 
05131         /* warning times */
05132         header[11] = "TIME_WARNING_SCHEDULED";
05133         header[12] = "PERCENT_TIME_WARNING_SCHEDULED";
05134         header[13] = "PERCENT_KNOWN_TIME_WARNING_SCHEDULED";
05135         header[14] = "TIME_WARNING_UNSCHEDULED";
05136         header[15] = "PERCENT_TIME_WARNING_UNSCHEDULED";
05137         header[16] = "PERCENT_KNOWN_TIME_WARNING_UNSCHEDULED";
05138         header[17] = "TOTAL_TIME_WARNING";
05139         header[18] = "PERCENT_TOTAL_TIME_WARNING";
05140         header[19] = "PERCENT_KNOWN_TIME_WARNING";
05141 
05142         /* unknown times */
05143         header[20] = "TIME_UNKNOWN_SCHEDULED";
05144         header[21] = "PERCENT_TIME_UNKNOWN_SCHEDULED";
05145         header[22] = "PERCENT_KNOWN_TIME_UNKNOWN_SCHEDULED";
05146         header[23] = "TIME_UNKNOWN_UNSCHEDULED";
05147         header[24] = "PERCENT_TIME_UNKNOWN_UNSCHEDULED";
05148         header[25] = "PERCENT_KNOWN_TIME_UNKNOWN_UNSCHEDULED";
05149         header[26] = "TOTAL_TIME_UNKNOWN";
05150         header[27] = "PERCENT_TOTAL_TIME_UNKNOWN";
05151         header[28] = "PERCENT_KNOWN_TIME_UNKNOWN";
05152 
05153         /* critical times */
05154         header[29] = "TIME_CRITICAL_SCHEDULED";
05155         header[30] = "PERCENT_TIME_CRITICAL_SCHEDULED";
05156         header[31] = "PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED";
05157         header[32] = "TIME_CRITICAL_UNSCHEDULED";
05158         header[33] = "PERCENT_TIME_CRITICAL_UNSCHEDULED";
05159         header[34] = "PERCENT_KNOWN_TIME_CRITICAL_UNSCHEDULED";
05160         header[35] = "TOTAL_TIME_CRITICAL";
05161         header[36] = "PERCENT_TOTAL_TIME_CRITICAL";
05162         header[37] = "PERCENT_KNOWN_TIME_CRITICAL";
05163 
05164         /* indeterminate times */
05165         header[38] = "TIME_UNDETERMINED_NOT_RUNNING";
05166         header[39] = "PERCENT_TIME_UNDETERMINED_NOT_RUNNING";
05167         header[40] = "TIME_UNDETERMINED_NO_DATA";
05168         header[41] = "PERCENT_TIME_UNDETERMINED_NO_DATA";
05169         header[42] = "TOTAL_TIME_UNDETERMINED";
05170         header[43] = "PERCENT_TOTAL_TIME_UNDETERMINED";
05171 
05172         if(content_type==JSON_CONTENT){
05173                 /* converting to lower case */
05174                 for(i=0;i<44;i++) {
05175                         len=(int)strlen(header[i]);
05176                         for(j=0;j<len;j++) {
05177                                 if (header[i][j]=='_')
05178                                         lower_header[i][j]=header[i][j];
05179                                 else
05180                                         lower_header[i][j]=header[i][j]+32;
05181                         }
05182                         lower_header[i][len]='\x0';
05183                 }
05184         }
05185 
05186         /* we're only getting data for one service */
05187         if(show_all_services==FALSE){
05188 
05189                 temp_subject=find_subject(SERVICE_SUBJECT,host_name,service_desc);
05190                 if(temp_subject==NULL)
05191                         return;
05192 
05193                 temp_service=find_service(temp_subject->host_name,temp_subject->service_description);
05194                 if(temp_service==NULL)
05195                         return;
05196 
05197                 /* the user isn't authorized to view this service */
05198                 if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
05199                         return;
05200 
05201                 time_determinate=temp_subject->time_ok+temp_subject->time_warning+temp_subject->time_unknown+temp_subject->time_critical;
05202                 time_indeterminate=total_time-time_determinate;
05203 
05204                 /* adjust indeterminate time due to insufficient data (not all was caught) */
05205                 temp_subject->time_indeterminate_nodata=time_indeterminate-temp_subject->time_indeterminate_notrunning;
05206 
05207                 /* ok states */
05208                 get_time_breakdown(temp_subject->time_ok,&days,&hours,&minutes,&seconds);
05209                 snprintf(time_ok_string,sizeof(time_ok_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05210                 get_time_breakdown(temp_subject->scheduled_time_ok,&days,&hours,&minutes,&seconds);
05211                 snprintf(time_ok_scheduled_string,sizeof(time_ok_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05212                 get_time_breakdown(temp_subject->time_ok-temp_subject->scheduled_time_ok,&days,&hours,&minutes,&seconds);
05213                 snprintf(time_ok_unscheduled_string,sizeof(time_ok_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05214 
05215                 /* warning states */
05216                 get_time_breakdown(temp_subject->time_warning,&days,&hours,&minutes,&seconds);
05217                 snprintf(time_warning_string,sizeof(time_warning_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05218                 get_time_breakdown(temp_subject->scheduled_time_warning,&days,&hours,&minutes,&seconds);
05219                 snprintf(time_warning_scheduled_string,sizeof(time_warning_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05220                 get_time_breakdown(temp_subject->time_warning-temp_subject->scheduled_time_warning,&days,&hours,&minutes,&seconds);
05221                 snprintf(time_warning_unscheduled_string,sizeof(time_warning_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05222 
05223                 /* unknown states */
05224                 get_time_breakdown(temp_subject->time_unknown,&days,&hours,&minutes,&seconds);
05225                 snprintf(time_unknown_string,sizeof(time_unknown_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05226                 get_time_breakdown(temp_subject->scheduled_time_unknown,&days,&hours,&minutes,&seconds);
05227                 snprintf(time_unknown_scheduled_string,sizeof(time_unknown_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05228                 get_time_breakdown(temp_subject->time_unknown-temp_subject->scheduled_time_unknown,&days,&hours,&minutes,&seconds);
05229                 snprintf(time_unknown_unscheduled_string,sizeof(time_unknown_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05230 
05231                 /* critical states */
05232                 get_time_breakdown(temp_subject->time_critical,&days,&hours,&minutes,&seconds);
05233                 snprintf(time_critical_string,sizeof(time_critical_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05234                 get_time_breakdown(temp_subject->scheduled_time_critical,&days,&hours,&minutes,&seconds);
05235                 snprintf(time_critical_scheduled_string,sizeof(time_critical_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05236                 get_time_breakdown(temp_subject->time_critical-temp_subject->scheduled_time_critical,&days,&hours,&minutes,&seconds);
05237                 snprintf(time_critical_unscheduled_string,sizeof(time_critical_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05238 
05239                 /* indeterminate time */
05240                 get_time_breakdown(time_indeterminate,&days,&hours,&minutes,&seconds);
05241                 snprintf(time_indeterminate_string,sizeof(time_indeterminate_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05242                 get_time_breakdown(temp_subject->scheduled_time_indeterminate,&days,&hours,&minutes,&seconds);
05243                 snprintf(time_indeterminate_scheduled_string,sizeof(time_indeterminate_scheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05244                 get_time_breakdown(time_indeterminate-temp_subject->scheduled_time_indeterminate,&days,&hours,&minutes,&seconds);
05245                 snprintf(time_indeterminate_unscheduled_string,sizeof(time_indeterminate_unscheduled_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05246                 get_time_breakdown(temp_subject->time_indeterminate_notrunning,&days,&hours,&minutes,&seconds);
05247                 snprintf(time_indeterminate_notrunning_string,sizeof(time_indeterminate_notrunning_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05248                 get_time_breakdown(temp_subject->time_indeterminate_nodata,&days,&hours,&minutes,&seconds);
05249                 snprintf(time_indeterminate_nodata_string,sizeof(time_indeterminate_nodata_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05250 
05251                 get_time_breakdown(time_determinate,&days,&hours,&minutes,&seconds);
05252                 snprintf(time_determinate_string,sizeof(time_determinate_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05253 
05254                 get_time_breakdown(total_time,&days,&hours,&minutes,&seconds);
05255                 snprintf(total_time_string,sizeof(total_time_string)-1,"%dd %dh %dm %ds",days,hours,minutes,seconds);
05256 
05257                 if(total_time>0){
05258                         percent_time_ok=(double)(((double)temp_subject->time_ok*100.0)/(double)total_time);
05259                         percent_time_ok_scheduled=(double)(((double)temp_subject->scheduled_time_ok*100.0)/(double)total_time);
05260                         percent_time_ok_unscheduled=percent_time_ok-percent_time_ok_scheduled;
05261                         percent_time_warning=(double)(((double)temp_subject->time_warning*100.0)/(double)total_time);
05262                         percent_time_warning_scheduled=(double)(((double)temp_subject->scheduled_time_unknown*100.0)/(double)total_time);
05263                         percent_time_warning_unscheduled=percent_time_warning-percent_time_warning_scheduled;
05264                         percent_time_unknown=(double)(((double)temp_subject->time_unknown*100.0)/(double)total_time);
05265                         percent_time_unknown_scheduled=(double)(((double)temp_subject->scheduled_time_unknown*100.0)/(double)total_time);
05266                         percent_time_unknown_unscheduled=percent_time_unknown-percent_time_unknown_scheduled;
05267                         percent_time_critical=(double)(((double)temp_subject->time_critical*100.0)/(double)total_time);
05268                         percent_time_critical_scheduled=(double)(((double)temp_subject->scheduled_time_critical*100.0)/(double)total_time);
05269                         percent_time_critical_unscheduled=percent_time_critical-percent_time_critical_scheduled;
05270                         percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
05271                         percent_time_indeterminate_scheduled=(double)(((double)temp_subject->scheduled_time_indeterminate*100.0)/(double)total_time);
05272                         percent_time_indeterminate_unscheduled=percent_time_indeterminate-percent_time_indeterminate_scheduled;
05273                         percent_time_indeterminate_notrunning=(double)(((double)temp_subject->time_indeterminate_notrunning*100.0)/(double)total_time);
05274                         percent_time_indeterminate_nodata=(double)(((double)temp_subject->time_indeterminate_nodata*100.0)/(double)total_time);
05275                         if(time_determinate>0){
05276                                 percent_time_ok_known=(double)(((double)temp_subject->time_ok*100.0)/(double)time_determinate);
05277                                 percent_time_ok_scheduled_known=(double)(((double)temp_subject->scheduled_time_ok*100.0)/(double)time_determinate);
05278                                 percent_time_ok_unscheduled_known=percent_time_ok_known-percent_time_ok_scheduled_known;
05279                                 percent_time_warning_known=(double)(((double)temp_subject->time_warning*100.0)/(double)time_determinate);
05280                                 percent_time_warning_scheduled_known=(double)(((double)temp_subject->scheduled_time_warning*100.0)/(double)time_determinate);
05281                                 percent_time_warning_unscheduled_known=percent_time_warning_known-percent_time_warning_scheduled_known;
05282                                 percent_time_unknown_known=(double)(((double)temp_subject->time_unknown*100.0)/(double)time_determinate);
05283                                 percent_time_unknown_scheduled_known=(double)(((double)temp_subject->scheduled_time_unknown*100.0)/(double)time_determinate);
05284                                 percent_time_unknown_unscheduled_known=percent_time_unknown_known-percent_time_unknown_scheduled_known;
05285                                 percent_time_critical_known=(double)(((double)temp_subject->time_critical*100.0)/(double)time_determinate);
05286                                 percent_time_critical_scheduled_known=(double)(((double)temp_subject->scheduled_time_critical*100.0)/(double)time_determinate);
05287                                 percent_time_critical_unscheduled_known=percent_time_critical_known-percent_time_critical_scheduled_known;
05288                                 }
05289                         }
05290 
05291                 if(content_type==HTML_CONTENT){
05292 
05293                         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Service State Breakdowns:</DIV>\n");
05294 #ifdef USE_TRENDS
05295                         printf("<p align='center'>\n");
05296                         printf("<a href='%s?host=%s",TRENDS_CGI,url_encode(host_name));
05297                         printf("&service=%s&t1=%lu&t2=%lu&includesoftstates=%s&assumestateretention=%s&assumeinitialstates=%s&assumestatesduringnotrunning=%s&initialassumedservicestate=%d&backtrack=%d'>",url_encode(service_desc),t1,t2,(include_soft_states==TRUE)?"yes":"no",(assume_state_retention==TRUE)?"yes":"no",(assume_initial_states==TRUE)?"yes":"no",(assume_states_during_notrunning==TRUE)?"yes":"no",initial_assumed_service_state,backtrack_archives);
05298                         printf("<img src='%s?createimage&smallimage&host=%s",TRENDS_CGI,url_encode(host_name));
05299                         printf("&service=%s&t1=%lu&t2=%lu&includesoftstates=%s&assumestateretention=%s&assumeinitialstates=%s&assumestatesduringnotrunning=%s&initialassumedservicestate=%d&backtrack=%d' border=1 alt='Service State Trends' title='Service State Trends' width='500' height='20'>",url_encode(service_desc),t1,t2,(include_soft_states==TRUE)?"yes":"no",(assume_state_retention==TRUE)?"yes":"no",(assume_initial_states==TRUE)?"yes":"no",(assume_states_during_notrunning==TRUE)?"yes":"no",initial_assumed_service_state,backtrack_archives);
05300                         printf("</a><br>\n");
05301                         printf("</p>\n");
05302 #endif
05303 
05304                         printf("<DIV ALIGN=CENTER>\n");
05305                         printf("<TABLE BORDER=0 CLASS='data'>\n");
05306                         printf("<TR><TH CLASS='data'>State</TH><TH CLASS='data'>Type / Reason</TH><TH CLASS='data'>Time</TH><TH CLASS='data'>%% Total Time</TH><TH CLASS='data'>%% Known Time</TH></TR>\n");
05307 
05308                         /* ok states */
05309                         printf("<tr CLASS='dataEven'><td CLASS='serviceOK' rowspan=3>OK</td>");
05310                         printf("<td CLASS='dataEven'>Unscheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'>%2.3f%%</td></tr>\n",time_ok_unscheduled_string,percent_time_ok_unscheduled,percent_time_ok_unscheduled_known);
05311                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Scheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'>%2.3f%%</td></tr>\n",time_ok_scheduled_string,percent_time_ok_scheduled,percent_time_ok_scheduled_known);
05312                         printf("<tr CLASS='serviceOK'><td CLASS='serviceOK'>Total</td><td CLASS='serviceOK'>%s</td><td CLASS='serviceOK'>%2.3f%%</td><td CLASS='serviceOK'>%2.3f%%</td></tr>\n",time_ok_string,percent_time_ok,percent_time_ok_known);
05313 
05314                         /* warning states */
05315                         printf("<tr CLASS='dataOdd'><td CLASS='serviceWARNING' rowspan=3>WARNING</td>");
05316                         printf("<td CLASS='dataOdd'>Unscheduled</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'>%2.3f%%</td></tr>\n",time_warning_unscheduled_string,percent_time_warning_unscheduled,percent_time_warning_unscheduled_known);
05317                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd'>Scheduled</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'>%2.3f%%</td></tr>\n",time_warning_scheduled_string,percent_time_warning_scheduled,percent_time_warning_scheduled_known);
05318                         printf("<tr CLASS='serviceWARNING'><td CLASS='serviceWARNING'>Total</td><td CLASS='serviceWARNING'>%s</td><td CLASS='serviceWARNING'>%2.3f%%</td><td CLASS='serviceWARNING'>%2.3f%%</td></tr>\n",time_warning_string,percent_time_warning,percent_time_warning_known);
05319 
05320                         /* unknown states */
05321                         printf("<tr CLASS='dataEven'><td CLASS='serviceUNKNOWN' rowspan=3>UNKNOWN</td>");
05322                         printf("<td CLASS='dataEven'>Unscheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'>%2.3f%%</td></tr>\n",time_unknown_unscheduled_string,percent_time_unknown_unscheduled,percent_time_unknown_unscheduled_known);
05323                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Scheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'>%2.3f%%</td></tr>\n",time_unknown_scheduled_string,percent_time_unknown_scheduled,percent_time_unknown_scheduled_known);
05324                         printf("<tr CLASS='serviceUNKNOWN'><td CLASS='serviceUNKNOWN'>Total</td><td CLASS='serviceUNKNOWN'>%s</td><td CLASS='serviceUNKNOWN'>%2.3f%%</td><td CLASS='serviceUNKNOWN'>%2.3f%%</td></tr>\n",time_unknown_string,percent_time_unknown,percent_time_unknown_known);
05325 
05326                         /* critical states */
05327                         printf("<tr CLASS='dataOdd'><td CLASS='serviceCRITICAL' rowspan=3>CRITICAL</td>");
05328                         printf("<td CLASS='dataOdd'>Unscheduled</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'>%2.3f%%</td></tr>\n",time_critical_unscheduled_string,percent_time_critical_unscheduled,percent_time_critical_unscheduled_known);
05329                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd'>Scheduled</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>%2.3f%%</td><td CLASS='dataOdd'>%2.3f%%</td></tr>\n",time_critical_scheduled_string,percent_time_critical_scheduled,percent_time_critical_scheduled_known);
05330                         printf("<tr CLASS='serviceCRITICAL'><td CLASS='serviceCRITICAL'>Total</td><td CLASS='serviceCRITICAL'>%s</td><td CLASS='serviceCRITICAL'>%2.3f%%</td><td CLASS='serviceCRITICAL'>%2.3f%%</td></tr>\n",time_critical_string,percent_time_critical,percent_time_critical_known);
05331 
05332 
05333                         printf("<tr CLASS='dataEven'><td CLASS='dataEven' rowspan=3>Undetermined</td>");
05334                         /*
05335                         printf("<td CLASS='dataEven'>Unscheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'></td></tr>\n",time_indeterminate_unscheduled_string,percent_time_indeterminate_unscheduled);
05336                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Scheduled</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'></td></tr>\n",time_indeterminate_scheduled_string,percent_time_indeterminate_scheduled);
05337                         */
05338                         printf("<td CLASS='dataEven'>%s Not Running</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'></td></tr>\n", PROGRAM_VERSION, time_indeterminate_notrunning_string, percent_time_indeterminate_notrunning);
05339                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Insufficient Data</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'></td></tr>\n",time_indeterminate_nodata_string,percent_time_indeterminate_nodata);
05340                         printf("<tr CLASS='dataEven'><td CLASS='dataEven'>Total</td><td CLASS='dataEven'>%s</td><td CLASS='dataEven'>%2.3f%%</td><td CLASS='dataEven'></td></tr>\n",time_indeterminate_string,percent_time_indeterminate);
05341 
05342                         printf("<tr><td colspan=3></td></tr>\n");
05343                         printf("<tr CLASS='dataOdd'><td CLASS='dataOdd'>All</td><td CLASS='dataOdd'>Total</td><td CLASS='dataOdd'>%s</td><td CLASS='dataOdd'>100.000%%</td><td CLASS='dataOdd'>100.000%%</td></tr>\n",total_time_string);
05344                         printf("</table>\n");
05345                         printf("</DIV>\n");
05346 
05347                 } else if(content_type==JSON_CONTENT){
05348                         printf("\"service_availability\": {\n");
05349                         printf("\"services\": [\n");
05350 
05351                         /* host name and service description */
05352                         printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
05353                         printf(" \"%s\": \"%s\", ",lower_header[1],json_encode(temp_subject->service_description));
05354 
05355                         /* ok times */
05356                         printf(" \"%s\": %lu, ",lower_header[2],temp_subject->scheduled_time_ok);
05357                         printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_ok_scheduled);
05358                         printf(" \"%s\": %2.3f, ",lower_header[4],percent_time_ok_scheduled_known);
05359                         printf(" \"%s\": %lu, ",lower_header[5],temp_subject->time_ok-temp_subject->scheduled_time_ok);
05360                         printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_ok_unscheduled);
05361                         printf(" \"%s\": %2.3f, ",lower_header[7],percent_time_ok_unscheduled_known);
05362                         printf(" \"%s\": %lu, ",lower_header[8],temp_subject->time_ok);
05363                         printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_ok);
05364                         printf(" \"%s\": %2.3f, ",lower_header[10],percent_time_ok_known);
05365 
05366                         /* warning times */
05367                         printf(" \"%s\": %lu, ",lower_header[11],temp_subject->scheduled_time_warning);
05368                         printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_warning_scheduled);
05369                         printf(" \"%s\": %2.3f, ",lower_header[13],percent_time_warning_scheduled_known);
05370                         printf(" \"%s\": %lu, ",lower_header[14],temp_subject->time_warning-temp_subject->scheduled_time_warning);
05371                         printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_warning_unscheduled);
05372                         printf(" \"%s\": %2.3f, ",lower_header[16],percent_time_warning_unscheduled_known);
05373                         printf(" \"%s\": %lu, ",lower_header[17],temp_subject->time_warning);
05374                         printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_warning);
05375                         printf(" \"%s\": %2.3f, ",lower_header[19],percent_time_warning_known);
05376 
05377                         /* unknown times */
05378                         printf(" \"%s\": %lu, ",lower_header[20],temp_subject->scheduled_time_unknown);
05379                         printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unknown_scheduled);
05380                         printf(" \"%s\": %2.3f, ",lower_header[22],percent_time_unknown_scheduled_known);
05381                         printf(" \"%s\": %lu, ",lower_header[23],temp_subject->time_unknown-temp_subject->scheduled_time_unknown);
05382                         printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unknown_unscheduled);
05383                         printf(" \"%s\": %2.3f, ",lower_header[25],percent_time_unknown_unscheduled_known);
05384                         printf(" \"%s\": %lu, ",lower_header[26],temp_subject->time_unknown);
05385                         printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unknown);
05386                         printf(" \"%s\": %2.3f, ",lower_header[28],percent_time_unknown_known);
05387 
05388                         /* critical times */
05389                         printf(" \"%s\": %lu, ",lower_header[29],temp_subject->scheduled_time_critical);
05390                         printf(" \"%s\": %2.3f, ",lower_header[30],percent_time_critical_scheduled);
05391                         printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_critical_scheduled_known);
05392                         printf(" \"%s\": %lu, ",lower_header[32],temp_subject->time_critical-temp_subject->scheduled_time_critical);
05393                         printf(" \"%s\": %2.3f, ",lower_header[33],percent_time_critical_unscheduled);
05394                         printf(" \"%s\": %2.3f, ",lower_header[34],percent_time_critical_unscheduled_known);
05395                         printf(" \"%s\": %lu, ",lower_header[35],temp_subject->time_critical);
05396                         printf(" \"%s\": %2.3f, ",lower_header[36],percent_time_critical);
05397                         printf(" \"%s\": %2.3f, ",lower_header[37],percent_time_critical_known);
05398 
05399 
05400                         /* indeterminate times */
05401                         printf(" \"%s\": %lu, ",lower_header[38],temp_subject->time_indeterminate_notrunning);
05402                         printf(" \"%s\": %2.3f, ",lower_header[39],percent_time_indeterminate_notrunning);
05403                         printf(" \"%s\": %lu, ",lower_header[40],temp_subject->time_indeterminate_nodata);
05404                         printf(" \"%s\": %2.3f, ",lower_header[41],percent_time_indeterminate_nodata);
05405                         printf(" \"%s\": %lu, ",lower_header[42],time_indeterminate);
05406                         printf(" \"%s\": %2.3f}\n]\n}",lower_header[43],percent_time_indeterminate);
05407 
05408                 } else if(content_type==CSV_CONTENT){
05409 
05410                         for(i=0;i<44;i++)
05411                                 printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
05412 
05413                         printf("\n");
05414 
05415                         /* host name and service description */
05416                         printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
05417                         printf("%s%s%s%s",csv_data_enclosure,temp_subject->service_description,csv_data_enclosure,csv_delimiter);
05418 
05419                         /* ok times */
05420                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_ok,csv_data_enclosure,csv_delimiter);
05421                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_scheduled,csv_data_enclosure,csv_delimiter);
05422                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_scheduled_known,csv_data_enclosure,csv_delimiter);
05423                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_ok-temp_subject->scheduled_time_ok,csv_data_enclosure,csv_delimiter);
05424                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_unscheduled,csv_data_enclosure,csv_delimiter);
05425                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_unscheduled_known,csv_data_enclosure,csv_delimiter);
05426                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_ok,csv_data_enclosure,csv_delimiter);
05427                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok,csv_data_enclosure,csv_delimiter);
05428                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_known,csv_data_enclosure,csv_delimiter);
05429 
05430                         /* warning times */
05431                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_warning,csv_data_enclosure,csv_delimiter);
05432                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_scheduled,csv_data_enclosure,csv_delimiter);
05433                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_scheduled_known,csv_data_enclosure,csv_delimiter);
05434                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_warning-temp_subject->scheduled_time_warning,csv_data_enclosure,csv_delimiter);
05435                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_unscheduled,csv_data_enclosure,csv_delimiter);
05436                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_unscheduled_known,csv_data_enclosure,csv_delimiter);
05437                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_warning,csv_data_enclosure,csv_delimiter);
05438                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning,csv_data_enclosure,csv_delimiter);
05439                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_known,csv_data_enclosure,csv_delimiter);
05440 
05441                         /* unknown times */
05442                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unknown,csv_data_enclosure,csv_delimiter);
05443                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_scheduled,csv_data_enclosure,csv_delimiter);
05444                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_scheduled_known,csv_data_enclosure,csv_delimiter);
05445                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unknown-temp_subject->scheduled_time_unknown,csv_data_enclosure,csv_delimiter);
05446                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_unscheduled,csv_data_enclosure,csv_delimiter);
05447                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_unscheduled_known,csv_data_enclosure,csv_delimiter);
05448                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unknown,csv_data_enclosure,csv_delimiter);
05449                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown,csv_data_enclosure,csv_delimiter);
05450                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_known,csv_data_enclosure,csv_delimiter);
05451 
05452                         /* critical times */
05453                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_critical,csv_data_enclosure,csv_delimiter);
05454                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_scheduled,csv_data_enclosure,csv_delimiter);
05455                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_scheduled_known,csv_data_enclosure,csv_delimiter);
05456                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_critical-temp_subject->scheduled_time_critical,csv_data_enclosure,csv_delimiter);
05457                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_unscheduled,csv_data_enclosure,csv_delimiter);
05458                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_unscheduled_known,csv_data_enclosure,csv_delimiter);
05459                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_critical,csv_data_enclosure,csv_delimiter);
05460                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical,csv_data_enclosure,csv_delimiter);
05461                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_known,csv_data_enclosure,csv_delimiter);
05462 
05463                         /* indeterminate times */
05464                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
05465                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
05466                         printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
05467                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
05468                         printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
05469                         printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
05470 
05471                         printf("\n");
05472 
05473                 }
05474 
05475 
05476                 write_log_entries(temp_subject);
05477         }
05478 
05479 
05480         /* display data for all services */
05481         else{
05482 
05483                 if(content_type==HTML_CONTENT){
05484 
05485                         printf("<DIV ALIGN=CENTER CLASS='dataTitle'>Service State Breakdowns:</DIV>\n");
05486 
05487                         printf("<DIV ALIGN=CENTER>\n");
05488                         printf("<TABLE BORDER=0 CLASS='data'>\n");
05489                         printf("<TR><TH CLASS='data'>Host</TH><TH CLASS='data'>Service</TH><TH CLASS='data'>%% Time OK</TH><TH CLASS='data'>%% Time Warning</TH><TH CLASS='data'>%% Time Unknown</TH><TH CLASS='data'>%% Time Critical</TH><TH CLASS='data'>%% Time Undetermined</TH></TR>\n");
05490 
05491                 }else if(content_type==JSON_CONTENT){
05492                         printf("\"service_availability\": {\n");
05493                         printf("\"services\": [\n");
05494                 }else if(content_type==CSV_CONTENT){
05495 
05496                         for(i=0;i<44;i++)
05497                                 printf("%s%s%s%s",csv_data_enclosure,header[i],csv_data_enclosure,csv_delimiter);
05498 
05499                         printf("\n");
05500                 }
05501 
05502 
05503                 for(temp_subject=subject_list;temp_subject!=NULL;temp_subject=temp_subject->next){
05504 
05505                         if(temp_subject->type!=SERVICE_SUBJECT)
05506                                 continue;
05507 
05508                         temp_service=find_service(temp_subject->host_name,temp_subject->service_description);
05509                         if(temp_service==NULL)
05510                                 continue;
05511 
05512                         /* the user isn't authorized to view this service */
05513                         if(is_authorized_for_service(temp_service,&current_authdata)==FALSE)
05514                                 continue;
05515 
05516                         current_subject++;
05517 
05518                         time_determinate=temp_subject->time_ok+temp_subject->time_warning+temp_subject->time_unknown+temp_subject->time_critical;
05519                         time_indeterminate=total_time-time_determinate;
05520 
05521                         /* adjust indeterminate time due to insufficient data (not all was caught) */
05522                         temp_subject->time_indeterminate_nodata=time_indeterminate-temp_subject->time_indeterminate_notrunning;
05523 
05524                         /* initialize values */
05525                         percent_time_ok=0.0;
05526                         percent_time_ok_scheduled=0.0;
05527                         percent_time_ok_unscheduled=0.0;
05528                         percent_time_warning=0.0;
05529                         percent_time_warning_scheduled=0.0;
05530                         percent_time_warning_unscheduled=0.0;
05531                         percent_time_unknown=0.0;
05532                         percent_time_unknown_scheduled=0.0;
05533                         percent_time_unknown_unscheduled=0.0;
05534                         percent_time_critical=0.0;
05535                         percent_time_critical_scheduled=0.0;
05536                         percent_time_critical_unscheduled=0.0;
05537                         percent_time_indeterminate=0.0;
05538                         percent_time_indeterminate_scheduled=0.0;
05539                         percent_time_indeterminate_unscheduled=0.0;
05540                         percent_time_indeterminate_notrunning=0.0;
05541                         percent_time_indeterminate_nodata=0.0;
05542                         percent_time_ok_known=0.0;
05543                         percent_time_ok_scheduled_known=0.0;
05544                         percent_time_ok_unscheduled_known=0.0;
05545                         percent_time_warning_known=0.0;
05546                         percent_time_warning_scheduled_known=0.0;
05547                         percent_time_warning_unscheduled_known=0.0;
05548                         percent_time_unknown_known=0.0;
05549                         percent_time_unknown_scheduled_known=0.0;
05550                         percent_time_unknown_unscheduled_known=0.0;
05551                         percent_time_critical_known=0.0;
05552                         percent_time_critical_scheduled_known=0.0;
05553                         percent_time_critical_unscheduled_known=0.0;
05554 
05555                         if(total_time>0){
05556                                 percent_time_ok=(double)(((double)temp_subject->time_ok*100.0)/(double)total_time);
05557                                 percent_time_ok_scheduled=(double)(((double)temp_subject->scheduled_time_ok*100.0)/(double)total_time);
05558                                 percent_time_ok_unscheduled=percent_time_ok-percent_time_ok_scheduled;
05559                                 percent_time_warning=(double)(((double)temp_subject->time_warning*100.0)/(double)total_time);
05560                                 percent_time_warning_scheduled=(double)(((double)temp_subject->scheduled_time_unknown*100.0)/(double)total_time);
05561                                 percent_time_warning_unscheduled=percent_time_warning-percent_time_warning_scheduled;
05562                                 percent_time_unknown=(double)(((double)temp_subject->time_unknown*100.0)/(double)total_time);
05563                                 percent_time_unknown_scheduled=(double)(((double)temp_subject->scheduled_time_unknown*100.0)/(double)total_time);
05564                                 percent_time_unknown_unscheduled=percent_time_unknown-percent_time_unknown_scheduled;
05565                                 percent_time_critical=(double)(((double)temp_subject->time_critical*100.0)/(double)total_time);
05566                                 percent_time_critical_scheduled=(double)(((double)temp_subject->scheduled_time_critical*100.0)/(double)total_time);
05567                                 percent_time_critical_unscheduled=percent_time_critical-percent_time_critical_scheduled;
05568                                 percent_time_indeterminate=(double)(((double)time_indeterminate*100.0)/(double)total_time);
05569                                 percent_time_indeterminate_scheduled=(double)(((double)temp_subject->scheduled_time_indeterminate*100.0)/(double)total_time);
05570                                 percent_time_indeterminate_unscheduled=percent_time_indeterminate-percent_time_indeterminate_scheduled;
05571                                 percent_time_indeterminate_notrunning=(double)(((double)temp_subject->time_indeterminate_notrunning*100.0)/(double)total_time);
05572                                 percent_time_indeterminate_nodata=(double)(((double)temp_subject->time_indeterminate_nodata*100.0)/(double)total_time);
05573                                 if(time_determinate>0){
05574                                         percent_time_ok_known=(double)(((double)temp_subject->time_ok*100.0)/(double)time_determinate);
05575                                         percent_time_ok_scheduled_known=(double)(((double)temp_subject->scheduled_time_ok*100.0)/(double)time_determinate);
05576                                         percent_time_ok_unscheduled_known=percent_time_ok_known-percent_time_ok_scheduled_known;
05577                                         percent_time_warning_known=(double)(((double)temp_subject->time_warning*100.0)/(double)time_determinate);
05578                                         percent_time_warning_scheduled_known=(double)(((double)temp_subject->scheduled_time_warning*100.0)/(double)time_determinate);
05579                                         percent_time_warning_unscheduled_known=percent_time_warning_known-percent_time_warning_scheduled_known;
05580                                         percent_time_unknown_known=(double)(((double)temp_subject->time_unknown*100.0)/(double)time_determinate);
05581                                         percent_time_unknown_scheduled_known=(double)(((double)temp_subject->scheduled_time_unknown*100.0)/(double)time_determinate);
05582                                         percent_time_unknown_unscheduled_known=percent_time_unknown_known-percent_time_unknown_scheduled_known;
05583                                         percent_time_critical_known=(double)(((double)temp_subject->time_critical*100.0)/(double)time_determinate);
05584                                         percent_time_critical_scheduled_known=(double)(((double)temp_subject->scheduled_time_critical*100.0)/(double)time_determinate);
05585                                         percent_time_critical_unscheduled_known=percent_time_critical_known-percent_time_critical_scheduled_known;
05586                                         }
05587                                 }
05588 
05589                         if(content_type==HTML_CONTENT){
05590 
05591                                 if(odd){
05592                                         odd=0;
05593                                         bgclass="Odd";
05594                                         }
05595                                 else{
05596                                         odd=1;
05597                                         bgclass="Even";
05598                                         }
05599 
05600                                 printf("<tr CLASS='data%s'><td CLASS='data%s'>",bgclass,bgclass);
05601                                 if(strcmp(temp_subject->host_name,last_host))
05602                                         host_report_url(temp_subject->host_name,temp_subject->host_name);
05603                                 printf("</td><td CLASS='data%s'>",bgclass);
05604                                 service_report_url(temp_subject->host_name,temp_subject->service_description,temp_subject->service_description);
05605                                 printf("</td><td CLASS='serviceOK'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceWARNING'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceUNKNOWN'>%2.3f%% (%2.3f%%)</td><td class='serviceCRITICAL'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",percent_time_ok,percent_time_ok_known,percent_time_warning,percent_time_warning_known,percent_time_unknown,percent_time_unknown_known,percent_time_critical,percent_time_critical_known,bgclass,percent_time_indeterminate);
05606 
05607                         } else if(content_type==JSON_CONTENT){
05608                                 if (json_start!=TRUE)
05609                                         printf(",\n");
05610 
05611                                 /* host name and service description */
05612                                 printf("{ \"%s\": \"%s\", ",lower_header[0],json_encode(temp_subject->host_name));
05613                                 printf(" \"%s\": \"%s\", ",lower_header[1],json_encode(temp_subject->service_description));
05614 
05615                                 /* ok times */
05616                                 printf(" \"%s\": %lu, ",lower_header[2],temp_subject->scheduled_time_ok);
05617                                 printf(" \"%s\": %2.3f, ",lower_header[3],percent_time_ok_scheduled);
05618                                 printf(" \"%s\": %2.3f, ",lower_header[4],percent_time_ok_scheduled_known);
05619                                 printf(" \"%s\": %lu, ",lower_header[5],temp_subject->time_ok-temp_subject->scheduled_time_ok);
05620                                 printf(" \"%s\": %2.3f, ",lower_header[6],percent_time_ok_unscheduled);
05621                                 printf(" \"%s\": %2.3f, ",lower_header[7],percent_time_ok_unscheduled_known);
05622                                 printf(" \"%s\": %lu, ",lower_header[8],temp_subject->time_ok);
05623                                 printf(" \"%s\": %2.3f, ",lower_header[9],percent_time_ok);
05624                                 printf(" \"%s\": %2.3f, ",lower_header[10],percent_time_ok_known);
05625 
05626                                 /* warning times */
05627                                 printf(" \"%s\": %lu, ",lower_header[11],temp_subject->scheduled_time_warning);
05628                                 printf(" \"%s\": %2.3f, ",lower_header[12],percent_time_warning_scheduled);
05629                                 printf(" \"%s\": %2.3f, ",lower_header[13],percent_time_warning_scheduled_known);
05630                                 printf(" \"%s\": %lu, ",lower_header[14],temp_subject->time_warning-temp_subject->scheduled_time_warning);
05631                                 printf(" \"%s\": %2.3f, ",lower_header[15],percent_time_warning_unscheduled);
05632                                 printf(" \"%s\": %2.3f, ",lower_header[16],percent_time_warning_unscheduled_known);
05633                                 printf(" \"%s\": %lu, ",lower_header[17],temp_subject->time_warning);
05634                                 printf(" \"%s\": %2.3f, ",lower_header[18],percent_time_warning);
05635                                 printf(" \"%s\": %2.3f, ",lower_header[19],percent_time_warning_known);
05636 
05637                                 /* unknown times */
05638                                 printf(" \"%s\": %lu, ",lower_header[20],temp_subject->scheduled_time_unknown);
05639                                 printf(" \"%s\": %2.3f, ",lower_header[21],percent_time_unknown_scheduled);
05640                                 printf(" \"%s\": %2.3f, ",lower_header[22],percent_time_unknown_scheduled_known);
05641                                 printf(" \"%s\": %lu, ",lower_header[23],temp_subject->time_unknown-temp_subject->scheduled_time_unknown);
05642                                 printf(" \"%s\": %2.3f, ",lower_header[24],percent_time_unknown_unscheduled);
05643                                 printf(" \"%s\": %2.3f, ",lower_header[25],percent_time_unknown_unscheduled_known);
05644                                 printf(" \"%s\": %lu, ",lower_header[26],temp_subject->time_unknown);
05645                                 printf(" \"%s\": %2.3f, ",lower_header[27],percent_time_unknown);
05646                                 printf(" \"%s\": %2.3f, ",lower_header[28],percent_time_unknown_known);
05647 
05648                                 /* critical times */
05649                                 printf(" \"%s\": %lu, ",lower_header[29],temp_subject->scheduled_time_critical);
05650                                 printf(" \"%s\": %2.3f, ",lower_header[30],percent_time_critical_scheduled);
05651                                 printf(" \"%s\": %2.3f, ",lower_header[31],percent_time_critical_scheduled_known);
05652                                 printf(" \"%s\": %lu, ",lower_header[32],temp_subject->time_critical-temp_subject->scheduled_time_critical);
05653                                 printf(" \"%s\": %2.3f, ",lower_header[33],percent_time_critical_unscheduled);
05654                                 printf(" \"%s\": %2.3f, ",lower_header[34],percent_time_critical_unscheduled_known);
05655                                 printf(" \"%s\": %lu, ",lower_header[35],temp_subject->time_critical);
05656                                 printf(" \"%s\": %2.3f, ",lower_header[36],percent_time_critical);
05657                                 printf(" \"%s\": %2.3f, ",lower_header[37],percent_time_critical_known);
05658 
05659 
05660                                 /* indeterminate times */
05661                                 printf(" \"%s\": %lu, ",lower_header[38],temp_subject->time_indeterminate_notrunning);
05662                                 printf(" \"%s\": %2.3f, ",lower_header[39],percent_time_indeterminate_notrunning);
05663                                 printf(" \"%s\": %lu, ",lower_header[40],temp_subject->time_indeterminate_nodata);
05664                                 printf(" \"%s\": %2.3f, ",lower_header[41],percent_time_indeterminate_nodata);
05665                                 printf(" \"%s\": %lu, ",lower_header[42],time_indeterminate);
05666                                 printf(" \"%s\": %2.3f} ",lower_header[43],percent_time_indeterminate);
05667 
05668                                 json_start=FALSE;
05669 
05670                         }else if(content_type==CSV_CONTENT){
05671 
05672                                 /* host name and service description */
05673                                 printf("%s%s%s%s",csv_data_enclosure,temp_subject->host_name,csv_data_enclosure,csv_delimiter);
05674                                 printf("%s%s%s%s",csv_data_enclosure,temp_subject->service_description,csv_data_enclosure,csv_delimiter);
05675 
05676                                 /* ok times */
05677                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_ok,csv_data_enclosure,csv_delimiter);
05678                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_scheduled,csv_data_enclosure,csv_delimiter);
05679                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_scheduled_known,csv_data_enclosure,csv_delimiter);
05680                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_ok-temp_subject->scheduled_time_ok,csv_data_enclosure,csv_delimiter);
05681                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_unscheduled,csv_data_enclosure,csv_delimiter);
05682                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_unscheduled_known,csv_data_enclosure,csv_delimiter);
05683                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_ok,csv_data_enclosure,csv_delimiter);
05684                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok,csv_data_enclosure,csv_delimiter);
05685                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_ok_known,csv_data_enclosure,csv_delimiter);
05686 
05687                                 /* warning times */
05688                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_warning,csv_data_enclosure,csv_delimiter);
05689                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_scheduled,csv_data_enclosure,csv_delimiter);
05690                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_scheduled_known,csv_data_enclosure,csv_delimiter);
05691                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_warning-temp_subject->scheduled_time_warning,csv_data_enclosure,csv_delimiter);
05692                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_unscheduled,csv_data_enclosure,csv_delimiter);
05693                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_unscheduled_known,csv_data_enclosure,csv_delimiter);
05694                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_warning,csv_data_enclosure,csv_delimiter);
05695                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning,csv_data_enclosure,csv_delimiter);
05696                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_warning_known,csv_data_enclosure,csv_delimiter);
05697 
05698                                 /* unknown times */
05699                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_unknown,csv_data_enclosure,csv_delimiter);
05700                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_scheduled,csv_data_enclosure,csv_delimiter);
05701                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_scheduled_known,csv_data_enclosure,csv_delimiter);
05702                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unknown-temp_subject->scheduled_time_unknown,csv_data_enclosure,csv_delimiter);
05703                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_unscheduled,csv_data_enclosure,csv_delimiter);
05704                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_unscheduled_known,csv_data_enclosure,csv_delimiter);
05705                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_unknown,csv_data_enclosure,csv_delimiter);
05706                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown,csv_data_enclosure,csv_delimiter);
05707                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_unknown_known,csv_data_enclosure,csv_delimiter);
05708 
05709                                 /* critical times */
05710                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->scheduled_time_critical,csv_data_enclosure,csv_delimiter);
05711                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_scheduled,csv_data_enclosure,csv_delimiter);
05712                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_scheduled_known,csv_data_enclosure,csv_delimiter);
05713                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_critical-temp_subject->scheduled_time_critical,csv_data_enclosure,csv_delimiter);
05714                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_unscheduled,csv_data_enclosure,csv_delimiter);
05715                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_unscheduled_known,csv_data_enclosure,csv_delimiter);
05716                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_critical,csv_data_enclosure,csv_delimiter);
05717                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical,csv_data_enclosure,csv_delimiter);
05718                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_critical_known,csv_data_enclosure,csv_delimiter);
05719 
05720                                 /* indeterminate times */
05721                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
05722                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_notrunning,csv_data_enclosure,csv_delimiter);
05723                                 printf("%s%lu%s%s",    csv_data_enclosure,temp_subject->time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
05724                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate_nodata,csv_data_enclosure,csv_delimiter);
05725                                 printf("%s%lu%s%s",    csv_data_enclosure,time_indeterminate,csv_data_enclosure,csv_delimiter);
05726                                 printf("%s%2.3f%%%s%s",csv_data_enclosure,percent_time_indeterminate,csv_data_enclosure,csv_delimiter);
05727 
05728                                 printf("\n");
05729                         }
05730 
05731                         strncpy(last_host,temp_subject->host_name,sizeof(last_host)-1);
05732                         last_host[sizeof(last_host)-1]='\x0';
05733 
05734                         get_running_average(&average_percent_time_ok,percent_time_ok,current_subject);
05735                         get_running_average(&average_percent_time_ok_known,percent_time_ok_known,current_subject);
05736                         get_running_average(&average_percent_time_unknown,percent_time_unknown,current_subject);
05737                         get_running_average(&average_percent_time_unknown_known,percent_time_unknown_known,current_subject);
05738                         get_running_average(&average_percent_time_warning,percent_time_warning,current_subject);
05739                         get_running_average(&average_percent_time_warning_known,percent_time_warning_known,current_subject);
05740                         get_running_average(&average_percent_time_critical,percent_time_critical,current_subject);
05741                         get_running_average(&average_percent_time_critical_known,percent_time_critical_known,current_subject);
05742                         get_running_average(&average_percent_time_indeterminate,percent_time_indeterminate,current_subject);
05743                 }
05744 
05745                 if(content_type==HTML_CONTENT){
05746 
05747                         /* average statistics */
05748                         if(odd){
05749                                 odd=0;
05750                                 bgclass="Odd";
05751                         }else{
05752                                 odd=1;
05753                                 bgclass="Even";
05754                         }
05755                         printf("<tr CLASS='data%s'><td CLASS='data%s' colspan='2'>Average</td><td CLASS='serviceOK'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceWARNING'>%2.3f%% (%2.3f%%)</td><td CLASS='serviceUNKNOWN'>%2.3f%% (%2.3f%%)</td><td class='serviceCRITICAL'>%2.3f%% (%2.3f%%)</td><td class='data%s'>%2.3f%%</td></tr>\n",bgclass,bgclass,average_percent_time_ok,average_percent_time_ok_known,average_percent_time_warning,average_percent_time_warning_known,average_percent_time_unknown,average_percent_time_unknown_known,average_percent_time_critical,average_percent_time_critical_known,bgclass,average_percent_time_indeterminate);
05756 
05757                         printf("</table>\n");
05758                         printf("</DIV>\n");
05759                 }else if (content_type==JSON_CONTENT){
05760                         printf(",{ \"average_percent_time_ok\": %2.3f, ",average_percent_time_ok);
05761                         printf("\"average_percent_time_ok_known\": %2.3f, ",average_percent_time_ok_known);
05762                         printf("\"average_percent_time_warning\": %2.3f, ",average_percent_time_warning);
05763                         printf("\"average_percent_time_warning_known\": %2.3f, ",average_percent_time_warning_known);
05764                         printf("\"average_percent_time_unknown\": %2.3f, ",average_percent_time_unknown);
05765                         printf("\"average_percent_time_unknown_known\": %2.3f, ",average_percent_time_unknown_known);
05766                         printf("\"average_percent_time_critical\": %2.3f, ",average_percent_time_critical);
05767                         printf("\"average_percent_time_critical_known\": %2.3f, ",average_percent_time_critical_known);
05768                         printf("\"average_percent_time_indeterminate\": %2.3f }",average_percent_time_indeterminate);
05769                         printf(" ] }\n");
05770                 } else if(content_type==CSV_CONTENT){
05771                         /* average */
05772                         /* left for future rework */
05773                 }
05774 
05775         }
05776 
05777         return;
05778 }
05779 
05780 
05781 
05782 
05783 void host_report_url(char *hn, char *label){
05784 
05785         printf("<a href='%s?host=%s",AVAIL_CGI,url_encode(hn));
05786         printf("&show_log_entries");
05787         printf("&t1=%lu&t2=%lu",t1,t2);
05788         printf("&backtrack=%d",backtrack_archives);
05789         printf("&assumestateretention=%s",(assume_state_retention==TRUE)?"yes":"no");
05790         printf("&assumeinitialstates=%s",(assume_initial_states==TRUE)?"yes":"no");
05791         printf("&assumestatesduringnotrunning=%s",(assume_states_during_notrunning==TRUE)?"yes":"no");
05792         printf("&initialassumedhoststate=%d",initial_assumed_host_state);
05793         printf("&initialassumedservicestate=%d",initial_assumed_service_state);
05794         if(show_log_entries==TRUE)
05795                 printf("&show_log_entries");
05796         if(full_log_entries==TRUE)
05797                 printf("&full_log_entries");
05798         printf("&showscheduleddowntime=%s",(show_scheduled_downtime==TRUE)?"yes":"no");
05799         if(current_timeperiod!=NULL)
05800                 printf("&rpttimeperiod=%s",url_encode(current_timeperiod->name));
05801         printf("'>%s</a>",label);
05802 
05803         return;
05804 }
05805 
05806 
05807 void service_report_url(char *hn, char *sd, char *label){
05808 
05809         printf("<a href='%s?host=%s",AVAIL_CGI,url_encode(hn));
05810         printf("&service=%s",url_encode(sd));
05811         printf("&t1=%lu&t2=%lu",t1,t2);
05812         printf("&backtrack=%d",backtrack_archives);
05813         printf("&assumestateretention=%s",(assume_state_retention==TRUE)?"yes":"no");
05814         printf("&assumeinitialstates=%s",(assume_initial_states==TRUE)?"yes":"no");
05815         printf("&assumestatesduringnotrunning=%s",(assume_states_during_notrunning==TRUE)?"yes":"no");
05816         printf("&initialassumedhoststate=%d",initial_assumed_host_state);
05817         printf("&initialassumedservicestate=%d",initial_assumed_service_state);
05818         if(show_log_entries==TRUE)
05819                 printf("&show_log_entries");
05820         if(full_log_entries==TRUE)
05821                 printf("&full_log_entries");
05822         printf("&showscheduleddowntime=%s",(show_scheduled_downtime==TRUE)?"yes":"no");
05823         if(current_timeperiod!=NULL)
05824                 printf("&rpttimeperiod=%s",url_encode(current_timeperiod->name));
05825         printf("'>%s</a>",label);
05826 
05827         return;
05828 }
05829 
05830 
05831 /* calculates running average */
05832 void get_running_average(double *running_average, double new_value, int current_item){
05833 
05834         *running_average=(((*running_average*((double)current_item-1.0))+new_value)/(double)current_item);
05835 
05836         return;
05837 }
05838 
05839 
05840 /* used in reports where a timeperiod is selected */
05841 unsigned long calculate_total_time(time_t start_time, time_t end_time){
05842         struct tm *t;
05843         unsigned long midnight_today;
05844         int weekday;
05845         unsigned long total_time;
05846         timerange *temp_timerange;
05847         unsigned long temp_duration;
05848         unsigned long temp_end;
05849         unsigned long temp_start;
05850         unsigned long start;
05851         unsigned long end;
05852 
05853         /* attempt to handle the current time_period */
05854         if(current_timeperiod!=NULL){
05855 
05856                 /* "A day" is 86400 seconds */
05857                 t=localtime(&start_time);
05858 
05859                 /* calculate the start of the day (midnight, 00:00 hours) */
05860                 t->tm_sec=0;
05861                 t->tm_min=0;
05862                 t->tm_hour=0;
05863                 t->tm_isdst=-1;
05864                 midnight_today=(unsigned long)mktime(t);
05865                 weekday=t->tm_wday;
05866 
05867                 total_time=0;
05868                 while(midnight_today<end_time){
05869                         temp_duration=0;
05870                         temp_end=min(86400,t2-midnight_today);
05871                         temp_start=0;
05872                         if(t1>midnight_today)
05873                                 temp_start=t1-midnight_today;
05874 
05875                         /* check all time ranges for this day of the week */
05876                         for(temp_timerange=current_timeperiod->days[weekday];temp_timerange!=NULL;temp_timerange=temp_timerange->next){
05877                                 start=max(temp_timerange->range_start,temp_start);
05878                                 end=min(temp_timerange->range_end,temp_end);
05879 #ifdef DEBUG
05880                                 printf("<li>Matching in timerange[%d]: %d -> %d (%ld -> %ld) %d -> %d = %ld<br>\n",weekday,temp_timerange->range_start,temp_timerange->range_end,temp_start,temp_end,start,end,end-start);
05881 #endif
05882                                 if(end>start)
05883                                         temp_duration += end-start;
05884                                 }
05885                         total_time+=temp_duration;
05886                         temp_start=0;
05887                         midnight_today+=86400;
05888                         if(++weekday>6)
05889                                 weekday=0;
05890                         }
05891 
05892                 return total_time;
05893                 }
05894 
05895         /* no timeperiod was selected */
05896         return end_time-start_time;
05897 }
 All Data Structures Files Functions Variables Typedefs Defines