nagios4/include/objects.h

878 lines
34 KiB
C
Raw Permalink Normal View History

2017-05-19 22:22:40 +02:00
/*****************************************************************************
*
* OBJECTS.H - Header file for object addition/search functions
*
*
* 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.
*
*****************************************************************************/
2017-05-19 23:37:19 +02:00
#ifndef NAGIOS_OBJECTS_H_INCLUDED
#define NAGIOS_OBJECTS_H_INCLUDED
2017-05-19 22:22:40 +02:00
#include "common.h"
NAGIOS_BEGIN_DECL
/*************** CURRENT OBJECT REVISION **************/
2017-05-19 23:37:19 +02:00
#define CURRENT_OBJECT_STRUCTURE_VERSION 403 /* increment when changes are made to data structures... */
2017-05-19 22:22:40 +02:00
/* Nagios 3 starts at 300, Nagios 4 at 400, etc. */
/***************** OBJECT SIZE LIMITS *****************/
#define MAX_STATE_HISTORY_ENTRIES 21 /* max number of old states to keep track of for flap detection */
#define MAX_CONTACT_ADDRESSES 6 /* max number of custom addresses a contact can have */
/***************** SKIP LISTS ****************/
#define NUM_OBJECT_SKIPLISTS 12
2017-05-19 23:37:19 +02:00
#define NUM_HASHED_OBJECT_TYPES 8
2017-05-19 22:22:40 +02:00
#define HOST_SKIPLIST 0
#define SERVICE_SKIPLIST 1
#define COMMAND_SKIPLIST 2
#define TIMEPERIOD_SKIPLIST 3
#define CONTACT_SKIPLIST 4
#define CONTACTGROUP_SKIPLIST 5
#define HOSTGROUP_SKIPLIST 6
#define SERVICEGROUP_SKIPLIST 7
#define HOSTDEPENDENCY_SKIPLIST 8
#define SERVICEDEPENDENCY_SKIPLIST 9
#define HOSTESCALATION_SKIPLIST 10
#define SERVICEESCALATION_SKIPLIST 11
2017-05-19 23:37:19 +02:00
/***************** DATE RANGE TYPES *******************/
#define DATERANGE_CALENDAR_DATE 0 /* 2008-12-25 */
#define DATERANGE_MONTH_DATE 1 /* july 4 (specific month) */
#define DATERANGE_MONTH_DAY 2 /* day 21 (generic month) */
#define DATERANGE_MONTH_WEEK_DAY 3 /* 3rd thursday (specific month) */
#define DATERANGE_WEEK_DAY 4 /* 3rd thursday (generic month) */
#define DATERANGE_TYPES 5
/*
* flags for notification_options, flapping_options and other similar
* flags. They overlap (hosts and services), so we can't use enum's.
*/
#define OPT_NOTHING 0 /* no options selected */
#define OPT_ALL (~0) /* everything selected, so all bits set */
#define OPT_DOWN (1 << HOST_DOWN)
#define OPT_UP (1 << HOST_UP)
#define OPT_UNREACHABLE (1 << HOST_UNREACHABLE)
#define OPT_OK (1 << STATE_OK)
#define OPT_WARNING (1 << STATE_WARNING)
#define OPT_CRITICAL (1 << STATE_CRITICAL)
#define OPT_UNKNOWN (1 << STATE_UNKNOWN)
#define OPT_RECOVERY OPT_OK
/* and now the "unreal" states... */
2019-04-18 17:09:18 +02:00
#define OPT_NOTIFICATIONS (1 << 9)
2017-05-19 23:37:19 +02:00
#define OPT_PENDING (1 << 10)
#define OPT_FLAPPING (1 << 11)
#define OPT_DOWNTIME (1 << 12)
#define OPT_DISABLED (1 << 15) /* will denote disabled checks some day */
/* macros useful with both hosts and services */
#define flag_set(c, flag) ((c) |= (flag))
#define flag_get(c, flag) (unsigned int)((c) & (flag))
#define flag_isset(c, flag) (flag_get((c), (flag)) == (unsigned int)(flag))
#define flag_unset(c, flag) (c &= ~(flag))
#define should_stalk(o) flag_isset(o->stalking_options, 1 << o->current_state)
2019-04-18 17:09:18 +02:00
#define should_stalk_notifications(o) flag_isset(o->stalking_options, OPT_NOTIFICATIONS)
2017-05-19 23:37:19 +02:00
#define should_flap_detect(o) flag_isset(o->flap_detection_options, 1 << o->current_state)
#define should_notify(o) flag_isset(o->notification_options, 1 << o->current_state)
#define add_notified_on(o, f) (o->notified_on |= (1 << f))
/* Event-related macros */
#define NUDGE_MIN 5
#define NUDGE_MAX 17
2017-05-19 22:22:40 +02:00
/****************** DATA STRUCTURES *******************/
2017-05-19 23:37:19 +02:00
/* @todo Remove typedef's of non-opaque types in Nagios 5 */
typedef struct host host;
typedef struct service service;
typedef struct contact contact;
/* TIMED_EVENT structure */
typedef struct timed_event {
int event_type;
time_t run_time;
int recurring;
unsigned long event_interval;
int compensate_for_time_change;
void *timing_func;
void *event_data;
void *event_args;
int event_options;
unsigned int priority; /* 0 is auto, 1 is highest. n+1 < n */
struct squeue_event *sq_event;
} timed_event;
/* NOTIFY_LIST structure */
typedef struct notify_list {
struct contact *contact;
struct notify_list *next;
} notification;
/*
* *name can be "Nagios Core", "Merlin", "mod_gearman" or "DNX", fe.
* source_name gets passed the 'source' pointer from check_result
* and must return a non-free()'able string useful for printing what
* we need to determine exactly where the check was received from,
* such as "mod_gearman worker@10.11.12.13", or "Nagios Core command
* file worker" (for passive checks submitted locally), which will be
* stashed with hosts and services and used as the "CHECKSOURCE" macro.
*/
struct check_engine {
char *name; /* "Nagios Core", "Merlin", "Mod Gearman" fe */
const char *(*source_name)( const void *);
void (*clean_result)(void *);
};
/* CHECK_RESULT structure */
typedef struct check_result {
int object_check_type; /* is this a service or a host check? */
char *host_name; /* host name */
char *service_description; /* service description */
int check_type; /* was this an active or passive service check? */
int check_options;
int scheduled_check; /* was this a scheduled or an on-demand check? */
int reschedule_check; /* should we reschedule the next check */
char *output_file; /* what file is the output stored in? */
FILE *output_file_fp;
double latency;
struct timeval start_time; /* time the service check was initiated */
struct timeval finish_time; /* time the service check was completed */
int early_timeout; /* did the service check timeout? */
int exited_ok; /* did the plugin check return okay? */
int return_code; /* plugin return code */
char *output; /* plugin output */
2019-04-18 17:09:18 +02:00
/* 5DEPR: rusage is deprecated in Nagios, will be removed in 5.0.0 */
2017-05-19 23:37:19 +02:00
struct rusage rusage; /* resource usage by this check */
struct check_engine *engine; /* where did we get this check from? */
const void *source; /* engine handles this */
} check_result;
/* SCHED_INFO structure */
typedef struct sched_info {
int total_services;
int total_scheduled_services;
int total_hosts;
int total_scheduled_hosts;
double average_services_per_host;
double average_scheduled_services_per_host;
unsigned long service_check_interval_total;
unsigned long host_check_interval_total;
double average_service_execution_time;
double average_service_check_interval;
double average_host_check_interval;
double average_service_inter_check_delay;
double average_host_inter_check_delay;
double service_inter_check_delay;
double host_inter_check_delay;
int service_interleave_factor;
int max_service_check_spread;
int max_host_check_spread;
time_t first_service_check;
time_t last_service_check;
time_t first_host_check;
time_t last_host_check;
} sched_info;
/* DBUF structure - dynamic string storage */
typedef struct dbuf {
char *buf;
unsigned long used_size;
unsigned long allocated_size;
unsigned long chunk_size;
} dbuf;
#define CHECK_STATS_BUCKETS 15
/* used for tracking host and service check statistics */
typedef struct check_stats {
int current_bucket;
int bucket[CHECK_STATS_BUCKETS];
int overflow_bucket;
int minute_stats[3];
time_t last_update;
} check_stats;
2017-05-19 22:22:40 +02:00
/* OBJECT LIST STRUCTURE */
2017-05-19 23:37:19 +02:00
typedef struct objectlist {
2017-05-19 22:22:40 +02:00
void *object_ptr;
2017-05-19 23:37:19 +02:00
struct objectlist *next;
2017-05-19 22:22:40 +02:00
} objectlist;
/* TIMERANGE structure */
2017-05-19 23:37:19 +02:00
typedef struct timerange {
2017-05-19 22:22:40 +02:00
unsigned long range_start;
unsigned long range_end;
2017-05-19 23:37:19 +02:00
struct timerange *next;
2017-05-19 22:22:40 +02:00
} timerange;
/* DATERANGE structure */
2017-05-19 23:37:19 +02:00
typedef struct daterange {
2017-05-19 22:22:40 +02:00
int type;
int syear; /* start year */
int smon; /* start month */
int smday; /* start day of month (may 3rd, last day in feb) */
int swday; /* start day of week (thursday) */
int swday_offset; /* start weekday offset (3rd thursday, last monday in jan) */
int eyear;
int emon;
int emday;
int ewday;
int ewday_offset;
int skip_interval;
2017-05-19 23:37:19 +02:00
struct timerange *times;
struct daterange *next;
2017-05-19 22:22:40 +02:00
} daterange;
/* TIMEPERIODEXCLUSION structure */
2017-05-19 23:37:19 +02:00
typedef struct timeperiodexclusion {
2017-05-19 22:22:40 +02:00
char *timeperiod_name;
2017-05-19 23:37:19 +02:00
struct timeperiod *timeperiod_ptr;
struct timeperiodexclusion *next;
2017-05-19 22:22:40 +02:00
} timeperiodexclusion;
/* TIMEPERIOD structure */
2017-05-19 23:37:19 +02:00
typedef struct timeperiod {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *name;
char *alias;
2017-05-19 23:37:19 +02:00
struct timerange *days[7];
struct daterange *exceptions[DATERANGE_TYPES];
struct timeperiodexclusion *exclusions;
struct timeperiod *next;
2017-05-19 22:22:40 +02:00
} timeperiod;
/* CONTACTSMEMBER structure */
2017-05-19 23:37:19 +02:00
typedef struct contactsmember {
2017-05-19 22:22:40 +02:00
char *contact_name;
2017-05-19 23:37:19 +02:00
struct contact *contact_ptr;
struct contactsmember *next;
2017-05-19 22:22:40 +02:00
} contactsmember;
/* CONTACTGROUP structure */
2017-05-19 23:37:19 +02:00
typedef struct contactgroup {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *group_name;
char *alias;
2017-05-19 23:37:19 +02:00
struct contactsmember *members;
struct contactgroup *next;
2017-05-19 22:22:40 +02:00
} contactgroup;
/* CONTACTGROUPSMEMBER structure */
2017-05-19 23:37:19 +02:00
typedef struct contactgroupsmember {
2017-05-19 22:22:40 +02:00
char *group_name;
2017-05-19 23:37:19 +02:00
struct contactgroup *group_ptr;
struct contactgroupsmember *next;
2017-05-19 22:22:40 +02:00
} contactgroupsmember;
/* CUSTOMVARIABLESMEMBER structure */
2017-05-19 23:37:19 +02:00
typedef struct customvariablesmember {
2017-05-19 22:22:40 +02:00
char *variable_name;
char *variable_value;
int has_been_modified;
2017-05-19 23:37:19 +02:00
struct customvariablesmember *next;
2017-05-19 22:22:40 +02:00
} customvariablesmember;
/* COMMAND structure */
2017-05-19 23:37:19 +02:00
typedef struct command {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *name;
char *command_line;
2017-05-19 23:37:19 +02:00
struct command *next;
2017-05-19 22:22:40 +02:00
} command;
/* COMMANDSMEMBER structure */
2017-05-19 23:37:19 +02:00
typedef struct commandsmember {
2017-05-19 22:22:40 +02:00
char *command;
2017-05-19 23:37:19 +02:00
struct command *command_ptr;
struct commandsmember *next;
2017-05-19 22:22:40 +02:00
} commandsmember;
/* CONTACT structure */
2017-05-19 23:37:19 +02:00
struct contact {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *name;
char *alias;
char *email;
char *pager;
char *address[MAX_CONTACT_ADDRESSES];
2017-05-19 23:37:19 +02:00
struct commandsmember *host_notification_commands;
struct commandsmember *service_notification_commands;
unsigned int host_notification_options;
unsigned int service_notification_options;
unsigned int minimum_value;
2017-05-19 22:22:40 +02:00
char *host_notification_period;
char *service_notification_period;
int host_notifications_enabled;
int service_notifications_enabled;
int can_submit_commands;
int retain_status_information;
int retain_nonstatus_information;
2017-05-19 23:37:19 +02:00
struct customvariablesmember *custom_variables;
#ifndef NSCGI
2017-05-19 22:22:40 +02:00
time_t last_host_notification;
time_t last_service_notification;
unsigned long modified_attributes;
unsigned long modified_host_attributes;
unsigned long modified_service_attributes;
#endif
2017-05-19 23:37:19 +02:00
struct timeperiod *host_notification_period_ptr;
struct timeperiod *service_notification_period_ptr;
struct objectlist *contactgroups_ptr;
struct contact *next;
2017-05-19 22:22:40 +02:00
};
/* SERVICESMEMBER structure */
2017-05-19 23:37:19 +02:00
typedef struct servicesmember {
2017-05-19 22:22:40 +02:00
char *host_name;
char *service_description;
2017-05-19 23:37:19 +02:00
struct service *service_ptr;
struct servicesmember *next;
2017-05-19 22:22:40 +02:00
} servicesmember;
/* HOSTSMEMBER structure */
2017-05-19 23:37:19 +02:00
typedef struct hostsmember {
2017-05-19 22:22:40 +02:00
char *host_name;
2017-05-19 23:37:19 +02:00
struct host *host_ptr;
struct hostsmember *next;
2017-05-19 22:22:40 +02:00
} hostsmember;
/* HOSTGROUP structure */
2017-05-19 23:37:19 +02:00
typedef struct hostgroup {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *group_name;
char *alias;
2017-05-19 23:37:19 +02:00
struct hostsmember *members;
2017-05-19 22:22:40 +02:00
char *notes;
char *notes_url;
char *action_url;
2017-05-19 23:37:19 +02:00
struct hostgroup *next;
2017-05-19 22:22:40 +02:00
} hostgroup;
/* HOST structure */
2017-05-19 23:37:19 +02:00
struct host {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *name;
char *display_name;
char *alias;
char *address;
2017-05-19 23:37:19 +02:00
struct hostsmember *parent_hosts;
struct hostsmember *child_hosts;
struct servicesmember *services;
char *check_command;
2017-05-19 22:22:40 +02:00
int initial_state;
double check_interval;
double retry_interval;
int max_attempts;
char *event_handler;
2017-05-19 23:37:19 +02:00
struct contactgroupsmember *contact_groups;
struct contactsmember *contacts;
2017-05-19 22:22:40 +02:00
double notification_interval;
double first_notification_delay;
2017-05-19 23:37:19 +02:00
unsigned int notification_options;
unsigned int hourly_value;
2017-05-19 22:22:40 +02:00
char *notification_period;
char *check_period;
int flap_detection_enabled;
double low_flap_threshold;
double high_flap_threshold;
2017-05-19 23:37:19 +02:00
int flap_detection_options;
unsigned int stalking_options;
2017-05-19 22:22:40 +02:00
int check_freshness;
int freshness_threshold;
int process_performance_data;
int checks_enabled;
2017-05-19 23:37:19 +02:00
const char *check_source;
int accept_passive_checks;
2017-05-19 22:22:40 +02:00
int event_handler_enabled;
int retain_status_information;
int retain_nonstatus_information;
2017-05-19 23:37:19 +02:00
int obsess;
2017-05-19 22:22:40 +02:00
char *notes;
char *notes_url;
char *action_url;
char *icon_image;
char *icon_image_alt;
2017-05-19 23:37:19 +02:00
char *statusmap_image; /* used by lots of graphing tools */
/* #ifdef NSCGI */
/*
* these are kept in ancillary storage for the daemon and
* thrown out as soon as we've created the object cache.
* The CGI's still attach them though, since they are the
* only users of this utter crap.
*/
2017-05-19 22:22:40 +02:00
char *vrml_image;
int have_2d_coords;
int x_2d;
int y_2d;
int have_3d_coords;
double x_3d;
double y_3d;
double z_3d;
int should_be_drawn;
2017-05-19 23:37:19 +02:00
/* #endif */
2017-05-19 22:22:40 +02:00
customvariablesmember *custom_variables;
2017-05-19 23:37:19 +02:00
#ifndef NSCGI
2017-05-19 22:22:40 +02:00
int problem_has_been_acknowledged;
int acknowledgement_type;
int check_type;
int current_state;
int last_state;
int last_hard_state;
char *plugin_output;
char *long_plugin_output;
char *perf_data;
int state_type;
int current_attempt;
unsigned long current_event_id;
unsigned long last_event_id;
unsigned long current_problem_id;
unsigned long last_problem_id;
double latency;
double execution_time;
int is_executing;
int check_options;
int notifications_enabled;
2017-05-19 23:37:19 +02:00
time_t last_notification;
time_t next_notification;
2017-05-19 22:22:40 +02:00
time_t next_check;
int should_be_scheduled;
time_t last_check;
time_t last_state_change;
time_t last_hard_state_change;
time_t last_time_up;
time_t last_time_down;
time_t last_time_unreachable;
int has_been_checked;
int is_being_freshened;
2017-05-19 23:37:19 +02:00
int notified_on;
2017-05-19 22:22:40 +02:00
int current_notification_number;
int no_more_notifications;
unsigned long current_notification_id;
int check_flapping_recovery_notification;
int scheduled_downtime_depth;
int pending_flex_downtime;
int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */
int state_history_index;
time_t last_state_history_update;
int is_flapping;
unsigned long flapping_comment_id;
double percent_state_change;
int total_services;
unsigned long total_service_check_interval;
unsigned long modified_attributes;
#endif
2017-05-19 23:37:19 +02:00
struct command *event_handler_ptr;
struct command *check_command_ptr;
struct timeperiod *check_period_ptr;
struct timeperiod *notification_period_ptr;
struct objectlist *hostgroups_ptr;
/* objects we depend upon */
struct objectlist *exec_deps, *notify_deps;
struct objectlist *escalation_list;
struct host *next;
struct timed_event *next_check_event;
2017-05-19 22:22:40 +02:00
};
/* SERVICEGROUP structure */
2017-05-19 23:37:19 +02:00
typedef struct servicegroup {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *group_name;
char *alias;
2017-05-19 23:37:19 +02:00
struct servicesmember *members;
2017-05-19 22:22:40 +02:00
char *notes;
char *notes_url;
char *action_url;
2017-05-19 23:37:19 +02:00
struct servicegroup *next;
2017-05-19 22:22:40 +02:00
} servicegroup;
/* SERVICE structure */
2017-05-19 23:37:19 +02:00
struct service {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *host_name;
char *description;
char *display_name;
2017-05-19 23:37:19 +02:00
struct servicesmember *parents;
struct servicesmember *children;
char *check_command;
2017-05-19 22:22:40 +02:00
char *event_handler;
int initial_state;
double check_interval;
double retry_interval;
int max_attempts;
int parallelize;
2017-05-19 23:37:19 +02:00
struct contactgroupsmember *contact_groups;
struct contactsmember *contacts;
2017-05-19 22:22:40 +02:00
double notification_interval;
double first_notification_delay;
2017-05-19 23:37:19 +02:00
unsigned int notification_options;
unsigned int stalking_options;
unsigned int hourly_value;
2017-05-19 22:22:40 +02:00
int is_volatile;
char *notification_period;
char *check_period;
int flap_detection_enabled;
double low_flap_threshold;
double high_flap_threshold;
2017-05-19 23:37:19 +02:00
unsigned int flap_detection_options;
2017-05-19 22:22:40 +02:00
int process_performance_data;
int check_freshness;
int freshness_threshold;
2017-05-19 23:37:19 +02:00
int accept_passive_checks;
2017-05-19 22:22:40 +02:00
int event_handler_enabled;
int checks_enabled;
2017-05-19 23:37:19 +02:00
const char *check_source;
2017-05-19 22:22:40 +02:00
int retain_status_information;
int retain_nonstatus_information;
int notifications_enabled;
2017-05-19 23:37:19 +02:00
int obsess;
2017-05-19 22:22:40 +02:00
char *notes;
char *notes_url;
char *action_url;
char *icon_image;
char *icon_image_alt;
2017-05-19 23:37:19 +02:00
struct customvariablesmember *custom_variables;
#ifndef NSCGI
2017-05-19 22:22:40 +02:00
int problem_has_been_acknowledged;
int acknowledgement_type;
int host_problem_at_last_check;
int check_type;
int current_state;
int last_state;
int last_hard_state;
char *plugin_output;
char *long_plugin_output;
char *perf_data;
int state_type;
time_t next_check;
int should_be_scheduled;
time_t last_check;
int current_attempt;
unsigned long current_event_id;
unsigned long last_event_id;
unsigned long current_problem_id;
unsigned long last_problem_id;
time_t last_notification;
time_t next_notification;
int no_more_notifications;
int check_flapping_recovery_notification;
time_t last_state_change;
time_t last_hard_state_change;
time_t last_time_ok;
time_t last_time_warning;
time_t last_time_unknown;
time_t last_time_critical;
int has_been_checked;
int is_being_freshened;
2017-05-19 23:37:19 +02:00
unsigned int notified_on;
2017-05-19 22:22:40 +02:00
int current_notification_number;
unsigned long current_notification_id;
double latency;
double execution_time;
int is_executing;
int check_options;
int scheduled_downtime_depth;
int pending_flex_downtime;
int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */
int state_history_index;
int is_flapping;
unsigned long flapping_comment_id;
double percent_state_change;
unsigned long modified_attributes;
2017-05-19 23:37:19 +02:00
#endif
2017-05-19 22:22:40 +02:00
2017-05-19 23:37:19 +02:00
struct host *host_ptr;
struct command *event_handler_ptr;
2017-05-19 22:22:40 +02:00
char *event_handler_args;
2017-05-19 23:37:19 +02:00
struct command *check_command_ptr;
2017-05-19 22:22:40 +02:00
char *check_command_args;
2017-05-19 23:37:19 +02:00
struct timeperiod *check_period_ptr;
struct timeperiod *notification_period_ptr;
struct objectlist *servicegroups_ptr;
struct objectlist *exec_deps, *notify_deps;
struct objectlist *escalation_list;
struct service *next;
struct timed_event *next_check_event;
2017-05-19 22:22:40 +02:00
};
/* SERVICE ESCALATION structure */
2017-05-19 23:37:19 +02:00
typedef struct serviceescalation {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *host_name;
char *description;
int first_notification;
int last_notification;
double notification_interval;
char *escalation_period;
2017-05-19 23:37:19 +02:00
int escalation_options;
struct contactgroupsmember *contact_groups;
struct contactsmember *contacts;
struct service *service_ptr;
struct timeperiod *escalation_period_ptr;
2017-05-19 22:22:40 +02:00
} serviceescalation;
/* SERVICE DEPENDENCY structure */
2017-05-19 23:37:19 +02:00
typedef struct servicedependency {
unsigned int id;
2017-05-19 22:22:40 +02:00
int dependency_type;
char *dependent_host_name;
char *dependent_service_description;
char *host_name;
char *service_description;
char *dependency_period;
int inherits_parent;
2017-05-19 23:37:19 +02:00
int failure_options;
struct service *master_service_ptr;
struct service *dependent_service_ptr;
struct timeperiod *dependency_period_ptr;
2017-05-19 22:22:40 +02:00
} servicedependency;
/* HOST ESCALATION structure */
2017-05-19 23:37:19 +02:00
typedef struct hostescalation {
unsigned int id;
2017-05-19 22:22:40 +02:00
char *host_name;
int first_notification;
int last_notification;
double notification_interval;
char *escalation_period;
2017-05-19 23:37:19 +02:00
int escalation_options;
struct contactgroupsmember *contact_groups;
struct contactsmember *contacts;
struct host *host_ptr;
struct timeperiod *escalation_period_ptr;
2017-05-19 22:22:40 +02:00
} hostescalation;
/* HOST DEPENDENCY structure */
2017-05-19 23:37:19 +02:00
typedef struct hostdependency {
unsigned int id;
2017-05-19 22:22:40 +02:00
int dependency_type;
char *dependent_host_name;
char *host_name;
char *dependency_period;
int inherits_parent;
2017-05-19 23:37:19 +02:00
int failure_options;
struct host *master_host_ptr;
struct host *dependent_host_ptr;
struct timeperiod *dependency_period_ptr;
2017-05-19 22:22:40 +02:00
} hostdependency;
2017-05-19 23:37:19 +02:00
extern struct command *command_list;
extern struct timeperiod *timeperiod_list;
extern struct host *host_list;
extern struct service *service_list;
extern struct contact *contact_list;
extern struct hostgroup *hostgroup_list;
extern struct servicegroup *servicegroup_list;
extern struct contactgroup *contactgroup_list;
extern struct hostescalation *hostescalation_list;
extern struct serviceescalation *serviceescalation_list;
extern struct command **command_ary;
extern struct timeperiod **timeperiod_ary;
extern struct host **host_ary;
extern struct service **service_ary;
extern struct contact **contact_ary;
extern struct hostgroup **hostgroup_ary;
extern struct servicegroup **servicegroup_ary;
extern struct contactgroup **contactgroup_ary;
extern struct hostescalation **hostescalation_ary;
extern struct hostdependency **hostdependency_ary;
extern struct serviceescalation **serviceescalation_ary;
extern struct servicedependency **servicedependency_ary;
2017-05-19 22:22:40 +02:00
/********************* FUNCTIONS **********************/
/**** Top-level input functions ****/
2017-05-19 23:37:19 +02:00
int read_object_config_data(const char *, int); /* reads all external configuration data of specific types */
2017-05-19 22:22:40 +02:00
/**** Object Creation Functions ****/
2017-05-19 23:37:19 +02:00
struct contact *add_contact(char *name, char *alias, char *email, char *pager, char **addresses, char *svc_notification_period, char *host_notification_period, int service_notification_options, int host_notification_options, int service_notifications_enabled, int host_notifications_enabled, int can_submit_commands, int retain_status_information, int retain_nonstatus_information, unsigned int minimum_value);
struct commandsmember *add_service_notification_command_to_contact(contact *, char *); /* adds a service notification command to a contact definition */
struct commandsmember *add_host_notification_command_to_contact(contact *, char *); /* adds a host notification command to a contact definition */
struct customvariablesmember *add_custom_variable_to_contact(contact *, char *, char *); /* adds a custom variable to a service definition */
struct host *add_host(char *name, char *display_name, char *alias, char *address, 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, char *notification_period, int notifications_enabled, char *check_command, int checks_enabled, int accept_passive_checks, 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, char *notes, char *notes_url, char *action_url, char *icon_image, char *icon_image_alt, char *vrml_image, 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 should_be_drawn, int retain_status_information, int retain_nonstatus_information, int obsess_over_host, unsigned int hourly_value);
struct hostsmember *add_parent_host_to_host(host *, char *); /* adds a parent host to a host definition */
struct servicesmember *add_parent_service_to_service(service *, char *host_name, char *description);
struct hostsmember *add_child_link_to_host(host *, host *); /* adds a child host to a host definition */
struct servicesmember *add_child_link_to_service(service *, service *); /* adds a child host to a host definition */
struct contactgroupsmember *add_contactgroup_to_host(host *, char *); /* adds a contactgroup to a host definition */
struct contactsmember *add_contact_to_host(host *, char *); /* adds a contact to a host definition */
struct customvariablesmember *add_custom_variable_to_host(host *, char *, char *); /* adds a custom variable to a host definition */
struct timeperiod *add_timeperiod(char *, char *); /* adds a timeperiod definition */
struct timeperiodexclusion *add_exclusion_to_timeperiod(timeperiod *, char *); /* adds an exclusion to a timeperiod */
struct timerange *add_timerange_to_timeperiod(timeperiod *, int, unsigned long, unsigned long); /* adds a timerange to a timeperiod definition */
struct daterange *add_exception_to_timeperiod(timeperiod *, int, int, int, int, int, int, int, int, int, int, int, int);
struct timerange *add_timerange_to_daterange(daterange *, unsigned long, unsigned long);
struct hostgroup *add_hostgroup(char *, char *, char *, char *, char *); /* adds a hostgroup definition */
struct hostsmember *add_host_to_hostgroup(hostgroup *, char *); /* adds a host to a hostgroup definition */
struct servicegroup *add_servicegroup(char *, char *, char *, char *, char *); /* adds a servicegroup definition */
struct servicesmember *add_service_to_servicegroup(servicegroup *, char *, char *); /* adds a service to a servicegroup definition */
struct contactgroup *add_contactgroup(char *, char *); /* adds a contactgroup definition */
struct contactsmember *add_contact_to_contactgroup(contactgroup *, char *); /* adds a contact to a contact group definition */
struct command *add_command(char *, char *); /* adds a command definition */
struct service *add_service(char *host_name, char *description, char *display_name, char *check_period, int initial_state, int max_attempts, int parallelize, 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, char *event_handler, int event_handler_enabled, char *check_command, 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, char *notes, char *notes_url, char *action_url, char *icon_image, char *icon_image_alt, int retain_status_information, int retain_nonstatus_information, int obsess_over_service, unsigned int hourly_value);
struct contactgroupsmember *add_contactgroup_to_service(service *, char *); /* adds a contact group to a service definition */
struct contactsmember *add_contact_to_service(service *, char *); /* adds a contact to a host definition */
struct serviceescalation *add_serviceescalation(char *host_name, char *description, int first_notification, int last_notification, double notification_interval, char *escalation_period, int escalation_options);
struct contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *, char *); /* adds a contact group to a service escalation definition */
struct contactsmember *add_contact_to_serviceescalation(serviceescalation *, char *); /* adds a contact to a service escalation definition */
struct customvariablesmember *add_custom_variable_to_service(service *, char *, char *); /* adds a custom variable to a service definition */
struct servicedependency *add_service_dependency(char *dependent_host_name, char *dependent_service_description, char *host_name, char *service_description, int dependency_type, int inherits_parent, int failure_options, char *dependency_period);
struct hostdependency *add_host_dependency(char *dependent_host_name, char *host_name, int dependency_type, int inherits_parent, int failure_options, char *dependency_period);
struct hostescalation *add_hostescalation(char *host_name, int first_notification, int last_notification, double notification_interval, char *escalation_period, int escalation_options);
struct contactsmember *add_contact_to_hostescalation(hostescalation *, char *); /* adds a contact to a host escalation definition */
struct contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *, char *); /* adds a contact group to a host escalation definition */
struct contactsmember *add_contact_to_object(contactsmember **, char *); /* adds a contact to an object */
struct customvariablesmember *add_custom_variable_to_object(customvariablesmember **, char *, char *); /* adds a custom variable to an object */
struct servicesmember *add_service_link_to_host(host *, service *);
2017-05-19 22:22:40 +02:00
2017-05-19 23:37:19 +02:00
int skiplist_compare_text(const char *val1a, const char *val1b, const char *val2a, const char *val2b);
2017-05-19 22:22:40 +02:00
int get_host_count(void);
int get_service_count(void);
2017-05-19 23:37:19 +02:00
int create_object_tables(unsigned int *);
2017-05-19 22:22:40 +02:00
/**** Object Search Functions ****/
2017-05-19 23:37:19 +02:00
struct timeperiod *find_timeperiod(const char *);
struct host *find_host(const char *);
struct hostgroup *find_hostgroup(const char *);
struct servicegroup *find_servicegroup(const char *);
struct contact *find_contact(const char *);
struct contactgroup *find_contactgroup(const char *);
struct command *find_command(const char *);
struct service *find_service(const char *, const char *);
#define OBJECTLIST_DUPE 1
int add_object_to_objectlist(struct objectlist **, void *);
int prepend_object_to_objectlist(struct objectlist **, void *);
int prepend_unique_object_to_objectlist(struct objectlist **, void *, size_t size);
2017-05-19 22:22:40 +02:00
int free_objectlist(objectlist **);
/**** Object Query Functions ****/
2017-05-19 23:37:19 +02:00
unsigned int host_services_value(struct host *h);
int is_host_immediate_child_of_host(struct host *, struct host *); /* checks if a host is an immediate child of another host */
int is_host_primary_immediate_child_of_host(struct host *, struct host *); /* checks if a host is an immediate child (and primary child) of another host */
int is_host_immediate_parent_of_host(struct host *, struct host *); /* checks if a host is an immediate child of another host */
int is_host_member_of_hostgroup(struct hostgroup *, struct host *); /* tests whether or not a host is a member of a specific hostgroup */
int is_host_member_of_servicegroup(struct servicegroup *, struct host *); /* tests whether or not a service is a member of a specific servicegroup */
int is_service_member_of_servicegroup(struct servicegroup *, struct service *); /* tests whether or not a service is a member of a specific servicegroup */
int is_contact_member_of_contactgroup(struct contactgroup *, struct contact *); /* tests whether or not a contact is a member of a specific contact group */
int is_contact_for_host(struct host *, struct contact *); /* tests whether or not a contact is a contact member for a specific host */
int is_contactgroup_for_host(struct host *, struct contactgroup *);
/* tests whether a contact group is a contract group for a specific host */
int is_escalated_contact_for_host(struct host *, struct contact *); /* checks whether or not a contact is an escalated contact for a specific host */
int is_contact_for_host_escalation(hostescalation *, contact *);
/* tests whether a contact is an contact for a particular host escalation */
int is_contactgroup_for_host_escalation(hostescalation *, contactgroup *);
/* tests whether a contactgroup is a contactgroup for a particular
host escalation */
int is_contact_for_service(struct service *, struct contact *); /* tests whether or not a contact is a contact member for a specific service */
int is_contactgroup_for_service(struct service *, struct contactgroup *);
/* tests whether a contact group is a contract group for a specific service */
int is_escalated_contact_for_host(struct host *, struct contact *); /* checks whether or not a contact is an escalated contact for a specific host */
int is_escalated_contact_for_service(struct service *, struct contact *); /* checks whether or not a contact is an escalated contact for a specific service */
int is_contact_for_service_escalation(serviceescalation *, contact *);
/* tests whether a contact is an contact for a particular service
escalation */
int is_contactgroup_for_service_escalation(serviceescalation *, contactgroup *);
/* tests whether a contactgroup is a contactgroup for a particular
service escalation */
int number_of_immediate_child_hosts(struct host *); /* counts the number of immediate child hosts for a particular host */
int number_of_total_child_hosts(struct host *); /* counts the number of total child hosts for a particular host */
int number_of_immediate_parent_hosts(struct host *); /* counts the number of immediate parents hosts for a particular host */
#ifndef NSCGI
void fcache_contactlist(FILE *fp, const char *prefix, struct contactsmember *list);
void fcache_contactgrouplist(FILE *fp, const char *prefix, struct contactgroupsmember *list);
void fcache_hostlist(FILE *fp, const char *prefix, struct hostsmember *list);
void fcache_customvars(FILE *fp, struct customvariablesmember *cvlist);
void fcache_timeperiod(FILE *fp, struct timeperiod *temp_timeperiod);
void fcache_command(FILE *fp, struct command *temp_command);
void fcache_contactgroup(FILE *fp, struct contactgroup *temp_contactgroup);
void fcache_hostgroup(FILE *fp, struct hostgroup *temp_hostgroup);
void fcache_servicegroup(FILE *fp, struct servicegroup *temp_servicegroup);
void fcache_contact(FILE *fp, struct contact *temp_contact);
void fcache_host(FILE *fp, struct host *temp_host);
void fcache_service(FILE *fp, struct service *temp_service);
void fcache_servicedependency(FILE *fp, struct servicedependency *temp_servicedependency);
void fcache_serviceescalation(FILE *fp, struct serviceescalation *temp_serviceescalation);
void fcache_hostdependency(FILE *fp, struct hostdependency *temp_hostdependency);
void fcache_hostescalation(FILE *fp, struct hostescalation *temp_hostescalation);
int fcache_objects(char *cache_file);
2017-05-19 22:22:40 +02:00
#endif
/**** Object Cleanup Functions ****/
int free_object_data(void); /* frees all allocated memory for the object definitions */
NAGIOS_END_DECL
#endif