Skip to content
This repository has been archived by the owner on Jan 15, 2019. It is now read-only.

Commit

Permalink
fix scheduled downtime notifications resent on restart/reload #584
Browse files Browse the repository at this point in the history
What happened here is, that a downtime is rescheduled after restart.
So it reads the status from the retention file, but it has no idea
if the downtime is already started or not. Because the flag
"is_in_effect" isn't stored to the status or retention data.

Added the flag to status and retention data.
Also to every function which is adding a downtime.

When icinga gets started then it will register and trigger a downtime
event soon after start, bailing also out on sending a notification if
downtime->is_in_effect is TRUE.

done by Ricardo.

fixes #584
  • Loading branch information
Michael Friedrich committed Sep 23, 2010
1 parent 59a31df commit 81eb1f3
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 32 deletions.
1 change: 1 addition & 0 deletions Changelog
Expand Up @@ -10,6 +10,7 @@ ENHANCEMENTS
* core: fix delay sorting of comments/downtimes (Ton Voon) #753
* core: fix custom macros being cleaned/stripped (as they are user-defined and should be trusted) (Peter Morch) #752
* core: add the possibility to use * as a wildcard for all hosts in servicegroup definition #813
* core: fix scheduled downtime notifications resent on restart/reload #584

* classic ui: add commands expander to config display (Jochen Bern) #746
- $ARGn$ substitution will be shown between command_line and
Expand Down
39 changes: 24 additions & 15 deletions common/downtime.c
Expand Up @@ -106,7 +106,7 @@ int schedule_downtime(int type, char *host_name, char *service_description, time
return ERROR;

/* add a new downtime entry */
add_new_downtime(type,host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,&downtime_id);
add_new_downtime(type,host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,&downtime_id,FALSE);

/* register the scheduled downtime */
register_downtime(type,downtime_id);
Expand Down Expand Up @@ -286,8 +286,8 @@ int register_downtime(int type, unsigned long downtime_id){
log_debug_info(DEBUGL_DOWNTIME,0," Service: %s\n",svc->description);
}
log_debug_info(DEBUGL_DOWNTIME,0," Fixed/Flex: %s\n",(temp_downtime->fixed==TRUE)?"Fixed":"Flexible");
log_debug_info(DEBUGL_DOWNTIME,0," Start: %lu\n",temp_downtime->downtime_id);
log_debug_info(DEBUGL_DOWNTIME,0," End: %lu\n",temp_downtime->downtime_id);
log_debug_info(DEBUGL_DOWNTIME,0," Start: %s\n",start_time_string);
log_debug_info(DEBUGL_DOWNTIME,0," End: %s\n",end_time_string);
log_debug_info(DEBUGL_DOWNTIME,0," Duration: %dh %dm %ds\n",hours,minutes,seconds);
log_debug_info(DEBUGL_DOWNTIME,0," Downtime ID: %lu\n",temp_downtime->downtime_id);
log_debug_info(DEBUGL_DOWNTIME,0," Trigger ID: %lu\n",temp_downtime->triggered_by);
Expand Down Expand Up @@ -348,6 +348,7 @@ int handle_scheduled_downtime(scheduled_downtime *temp_downtime){
host *hst=NULL;
service *svc=NULL;
time_t event_time=0L;
time_t current_time=0L;
unsigned long *new_downtime_id=NULL;
#ifdef USE_EVENT_BROKER
int attr=0;
Expand Down Expand Up @@ -395,6 +396,13 @@ int handle_scheduled_downtime(scheduled_downtime *temp_downtime){
}
}

/* if downtime handler gets triggerd in between then there seems to be a restart of Icinga */
/* Don't do anything just return */
time(&current_time);
if(temp_downtime->start_time<current_time && current_time<temp_downtime->end_time && temp_downtime->is_in_effect==TRUE)
return OK;


/* have we come to the end of the scheduled downtime? */
if(temp_downtime->is_in_effect==TRUE){

Expand Down Expand Up @@ -682,20 +690,20 @@ int check_for_expired_downtime(void){


/* save a host or service downtime */
int add_new_downtime(int type, char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id){
int add_new_downtime(int type, char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id,int is_in_effect){
int result=OK;

if(type==HOST_DOWNTIME)
result=add_new_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
result=add_new_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);
else
result=add_new_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
result=add_new_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);

return result;
}


/* saves a host downtime entry */
int add_new_host_downtime(char *host_name, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id){
int add_new_host_downtime(char *host_name, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id,int is_in_effect){
int result=OK;
unsigned long new_downtime_id=0L;

Expand All @@ -704,7 +712,7 @@ int add_new_host_downtime(char *host_name, time_t entry_time, char *author, char

/**** IMPLEMENTATION-SPECIFIC CALLS ****/
#ifdef USE_XDDDEFAULT
result=xdddefault_add_new_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,&new_downtime_id);
result=xdddefault_add_new_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,&new_downtime_id,is_in_effect);
#endif

/* save downtime id */
Expand All @@ -721,7 +729,7 @@ int add_new_host_downtime(char *host_name, time_t entry_time, char *author, char


/* saves a service downtime entry */
int add_new_service_downtime(char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id){
int add_new_service_downtime(char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id,int is_in_effect){
int result=OK;
unsigned long new_downtime_id=0L;

Expand All @@ -730,7 +738,7 @@ int add_new_service_downtime(char *host_name, char *service_description, time_t

/**** IMPLEMENTATION-SPECIFIC CALLS ****/
#ifdef USE_XDDDEFAULT
result=xdddefault_add_new_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,&new_downtime_id);
result=xdddefault_add_new_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,&new_downtime_id,is_in_effect);
#endif

/* save downtime id */
Expand Down Expand Up @@ -847,27 +855,27 @@ int delete_service_downtime(unsigned long downtime_id){
/******************************************************************/

/* adds a host downtime entry to the list in memory */
int add_host_downtime(char *host_name, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id){
int add_host_downtime(char *host_name, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id,int is_in_effect){
int result=OK;

result=add_downtime(HOST_DOWNTIME,host_name,NULL,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
result=add_downtime(HOST_DOWNTIME,host_name,NULL,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);

return result;
}


/* adds a service downtime entry to the list in memory */
int add_service_downtime(char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id){
int add_service_downtime(char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id,int is_in_effect){
int result=OK;

result=add_downtime(SERVICE_DOWNTIME,host_name,svc_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
result=add_downtime(SERVICE_DOWNTIME,host_name,svc_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);

return result;
}


/* adds a host or service downtime entry to the list in memory */
int add_downtime(int downtime_type, char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id){
int add_downtime(int downtime_type, char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id,int is_in_effect){
scheduled_downtime *new_downtime=NULL;
scheduled_downtime *last_downtime=NULL;
scheduled_downtime *temp_downtime=NULL;
Expand Down Expand Up @@ -919,6 +927,7 @@ int add_downtime(int downtime_type, char *host_name, char *svc_description, time
new_downtime->triggered_by=triggered_by;
new_downtime->duration=duration;
new_downtime->downtime_id=downtime_id;
new_downtime->is_in_effect=is_in_effect;

if(defer_downtime_sorting){
new_downtime->next=scheduled_downtime_list;
Expand Down
14 changes: 7 additions & 7 deletions include/downtime.h
Expand Up @@ -48,9 +48,9 @@ typedef struct scheduled_downtime_struct{
unsigned long downtime_id;
char *author;
char *comment;
int is_in_effect;
#ifdef NSCORE
unsigned long comment_id;
int is_in_effect;
int start_flex_downtime;
int incremented_pending_downtime;
#endif
Expand All @@ -63,9 +63,9 @@ typedef struct scheduled_downtime_struct{
int initialize_downtime_data(char *); /* initializes scheduled downtime data */
int cleanup_downtime_data(char *); /* cleans up scheduled downtime data */

int add_new_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *);
int add_new_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *);
int add_new_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *);
int add_new_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *,int);
int add_new_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *,int);
int add_new_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *,int);

int delete_host_downtime(unsigned long);
int delete_service_downtime(unsigned long);
Expand All @@ -84,15 +84,15 @@ int check_pending_flex_service_downtime(service *);
int check_for_expired_downtime(void);
#endif

int add_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long);
int add_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long);
int add_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long,int);
int add_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long,int);

/* If you are going to be adding a lot of downtime in sequence, set
defer_downtime_sorting to 1 before you start and then call
sort_downtime afterwards. Things will go MUCH faster. */

extern int defer_downtime_sorting;
int add_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long);
int add_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long,int);
int sort_downtime(void);

scheduled_downtime *find_downtime(int,unsigned long);
Expand Down
8 changes: 4 additions & 4 deletions xdata/xdddefault.c
Expand Up @@ -161,14 +161,14 @@ int xdddefault_cleanup_downtime_data(char *main_config_file){
/******************************************************************/

/* adds a new scheduled host downtime entry */
int xdddefault_add_new_host_downtime(char *host_name, time_t entry_time, char *author, char *comment, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id){
int xdddefault_add_new_host_downtime(char *host_name, time_t entry_time, char *author, char *comment, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id,int is_in_effect){

/* find the next valid downtime id */
while(find_host_downtime(next_downtime_id)!=NULL)
next_downtime_id++;

/* add downtime to list in memory */
add_host_downtime(host_name,entry_time,author,comment,start_time,end_time,fixed,triggered_by,duration,next_downtime_id);
add_host_downtime(host_name,entry_time,author,comment,start_time,end_time,fixed,triggered_by,duration,next_downtime_id,is_in_effect);

/* update downtime file */
xdddefault_save_downtime_data();
Expand All @@ -186,14 +186,14 @@ int xdddefault_add_new_host_downtime(char *host_name, time_t entry_time, char *a


/* adds a new scheduled service downtime entry */
int xdddefault_add_new_service_downtime(char *host_name, char *service_description, time_t entry_time, char *author, char *comment, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id){
int xdddefault_add_new_service_downtime(char *host_name, char *service_description, time_t entry_time, char *author, char *comment, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id,int is_in_effect){

/* find the next valid downtime id */
while(find_service_downtime(next_downtime_id)!=NULL)
next_downtime_id++;

/* add downtime to list in memory */
add_service_downtime(host_name,service_description,entry_time,author,comment,start_time,end_time,fixed,triggered_by,duration,next_downtime_id);
add_service_downtime(host_name,service_description,entry_time,author,comment,start_time,end_time,fixed,triggered_by,duration,next_downtime_id,is_in_effect);

/* update downtime file */
xdddefault_save_downtime_data();
Expand Down
4 changes: 2 additions & 2 deletions xdata/xdddefault.h
Expand Up @@ -36,8 +36,8 @@ int xdddefault_validate_downtime_data(void);
int xdddefault_cleanup_downtime_data(char *);

int xdddefault_save_downtime_data(void);
int xdddefault_add_new_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *);
int xdddefault_add_new_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *);
int xdddefault_add_new_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *,int);
int xdddefault_add_new_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *,int);

int xdddefault_delete_host_downtime(unsigned long);
int xdddefault_delete_service_downtime(unsigned long);
Expand Down
9 changes: 7 additions & 2 deletions xdata/xrddefault.c
Expand Up @@ -563,6 +563,7 @@ int xrddefault_save_state_information(void){
fprintf(fp,"triggered_by=%lu\n",temp_downtime->triggered_by);
fprintf(fp,"fixed=%d\n",temp_downtime->fixed);
fprintf(fp,"duration=%lu\n",temp_downtime->duration);
fprintf(fp,"is_in_effect=%d\n",temp_downtime->is_in_effect);
fprintf(fp,"author=%s\n",temp_downtime->author);
fprintf(fp,"comment=%s\n",temp_downtime->comment);
fprintf(fp,"}\n");
Expand Down Expand Up @@ -675,6 +676,7 @@ int xrddefault_read_retention_file_information(char *retention_file, int overwri
int retain_flag=TRUE;
time_t last_check=0L;
int add_object;
int is_in_effect=FALSE;

log_debug_info(DEBUGL_FUNCTIONS,0,"xrddefault_read_state_information() start\n");

Expand Down Expand Up @@ -1023,9 +1025,9 @@ int xrddefault_read_retention_file_information(char *retention_file, int overwri

/* add the downtime */
if(data_type==XRDDEFAULT_HOSTDOWNTIME_DATA) {
add_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
add_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);
} else {
add_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
add_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);
}

/* must register the downtime with Icinga so it can schedule it, add comments, etc. */
Expand All @@ -1045,6 +1047,7 @@ int xrddefault_read_retention_file_information(char *retention_file, int overwri
end_time=0L;
fixed=FALSE;
triggered_by=0;
is_in_effect=FALSE;
duration=0L;

break;
Expand Down Expand Up @@ -1919,6 +1922,8 @@ int xrddefault_read_retention_file_information(char *retention_file, int overwri
fixed=(atoi(val)>0)?TRUE:FALSE;
else if(!strcmp(var,"triggered_by"))
triggered_by=strtoul(val,NULL,10);
else if(!strcmp(var,"is_in_effect"))
is_in_effect=(atoi(val)>0)?TRUE:FALSE;
else if(!strcmp(var,"duration"))
duration=strtoul(val,NULL,10);
else if(!strcmp(var,"author"))
Expand Down
9 changes: 7 additions & 2 deletions xdata/xsddefault.c
Expand Up @@ -678,6 +678,7 @@ int xsddefault_save_status_data(void){
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,"\tauthor=%s\n",temp_downtime->author);
fprintf(fp,"\tcomment=%s\n",temp_downtime->comment);
fprintf(fp,"\t}\n\n");
Expand Down Expand Up @@ -770,6 +771,7 @@ int xsddefault_read_status_data(char *config_file,int options){
unsigned long triggered_by=0;
unsigned long duration=0L;
int x=0;
int is_in_effect=FALSE;


/* initialize some vars */
Expand Down Expand Up @@ -911,9 +913,9 @@ int xsddefault_read_status_data(char *config_file,int options){

/* add the downtime */
if(data_type==XSDDEFAULT_HOSTDOWNTIME_DATA)
add_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
add_host_downtime(host_name,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);
else
add_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id);
add_service_downtime(host_name,service_description,entry_time,author,comment_data,start_time,end_time,fixed,triggered_by,duration,downtime_id,is_in_effect);

/* free temp memory */
my_free(host_name);
Expand All @@ -929,6 +931,7 @@ int xsddefault_read_status_data(char *config_file,int options){
fixed=FALSE;
triggered_by=0;
duration=0L;
is_in_effect=FALSE;

break;

Expand Down Expand Up @@ -1313,6 +1316,8 @@ int xsddefault_read_status_data(char *config_file,int options){
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,"author"))
author=(char *)strdup(val);
else if(!strcmp(var,"comment"))
Expand Down

0 comments on commit 81eb1f3

Please sign in to comment.