/* deletes a scheduled host or service downtime entry from the list in memory */ int delete_downtime(int type, unsigned long downtime_id) { scheduled_downtime *this_downtime = NULL; /* find the downtime we should remove */ this_downtime = find_downtime(type, downtime_id); if(!this_downtime) return ERROR; downtime_remove(this_downtime); /* first remove the comment associated with this downtime */ if(this_downtime->type == HOST_DOWNTIME) delete_host_comment(this_downtime->comment_id); else delete_service_comment(this_downtime->comment_id); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_DELETE, NEBFLAG_NONE, NEBATTR_NONE, type, this_downtime->host_name, this_downtime->service_description, this_downtime->entry_time, this_downtime->author, this_downtime->comment, this_downtime->start_time, this_downtime->end_time, this_downtime->fixed, this_downtime->triggered_by, this_downtime->duration, downtime_id, NULL); #endif /* free memory */ my_free(this_downtime->host_name); my_free(this_downtime->service_description); my_free(this_downtime->author); my_free(this_downtime->comment); my_free(this_downtime); return OK; }
/* handles a service that has stopped flapping */ void clear_service_flap(service *svc, double percent_change, double high_threshold, double low_threshold) { if (svc == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Service '%s' on host '%s' stopped flapping.\n", svc->description, svc->host_name); /* log a notice - this one is parsed by the history CGI */ nm_log(NSLOG_INFO_MESSAGE, "SERVICE FLAPPING ALERT: %s;%s;STOPPED; Service appears to have stopped flapping (%2.1f%% change < %2.1f%% threshold)\n", svc->host_name, svc->description, percent_change, low_threshold); /* delete the comment we added earlier */ if (svc->flapping_comment_id != 0) delete_service_comment(svc->flapping_comment_id); svc->flapping_comment_id = 0; /* clear the flapping indicator */ svc->is_flapping = FALSE; broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_NORMAL, SERVICE_FLAPPING, svc, percent_change, high_threshold, low_threshold); /* send a notification */ service_notification(svc, NOTIFICATION_FLAPPINGSTOP, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if (svc->check_flapping_recovery_notification == TRUE && svc->current_state == STATE_OK) service_notification(svc, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* clear the recovery notification flag */ svc->check_flapping_recovery_notification = FALSE; return; }
/* deletes a scheduled host or service downtime entry from the list in memory */ int delete_downtime(int type, unsigned long downtime_id) { int result = OK; scheduled_downtime *this_downtime = NULL; scheduled_downtime *last_downtime = NULL; scheduled_downtime *next_downtime = NULL; #ifdef NSCORE pthread_mutex_lock(&icinga_downtime_lock); #endif /* find the downtime we should remove */ for (this_downtime = scheduled_downtime_list, last_downtime = scheduled_downtime_list; this_downtime != NULL; this_downtime = next_downtime) { next_downtime = this_downtime->next; /* we found the downtime we should delete */ if (this_downtime->downtime_id == downtime_id && this_downtime->type == type) break; last_downtime = this_downtime; } /* remove the downtime from the list in memory */ if (this_downtime != NULL) { /* first remove the comment associated with this downtime */ if (this_downtime->type == HOST_DOWNTIME) delete_host_comment(this_downtime->comment_id); else delete_service_comment(this_downtime->comment_id); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_DELETE, NEBFLAG_NONE, NEBATTR_NONE, type, this_downtime->host_name, this_downtime->service_description, this_downtime->entry_time, this_downtime->author, this_downtime->comment, this_downtime->start_time, this_downtime->end_time, this_downtime->fixed, this_downtime->triggered_by, this_downtime->duration, downtime_id, NULL, this_downtime->is_in_effect, this_downtime->trigger_time); #endif if (scheduled_downtime_list == this_downtime) scheduled_downtime_list = this_downtime->next; else last_downtime->next = next_downtime; /* free memory */ my_free(this_downtime->host_name); my_free(this_downtime->service_description); my_free(this_downtime->author); my_free(this_downtime->comment); my_free(this_downtime); result = OK; } else result = ERROR; #ifdef NSCORE pthread_mutex_unlock(&icinga_downtime_lock); #endif return result; }
/* handles the details for a service when flap detection is disabled (globally or per-service) */ void handle_service_flap_detection_disabled(service *svc) { log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_service_flap_detection_disabled()\n"); if (svc == NULL) return; /* if the service was flapping, remove the flapping indicator */ if (svc->is_flapping == TRUE) { svc->is_flapping = FALSE; /* delete the original comment we added earlier */ if (svc->flapping_comment_id != 0) delete_service_comment(svc->flapping_comment_id); svc->flapping_comment_id = 0; /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE FLAPPING ALERT: %s;%s;DISABLED; Flap detection has been disabled\n", svc->host_name, svc->description); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_DISABLED, SERVICE_FLAPPING, svc, svc->percent_state_change, 0.0, 0.0, NULL); #endif /* send a notification */ service_notification(svc, NOTIFICATION_FLAPPINGDISABLED, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if (svc->check_flapping_recovery_notification == TRUE && svc->current_state == STATE_OK) service_notification(svc, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* clear the recovery notification flag */ svc->check_flapping_recovery_notification = FALSE; } /* update service status */ update_service_status(svc, FALSE); return; }
/* handles a service that has stopped flapping */ void clear_service_flap(service *svc, double percent_change, double high_threshold, double low_threshold) { log_debug_info(DEBUGL_FUNCTIONS, 0, "clear_service_flap()\n"); if (svc == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Service '%s' on host '%s' stopped flapping.\n", svc->description, svc->host_name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "服务抖动警告: %s;%s;停止; 服务似乎已经停止抖动 (%2.1f%% 变化 < %2.1f%% 阙值)\n", svc->host_name, svc->description, percent_change, low_threshold); /* delete the comment we added earlier */ if (svc->flapping_comment_id != 0) delete_service_comment(svc->flapping_comment_id); svc->flapping_comment_id = 0; /* clear the flapping indicator */ svc->is_flapping = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_NORMAL, SERVICE_FLAPPING, svc, percent_change, high_threshold, low_threshold, NULL); #endif /* send a notification */ service_notification(svc, NOTIFICATION_FLAPPINGSTOP, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if (svc->check_flapping_recovery_notification == TRUE && svc->current_state == STATE_OK) service_notification(svc, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* clear the recovery notification flag */ svc->check_flapping_recovery_notification = FALSE; return; }