/* initializes performance data */ int xpddefault_initialize_performance_data(const char *cfgfile) { char *buffer = NULL; char *temp_buffer = NULL; command *temp_command = NULL; time_t current_time; nagios_macros *mac; mac = get_global_macros(); time(¤t_time); /* reset vars */ host_perfdata_command_ptr = NULL; service_perfdata_command_ptr = NULL; host_perfdata_file_processing_command_ptr = NULL; service_perfdata_file_processing_command_ptr = NULL; /* make sure we have some templates defined */ if (host_perfdata_file_template == NULL) host_perfdata_file_template = (char *)strdup(DEFAULT_HOST_PERFDATA_FILE_TEMPLATE); if (service_perfdata_file_template == NULL) service_perfdata_file_template = (char *)strdup(DEFAULT_SERVICE_PERFDATA_FILE_TEMPLATE); /* process special chars in templates */ xpddefault_preprocess_file_templates(host_perfdata_file_template); xpddefault_preprocess_file_templates(service_perfdata_file_template); /* open the performance data files */ xpddefault_open_host_perfdata_file(); xpddefault_open_service_perfdata_file(); /* verify that performance data commands are valid */ if (host_perfdata_command != NULL) { temp_buffer = (char *)strdup(host_perfdata_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host performance command '%s' was not found - host performance data will not be processed!\n", host_perfdata_command); my_free(host_perfdata_command); } my_free(temp_buffer); /* save the command pointer for later */ host_perfdata_command_ptr = temp_command; } if (service_perfdata_command != NULL) { temp_buffer = (char *)strdup(service_perfdata_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service performance command '%s' was not found - service performance data will not be processed!\n", service_perfdata_command); my_free(service_perfdata_command); } my_free(temp_buffer); /* save the command pointer for later */ service_perfdata_command_ptr = temp_command; } if (host_perfdata_file_processing_command != NULL) { temp_buffer = (char *)strdup(host_perfdata_file_processing_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host performance file processing command '%s' was not found - host performance data file will not be processed!\n", host_perfdata_file_processing_command); my_free(host_perfdata_file_processing_command); } /* free memory */ my_free(temp_buffer); /* save the command pointer for later */ host_perfdata_file_processing_command_ptr = temp_command; } if (service_perfdata_file_processing_command != NULL) { temp_buffer = (char *)strdup(service_perfdata_file_processing_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service performance file processing command '%s' was not found - service performance data file will not be processed!\n", service_perfdata_file_processing_command); my_free(service_perfdata_file_processing_command); } /* save the command pointer for later */ service_perfdata_file_processing_command_ptr = temp_command; } /* periodically process the host perfdata file */ if (host_perfdata_file_processing_interval > 0 && host_perfdata_file_processing_command != NULL) schedule_new_event(EVENT_USER_FUNCTION, TRUE, current_time + host_perfdata_file_processing_interval, TRUE, host_perfdata_file_processing_interval, NULL, TRUE, (void *)xpddefault_process_host_perfdata_file, NULL, 0); /* periodically process the service perfdata file */ if (service_perfdata_file_processing_interval > 0 && service_perfdata_file_processing_command != NULL) schedule_new_event(EVENT_USER_FUNCTION, TRUE, current_time + service_perfdata_file_processing_interval, TRUE, service_perfdata_file_processing_interval, NULL, TRUE, (void *)xpddefault_process_service_perfdata_file, NULL, 0); /* save the host perf data file macro */ my_free(mac->x[MACRO_HOSTPERFDATAFILE]); if (host_perfdata_file != NULL) { if ((mac->x[MACRO_HOSTPERFDATAFILE] = (char *)strdup(host_perfdata_file))) strip(mac->x[MACRO_HOSTPERFDATAFILE]); } /* save the service perf data file macro */ my_free(mac->x[MACRO_SERVICEPERFDATAFILE]); if (service_perfdata_file != NULL) { if ((mac->x[MACRO_SERVICEPERFDATAFILE] = (char *)strdup(service_perfdata_file))) strip(mac->x[MACRO_SERVICEPERFDATAFILE]); } /* free memory */ my_free(temp_buffer); my_free(buffer); return OK; }
int setup_host_variables(host *new_host, const char *display_name, const char *alias, const char *address, const char *check_period, int initial_state, double check_interval, double retry_interval, int max_attempts, int notification_options, double notification_interval, double first_notification_delay, const char *notification_period, int notifications_enabled, const char *check_command, int checks_enabled, int accept_passive_checks, const char *event_handler, int event_handler_enabled, int flap_detection_enabled, double low_flap_threshold, double high_flap_threshold, int flap_detection_options, int stalking_options, int process_perfdata, int check_freshness, int freshness_threshold, const char *notes, const char *notes_url, const char *action_url, const char *icon_image, const char *icon_image_alt, const char *vrml_image, const char *statusmap_image, int x_2d, int y_2d, int have_2d_coords, double x_3d, double y_3d, double z_3d, int have_3d_coords, int retain_status_information, int retain_nonstatus_information, int obsess, unsigned int hourly_value) { timeperiod *check_tp = NULL, *notify_tp = NULL; if (check_period && !(check_tp = find_timeperiod(check_period))) { nm_log(NSLOG_CONFIG_ERROR, "Error: Failed to locate check_period '%s' for host '%s'!\n", check_period, new_host->name); return -1; } if (notification_period && !(notify_tp = find_timeperiod(notification_period))) { nm_log(NSLOG_CONFIG_ERROR, "Error: Failed to locate notification_period '%s' for host '%s'!\n", notification_period, new_host->name); return -1; } /* check values */ if (max_attempts <= 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: max_check_attempts must be a positive integer host '%s'\n", new_host->name); return -1; } if (check_interval < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: Invalid check_interval value for host '%s'\n", new_host->name); return -1; } if (notification_interval < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: Invalid notification_interval value for host '%s'\n", new_host->name); return -1; } if (first_notification_delay < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: Invalid first_notification_delay value for host '%s'\n", new_host->name); return -1; } if (freshness_threshold < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: Invalid freshness_threshold value for host '%s'\n", new_host->name); return -1; } /* assign string vars */ if (display_name) new_host->display_name = nm_strdup(display_name); if (alias) new_host->alias = nm_strdup(alias); if (address) new_host->address = nm_strdup(address); if (check_tp) { new_host->check_period = check_tp->name; new_host->check_period_ptr = check_tp; } new_host->notification_period = notify_tp ? notify_tp->name : NULL; new_host->notification_period_ptr = notify_tp; if (check_command) { new_host->check_command = nm_strdup(check_command); new_host->check_command_ptr = find_bang_command(check_command); if (new_host->check_command_ptr == NULL) { nm_log(NSLOG_VERIFICATION_ERROR, "Error: Host check command '%s' specified for host '%s' is not defined anywhere!", new_host->check_command, new_host->name); return -1; } } if (event_handler) { new_host->event_handler = nm_strdup(event_handler); new_host->event_handler_ptr = find_bang_command(event_handler); if (new_host->event_handler_ptr == NULL) { nm_log(NSLOG_VERIFICATION_ERROR, "Error: Event handler command '%s' specified for host '%s' not defined anywhere", new_host->event_handler, new_host->name); return -1; } } new_host->notes = notes ? nm_strdup(notes) : NULL; new_host->notes_url = notes_url ? nm_strdup(notes_url) : NULL; new_host->action_url = action_url ? nm_strdup(action_url) : NULL; new_host->icon_image = icon_image ? nm_strdup(icon_image) : NULL; new_host->icon_image_alt = icon_image_alt ? nm_strdup(icon_image_alt) : NULL; new_host->vrml_image = vrml_image ? nm_strdup(vrml_image) : NULL; new_host->statusmap_image = statusmap_image ? nm_strdup(statusmap_image) : NULL; /* duplicate non-string vars */ new_host->hourly_value = hourly_value; new_host->max_attempts = max_attempts; new_host->check_interval = check_interval; new_host->retry_interval = retry_interval; new_host->notification_interval = notification_interval; new_host->first_notification_delay = first_notification_delay; new_host->notification_options = notification_options; new_host->flap_detection_enabled = (flap_detection_enabled > 0) ? TRUE : FALSE; new_host->low_flap_threshold = low_flap_threshold; new_host->high_flap_threshold = high_flap_threshold; new_host->flap_detection_options = flap_detection_options; new_host->stalking_options = stalking_options; new_host->process_performance_data = (process_perfdata > 0) ? TRUE : FALSE; new_host->check_freshness = (check_freshness > 0) ? TRUE : FALSE; new_host->freshness_threshold = freshness_threshold; new_host->checks_enabled = (checks_enabled > 0) ? TRUE : FALSE; new_host->accept_passive_checks = (accept_passive_checks > 0) ? TRUE : FALSE; new_host->event_handler_enabled = (event_handler_enabled > 0) ? TRUE : FALSE; new_host->x_2d = x_2d; new_host->y_2d = y_2d; new_host->have_2d_coords = (have_2d_coords > 0) ? TRUE : FALSE; new_host->x_3d = x_3d; new_host->y_3d = y_3d; new_host->z_3d = z_3d; new_host->have_3d_coords = (have_3d_coords > 0) ? TRUE : FALSE; new_host->obsess = (obsess > 0) ? TRUE : FALSE; new_host->retain_status_information = (retain_status_information > 0) ? TRUE : FALSE; new_host->retain_nonstatus_information = (retain_nonstatus_information > 0) ? TRUE : FALSE; new_host->current_state = initial_state; new_host->last_state = initial_state; new_host->last_hard_state = initial_state; new_host->current_attempt = (initial_state == STATE_UP) ? 1 : max_attempts; new_host->notifications_enabled = (notifications_enabled > 0) ? TRUE : FALSE; return 0; }
int setup_service_variables(service *new_service, const char *display_name, const char *check_command, const char *check_period, int initial_state, int max_attempts, int accept_passive_checks, double check_interval, double retry_interval, double notification_interval, double first_notification_delay, char *notification_period, int notification_options, int notifications_enabled, int is_volatile, const char *event_handler, int event_handler_enabled, int checks_enabled, int flap_detection_enabled, double low_flap_threshold, double high_flap_threshold, int flap_detection_options, int stalking_options, int process_perfdata, int check_freshness, int freshness_threshold, const char *notes, const char *notes_url, const char *action_url, const char *icon_image, const char *icon_image_alt, int retain_status_information, int retain_nonstatus_information, int obsess, unsigned int hourly_value) { timeperiod *cp = NULL, *np = NULL; command *cmd; /* make sure we have everything we need */ if (notification_period && !(np = find_timeperiod(notification_period))) { nm_log(NSLOG_CONFIG_ERROR, "Error: notification_period '%s' for service '%s' on host '%s' could not be found!\n", notification_period, new_service->description, new_service->host_name); return -1; } if (check_period && !(cp = find_timeperiod(check_period))) { nm_log(NSLOG_CONFIG_ERROR, "Error: check_period '%s' for service '%s' on host '%s' not found!\n", check_period, new_service->description, new_service->host_name); return -1; } if (check_command == NULL || !*check_command) { nm_log(NSLOG_CONFIG_ERROR, "Error: No check command provided for service '%s' on host '%s'\n", new_service->check_command, new_service->description); return -1; } cmd = find_bang_command(check_command); if (cmd == NULL) { nm_log(NSLOG_VERIFICATION_ERROR, "Error: Service check command '%s' specified in service '%s' for host '%s' not defined anywhere!", check_command, new_service->description, new_service->host_name); return -1; } if (max_attempts <= 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: max_check_attempts must be a positive integer for service '%s' on host '%s'\n", new_service->description, new_service->host_name); return -1; } if (check_interval < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: check_interval must be a non-negative integer for service '%s' on host '%s'\n", new_service->description, new_service->host_name); return -1; } if (retry_interval <= 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: retry_interval must be a positive integer for service '%s' on host '%s'\n", new_service->description, new_service->host_name); return -1; } if (notification_interval < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: notification_interval must be a non-negative integer for service '%s' on host '%s'\n", new_service->description, new_service->host_name); return -1; } if (first_notification_delay < 0) { nm_log(NSLOG_CONFIG_ERROR, "Error: first_notification_delay must be a non-negative integer for service '%s' on host '%s'\n", new_service->description, new_service->host_name); return -1; } /* duplicate vars, but assign what we can */ new_service->notification_period_ptr = np; new_service->check_period_ptr = cp; new_service->check_period = cp ? cp->name : NULL; new_service->notification_period = np ? np->name : NULL; new_service->check_command = nm_strdup(check_command); new_service->check_command_ptr = cmd; if (display_name) { new_service->display_name = nm_strdup(display_name); } if (event_handler) { new_service->event_handler = nm_strdup(event_handler); new_service->event_handler_ptr = find_bang_command(event_handler); if (new_service->event_handler_ptr == NULL) { nm_log(NSLOG_VERIFICATION_ERROR, "Error: Event handler command '%s' specified in service '%s' for host '%s' not defined anywhere", new_service->event_handler, new_service->description, new_service->host_name); return -1; } } if (notes) { new_service->notes = nm_strdup(notes); } if (notes_url) { new_service->notes_url = nm_strdup(notes_url); } if (action_url) { new_service->action_url = nm_strdup(action_url); } if (icon_image) { new_service->icon_image = nm_strdup(icon_image); } if (icon_image_alt) { new_service->icon_image_alt = nm_strdup(icon_image_alt); } new_service->hourly_value = hourly_value; new_service->check_interval = check_interval; new_service->retry_interval = retry_interval; new_service->max_attempts = max_attempts; new_service->notification_interval = notification_interval; new_service->first_notification_delay = first_notification_delay; new_service->notification_options = notification_options; new_service->is_volatile = (is_volatile > 0) ? TRUE : FALSE; new_service->flap_detection_enabled = (flap_detection_enabled > 0) ? TRUE : FALSE; new_service->low_flap_threshold = low_flap_threshold; new_service->high_flap_threshold = high_flap_threshold; new_service->flap_detection_options = flap_detection_options; new_service->stalking_options = stalking_options; new_service->process_performance_data = (process_perfdata > 0) ? TRUE : FALSE; new_service->check_freshness = (check_freshness > 0) ? TRUE : FALSE; new_service->freshness_threshold = freshness_threshold; new_service->accept_passive_checks = (accept_passive_checks > 0) ? TRUE : FALSE; new_service->event_handler_enabled = (event_handler_enabled > 0) ? TRUE : FALSE; new_service->checks_enabled = (checks_enabled > 0) ? TRUE : FALSE; new_service->retain_status_information = (retain_status_information > 0) ? TRUE : FALSE; new_service->retain_nonstatus_information = (retain_nonstatus_information > 0) ? TRUE : FALSE; new_service->notifications_enabled = (notifications_enabled > 0) ? TRUE : FALSE; new_service->obsess = (obsess > 0) ? TRUE : FALSE; new_service->current_attempt = (initial_state == STATE_OK) ? 1 : max_attempts; new_service->current_state = initial_state; new_service->last_state = initial_state; new_service->last_hard_state = initial_state; /* check the service check_command */ return 0; }
/* initializes performance data */ int initialize_performance_data(const char *cfgfile) { char *buffer = NULL; char *temp_buffer = NULL; command *temp_command = NULL; time_t current_time; nagios_macros *mac; mac = get_global_macros(); time(¤t_time); /* reset vars */ host_perfdata_command_ptr = NULL; service_perfdata_command_ptr = NULL; host_perfdata_file_processing_command_ptr = NULL; service_perfdata_file_processing_command_ptr = NULL; /* make sure we have some templates defined */ if (host_perfdata_file_template == NULL) host_perfdata_file_template = nm_strdup(DEFAULT_HOST_PERFDATA_FILE_TEMPLATE); if (service_perfdata_file_template == NULL) service_perfdata_file_template = nm_strdup(DEFAULT_SERVICE_PERFDATA_FILE_TEMPLATE); /* process special chars in templates */ xpddefault_preprocess_file_templates(host_perfdata_file_template); xpddefault_preprocess_file_templates(service_perfdata_file_template); /* open the performance data caches */ host_perfdata_bq = nm_bufferqueue_create(); host_perfdata_fd = xpddefault_open_perfdata_file( host_perfdata_file, host_perfdata_file_pipe, host_perfdata_file_append); service_perfdata_bq = nm_bufferqueue_create(); service_perfdata_fd = xpddefault_open_perfdata_file( service_perfdata_file, service_perfdata_file_pipe, service_perfdata_file_append); /* verify that performance data commands are valid */ if (host_perfdata_command != NULL) { temp_buffer = nm_strdup(host_perfdata_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { nm_log(NSLOG_RUNTIME_WARNING, "Warning: Host performance command '%s' was not found - host performance data will not be processed!\n", host_perfdata_command); nm_free(host_perfdata_command); } nm_free(temp_buffer); /* save the command pointer for later */ host_perfdata_command_ptr = temp_command; } if (service_perfdata_command != NULL) { temp_buffer = nm_strdup(service_perfdata_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { nm_log(NSLOG_RUNTIME_WARNING, "Warning: Service performance command '%s' was not found - service performance data will not be processed!\n", service_perfdata_command); nm_free(service_perfdata_command); } nm_free(temp_buffer); /* save the command pointer for later */ service_perfdata_command_ptr = temp_command; } if (host_perfdata_file_processing_command != NULL) { temp_buffer = nm_strdup(host_perfdata_file_processing_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { nm_log(NSLOG_RUNTIME_WARNING, "Warning: Host performance file processing command '%s' was not found - host performance data file will not be processed!\n", host_perfdata_file_processing_command); nm_free(host_perfdata_file_processing_command); } nm_free(temp_buffer); /* save the command pointer for later */ host_perfdata_file_processing_command_ptr = temp_command; } if (service_perfdata_file_processing_command != NULL) { temp_buffer = nm_strdup(service_perfdata_file_processing_command); if ((temp_command = find_bang_command(temp_buffer)) == NULL) { nm_log(NSLOG_RUNTIME_WARNING, "Warning: Service performance file processing command '%s' was not found - service performance data file will not be processed!\n", service_perfdata_file_processing_command); nm_free(service_perfdata_file_processing_command); } /* save the command pointer for later */ service_perfdata_file_processing_command_ptr = temp_command; } /* periodically process the host perfdata file */ if (host_perfdata_file_processing_interval > 0 && host_perfdata_file_processing_command != NULL) { if (host_perfdata_file_pipe) nm_log(NSLOG_RUNTIME_WARNING, "Warning: Host performance file is configured to be a pipe - ignoring host_perfdata_file_processing_interval"); else schedule_event(host_perfdata_file_processing_interval, xpddefault_process_host_perfdata_file, NULL); } /* periodically process the service perfdata file */ if (service_perfdata_file_processing_interval > 0 && service_perfdata_file_processing_command != NULL) { if (service_perfdata_file_pipe) nm_log(NSLOG_RUNTIME_WARNING, "Warning: Service performance file is configured to be a pipe - ignoring service_perfdata_file_processing_interval"); else schedule_event(service_perfdata_file_processing_interval, xpddefault_process_service_perfdata_file, NULL); } /* save the host perf data file macro */ nm_free(mac->x[MACRO_HOSTPERFDATAFILE]); if (host_perfdata_file != NULL) { mac->x[MACRO_HOSTPERFDATAFILE] = nm_strdup(host_perfdata_file); strip(mac->x[MACRO_HOSTPERFDATAFILE]); } /* save the service perf data file macro */ nm_free(mac->x[MACRO_SERVICEPERFDATAFILE]); if (service_perfdata_file != NULL) { mac->x[MACRO_SERVICEPERFDATAFILE] = nm_strdup(service_perfdata_file); strip(mac->x[MACRO_SERVICEPERFDATAFILE]); } nm_free(temp_buffer); nm_free(buffer); return OK; }