nagios4/xdata/xsddefault.c
2017-05-19 22:22:40 +02:00

1319 lines
54 KiB
C

/*****************************************************************************
*
* XSDDEFAULT.C - Default external status data input routines for Nagios
*
* Copyright (c) 2009 Nagios Core Development Team and Community Contributors
* Copyright (c) 2000-2009 Ethan Galstad (egalstad@nagios.org)
* Last Modified: 07-31-2009
*
* License:
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*****************************************************************************/
/*********** COMMON HEADER FILES ***********/
#include "../include/config.h"
#include "../include/common.h"
#include "../include/locations.h"
#include "../include/statusdata.h"
#include "../include/comments.h"
#include "../include/downtime.h"
#include "../include/macros.h"
#include "../include/skiplist.h"
#ifdef NSCORE
#include "../include/nagios.h"
#endif
#ifdef NSCGI
#include "../include/cgiutils.h"
#endif
/**** IMPLEMENTATION SPECIFIC HEADER FILES ****/
#include "xsddefault.h"
#ifdef NSCGI
time_t program_start;
int daemon_mode;
time_t last_command_check;
time_t last_log_rotation;
int enable_notifications;
int execute_service_checks;
int accept_passive_service_checks;
int execute_host_checks;
int accept_passive_host_checks;
int enable_event_handlers;
int obsess_over_services;
int obsess_over_hosts;
int check_service_freshness;
int check_host_freshness;
int enable_flap_detection;
int enable_failure_prediction;
int process_performance_data;
int nagios_pid;
int buffer_stats[1][3];
int program_stats[MAX_CHECK_STATS_TYPES][3];
#endif
#ifdef NSCORE
extern time_t program_start;
extern int nagios_pid;
extern int daemon_mode;
extern time_t last_command_check;
extern time_t last_log_rotation;
extern int enable_notifications;
extern int execute_service_checks;
extern int accept_passive_service_checks;
extern int execute_host_checks;
extern int accept_passive_host_checks;
extern int enable_event_handlers;
extern int obsess_over_services;
extern int obsess_over_hosts;
extern int check_service_freshness;
extern int check_host_freshness;
extern int enable_flap_detection;
extern int enable_failure_prediction;
extern int process_performance_data;
extern int aggregate_status_updates;
extern int check_external_commands;
extern time_t last_update_check;
extern char *last_program_version;
extern int update_available;
extern char *last_program_version;
extern char *new_program_version;
extern int external_command_buffer_slots;
extern circular_buffer external_command_buffer;
extern host *host_list;
extern service *service_list;
extern contact *contact_list;
extern comment *comment_list;
extern scheduled_downtime *scheduled_downtime_list;
extern skiplist *object_skiplists[NUM_OBJECT_SKIPLISTS];
extern unsigned long next_comment_id;
extern unsigned long next_downtime_id;
extern unsigned long next_event_id;
extern unsigned long next_problem_id;
extern unsigned long next_notification_id;
extern unsigned long modified_host_process_attributes;
extern unsigned long modified_service_process_attributes;
extern char *global_host_event_handler;
extern char *global_service_event_handler;
extern check_stats check_statistics[MAX_CHECK_STATS_TYPES];
#endif
char *xsddefault_status_log = NULL;
char *xsddefault_temp_file = NULL;
/******************************************************************/
/***************** COMMON CONFIG INITIALIZATION ******************/
/******************************************************************/
/* grab configuration information */
int xsddefault_grab_config_info(char *config_file) {
char *input = NULL;
mmapfile *thefile;
#ifdef NSCGI
char *input2 = NULL;
mmapfile *thefile2;
char *temp_buffer;
#else
nagios_macros *mac;
#endif
/*** CORE PASSES IN MAIN CONFIG FILE, CGIS PASS IN CGI CONFIG FILE! ***/
/* open the config file for reading */
if((thefile = mmap_fopen(config_file)) == NULL)
return ERROR;
/* read in all lines from the main config file */
while(1) {
/* free memory */
my_free(input);
/* read the next line */
if((input = mmap_fgets_multiline(thefile)) == NULL)
break;
strip(input);
/* skip blank lines and comments */
if(input[0] == '#' || input[0] == '\x0')
continue;
#ifdef NSCGI
/* CGI needs to find and read contents of main config file, since it was passed the name of the CGI config file */
if(strstr(input, "main_config_file") == input) {
temp_buffer = strtok(input, "=");
temp_buffer = strtok(NULL, "\n");
if(temp_buffer == NULL)
continue;
if((thefile2 = mmap_fopen(temp_buffer)) == NULL)
continue;
/* read in all lines from the main config file */
while(1) {
/* free memory */
my_free(input2);
/* read the next line */
if((input2 = mmap_fgets_multiline(thefile2)) == NULL)
break;
strip(input2);
/* skip blank lines and comments */
if(input2[0] == '#' || input2[0] == '\x0')
continue;
xsddefault_grab_config_directives(input2);
}
/* free memory and close the file */
my_free(input2);
mmap_fclose(thefile2);
}
#endif
#ifdef NSCORE
/* core reads variables directly from the main config file */
xsddefault_grab_config_directives(input);
#endif
}
/* free memory and close the file */
my_free(input);
mmap_fclose(thefile);
/* initialize locations if necessary */
if(xsddefault_status_log == NULL)
xsddefault_status_log = (char *)strdup(DEFAULT_STATUS_FILE);
if(xsddefault_temp_file == NULL)
xsddefault_temp_file = (char *)strdup(DEFAULT_TEMP_FILE);
/* make sure we have what we need */
if(xsddefault_status_log == NULL)
return ERROR;
if(xsddefault_temp_file == NULL)
return ERROR;
#ifdef NSCORE
mac = get_global_macros();
/* save the status file macro */
my_free(mac->x[MACRO_STATUSDATAFILE]);
if((mac->x[MACRO_STATUSDATAFILE] = (char *)strdup(xsddefault_status_log)))
strip(mac->x[MACRO_STATUSDATAFILE]);
#endif
return OK;
}
/* processes a single directive */
int xsddefault_grab_config_directives(char *input) {
char *temp_ptr = NULL;
char *varname = NULL;
char *varvalue = NULL;
/* get the variable name */
if((temp_ptr = my_strtok(input, "=")) == NULL)
return ERROR;
if((varname = (char *)strdup(temp_ptr)) == NULL)
return ERROR;
/* get the variable value */
if((temp_ptr = my_strtok(NULL, "\n")) == NULL) {
my_free(varname);
return ERROR;
}
if((varvalue = (char *)strdup(temp_ptr)) == NULL) {
my_free(varname);
return ERROR;
}
/* status log definition */
if(!strcmp(varname, "status_file") || !strcmp(varname, "xsddefault_status_log"))
xsddefault_status_log = (char *)strdup(temp_ptr);
/* temp file definition */
else if(!strcmp(varname, "temp_file"))
xsddefault_temp_file = (char *)strdup(temp_ptr);
/* free memory */
my_free(varname);
my_free(varvalue);
return OK;
}
#ifdef NSCORE
/******************************************************************/
/********************* INIT/CLEANUP FUNCTIONS *********************/
/******************************************************************/
/* initialize status data */
int xsddefault_initialize_status_data(char *config_file) {
int result;
/* grab configuration data */
result = xsddefault_grab_config_info(config_file);
if(result == ERROR)
return ERROR;
/* delete the old status log (it might not exist) */
if(xsddefault_status_log)
unlink(xsddefault_status_log);
return OK;
}
/* cleanup status data before terminating */
int xsddefault_cleanup_status_data(char *config_file, int delete_status_data) {
/* delete the status log */
if(delete_status_data == TRUE && xsddefault_status_log) {
if(unlink(xsddefault_status_log))
return ERROR;
}
/* free memory */
my_free(xsddefault_status_log);
my_free(xsddefault_temp_file);
return OK;
}
/******************************************************************/
/****************** STATUS DATA OUTPUT FUNCTIONS ******************/
/******************************************************************/
/* write all status data to file */
int xsddefault_save_status_data(void) {
char *temp_file = NULL;
customvariablesmember *temp_customvariablesmember = NULL;
host *temp_host = NULL;
service *temp_service = NULL;
contact *temp_contact = NULL;
comment *temp_comment = NULL;
scheduled_downtime *temp_downtime = NULL;
time_t current_time;
int fd = 0;
FILE *fp = NULL;
int used_external_command_buffer_slots = 0;
int high_external_command_buffer_slots = 0;
int result = OK;
log_debug_info(DEBUGL_FUNCTIONS, 0, "save_status_data()\n");
/* open a safe temp file for output */
if(xsddefault_temp_file == NULL)
return ERROR;
asprintf(&temp_file, "%sXXXXXX", xsddefault_temp_file);
if(temp_file == NULL)
return ERROR;
log_debug_info(DEBUGL_STATUSDATA, 2, "Writing status data to temp file '%s'\n", temp_file);
if((fd = mkstemp(temp_file)) == -1) {
/* log an error */
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to create temp file for writing status data: %s\n", strerror(errno));
/* free memory */
my_free(temp_file);
return ERROR;
}
fp = (FILE *)fdopen(fd, "w");
if(fp == NULL) {
close(fd);
unlink(temp_file);
/* log an error */
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to open temp file '%s' for writing status data: %s\n", temp_file, strerror(errno));
/* free memory */
my_free(temp_file);
return ERROR;
}
/* get number of items in the command buffer */
if(check_external_commands == TRUE) {
pthread_mutex_lock(&external_command_buffer.buffer_lock);
used_external_command_buffer_slots = external_command_buffer.items;
high_external_command_buffer_slots = external_command_buffer.high;
pthread_mutex_unlock(&external_command_buffer.buffer_lock);
}
else {
used_external_command_buffer_slots = 0;
high_external_command_buffer_slots = 0;
}
/* generate check statistics */
generate_check_stats();
/* write version info to status file */
fprintf(fp, "########################################\n");
fprintf(fp, "# NAGIOS STATUS FILE\n");
fprintf(fp, "#\n");
fprintf(fp, "# THIS FILE IS AUTOMATICALLY GENERATED\n");
fprintf(fp, "# BY NAGIOS. DO NOT MODIFY THIS FILE!\n");
fprintf(fp, "########################################\n\n");
time(&current_time);
/* write file info */
fprintf(fp, "info {\n");
fprintf(fp, "\tcreated=%lu\n", current_time);
fprintf(fp, "\tversion=%s\n", PROGRAM_VERSION);
fprintf(fp, "\tlast_update_check=%lu\n", last_update_check);
fprintf(fp, "\tupdate_available=%d\n", update_available);
fprintf(fp, "\tlast_version=%s\n", (last_program_version == NULL) ? "" : last_program_version);
fprintf(fp, "\tnew_version=%s\n", (new_program_version == NULL) ? "" : new_program_version);
fprintf(fp, "\t}\n\n");
/* save program status data */
fprintf(fp, "programstatus {\n");
fprintf(fp, "\tmodified_host_attributes=%lu\n", modified_host_process_attributes);
fprintf(fp, "\tmodified_service_attributes=%lu\n", modified_service_process_attributes);
fprintf(fp, "\tnagios_pid=%d\n", nagios_pid);
fprintf(fp, "\tdaemon_mode=%d\n", daemon_mode);
fprintf(fp, "\tprogram_start=%lu\n", program_start);
fprintf(fp, "\tlast_command_check=%lu\n", last_command_check);
fprintf(fp, "\tlast_log_rotation=%lu\n", last_log_rotation);
fprintf(fp, "\tenable_notifications=%d\n", enable_notifications);
fprintf(fp, "\tactive_service_checks_enabled=%d\n", execute_service_checks);
fprintf(fp, "\tpassive_service_checks_enabled=%d\n", accept_passive_service_checks);
fprintf(fp, "\tactive_host_checks_enabled=%d\n", execute_host_checks);
fprintf(fp, "\tpassive_host_checks_enabled=%d\n", accept_passive_host_checks);
fprintf(fp, "\tenable_event_handlers=%d\n", enable_event_handlers);
fprintf(fp, "\tobsess_over_services=%d\n", obsess_over_services);
fprintf(fp, "\tobsess_over_hosts=%d\n", obsess_over_hosts);
fprintf(fp, "\tcheck_service_freshness=%d\n", check_service_freshness);
fprintf(fp, "\tcheck_host_freshness=%d\n", check_host_freshness);
fprintf(fp, "\tenable_flap_detection=%d\n", enable_flap_detection);
fprintf(fp, "\tenable_failure_prediction=%d\n", enable_failure_prediction);
fprintf(fp, "\tprocess_performance_data=%d\n", process_performance_data);
fprintf(fp, "\tglobal_host_event_handler=%s\n", (global_host_event_handler == NULL) ? "" : global_host_event_handler);
fprintf(fp, "\tglobal_service_event_handler=%s\n", (global_service_event_handler == NULL) ? "" : global_service_event_handler);
fprintf(fp, "\tnext_comment_id=%lu\n", next_comment_id);
fprintf(fp, "\tnext_downtime_id=%lu\n", next_downtime_id);
fprintf(fp, "\tnext_event_id=%lu\n", next_event_id);
fprintf(fp, "\tnext_problem_id=%lu\n", next_problem_id);
fprintf(fp, "\tnext_notification_id=%lu\n", next_notification_id);
fprintf(fp, "\ttotal_external_command_buffer_slots=%d\n", external_command_buffer_slots);
fprintf(fp, "\tused_external_command_buffer_slots=%d\n", used_external_command_buffer_slots);
fprintf(fp, "\thigh_external_command_buffer_slots=%d\n", high_external_command_buffer_slots);
fprintf(fp, "\tactive_scheduled_host_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tactive_ondemand_host_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tpassive_host_check_stats=%d,%d,%d\n", check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[0], check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[1], check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tactive_scheduled_service_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tactive_ondemand_service_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tpassive_service_check_stats=%d,%d,%d\n", check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tcached_host_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tcached_service_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\texternal_command_stats=%d,%d,%d\n", check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[0], check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[1], check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[2]);
fprintf(fp, "\tparallel_host_check_stats=%d,%d,%d\n", check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[0], check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[1], check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\tserial_host_check_stats=%d,%d,%d\n", check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[0], check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[1], check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[2]);
fprintf(fp, "\t}\n\n");
/* save host status data */
for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) {
fprintf(fp, "hoststatus {\n");
fprintf(fp, "\thost_name=%s\n", temp_host->name);
fprintf(fp, "\tmodified_attributes=%lu\n", temp_host->modified_attributes);
fprintf(fp, "\tcheck_command=%s\n", (temp_host->host_check_command == NULL) ? "" : temp_host->host_check_command);
fprintf(fp, "\tcheck_period=%s\n", (temp_host->check_period == NULL) ? "" : temp_host->check_period);
fprintf(fp, "\tnotification_period=%s\n", (temp_host->notification_period == NULL) ? "" : temp_host->notification_period);
fprintf(fp, "\tcheck_interval=%f\n", temp_host->check_interval);
fprintf(fp, "\tretry_interval=%f\n", temp_host->retry_interval);
fprintf(fp, "\tevent_handler=%s\n", (temp_host->event_handler == NULL) ? "" : temp_host->event_handler);
fprintf(fp, "\thas_been_checked=%d\n", temp_host->has_been_checked);
fprintf(fp, "\tshould_be_scheduled=%d\n", temp_host->should_be_scheduled);
fprintf(fp, "\tcheck_execution_time=%.3f\n", temp_host->execution_time);
fprintf(fp, "\tcheck_latency=%.3f\n", temp_host->latency);
fprintf(fp, "\tcheck_type=%d\n", temp_host->check_type);
fprintf(fp, "\tcurrent_state=%d\n", temp_host->current_state);
fprintf(fp, "\tlast_hard_state=%d\n", temp_host->last_hard_state);
fprintf(fp, "\tlast_event_id=%lu\n", temp_host->last_event_id);
fprintf(fp, "\tcurrent_event_id=%lu\n", temp_host->current_event_id);
fprintf(fp, "\tcurrent_problem_id=%lu\n", temp_host->current_problem_id);
fprintf(fp, "\tlast_problem_id=%lu\n", temp_host->last_problem_id);
fprintf(fp, "\tplugin_output=%s\n", (temp_host->plugin_output == NULL) ? "" : temp_host->plugin_output);
fprintf(fp, "\tlong_plugin_output=%s\n", (temp_host->long_plugin_output == NULL) ? "" : temp_host->long_plugin_output);
fprintf(fp, "\tperformance_data=%s\n", (temp_host->perf_data == NULL) ? "" : temp_host->perf_data);
fprintf(fp, "\tlast_check=%lu\n", temp_host->last_check);
fprintf(fp, "\tnext_check=%lu\n", temp_host->next_check);
fprintf(fp, "\tcheck_options=%d\n", temp_host->check_options);
fprintf(fp, "\tcurrent_attempt=%d\n", temp_host->current_attempt);
fprintf(fp, "\tmax_attempts=%d\n", temp_host->max_attempts);
fprintf(fp, "\tstate_type=%d\n", temp_host->state_type);
fprintf(fp, "\tlast_state_change=%lu\n", temp_host->last_state_change);
fprintf(fp, "\tlast_hard_state_change=%lu\n", temp_host->last_hard_state_change);
fprintf(fp, "\tlast_time_up=%lu\n", temp_host->last_time_up);
fprintf(fp, "\tlast_time_down=%lu\n", temp_host->last_time_down);
fprintf(fp, "\tlast_time_unreachable=%lu\n", temp_host->last_time_unreachable);
fprintf(fp, "\tlast_notification=%lu\n", temp_host->last_host_notification);
fprintf(fp, "\tnext_notification=%lu\n", temp_host->next_host_notification);
fprintf(fp, "\tno_more_notifications=%d\n", temp_host->no_more_notifications);
fprintf(fp, "\tcurrent_notification_number=%d\n", temp_host->current_notification_number);
fprintf(fp, "\tcurrent_notification_id=%lu\n", temp_host->current_notification_id);
fprintf(fp, "\tnotifications_enabled=%d\n", temp_host->notifications_enabled);
fprintf(fp, "\tproblem_has_been_acknowledged=%d\n", temp_host->problem_has_been_acknowledged);
fprintf(fp, "\tacknowledgement_type=%d\n", temp_host->acknowledgement_type);
fprintf(fp, "\tactive_checks_enabled=%d\n", temp_host->checks_enabled);
fprintf(fp, "\tpassive_checks_enabled=%d\n", temp_host->accept_passive_host_checks);
fprintf(fp, "\tevent_handler_enabled=%d\n", temp_host->event_handler_enabled);
fprintf(fp, "\tflap_detection_enabled=%d\n", temp_host->flap_detection_enabled);
fprintf(fp, "\tfailure_prediction_enabled=%d\n", temp_host->failure_prediction_enabled);
fprintf(fp, "\tprocess_performance_data=%d\n", temp_host->process_performance_data);
fprintf(fp, "\tobsess_over_host=%d\n", temp_host->obsess_over_host);
fprintf(fp, "\tlast_update=%lu\n", current_time);
fprintf(fp, "\tis_flapping=%d\n", temp_host->is_flapping);
fprintf(fp, "\tpercent_state_change=%.2f\n", temp_host->percent_state_change);
fprintf(fp, "\tscheduled_downtime_depth=%d\n", temp_host->scheduled_downtime_depth);
/*
fprintf(fp,"\tstate_history=");
for(x=0;x<MAX_STATE_HISTORY_ENTRIES;x++)
fprintf(fp,"%s%d",(x>0)?",":"",temp_host->state_history[(x+temp_host->state_history_index)%MAX_STATE_HISTORY_ENTRIES]);
fprintf(fp,"\n");
*/
/* custom variables */
for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) {
if(temp_customvariablesmember->variable_name)
fprintf(fp, "\t_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value);
}
fprintf(fp, "\t}\n\n");
}
/* save service status data */
for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) {
fprintf(fp, "servicestatus {\n");
fprintf(fp, "\thost_name=%s\n", temp_service->host_name);
fprintf(fp, "\tservice_description=%s\n", temp_service->description);
fprintf(fp, "\tmodified_attributes=%lu\n", temp_service->modified_attributes);
fprintf(fp, "\tcheck_command=%s\n", (temp_service->service_check_command == NULL) ? "" : temp_service->service_check_command);
fprintf(fp, "\tcheck_period=%s\n", (temp_service->check_period == NULL) ? "" : temp_service->check_period);
fprintf(fp, "\tnotification_period=%s\n", (temp_service->notification_period == NULL) ? "" : temp_service->notification_period);
fprintf(fp, "\tcheck_interval=%f\n", temp_service->check_interval);
fprintf(fp, "\tretry_interval=%f\n", temp_service->retry_interval);
fprintf(fp, "\tevent_handler=%s\n", (temp_service->event_handler == NULL) ? "" : temp_service->event_handler);
fprintf(fp, "\thas_been_checked=%d\n", temp_service->has_been_checked);
fprintf(fp, "\tshould_be_scheduled=%d\n", temp_service->should_be_scheduled);
fprintf(fp, "\tcheck_execution_time=%.3f\n", temp_service->execution_time);
fprintf(fp, "\tcheck_latency=%.3f\n", temp_service->latency);
fprintf(fp, "\tcheck_type=%d\n", temp_service->check_type);
fprintf(fp, "\tcurrent_state=%d\n", temp_service->current_state);
fprintf(fp, "\tlast_hard_state=%d\n", temp_service->last_hard_state);
fprintf(fp, "\tlast_event_id=%lu\n", temp_service->last_event_id);
fprintf(fp, "\tcurrent_event_id=%lu\n", temp_service->current_event_id);
fprintf(fp, "\tcurrent_problem_id=%lu\n", temp_service->current_problem_id);
fprintf(fp, "\tlast_problem_id=%lu\n", temp_service->last_problem_id);
fprintf(fp, "\tcurrent_attempt=%d\n", temp_service->current_attempt);
fprintf(fp, "\tmax_attempts=%d\n", temp_service->max_attempts);
fprintf(fp, "\tstate_type=%d\n", temp_service->state_type);
fprintf(fp, "\tlast_state_change=%lu\n", temp_service->last_state_change);
fprintf(fp, "\tlast_hard_state_change=%lu\n", temp_service->last_hard_state_change);
fprintf(fp, "\tlast_time_ok=%lu\n", temp_service->last_time_ok);
fprintf(fp, "\tlast_time_warning=%lu\n", temp_service->last_time_warning);
fprintf(fp, "\tlast_time_unknown=%lu\n", temp_service->last_time_unknown);
fprintf(fp, "\tlast_time_critical=%lu\n", temp_service->last_time_critical);
fprintf(fp, "\tplugin_output=%s\n", (temp_service->plugin_output == NULL) ? "" : temp_service->plugin_output);
fprintf(fp, "\tlong_plugin_output=%s\n", (temp_service->long_plugin_output == NULL) ? "" : temp_service->long_plugin_output);
fprintf(fp, "\tperformance_data=%s\n", (temp_service->perf_data == NULL) ? "" : temp_service->perf_data);
fprintf(fp, "\tlast_check=%lu\n", temp_service->last_check);
fprintf(fp, "\tnext_check=%lu\n", temp_service->next_check);
fprintf(fp, "\tcheck_options=%d\n", temp_service->check_options);
fprintf(fp, "\tcurrent_notification_number=%d\n", temp_service->current_notification_number);
fprintf(fp, "\tcurrent_notification_id=%lu\n", temp_service->current_notification_id);
fprintf(fp, "\tlast_notification=%lu\n", temp_service->last_notification);
fprintf(fp, "\tnext_notification=%lu\n", temp_service->next_notification);
fprintf(fp, "\tno_more_notifications=%d\n", temp_service->no_more_notifications);
fprintf(fp, "\tnotifications_enabled=%d\n", temp_service->notifications_enabled);
fprintf(fp, "\tactive_checks_enabled=%d\n", temp_service->checks_enabled);
fprintf(fp, "\tpassive_checks_enabled=%d\n", temp_service->accept_passive_service_checks);
fprintf(fp, "\tevent_handler_enabled=%d\n", temp_service->event_handler_enabled);
fprintf(fp, "\tproblem_has_been_acknowledged=%d\n", temp_service->problem_has_been_acknowledged);
fprintf(fp, "\tacknowledgement_type=%d\n", temp_service->acknowledgement_type);
fprintf(fp, "\tflap_detection_enabled=%d\n", temp_service->flap_detection_enabled);
fprintf(fp, "\tfailure_prediction_enabled=%d\n", temp_service->failure_prediction_enabled);
fprintf(fp, "\tprocess_performance_data=%d\n", temp_service->process_performance_data);
fprintf(fp, "\tobsess_over_service=%d\n", temp_service->obsess_over_service);
fprintf(fp, "\tlast_update=%lu\n", current_time);
fprintf(fp, "\tis_flapping=%d\n", temp_service->is_flapping);
fprintf(fp, "\tpercent_state_change=%.2f\n", temp_service->percent_state_change);
fprintf(fp, "\tscheduled_downtime_depth=%d\n", temp_service->scheduled_downtime_depth);
/*
fprintf(fp,"\tstate_history=");
for(x=0;x<MAX_STATE_HISTORY_ENTRIES;x++)
fprintf(fp,"%s%d",(x>0)?",":"",temp_service->state_history[(x+temp_service->state_history_index)%MAX_STATE_HISTORY_ENTRIES]);
fprintf(fp,"\n");
*/
/* custom variables */
for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) {
if(temp_customvariablesmember->variable_name)
fprintf(fp, "\t_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value);
}
fprintf(fp, "\t}\n\n");
}
/* save contact status data */
for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) {
fprintf(fp, "contactstatus {\n");
fprintf(fp, "\tcontact_name=%s\n", temp_contact->name);
fprintf(fp, "\tmodified_attributes=%lu\n", temp_contact->modified_attributes);
fprintf(fp, "\tmodified_host_attributes=%lu\n", temp_contact->modified_host_attributes);
fprintf(fp, "\tmodified_service_attributes=%lu\n", temp_contact->modified_service_attributes);
fprintf(fp, "\thost_notification_period=%s\n", (temp_contact->host_notification_period == NULL) ? "" : temp_contact->host_notification_period);
fprintf(fp, "\tservice_notification_period=%s\n", (temp_contact->service_notification_period == NULL) ? "" : temp_contact->service_notification_period);
fprintf(fp, "\tlast_host_notification=%lu\n", temp_contact->last_host_notification);
fprintf(fp, "\tlast_service_notification=%lu\n", temp_contact->last_service_notification);
fprintf(fp, "\thost_notifications_enabled=%d\n", temp_contact->host_notifications_enabled);
fprintf(fp, "\tservice_notifications_enabled=%d\n", temp_contact->service_notifications_enabled);
/* custom variables */
for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) {
if(temp_customvariablesmember->variable_name)
fprintf(fp, "\t_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value);
}
fprintf(fp, "\t}\n\n");
}
/* save all comments */
for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) {
if(temp_comment->comment_type == HOST_COMMENT)
fprintf(fp, "hostcomment {\n");
else
fprintf(fp, "servicecomment {\n");
fprintf(fp, "\thost_name=%s\n", temp_comment->host_name);
if(temp_comment->comment_type == SERVICE_COMMENT)
fprintf(fp, "\tservice_description=%s\n", temp_comment->service_description);
fprintf(fp, "\tentry_type=%d\n", temp_comment->entry_type);
fprintf(fp, "\tcomment_id=%lu\n", temp_comment->comment_id);
fprintf(fp, "\tsource=%d\n", temp_comment->source);
fprintf(fp, "\tpersistent=%d\n", temp_comment->persistent);
fprintf(fp, "\tentry_time=%lu\n", temp_comment->entry_time);
fprintf(fp, "\texpires=%d\n", temp_comment->expires);
fprintf(fp, "\texpire_time=%lu\n", temp_comment->expire_time);
fprintf(fp, "\tauthor=%s\n", temp_comment->author);
fprintf(fp, "\tcomment_data=%s\n", temp_comment->comment_data);
fprintf(fp, "\t}\n\n");
}
/* save all downtime */
for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) {
if(temp_downtime->type == HOST_DOWNTIME)
fprintf(fp, "hostdowntime {\n");
else
fprintf(fp, "servicedowntime {\n");
fprintf(fp, "\thost_name=%s\n", temp_downtime->host_name);
if(temp_downtime->type == SERVICE_DOWNTIME)
fprintf(fp, "\tservice_description=%s\n", temp_downtime->service_description);
fprintf(fp, "\tdowntime_id=%lu\n", temp_downtime->downtime_id);
fprintf(fp, "\tcomment_id=%lu\n", temp_downtime->comment_id);
fprintf(fp, "\tentry_time=%lu\n", temp_downtime->entry_time);
fprintf(fp, "\tstart_time=%lu\n", temp_downtime->start_time);
fprintf(fp, "\tflex_downtime_start=%lu\n", temp_downtime->flex_downtime_start);
fprintf(fp, "\tend_time=%lu\n", temp_downtime->end_time);
fprintf(fp, "\ttriggered_by=%lu\n", temp_downtime->triggered_by);
fprintf(fp, "\tfixed=%d\n", temp_downtime->fixed);
fprintf(fp, "\tduration=%lu\n", temp_downtime->duration);
fprintf(fp, "\tis_in_effect=%d\n", temp_downtime->is_in_effect);
fprintf(fp, "\tstart_notification_sent=%d\n", temp_downtime->start_notification_sent);
fprintf(fp, "\tauthor=%s\n", temp_downtime->author);
fprintf(fp, "\tcomment=%s\n", temp_downtime->comment);
fprintf(fp, "\t}\n\n");
}
/* reset file permissions */
fchmod(fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
/* flush the file to disk */
fflush(fp);
/* close the temp file */
result = fclose(fp);
/* fsync the file so that it is completely written out before moving it */
fsync(fd);
/* save/close was successful */
if(result == 0) {
result = OK;
/* move the temp file to the status log (overwrite the old status log) */
if(my_rename(temp_file, xsddefault_status_log)) {
unlink(temp_file);
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to update status data file '%s': %s", xsddefault_status_log, strerror(errno));
result = ERROR;
}
}
/* a problem occurred saving the file */
else {
result = ERROR;
/* remove temp file and log an error */
unlink(temp_file);
logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to save status file: %s", strerror(errno));
}
/* free memory */
my_free(temp_file);
return result;
}
#endif
#ifdef NSCGI
/******************************************************************/
/****************** DEFAULT DATA INPUT FUNCTIONS ******************/
/******************************************************************/
/* read all program, host, and service status information */
int xsddefault_read_status_data(char *config_file, int options) {
#ifdef NO_MMAP
char input[MAX_PLUGIN_OUTPUT_LENGTH] = "";
FILE *fp = NULL;
#else
char *input = NULL;
mmapfile *thefile = NULL;
#endif
int data_type = XSDDEFAULT_NO_DATA;
hoststatus *temp_hoststatus = NULL;
servicestatus *temp_servicestatus = NULL;
char *var = NULL;
char *val = NULL;
char *ptr = NULL;
int result = 0;
/* comment and downtime vars */
unsigned long comment_id = 0;
int persistent = FALSE;
int expires = FALSE;
time_t expire_time = 0L;
int entry_type = USER_COMMENT;
int source = COMMENTSOURCE_INTERNAL;
time_t entry_time = 0L;
char *host_name = NULL;
char *service_description = NULL;
char *author = NULL;
char *comment_data = NULL;
unsigned long downtime_id = 0;
time_t start_time = 0L;
time_t flex_downtime_start = 0L;
time_t end_time = 0L;
int fixed = FALSE;
unsigned long triggered_by = 0;
unsigned long duration = 0L;
int x = 0;
int is_in_effect = FALSE;
int start_notification_sent = FALSE;
/* initialize some vars */
for(x = 0; x < MAX_CHECK_STATS_TYPES; x++) {
program_stats[x][0] = 0;
program_stats[x][1] = 0;
program_stats[x][2] = 0;
}
/* grab configuration data */
result = xsddefault_grab_config_info(config_file);
if(result == ERROR)
return ERROR;
/* open the status file for reading */
#ifdef NO_MMAP
if((fp = fopen(xsddefault_status_log, "r")) == NULL)
return ERROR;
#else
if((thefile = mmap_fopen(xsddefault_status_log)) == NULL)
return ERROR;
#endif
/* Big speedup when reading status.dat in bulk */
defer_downtime_sorting = 1;
defer_comment_sorting = 1;
/* read all lines in the status file */
while(1) {
#ifdef NO_MMAP
strcpy(input, "");
if(fgets(input, sizeof(input), fp) == NULL)
break;
#else
/* free memory */
my_free(input);
/* read the next line */
if((input = mmap_fgets(thefile)) == NULL)
break;
#endif
strip(input);
/* skip blank lines and comments */
if(input[0] == '#' || input[0] == '\x0')
continue;
else if(!strcmp(input, "info {"))
data_type = XSDDEFAULT_INFO_DATA;
else if(!strcmp(input, "programstatus {"))
data_type = XSDDEFAULT_PROGRAMSTATUS_DATA;
else if(!strcmp(input, "hoststatus {")) {
data_type = XSDDEFAULT_HOSTSTATUS_DATA;
temp_hoststatus = (hoststatus *)calloc(1, sizeof(hoststatus));
}
else if(!strcmp(input, "servicestatus {")) {
data_type = XSDDEFAULT_SERVICESTATUS_DATA;
temp_servicestatus = (servicestatus *)calloc(1, sizeof(servicestatus));
}
else if(!strcmp(input, "contactstatus {")) {
data_type = XSDDEFAULT_CONTACTSTATUS_DATA;
/* unimplemented */
}
else if(!strcmp(input, "hostcomment {"))
data_type = XSDDEFAULT_HOSTCOMMENT_DATA;
else if(!strcmp(input, "servicecomment {"))
data_type = XSDDEFAULT_SERVICECOMMENT_DATA;
else if(!strcmp(input, "hostdowntime {"))
data_type = XSDDEFAULT_HOSTDOWNTIME_DATA;
else if(!strcmp(input, "servicedowntime {"))
data_type = XSDDEFAULT_SERVICEDOWNTIME_DATA;
else if(!strcmp(input, "}")) {
switch(data_type) {
case XSDDEFAULT_INFO_DATA:
break;
case XSDDEFAULT_PROGRAMSTATUS_DATA:
break;
case XSDDEFAULT_HOSTSTATUS_DATA:
add_host_status(temp_hoststatus);
temp_hoststatus = NULL;
break;
case XSDDEFAULT_SERVICESTATUS_DATA:
add_service_status(temp_servicestatus);
temp_servicestatus = NULL;
break;
case XSDDEFAULT_CONTACTSTATUS_DATA:
/* unimplemented */
break;
case XSDDEFAULT_HOSTCOMMENT_DATA:
case XSDDEFAULT_SERVICECOMMENT_DATA:
/* add the comment */
add_comment((data_type == XSDDEFAULT_HOSTCOMMENT_DATA) ? HOST_COMMENT : SERVICE_COMMENT, entry_type, host_name, service_description, entry_time, author, comment_data, comment_id, persistent, expires, expire_time, source);
/* free temp memory */
my_free(host_name);
my_free(service_description);
my_free(author);
my_free(comment_data);
/* reset defaults */
entry_type = USER_COMMENT;
comment_id = 0;
source = COMMENTSOURCE_INTERNAL;
persistent = FALSE;
entry_time = 0L;
expires = FALSE;
expire_time = 0L;
break;
case XSDDEFAULT_HOSTDOWNTIME_DATA:
case XSDDEFAULT_SERVICEDOWNTIME_DATA:
/* add the downtime */
if(data_type == XSDDEFAULT_HOSTDOWNTIME_DATA)
add_host_downtime(host_name, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent);
else
add_service_downtime(host_name, service_description, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent);
/* free temp memory */
my_free(host_name);
my_free(service_description);
my_free(author);
my_free(comment_data);
/* reset defaults */
downtime_id = 0;
entry_time = 0L;
start_time = 0L;
end_time = 0L;
fixed = FALSE;
triggered_by = 0;
duration = 0L;
is_in_effect = FALSE;
start_notification_sent = FALSE;
break;
default:
break;
}
data_type = XSDDEFAULT_NO_DATA;
}
else if(data_type != XSDDEFAULT_NO_DATA) {
var = strtok(input, "=");
val = strtok(NULL, "\n");
if(val == NULL)
continue;
switch(data_type) {
case XSDDEFAULT_INFO_DATA:
break;
case XSDDEFAULT_PROGRAMSTATUS_DATA:
/* NOTE: some vars are not read, as they are not used by the CGIs (modified attributes, event handler commands, etc.) */
if(!strcmp(var, "nagios_pid"))
nagios_pid = atoi(val);
else if(!strcmp(var, "daemon_mode"))
daemon_mode = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "program_start"))
program_start = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_command_check"))
last_command_check = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_log_rotation"))
last_log_rotation = strtoul(val, NULL, 10);
else if(!strcmp(var, "enable_notifications"))
enable_notifications = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "active_service_checks_enabled"))
execute_service_checks = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "passive_service_checks_enabled"))
accept_passive_service_checks = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "active_host_checks_enabled"))
execute_host_checks = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "passive_host_checks_enabled"))
accept_passive_host_checks = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "enable_event_handlers"))
enable_event_handlers = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "obsess_over_services"))
obsess_over_services = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "obsess_over_hosts"))
obsess_over_hosts = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "check_service_freshness"))
check_service_freshness = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "check_host_freshness"))
check_host_freshness = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "enable_flap_detection"))
enable_flap_detection = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "enable_failure_prediction"))
enable_failure_prediction = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "process_performance_data"))
process_performance_data = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "total_external_command_buffer_slots"))
buffer_stats[0][0] = atoi(val);
else if(!strcmp(var, "used_external_command_buffer_slots"))
buffer_stats[0][1] = atoi(val);
else if(!strcmp(var, "high_external_command_buffer_slots"))
buffer_stats[0][2] = atoi(val);
else if(strstr(var, "_stats")) {
x = -1;
if(!strcmp(var, "active_scheduled_host_check_stats"))
x = ACTIVE_SCHEDULED_HOST_CHECK_STATS;
if(!strcmp(var, "active_ondemand_host_check_stats"))
x = ACTIVE_ONDEMAND_HOST_CHECK_STATS;
if(!strcmp(var, "passive_host_check_stats"))
x = PASSIVE_HOST_CHECK_STATS;
if(!strcmp(var, "active_scheduled_service_check_stats"))
x = ACTIVE_SCHEDULED_SERVICE_CHECK_STATS;
if(!strcmp(var, "active_ondemand_service_check_stats"))
x = ACTIVE_ONDEMAND_SERVICE_CHECK_STATS;
if(!strcmp(var, "passive_service_check_stats"))
x = PASSIVE_SERVICE_CHECK_STATS;
if(!strcmp(var, "cached_host_check_stats"))
x = ACTIVE_CACHED_HOST_CHECK_STATS;
if(!strcmp(var, "cached_service_check_stats"))
x = ACTIVE_CACHED_SERVICE_CHECK_STATS;
if(!strcmp(var, "external_command_stats"))
x = EXTERNAL_COMMAND_STATS;
if(!strcmp(var, "parallel_host_check_stats"))
x = PARALLEL_HOST_CHECK_STATS;
if(!strcmp(var, "serial_host_check_stats"))
x = SERIAL_HOST_CHECK_STATS;
if(x >= 0) {
if((ptr = strtok(val, ","))) {
program_stats[x][0] = atoi(ptr);
if((ptr = strtok(NULL, ","))) {
program_stats[x][1] = atoi(ptr);
if((ptr = strtok(NULL, "\n")))
program_stats[x][2] = atoi(ptr);
}
}
}
}
break;
case XSDDEFAULT_HOSTSTATUS_DATA:
/* NOTE: some vars are not read, as they are not used by the CGIs (modified attributes, event handler commands, etc.) */
if(temp_hoststatus != NULL) {
if(!strcmp(var, "host_name"))
temp_hoststatus->host_name = (char *)strdup(val);
else if(!strcmp(var, "has_been_checked"))
temp_hoststatus->has_been_checked = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "should_be_scheduled"))
temp_hoststatus->should_be_scheduled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "check_execution_time"))
temp_hoststatus->execution_time = strtod(val, NULL);
else if(!strcmp(var, "check_latency"))
temp_hoststatus->latency = strtod(val, NULL);
else if(!strcmp(var, "check_type"))
temp_hoststatus->check_type = atoi(val);
else if(!strcmp(var, "current_state"))
temp_hoststatus->status = atoi(val);
else if(!strcmp(var, "last_hard_state"))
temp_hoststatus->last_hard_state = atoi(val);
else if(!strcmp(var, "plugin_output")) {
temp_hoststatus->plugin_output = (char *)strdup(val);
unescape_newlines(temp_hoststatus->plugin_output);
}
else if(!strcmp(var, "long_plugin_output")) {
temp_hoststatus->long_plugin_output = (char *)strdup(val);
unescape_newlines(temp_hoststatus->long_plugin_output);
}
else if(!strcmp(var, "performance_data"))
temp_hoststatus->perf_data = (char *)strdup(val);
else if(!strcmp(var, "current_attempt"))
temp_hoststatus->current_attempt = atoi(val);
else if(!strcmp(var, "max_attempts"))
temp_hoststatus->max_attempts = atoi(val);
else if(!strcmp(var, "last_check"))
temp_hoststatus->last_check = strtoul(val, NULL, 10);
else if(!strcmp(var, "next_check"))
temp_hoststatus->next_check = strtoul(val, NULL, 10);
else if(!strcmp(var, "check_options"))
temp_hoststatus->check_options = atoi(val);
else if(!strcmp(var, "current_attempt"))
temp_hoststatus->current_attempt = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "state_type"))
temp_hoststatus->state_type = atoi(val);
else if(!strcmp(var, "last_state_change"))
temp_hoststatus->last_state_change = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_hard_state_change"))
temp_hoststatus->last_hard_state_change = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_up"))
temp_hoststatus->last_time_up = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_down"))
temp_hoststatus->last_time_down = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_unreachable"))
temp_hoststatus->last_time_unreachable = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_notification"))
temp_hoststatus->last_notification = strtoul(val, NULL, 10);
else if(!strcmp(var, "next_notification"))
temp_hoststatus->next_notification = strtoul(val, NULL, 10);
else if(!strcmp(var, "no_more_notifications"))
temp_hoststatus->no_more_notifications = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "current_notification_number"))
temp_hoststatus->current_notification_number = atoi(val);
else if(!strcmp(var, "notifications_enabled"))
temp_hoststatus->notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "problem_has_been_acknowledged"))
temp_hoststatus->problem_has_been_acknowledged = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "acknowledgement_type"))
temp_hoststatus->acknowledgement_type = atoi(val);
else if(!strcmp(var, "active_checks_enabled"))
temp_hoststatus->checks_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "passive_checks_enabled"))
temp_hoststatus->accept_passive_host_checks = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "event_handler_enabled"))
temp_hoststatus->event_handler_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "flap_detection_enabled"))
temp_hoststatus->flap_detection_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "failure_prediction_enabled"))
temp_hoststatus->failure_prediction_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "process_performance_data"))
temp_hoststatus->process_performance_data = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "obsess_over_host"))
temp_hoststatus->obsess_over_host = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "last_update"))
temp_hoststatus->last_update = strtoul(val, NULL, 10);
else if(!strcmp(var, "is_flapping"))
temp_hoststatus->is_flapping = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "percent_state_change"))
temp_hoststatus->percent_state_change = strtod(val, NULL);
else if(!strcmp(var, "scheduled_downtime_depth"))
temp_hoststatus->scheduled_downtime_depth = atoi(val);
/*
else if(!strcmp(var,"state_history")){
temp_ptr=val;
for(x=0;x<MAX_STATE_HISTORY_ENTRIES;x++)
temp_hoststatus->state_history[x]=atoi(my_strsep(&temp_ptr,","));
temp_hoststatus->state_history_index=0;
}
*/
}
break;
case XSDDEFAULT_SERVICESTATUS_DATA:
/* NOTE: some vars are not read, as they are not used by the CGIs (modified attributes, event handler commands, etc.) */
if(temp_servicestatus != NULL) {
if(!strcmp(var, "host_name"))
temp_servicestatus->host_name = (char *)strdup(val);
else if(!strcmp(var, "service_description"))
temp_servicestatus->description = (char *)strdup(val);
else if(!strcmp(var, "has_been_checked"))
temp_servicestatus->has_been_checked = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "should_be_scheduled"))
temp_servicestatus->should_be_scheduled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "check_execution_time"))
temp_servicestatus->execution_time = strtod(val, NULL);
else if(!strcmp(var, "check_latency"))
temp_servicestatus->latency = strtod(val, NULL);
else if(!strcmp(var, "check_type"))
temp_servicestatus->check_type = atoi(val);
else if(!strcmp(var, "current_state"))
temp_servicestatus->status = atoi(val);
else if(!strcmp(var, "last_hard_state"))
temp_servicestatus->last_hard_state = atoi(val);
else if(!strcmp(var, "current_attempt"))
temp_servicestatus->current_attempt = atoi(val);
else if(!strcmp(var, "max_attempts"))
temp_servicestatus->max_attempts = atoi(val);
else if(!strcmp(var, "state_type"))
temp_servicestatus->state_type = atoi(val);
else if(!strcmp(var, "last_state_change"))
temp_servicestatus->last_state_change = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_hard_state_change"))
temp_servicestatus->last_hard_state_change = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_ok"))
temp_servicestatus->last_time_ok = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_warning"))
temp_servicestatus->last_time_warning = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_unknown"))
temp_servicestatus->last_time_unknown = strtoul(val, NULL, 10);
else if(!strcmp(var, "last_time_critical"))
temp_servicestatus->last_time_critical = strtoul(val, NULL, 10);
else if(!strcmp(var, "plugin_output")) {
temp_servicestatus->plugin_output = (char *)strdup(val);
unescape_newlines(temp_servicestatus->plugin_output);
}
else if(!strcmp(var, "long_plugin_output")) {
temp_servicestatus->long_plugin_output = (char *)strdup(val);
unescape_newlines(temp_servicestatus->long_plugin_output);
}
else if(!strcmp(var, "performance_data"))
temp_servicestatus->perf_data = (char *)strdup(val);
else if(!strcmp(var, "last_check"))
temp_servicestatus->last_check = strtoul(val, NULL, 10);
else if(!strcmp(var, "next_check"))
temp_servicestatus->next_check = strtoul(val, NULL, 10);
else if(!strcmp(var, "check_options"))
temp_servicestatus->check_options = atoi(val);
else if(!strcmp(var, "current_notification_number"))
temp_servicestatus->current_notification_number = atoi(val);
else if(!strcmp(var, "last_notification"))
temp_servicestatus->last_notification = strtoul(val, NULL, 10);
else if(!strcmp(var, "next_notification"))
temp_servicestatus->next_notification = strtoul(val, NULL, 10);
else if(!strcmp(var, "no_more_notifications"))
temp_servicestatus->no_more_notifications = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "notifications_enabled"))
temp_servicestatus->notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "active_checks_enabled"))
temp_servicestatus->checks_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "passive_checks_enabled"))
temp_servicestatus->accept_passive_service_checks = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "event_handler_enabled"))
temp_servicestatus->event_handler_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "problem_has_been_acknowledged"))
temp_servicestatus->problem_has_been_acknowledged = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "acknowledgement_type"))
temp_servicestatus->acknowledgement_type = atoi(val);
else if(!strcmp(var, "flap_detection_enabled"))
temp_servicestatus->flap_detection_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "failure_prediction_enabled"))
temp_servicestatus->failure_prediction_enabled = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "process_performance_data"))
temp_servicestatus->process_performance_data = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "obsess_over_service"))
temp_servicestatus->obsess_over_service = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "last_update"))
temp_servicestatus->last_update = strtoul(val, NULL, 10);
else if(!strcmp(var, "is_flapping"))
temp_servicestatus->is_flapping = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "percent_state_change"))
temp_servicestatus->percent_state_change = strtod(val, NULL);
else if(!strcmp(var, "scheduled_downtime_depth"))
temp_servicestatus->scheduled_downtime_depth = atoi(val);
/*
else if(!strcmp(var,"state_history")){
temp_ptr=val;
for(x=0;x<MAX_STATE_HISTORY_ENTRIES;x++)
temp_servicestatus->state_history[x]=atoi(my_strsep(&temp_ptr,","));
temp_servicestatus->state_history_index=0;
}
*/
}
break;
case XSDDEFAULT_CONTACTSTATUS_DATA:
/* unimplemented */
break;
case XSDDEFAULT_HOSTCOMMENT_DATA:
case XSDDEFAULT_SERVICECOMMENT_DATA:
if(!strcmp(var, "host_name"))
host_name = (char *)strdup(val);
else if(!strcmp(var, "service_description"))
service_description = (char *)strdup(val);
else if(!strcmp(var, "entry_type"))
entry_type = atoi(val);
else if(!strcmp(var, "comment_id"))
comment_id = strtoul(val, NULL, 10);
else if(!strcmp(var, "source"))
source = atoi(val);
else if(!strcmp(var, "persistent"))
persistent = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "entry_time"))
entry_time = strtoul(val, NULL, 10);
else if(!strcmp(var, "expires"))
expires = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "expire_time"))
expire_time = strtoul(val, NULL, 10);
else if(!strcmp(var, "author"))
author = (char *)strdup(val);
else if(!strcmp(var, "comment_data"))
comment_data = (char *)strdup(val);
break;
case XSDDEFAULT_HOSTDOWNTIME_DATA:
case XSDDEFAULT_SERVICEDOWNTIME_DATA:
if(!strcmp(var, "host_name"))
host_name = (char *)strdup(val);
else if(!strcmp(var, "service_description"))
service_description = (char *)strdup(val);
else if(!strcmp(var, "downtime_id"))
downtime_id = strtoul(val, NULL, 10);
else if(!strcmp(var, "comment_id"))
comment_id = strtoul(val, NULL, 10);
else if(!strcmp(var, "entry_time"))
entry_time = strtoul(val, NULL, 10);
else if(!strcmp(var, "start_time"))
start_time = strtoul(val, NULL, 10);
else if(!strcmp(var, "flex_downtime_start"))
flex_downtime_start = strtoul(val, NULL, 10);
else if(!strcmp(var, "end_time"))
end_time = strtoul(val, NULL, 10);
else if(!strcmp(var, "fixed"))
fixed = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "triggered_by"))
triggered_by = strtoul(val, NULL, 10);
else if(!strcmp(var, "duration"))
duration = strtoul(val, NULL, 10);
else if(!strcmp(var, "is_in_effect"))
is_in_effect = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "start_notification_sent"))
start_notification_sent = (atoi(val) > 0) ? TRUE : FALSE;
else if(!strcmp(var, "author"))
author = (char *)strdup(val);
else if(!strcmp(var, "comment"))
comment_data = (char *)strdup(val);
break;
default:
break;
}
}
}
/* free memory and close the file */
#ifdef NO_MMAP
fclose(fp);
#else
my_free(input);
mmap_fclose(thefile);
#endif
/* free memory */
my_free(xsddefault_status_log);
my_free(xsddefault_temp_file);
if(sort_downtime() != OK)
return ERROR;
if(sort_comments() != OK)
return ERROR;
return OK;
}
#endif