diff --git a/base/commands.c b/base/commands.c index 79de49b..5b5ab45 100644 --- base/commands.c +++ base/commands.c @@ -204,9 +204,9 @@ void check_for_external_commands(void){ else if(!strcmp(command_id,"ENTER_ACTIVE_MODE") || !strcmp(command_id,"ENABLE_NOTIFICATIONS")) command_type=CMD_ENABLE_NOTIFICATIONS; - else if(!strcmp(command_id,"SHUTDOWN_PROGRAM")) + else if(!strcmp(command_id,"SHUTDOWN_PROGRAM") || !strcmp(command_id,"SHUTDOWN_PROCESS")) command_type=CMD_SHUTDOWN_PROCESS; - else if(!strcmp(command_id,"RESTART_PROGRAM")) + else if(!strcmp(command_id,"RESTART_PROGRAM") || !strcmp(command_id,"RESTART_PROCESS")) command_type=CMD_RESTART_PROCESS; else if(!strcmp(command_id,"SAVE_STATE_INFORMATION")) diff --git a/cgi/cmd.c b/cgi/cmd.c index 63059bd..d36cab6 100644 --- cgi/cmd.c +++ cgi/cmd.c @@ -31,6 +31,10 @@ #include "../include/cgiauth.h" #include "../include/getcgi.h" +#include + +extern const char *extcmd_get_name(int id); + extern char main_config_file[MAX_FILENAME_LENGTH]; extern char command_file[MAX_FILENAME_LENGTH]; extern char comment_file[MAX_FILENAME_LENGTH]; @@ -1825,6 +1829,35 @@ void commit_command_data(int cmd){ return; } +__attribute__((format(printf, 2, 3))) +static int cmd_submitf(int id, const char *fmt, ...) +{ + char cmd[MAX_EXTERNAL_COMMAND_LENGTH]; + const char *command; + int len, len2; + va_list ap; + + command = extcmd_get_name(id); + /* + * We disallow sending 'CHANGE' commands from the cgi's + * until we do proper session handling to prevent cross-site + * request forgery + */ + if (!command || (strlen(command) > 6 && !memcmp("CHANGE", command, 6))) + return ERROR; + + len = snprintf(cmd, sizeof(cmd) - 1, "[%lu] %s;", time(NULL), command); + if (len < 0) + return ERROR; + + va_start(ap, fmt); + len2 = vsnprintf(&cmd[len], sizeof(cmd) - len - 1, fmt, ap); + va_end(ap); + if (len2 < 0) + return ERROR; + + return write_command_to_file(cmd); +} /* commits a command for processing */ int commit_command(int cmd){ @@ -1847,236 +1880,211 @@ int commit_command(int cmd){ switch(cmd){ case CMD_ADD_HOST_COMMENT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] ADD_HOST_COMMENT;%s;%d;%s;%s\n",current_time,host_name,(persistent_comment==TRUE)?1:0,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%d;%s;%s",host_name,(persistent_comment==TRUE)?1:0,comment_author,comment_data); break; - + case CMD_ADD_SVC_COMMENT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] ADD_SVC_COMMENT;%s;%s;%d;%s;%s\n",current_time,host_name,service_desc,(persistent_comment==TRUE)?1:0,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%s;%d;%s;%s",host_name,service_desc,(persistent_comment==TRUE)?1:0,comment_author,comment_data); break; case CMD_DEL_HOST_COMMENT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DEL_HOST_COMMENT;%lu\n",current_time,comment_id); - break; - case CMD_DEL_SVC_COMMENT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DEL_SVC_COMMENT;%lu\n",current_time,comment_id); + result = cmd_submitf(cmd,"%lu",comment_id); break; - + case CMD_DELAY_HOST_NOTIFICATION: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DELAY_HOST_NOTIFICATION;%s;%lu\n",current_time,host_name,notification_time); + result = cmd_submitf(cmd,"%s;%lu",host_name,notification_time); break; case CMD_DELAY_SVC_NOTIFICATION: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DELAY_SVC_NOTIFICATION;%s;%s;%lu\n",current_time,host_name,service_desc,notification_time); + result = cmd_submitf(cmd,"%s;%s;%lu",host_name,service_desc,notification_time); break; case CMD_SCHEDULE_SVC_CHECK: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_%sSVC_CHECK;%s;%s;%lu\n",current_time,(force_check==TRUE)?"FORCED_":"",host_name,service_desc,start_time); + result = cmd_submitf((force_check==TRUE)?CMD_SCHEDULE_FORCED_SVC_CHECK:cmd,"%s;%s;%lu",host_name,service_desc,start_time); break; case CMD_ENABLE_SVC_CHECK: case CMD_DISABLE_SVC_CHECK: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SVC_CHECK;%s;%s\n",current_time,(cmd==CMD_ENABLE_SVC_CHECK)?"ENABLE":"DISABLE",host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; - + case CMD_DISABLE_NOTIFICATIONS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DISABLE_NOTIFICATIONS;%lu\n",current_time,scheduled_time); - break; - case CMD_ENABLE_NOTIFICATIONS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] ENABLE_NOTIFICATIONS;%lu\n",current_time,scheduled_time); - break; - case CMD_SHUTDOWN_PROCESS: case CMD_RESTART_PROCESS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_PROGRAM;%lu\n",current_time,(cmd==CMD_SHUTDOWN_PROCESS)?"SHUTDOWN":"RESTART",scheduled_time); + result = cmd_submitf(cmd,"%lu",scheduled_time); break; case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_SVC_CHECKS;%s\n",current_time,(cmd==CMD_ENABLE_HOST_SVC_CHECKS)?"ENABLE":"DISABLE",host_name); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_SVC_CHECKS;%s\n[%lu] %s_HOST_CHECK;%s\n",current_time,(cmd==CMD_ENABLE_HOST_SVC_CHECKS)?"ENABLE":"DISABLE",host_name,current_time,(cmd==CMD_ENABLE_HOST_SVC_CHECKS)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); + if(affect_host_and_services==TRUE) + result |= cmd_submitf((cmd == CMD_ENABLE_HOST_SVC_CHECKS?CMD_ENABLE_HOST_CHECK:CMD_DISABLE_HOST_CHECK),"%s",host_name); break; - + case CMD_SCHEDULE_HOST_SVC_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_%sHOST_SVC_CHECKS;%s;%lu\n",current_time,(force_check==TRUE)?"FORCED_":"",host_name,scheduled_time); + result = cmd_submitf((force_check==TRUE?CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS:cmd),"%s;%lu",host_name,scheduled_time); break; case CMD_DEL_ALL_HOST_COMMENTS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DEL_ALL_HOST_COMMENTS;%s\n",current_time,host_name); + result = cmd_submitf(cmd,"%s",host_name); break; - + case CMD_DEL_ALL_SVC_COMMENTS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DEL_ALL_SVC_COMMENTS;%s;%s\n",current_time,host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; case CMD_ENABLE_SVC_NOTIFICATIONS: case CMD_DISABLE_SVC_NOTIFICATIONS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SVC_NOTIFICATIONS;%s;%s\n",current_time,(cmd==CMD_ENABLE_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; - + case CMD_ENABLE_HOST_NOTIFICATIONS: case CMD_DISABLE_HOST_NOTIFICATIONS: if(propagate_to_children==TRUE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_AND_CHILD_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOST_NOTIFICATIONS)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf((cmd==CMD_ENABLE_HOST_NOTIFICATIONS?CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS:CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS),"%s",host_name); else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOST_NOTIFICATIONS)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); break; - + case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_ALL_NOTIFICATIONS_BEYOND_HOST;%s\n",current_time,(cmd==CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); break; - + case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_SVC_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOST_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",host_name); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_SVC_NOTIFICATIONS;%s\n[%lu] %s_HOST_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOST_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",host_name,current_time,(cmd==CMD_ENABLE_HOST_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); + if(affect_host_and_services==TRUE) + result |= cmd_submitf((cmd==CMD_ENABLE_HOST_SVC_NOTIFICATIONS?CMD_ENABLE_HOST_NOTIFICATIONS:CMD_DISABLE_HOST_NOTIFICATIONS),"%s",host_name); break; - + case CMD_ACKNOWLEDGE_HOST_PROBLEM: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] ACKNOWLEDGE_HOST_PROBLEM;%s;%d;%d;%d;%s;%s\n",current_time,host_name,(sticky_ack==TRUE)?ACKNOWLEDGEMENT_STICKY:ACKNOWLEDGEMENT_NORMAL,(send_notification==TRUE)?1:0,(persistent_comment==TRUE)?1:0,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%d;%d;%d;%s;%s",host_name,(sticky_ack==TRUE)?ACKNOWLEDGEMENT_STICKY:ACKNOWLEDGEMENT_NORMAL,(send_notification==TRUE)?1:0,(persistent_comment==TRUE)?1:0,comment_author,comment_data); break; - + case CMD_ACKNOWLEDGE_SVC_PROBLEM: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] ACKNOWLEDGE_SVC_PROBLEM;%s;%s;%d;%d;%d;%s;%s\n",current_time,host_name,service_desc,(sticky_ack==TRUE)?ACKNOWLEDGEMENT_STICKY:ACKNOWLEDGEMENT_NORMAL,(send_notification==TRUE)?1:0,(persistent_comment==TRUE)?1:0,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%s;%d;%d;%d;%s;%s",host_name,service_desc,(sticky_ack==TRUE)?ACKNOWLEDGEMENT_STICKY:ACKNOWLEDGEMENT_NORMAL,(send_notification==TRUE)?1:0,(persistent_comment==TRUE)?1:0,comment_author,comment_data); break; case CMD_START_EXECUTING_SVC_CHECKS: case CMD_STOP_EXECUTING_SVC_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_EXECUTING_SVC_CHECKS;\n",current_time,(cmd==CMD_START_EXECUTING_SVC_CHECKS)?"START":"STOP"); - break; - case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_ACCEPTING_PASSIVE_SVC_CHECKS;\n",current_time,(cmd==CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS)?"START":"STOP"); + result = cmd_submitf(cmd,""); break; case CMD_ENABLE_PASSIVE_SVC_CHECKS: case CMD_DISABLE_PASSIVE_SVC_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_PASSIVE_SVC_CHECKS;%s;%s\n",current_time,(cmd==CMD_ENABLE_PASSIVE_SVC_CHECKS)?"ENABLE":"DISABLE",host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; - + case CMD_ENABLE_EVENT_HANDLERS: case CMD_DISABLE_EVENT_HANDLERS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_EVENT_HANDLERS;\n",current_time,(cmd==CMD_ENABLE_EVENT_HANDLERS)?"ENABLE":"DISABLE"); + result = cmd_submitf(cmd,""); break; case CMD_ENABLE_SVC_EVENT_HANDLER: case CMD_DISABLE_SVC_EVENT_HANDLER: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SVC_EVENT_HANDLER;%s;%s\n",current_time,(cmd==CMD_ENABLE_SVC_EVENT_HANDLER)?"ENABLE":"DISABLE",host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; - + case CMD_ENABLE_HOST_EVENT_HANDLER: case CMD_DISABLE_HOST_EVENT_HANDLER: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_EVENT_HANDLER;%s\n",current_time,(cmd==CMD_ENABLE_HOST_EVENT_HANDLER)?"ENABLE":"DISABLE",host_name); - break; - case CMD_ENABLE_HOST_CHECK: case CMD_DISABLE_HOST_CHECK: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_CHECK;%s\n",current_time,(cmd==CMD_ENABLE_HOST_CHECK)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); break; - + case CMD_START_OBSESSING_OVER_SVC_CHECKS: case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_OBSESSING_OVER_SVC_CHECKS;\n",current_time,(cmd==CMD_START_OBSESSING_OVER_SVC_CHECKS)?"START":"STOP"); + result = cmd_submitf(cmd,""); break; - + case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] REMOVE_HOST_ACKNOWLEDGEMENT;%s\n",current_time,host_name); + result = cmd_submitf(cmd,"%s",host_name); break; - + case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] REMOVE_SVC_ACKNOWLEDGEMENT;%s;%s\n",current_time,host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; - + case CMD_PROCESS_SERVICE_CHECK_RESULT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] PROCESS_SERVICE_CHECK_RESULT;%s;%s;%d;%s|%s\n",current_time,host_name,service_desc,plugin_state,plugin_output,performance_data); + result = cmd_submitf(cmd,"%s;%s;%d;%s|%s",host_name,service_desc,plugin_state,plugin_output,performance_data); break; - + case CMD_PROCESS_HOST_CHECK_RESULT: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] PROCESS_HOST_CHECK_RESULT;%s;%d;%s|%s\n",current_time,host_name,plugin_state,plugin_output,performance_data); + result = cmd_submitf(cmd,"%s;%d;%s|%s",host_name,plugin_state,plugin_output,performance_data); break; - + case CMD_SCHEDULE_HOST_DOWNTIME: if(child_options==1) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME;%s;%lu;%lu;%d;%lu;%lu;%s;%s\n",current_time,host_name,start_time,end_time,(fixed==TRUE)?1:0,triggered_by,duration,comment_author,comment_data); + cmd = CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME; else if(child_options==2) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;%s;%lu;%lu;%d;%lu;%lu;%s;%s\n",current_time,host_name,start_time,end_time,(fixed==TRUE)?1:0,triggered_by,duration,comment_author,comment_data); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_HOST_DOWNTIME;%s;%lu;%lu;%d;%lu;%lu;%s;%s\n",current_time,host_name,start_time,end_time,(fixed==TRUE)?1:0,triggered_by,duration,comment_author,comment_data); + cmd = CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME; + result = cmd_submitf(cmd,"%s;%lu;%lu;%d;%lu;%lu;%s;%s",host_name,start_time,end_time,(fixed==TRUE)?1:0,triggered_by,duration,comment_author,comment_data); break; - + case CMD_SCHEDULE_SVC_DOWNTIME: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_SVC_DOWNTIME;%s;%s;%lu;%lu;%d;%lu;%lu;%s;%s\n",current_time,host_name,service_desc,start_time,end_time,(fixed==TRUE)?1:0,triggered_by,duration,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%s;%lu;%lu;%d;%lu;%lu;%s;%s",host_name,service_desc,start_time,end_time,(fixed==TRUE)?1:0,triggered_by,duration,comment_author,comment_data); break; - + case CMD_ENABLE_HOST_FLAP_DETECTION: case CMD_DISABLE_HOST_FLAP_DETECTION: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOST_FLAP_DETECTION;%s\n",current_time,(cmd==CMD_ENABLE_HOST_FLAP_DETECTION)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); break; - + case CMD_ENABLE_SVC_FLAP_DETECTION: case CMD_DISABLE_SVC_FLAP_DETECTION: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SVC_FLAP_DETECTION;%s;%s\n",current_time,(cmd==CMD_ENABLE_SVC_FLAP_DETECTION)?"ENABLE":"DISABLE",host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; - + case CMD_ENABLE_FLAP_DETECTION: case CMD_DISABLE_FLAP_DETECTION: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_FLAP_DETECTION\n",current_time,(cmd==CMD_ENABLE_FLAP_DETECTION)?"ENABLE":"DISABLE"); + result = cmd_submitf(cmd,""); break; - + case CMD_DEL_HOST_DOWNTIME: case CMD_DEL_SVC_DOWNTIME: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] DEL_%s_DOWNTIME;%lu\n",current_time,(cmd==CMD_DEL_HOST_DOWNTIME)?"HOST":"SVC",downtime_id); + result = cmd_submitf(cmd,"%lu",downtime_id); break; case CMD_ENABLE_FAILURE_PREDICTION: case CMD_DISABLE_FAILURE_PREDICTION: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_FAILURE_PREDICTION\n",current_time,(cmd==CMD_ENABLE_FAILURE_PREDICTION)?"ENABLE":"DISABLE"); - break; - case CMD_ENABLE_PERFORMANCE_DATA: case CMD_DISABLE_PERFORMANCE_DATA: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_PERFORMANCE_DATA\n",current_time,(cmd==CMD_ENABLE_PERFORMANCE_DATA)?"ENABLE":"DISABLE"); - break; - case CMD_START_EXECUTING_HOST_CHECKS: case CMD_STOP_EXECUTING_HOST_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_EXECUTING_HOST_CHECKS;\n",current_time,(cmd==CMD_START_EXECUTING_HOST_CHECKS)?"START":"STOP"); - break; - case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_ACCEPTING_PASSIVE_HOST_CHECKS;\n",current_time,(cmd==CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS)?"START":"STOP"); + result = cmd_submitf(cmd,""); break; case CMD_ENABLE_PASSIVE_HOST_CHECKS: case CMD_DISABLE_PASSIVE_HOST_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_PASSIVE_HOST_CHECKS;%s\n",current_time,(cmd==CMD_ENABLE_PASSIVE_HOST_CHECKS)?"ENABLE":"DISABLE",host_name); + result = cmd_submitf(cmd,"%s",host_name); break; case CMD_START_OBSESSING_OVER_HOST_CHECKS: case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_OBSESSING_OVER_HOST_CHECKS;\n",current_time,(cmd==CMD_START_OBSESSING_OVER_HOST_CHECKS)?"START":"STOP"); + result = cmd_submitf(cmd,""); break; case CMD_SCHEDULE_HOST_CHECK: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_%sHOST_CHECK;%s;%lu\n",current_time,(force_check==TRUE)?"FORCED_":"",host_name,start_time); + if (force_check==TRUE) + cmd = CMD_SCHEDULE_FORCED_HOST_CHECK; + result = cmd_submitf(cmd,"%s;%lu",host_name,start_time); break; case CMD_START_OBSESSING_OVER_SVC: case CMD_STOP_OBSESSING_OVER_SVC: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_OBSESSING_OVER_SVC;%s;%s\n",current_time,(cmd==CMD_START_OBSESSING_OVER_SVC)?"START":"STOP",host_name,service_desc); + result = cmd_submitf(cmd,"%s;%s",host_name,service_desc); break; case CMD_START_OBSESSING_OVER_HOST: case CMD_STOP_OBSESSING_OVER_HOST: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_OBSESSING_OVER_HOST;%s\n",current_time,(cmd==CMD_START_OBSESSING_OVER_HOST)?"START":"STOP",host_name); + result = cmd_submitf(cmd,"%s",host_name); break; @@ -2084,34 +2092,31 @@ int commit_command(int cmd){ case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOSTGROUP_SVC_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",hostgroup_name); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOSTGROUP_SVC_NOTIFICATIONS;%s\n[%lu] %s_HOSTGROUP_HOST_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",hostgroup_name,current_time,(cmd==CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",hostgroup_name); + result = cmd_submitf(cmd,"%s",hostgroup_name); + if(affect_host_and_services==TRUE) + result |= cmd_submitf((cmd==CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS?CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS:CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS),"%s",hostgroup_name); break; case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOSTGROUP_HOST_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS)?"ENABLE":"DISABLE",hostgroup_name); + result = cmd_submitf(cmd,"%s",hostgroup_name); break; case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOSTGROUP_SVC_CHECKS;%s\n",current_time,(cmd==CMD_ENABLE_HOSTGROUP_SVC_CHECKS)?"ENABLE":"DISABLE",hostgroup_name); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_HOSTGROUP_SVC_CHECKS;%s\n[%lu] %s_HOSTGROUP_HOST_CHECKS;%s\n",current_time,(cmd==CMD_ENABLE_HOSTGROUP_SVC_CHECKS)?"ENABLE":"DISABLE",hostgroup_name,current_time,(cmd==CMD_ENABLE_HOSTGROUP_SVC_CHECKS)?"ENABLE":"DISABLE",hostgroup_name); + result = cmd_submitf(cmd,"%s",hostgroup_name); + if(affect_host_and_services==TRUE) + result |= cmd_submitf((cmd==CMD_ENABLE_HOSTGROUP_SVC_CHECKS?CMD_ENABLE_HOSTGROUP_HOST_CHECKS:CMD_DISABLE_HOSTGROUP_HOST_CHECKS),"%s",hostgroup_name); break; case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_HOSTGROUP_HOST_DOWNTIME;%s;%lu;%lu;%d;0;%lu;%s;%s\n",current_time,hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%lu;%lu;%d;0;%lu;%s;%s",hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); break; case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_HOSTGROUP_SVC_DOWNTIME;%s;%lu;%lu;%d;0;%lu;%s;%s\n",current_time,hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_HOSTGROUP_SVC_DOWNTIME;%s;%lu;%lu;%d;0;%lu;%s;%s\n[%lu] SCHEDULE_HOSTGROUP_HOST_DOWNTIME;%s;%lu;%lu;%d;%lu;%s;%s\n",current_time,hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data,current_time,hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%lu;%lu;%d;0;%lu;%s;%s",hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); + if(affect_host_and_services==TRUE) + result |= cmd_submitf(CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME,"%s;%lu;%lu;%d;%lu;%s;%s",hostgroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); break; @@ -2119,34 +2124,31 @@ int commit_command(int cmd){ case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SERVICEGROUP_SVC_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",servicegroup_name); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SERVICEGROUP_SVC_NOTIFICATIONS;%s\n[%lu] %s_SERVICEGROUP_HOST_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",servicegroup_name,current_time,(cmd==CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS)?"ENABLE":"DISABLE",servicegroup_name); + result = cmd_submitf(cmd,"%s",servicegroup_name); + if(affect_host_and_services==TRUE) + result |= cmd_submitf((cmd==CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS?CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS:CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS),"%s",servicegroup_name); break; case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SERVICEGROUP_HOST_NOTIFICATIONS;%s\n",current_time,(cmd==CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS)?"ENABLE":"DISABLE",servicegroup_name); + result = cmd_submitf(cmd,"%s",servicegroup_name); break; case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SERVICEGROUP_SVC_CHECKS;%s\n",current_time,(cmd==CMD_ENABLE_SERVICEGROUP_SVC_CHECKS)?"ENABLE":"DISABLE",servicegroup_name); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] %s_SERVICEGROUP_SVC_CHECKS;%s\n[%lu] %s_SERVICEGROUP_HOST_CHECKS;%s\n",current_time,(cmd==CMD_ENABLE_SERVICEGROUP_SVC_CHECKS)?"ENABLE":"DISABLE",servicegroup_name,current_time,(cmd==CMD_ENABLE_SERVICEGROUP_SVC_CHECKS)?"ENABLE":"DISABLE",servicegroup_name); + result = cmd_submitf(cmd,"%s",servicegroup_name); + if(affect_host_and_services==TRUE) + result |= cmd_submitf((cmd==CMD_ENABLE_SERVICEGROUP_SVC_CHECKS?CMD_ENABLE_SERVICEGROUP_HOST_CHECKS:CMD_DISABLE_SERVICEGROUP_HOST_CHECKS),"%s",servicegroup_name); break; case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_SERVICEGROUP_HOST_DOWNTIME;%s;%lu;%lu;%d;0;%lu;%s;%s\n",current_time,servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%lu;%lu;%d;0;%lu;%s;%s",servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); break; case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: - if(affect_host_and_services==FALSE) - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_SERVICEGROUP_SVC_DOWNTIME;%s;%lu;%lu;%d;0;%lu;%s;%s\n",current_time,servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); - else - snprintf(command_buffer,sizeof(command_buffer)-1,"[%lu] SCHEDULE_SERVICEGROUP_SVC_DOWNTIME;%s;%lu;%lu;%d;0;%lu;%s;%s\n[%lu] SCHEDULE_SERVICEGROUP_HOST_DOWNTIME;%s;%lu;%lu;%d;%lu;%s;%s\n",current_time,servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data,current_time,servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); + result = cmd_submitf(cmd,"%s;%lu;%lu;%d;0;%lu;%s;%s",servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); + if(affect_host_and_services==TRUE) + result |= cmd_submitf(CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME,"%s;%lu;%lu;%d;%lu;%s;%s",servicegroup_name,start_time,end_time,(fixed==TRUE)?1:0,duration,comment_author,comment_data); break; default: @@ -2154,12 +2156,6 @@ int commit_command(int cmd){ break; } - /* make sure command buffer is terminated */ - command_buffer[sizeof(command_buffer)-1]='\x0'; - - /* write the command to the command file */ - result=write_command_to_file(command_buffer); - return result; } @@ -2170,6 +2166,14 @@ int write_command_to_file(char *cmd){ FILE *fp; struct stat statbuf; + /* + * Commands are not allowed to have newlines in them, as + * that allows malicious users to hand-craft requests that + * bypass the access-restrictions. + */ + if (!cmd || !*cmd || strchr(cmd, '\n')) + return ERROR; + /* bail out if the external command file doesn't exist */ if(stat(command_file,&statbuf)){ @@ -2202,7 +2206,7 @@ int write_command_to_file(char *cmd){ } /* write the command to file */ - fputs(cmd,fp); + fprintf(fp, "%s\n", cmd); /* flush buffer */ fflush(fp); @@ -2728,3 +2732,182 @@ int string_to_time(char *buffer, time_t *t){ return OK; } + +/* From Nagios 3.0.5, cgi/extcmd_list.c */ + +#include +#include +#include +#include "../include/common.h" + +struct nagios_extcmd { + const char *name; + int id; +/* size_t namelen; + int min_args; + int (*handler)(struct nagios_extcmd *, int, char **); + struct nagios_extcmd *next_handler; + */ +}; + +#define CMD_DEF(name, min_args, handler) \ + { #name, CMD_ ## name } +/* { #name, sizeof(#name) - 1, CMD_ ## name, min_args, handler, NULL } */ +struct nagios_extcmd in_core_commands[] = +{ + CMD_DEF(NONE, 0, NULL), + CMD_DEF(ADD_HOST_COMMENT, 0, NULL), + CMD_DEF(DEL_HOST_COMMENT, 0, NULL), + CMD_DEF(ADD_SVC_COMMENT, 0, NULL), + CMD_DEF(DEL_SVC_COMMENT, 0, NULL), + CMD_DEF(ENABLE_SVC_CHECK, 0, NULL), + CMD_DEF(DISABLE_SVC_CHECK, 0, NULL), + CMD_DEF(SCHEDULE_SVC_CHECK, 0, NULL), + CMD_DEF(DELAY_SVC_NOTIFICATION, 0, NULL), + CMD_DEF(DELAY_HOST_NOTIFICATION, 0, NULL), + CMD_DEF(DISABLE_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_NOTIFICATIONS, 0, NULL), + CMD_DEF(RESTART_PROCESS, 0, NULL), + CMD_DEF(SHUTDOWN_PROCESS, 0, NULL), + CMD_DEF(ENABLE_HOST_SVC_CHECKS, 0, NULL), + CMD_DEF(DISABLE_HOST_SVC_CHECKS, 0, NULL), + CMD_DEF(SCHEDULE_HOST_SVC_CHECKS, 0, NULL), + CMD_DEF(DELAY_HOST_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(DEL_ALL_HOST_COMMENTS, 0, NULL), + CMD_DEF(DEL_ALL_SVC_COMMENTS, 0, NULL), + CMD_DEF(ENABLE_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_HOST_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_HOST_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST, 0, NULL), + CMD_DEF(DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST, 0, NULL), + CMD_DEF(ENABLE_HOST_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_HOST_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(PROCESS_SERVICE_CHECK_RESULT, 0, NULL), + CMD_DEF(SAVE_STATE_INFORMATION, 0, NULL), + CMD_DEF(READ_STATE_INFORMATION, 0, NULL), + CMD_DEF(ACKNOWLEDGE_HOST_PROBLEM, 0, NULL), + CMD_DEF(ACKNOWLEDGE_SVC_PROBLEM, 0, NULL), + CMD_DEF(START_EXECUTING_SVC_CHECKS, 0, NULL), + CMD_DEF(STOP_EXECUTING_SVC_CHECKS, 0, NULL), + CMD_DEF(START_ACCEPTING_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(STOP_ACCEPTING_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(ENABLE_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(DISABLE_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(ENABLE_EVENT_HANDLERS, 0, NULL), + CMD_DEF(DISABLE_EVENT_HANDLERS, 0, NULL), + CMD_DEF(ENABLE_HOST_EVENT_HANDLER, 0, NULL), + CMD_DEF(DISABLE_HOST_EVENT_HANDLER, 0, NULL), + CMD_DEF(ENABLE_SVC_EVENT_HANDLER, 0, NULL), + CMD_DEF(DISABLE_SVC_EVENT_HANDLER, 0, NULL), + CMD_DEF(ENABLE_HOST_CHECK, 0, NULL), + CMD_DEF(DISABLE_HOST_CHECK, 0, NULL), + CMD_DEF(START_OBSESSING_OVER_SVC_CHECKS, 0, NULL), + CMD_DEF(STOP_OBSESSING_OVER_SVC_CHECKS, 0, NULL), + CMD_DEF(REMOVE_HOST_ACKNOWLEDGEMENT, 0, NULL), + CMD_DEF(REMOVE_SVC_ACKNOWLEDGEMENT, 0, NULL), + CMD_DEF(SCHEDULE_FORCED_HOST_SVC_CHECKS, 0, NULL), + CMD_DEF(SCHEDULE_FORCED_SVC_CHECK, 0, NULL), + CMD_DEF(SCHEDULE_HOST_DOWNTIME, 0, NULL), + CMD_DEF(SCHEDULE_SVC_DOWNTIME, 0, NULL), + CMD_DEF(ENABLE_HOST_FLAP_DETECTION, 0, NULL), + CMD_DEF(DISABLE_HOST_FLAP_DETECTION, 0, NULL), + CMD_DEF(ENABLE_SVC_FLAP_DETECTION, 0, NULL), + CMD_DEF(DISABLE_SVC_FLAP_DETECTION, 0, NULL), + CMD_DEF(ENABLE_FLAP_DETECTION, 0, NULL), + CMD_DEF(DISABLE_FLAP_DETECTION, 0, NULL), + CMD_DEF(ENABLE_HOSTGROUP_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_HOSTGROUP_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_HOSTGROUP_HOST_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_HOSTGROUP_HOST_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_HOSTGROUP_SVC_CHECKS, 0, NULL), + CMD_DEF(DISABLE_HOSTGROUP_SVC_CHECKS, 0, NULL), + CMD_DEF(CANCEL_HOST_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_SVC_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_ACTIVE_HOST_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_PENDING_HOST_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_ACTIVE_SVC_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_PENDING_SVC_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_ACTIVE_HOST_SVC_DOWNTIME, 0, NULL), + CMD_DEF(CANCEL_PENDING_HOST_SVC_DOWNTIME, 0, NULL), + CMD_DEF(FLUSH_PENDING_COMMANDS, 0, NULL), + CMD_DEF(DEL_HOST_DOWNTIME, 0, NULL), + CMD_DEF(DEL_SVC_DOWNTIME, 0, NULL), + CMD_DEF(ENABLE_FAILURE_PREDICTION, 0, NULL), + CMD_DEF(DISABLE_FAILURE_PREDICTION, 0, NULL), + CMD_DEF(ENABLE_PERFORMANCE_DATA, 0, NULL), + CMD_DEF(DISABLE_PERFORMANCE_DATA, 0, NULL), + CMD_DEF(SCHEDULE_HOSTGROUP_HOST_DOWNTIME, 0, NULL), + CMD_DEF(SCHEDULE_HOSTGROUP_SVC_DOWNTIME, 0, NULL), + CMD_DEF(SCHEDULE_HOST_SVC_DOWNTIME, 0, NULL), + CMD_DEF(PROCESS_HOST_CHECK_RESULT, 0, NULL), + CMD_DEF(START_EXECUTING_HOST_CHECKS, 0, NULL), + CMD_DEF(STOP_EXECUTING_HOST_CHECKS, 0, NULL), + CMD_DEF(START_ACCEPTING_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(STOP_ACCEPTING_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(ENABLE_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(DISABLE_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(START_OBSESSING_OVER_HOST_CHECKS, 0, NULL), + CMD_DEF(STOP_OBSESSING_OVER_HOST_CHECKS, 0, NULL), + CMD_DEF(SCHEDULE_HOST_CHECK, 0, NULL), + CMD_DEF(SCHEDULE_FORCED_HOST_CHECK, 0, NULL), + CMD_DEF(START_OBSESSING_OVER_SVC, 0, NULL), + CMD_DEF(STOP_OBSESSING_OVER_SVC, 0, NULL), + CMD_DEF(START_OBSESSING_OVER_HOST, 0, NULL), + CMD_DEF(STOP_OBSESSING_OVER_HOST, 0, NULL), + CMD_DEF(ENABLE_HOSTGROUP_HOST_CHECKS, 0, NULL), + CMD_DEF(DISABLE_HOSTGROUP_HOST_CHECKS, 0, NULL), + CMD_DEF(ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS, 0, NULL), + CMD_DEF(ENABLE_SERVICEGROUP_SVC_CHECKS, 0, NULL), + CMD_DEF(DISABLE_SERVICEGROUP_SVC_CHECKS, 0, NULL), + CMD_DEF(ENABLE_SERVICEGROUP_HOST_CHECKS, 0, NULL), + CMD_DEF(DISABLE_SERVICEGROUP_HOST_CHECKS, 0, NULL), + CMD_DEF(ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS, 0, NULL), + CMD_DEF(ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL), + CMD_DEF(SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, 0, NULL), + CMD_DEF(SCHEDULE_SERVICEGROUP_SVC_DOWNTIME, 0, NULL), + CMD_DEF(CHANGE_NORMAL_HOST_CHECK_INTERVAL, 0, NULL), + CMD_DEF(CHANGE_NORMAL_SVC_CHECK_INTERVAL, 0, NULL), + CMD_DEF(CHANGE_RETRY_SVC_CHECK_INTERVAL, 0, NULL), + CMD_DEF(CHANGE_MAX_HOST_CHECK_ATTEMPTS, 0, NULL), + CMD_DEF(CHANGE_MAX_SVC_CHECK_ATTEMPTS, 0, NULL), + CMD_DEF(SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME, 0, NULL), + CMD_DEF(ENABLE_HOST_AND_CHILD_NOTIFICATIONS, 0, NULL), + CMD_DEF(DISABLE_HOST_AND_CHILD_NOTIFICATIONS, 0, NULL), + CMD_DEF(SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME, 0, NULL), + CMD_DEF(ENABLE_SERVICE_FRESHNESS_CHECKS, 0, NULL), + CMD_DEF(DISABLE_SERVICE_FRESHNESS_CHECKS, 0, NULL), + CMD_DEF(ENABLE_HOST_FRESHNESS_CHECKS, 0, NULL), + CMD_DEF(DISABLE_HOST_FRESHNESS_CHECKS, 0, NULL), + CMD_DEF(SET_HOST_NOTIFICATION_NUMBER, 0, NULL), + CMD_DEF(SET_SVC_NOTIFICATION_NUMBER, 0, NULL), +}; +#undef CMD_DEF + +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#endif +static int extcmd_entries, extcmd_slots; + +const char *extcmd_get_name(int id) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(in_core_commands); i++) { + struct nagios_extcmd *ecmd; + ecmd = &in_core_commands[i]; + if (ecmd->id == id) + return ecmd->name; + } + + return NULL; +} diff --git a/include/common.h b/include/common.h index 8f4d3cd..d4be718 100644 --- include/common.h +++ include/common.h @@ -383,6 +383,7 @@ #define MAX_COMMAND_BUFFER 8192 /* max length of raw or processed command line */ #define MAX_DATETIME_LENGTH 48 +#define MAX_EXTERNAL_COMMAND_LENGTH 8192 /************************* MODIFIED ATTRIBUTES **************************/ -- 1.6.0.4