![]() |
Icinga-core 1.4.0
next gen monitoring
|
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(¤t_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(¤t_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,¤t_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(¤t_time); 00617 t=localtime(¤t_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,¤t_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,¤t_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,¤t_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,¤t_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,¤t_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),¤t_authdata); 00960 else 00961 is_authorized=is_authorized_for_service(find_service(host_name,service_desc),¤t_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(¤t_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(¤t_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),¤t_authdata); 02500 else 02501 is_authorized=is_authorized_for_service(find_service(hn,sd),¤t_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(¤t_time); 03044 03045 st=localtime(¤t_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(¤t_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(¤t_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,¤t_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,¤t_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,¤t_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,¤t_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,¤t_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,¤t_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,¤t_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 }