/***************************************************************************** * * OBJECTS.H - Header file for object addition/search functions * * Copyright (c) 1999-2007 Ethan Galstad (egalstad@nagios.org) * Last Modified: 11-10-2007 * * 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. * *****************************************************************************/ #ifndef _OBJECTS_H #define _OBJECTS_H #include "compat.h" #include "common.h" NAGIOS_BEGIN_DECL /*************** CURRENT OBJECT REVISION **************/ #define CURRENT_OBJECT_STRUCTURE_VERSION 307 /* increment when changes are made to data structures... */ /* 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 #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 /****************** DATA STRUCTURES *******************/ typedef struct host_struct host; typedef struct service_struct service; typedef struct contact_struct contact; /* OBJECT LIST STRUCTURE */ typedef struct objectlist_struct { void *object_ptr; struct objectlist_struct *next; } objectlist; /* TIMERANGE structure */ typedef struct timerange_struct { unsigned long range_start; unsigned long range_end; struct timerange_struct *next; } timerange; /* DATERANGE structure */ typedef struct daterange_struct { 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; timerange *times; struct daterange_struct *next; } daterange; /* TIMEPERIODEXCLUSION structure */ typedef struct timeperiodexclusion_struct { char *timeperiod_name; struct timeperiod_struct *timeperiod_ptr; struct timeperiodexclusion_struct *next; } timeperiodexclusion; /* TIMEPERIOD structure */ typedef struct timeperiod_struct { char *name; char *alias; timerange *days[7]; daterange *exceptions[DATERANGE_TYPES]; timeperiodexclusion *exclusions; struct timeperiod_struct *next; struct timeperiod_struct *nexthash; } timeperiod; /* CONTACTSMEMBER structure */ typedef struct contactsmember_struct { char *contact_name; #ifdef NSCORE contact *contact_ptr; #endif struct contactsmember_struct *next; } contactsmember; /* CONTACTGROUP structure */ typedef struct contactgroup_struct { char *group_name; char *alias; contactsmember *members; struct contactgroup_struct *next; struct contactgroup_struct *nexthash; } contactgroup; /* CONTACTGROUPSMEMBER structure */ typedef struct contactgroupsmember_struct { char *group_name; #ifdef NSCORE contactgroup *group_ptr; #endif struct contactgroupsmember_struct *next; } contactgroupsmember; /* CUSTOMVARIABLESMEMBER structure */ typedef struct customvariablesmember_struct { char *variable_name; char *variable_value; int has_been_modified; struct customvariablesmember_struct *next; } customvariablesmember; /* COMMAND structure */ typedef struct command_struct { char *name; char *command_line; struct command_struct *next; struct command_struct *nexthash; } command; /* COMMANDSMEMBER structure */ typedef struct commandsmember_struct { char *command; #ifdef NSCORE command *command_ptr; #endif struct commandsmember_struct *next; } commandsmember; /* CONTACT structure */ struct contact_struct { char *name; char *alias; char *email; char *pager; char *address[MAX_CONTACT_ADDRESSES]; commandsmember *host_notification_commands; commandsmember *service_notification_commands; int notify_on_service_unknown; int notify_on_service_warning; int notify_on_service_critical; int notify_on_service_recovery; int notify_on_service_flapping; int notify_on_service_downtime; int notify_on_host_down; int notify_on_host_unreachable; int notify_on_host_recovery; int notify_on_host_flapping; int notify_on_host_downtime; 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; customvariablesmember *custom_variables; #ifdef NSCORE time_t last_host_notification; time_t last_service_notification; unsigned long modified_attributes; unsigned long modified_host_attributes; unsigned long modified_service_attributes; timeperiod *host_notification_period_ptr; timeperiod *service_notification_period_ptr; objectlist *contactgroups_ptr; #endif struct contact_struct *next; struct contact_struct *nexthash; }; /* SERVICESMEMBER structure */ typedef struct servicesmember_struct { char *host_name; char *service_description; #ifdef NSCORE service *service_ptr; #endif struct servicesmember_struct *next; } servicesmember; /* HOSTSMEMBER structure */ typedef struct hostsmember_struct { char *host_name; #ifdef NSCORE host *host_ptr; #endif struct hostsmember_struct *next; } hostsmember; /* HOSTGROUP structure */ typedef struct hostgroup_struct { char *group_name; char *alias; hostsmember *members; char *notes; char *notes_url; char *action_url; struct hostgroup_struct *next; struct hostgroup_struct *nexthash; } hostgroup; /* HOST structure */ struct host_struct { char *name; char *display_name; char *alias; char *address; hostsmember *parent_hosts; hostsmember *child_hosts; servicesmember *services; char *host_check_command; int initial_state; double check_interval; double retry_interval; int max_attempts; char *event_handler; contactgroupsmember *contact_groups; contactsmember *contacts; double notification_interval; double first_notification_delay; int notify_on_down; int notify_on_unreachable; int notify_on_recovery; int notify_on_flapping; int notify_on_downtime; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_on_up; int flap_detection_on_down; int flap_detection_on_unreachable; int stalk_on_up; int stalk_on_down; int stalk_on_unreachable; int check_freshness; int freshness_threshold; int process_performance_data; int checks_enabled; int accept_passive_host_checks; int event_handler_enabled; int retain_status_information; int retain_nonstatus_information; int failure_prediction_enabled; char *failure_prediction_options; int obsess_over_host; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char *vrml_image; char *statusmap_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; customvariablesmember *custom_variables; #ifdef NSCORE 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; time_t last_host_notification; time_t next_host_notification; 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; int notified_on_down; int notified_on_unreachable; 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; int circular_path_checked; int contains_circular_path; command *event_handler_ptr; command *check_command_ptr; timeperiod *check_period_ptr; timeperiod *notification_period_ptr; objectlist *hostgroups_ptr; #endif struct host_struct *next; void *next_check_event; }; /* SERVICEGROUP structure */ typedef struct servicegroup_struct { char *group_name; char *alias; servicesmember *members; char *notes; char *notes_url; char *action_url; struct servicegroup_struct *next; struct servicegroup_struct *nexthash; } servicegroup; /* SERVICE structure */ struct service_struct { char *host_name; char *description; char *display_name; char *service_check_command; char *event_handler; int initial_state; double check_interval; double retry_interval; int max_attempts; int parallelize; contactgroupsmember *contact_groups; contactsmember *contacts; double notification_interval; double first_notification_delay; int notify_on_unknown; int notify_on_warning; int notify_on_critical; int notify_on_recovery; int notify_on_flapping; int notify_on_downtime; int stalk_on_ok; int stalk_on_warning; int stalk_on_unknown; int stalk_on_critical; int is_volatile; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_on_ok; int flap_detection_on_warning; int flap_detection_on_unknown; int flap_detection_on_critical; int process_performance_data; int check_freshness; int freshness_threshold; int accept_passive_service_checks; int event_handler_enabled; int checks_enabled; int retain_status_information; int retain_nonstatus_information; int notifications_enabled; int obsess_over_service; int failure_prediction_enabled; char *failure_prediction_options; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; customvariablesmember *custom_variables; #ifdef NSCORE 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; int notified_on_unknown; int notified_on_warning; int notified_on_critical; 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; host *host_ptr; command *event_handler_ptr; char *event_handler_args; command *check_command_ptr; char *check_command_args; timeperiod *check_period_ptr; timeperiod *notification_period_ptr; objectlist *servicegroups_ptr; #endif struct service_struct *next; void *next_check_event; }; /* SERVICE ESCALATION structure */ typedef struct serviceescalation_struct { char *host_name; char *description; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_warning; int escalate_on_unknown; int escalate_on_critical; contactgroupsmember *contact_groups; contactsmember *contacts; #ifdef NSCORE service *service_ptr; timeperiod *escalation_period_ptr; #endif struct serviceescalation_struct *next; struct serviceescalation_struct *nexthash; } serviceescalation; /* SERVICE DEPENDENCY structure */ typedef struct servicedependency_struct { int dependency_type; char *dependent_host_name; char *dependent_service_description; char *host_name; char *service_description; char *dependency_period; int inherits_parent; int fail_on_ok; int fail_on_warning; int fail_on_unknown; int fail_on_critical; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; service *master_service_ptr; service *dependent_service_ptr; timeperiod *dependency_period_ptr; #endif struct servicedependency_struct *next; struct servicedependency_struct *nexthash; } servicedependency; /* HOST ESCALATION structure */ typedef struct hostescalation_struct { char *host_name; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_down; int escalate_on_unreachable; contactgroupsmember *contact_groups; contactsmember *contacts; #ifdef NSCORE host *host_ptr; timeperiod *escalation_period_ptr; #endif struct hostescalation_struct *next; struct hostescalation_struct *nexthash; } hostescalation; /* HOST DEPENDENCY structure */ typedef struct hostdependency_struct { int dependency_type; char *dependent_host_name; char *host_name; char *dependency_period; int inherits_parent; int fail_on_up; int fail_on_down; int fail_on_unreachable; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; host *master_host_ptr; host *dependent_host_ptr; timeperiod *dependency_period_ptr; #endif struct hostdependency_struct *next; struct hostdependency_struct *nexthash; } hostdependency; /****************** HASH STRUCTURES ********************/ typedef struct host_cursor_struct { int host_hashchain_iterator; host *current_host_pointer; } host_cursor; /********************* FUNCTIONS **********************/ /**** Top-level input functions ****/ int read_object_config_data(char *, int, int, int); /* reads all external configuration data of specific types */ /**** Object Creation Functions ****/ contact *add_contact(char *, char *, char *, char *, char **, char *, char *, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int); /* adds a contact definition */ commandsmember *add_service_notification_command_to_contact(contact *, char *); /* adds a service notification command to a contact definition */ commandsmember *add_host_notification_command_to_contact(contact *, char *); /* adds a host notification command to a contact definition */ customvariablesmember *add_custom_variable_to_contact(contact *, char *, char *); /* adds a custom variable to a service definition */ host *add_host(char *, char *, char *, char *, char *, int, double, double, int, int, int, int, int, int, double, double, char *, int, char *, int, int, char *, int, int, double, double, int, int, int, int, int, int, int, int, char *, int, int, char *, char *, char *, char *, char *, char *, char *, int, int, int, double, double, double, int, int, int, int, int); /* adds a host definition */ hostsmember *add_parent_host_to_host(host *, char *); /* adds a parent host to a host definition */ hostsmember *add_child_link_to_host(host *, host *); /* adds a child host to a host definition */ contactgroupsmember *add_contactgroup_to_host(host *, char *); /* adds a contactgroup to a host definition */ contactsmember *add_contact_to_host(host *, char *); /* adds a contact to a host definition */ customvariablesmember *add_custom_variable_to_host(host *, char *, char *); /* adds a custom variable to a host definition */ timeperiod *add_timeperiod(char *, char *); /* adds a timeperiod definition */ timeperiodexclusion *add_exclusion_to_timeperiod(timeperiod *, char *); /* adds an exclusion to a timeperiod */ timerange *add_timerange_to_timeperiod(timeperiod *, int, unsigned long, unsigned long); /* adds a timerange to a timeperiod definition */ daterange *add_exception_to_timeperiod(timeperiod *, int, int, int, int, int, int, int, int, int, int, int, int); timerange *add_timerange_to_daterange(daterange *, unsigned long, unsigned long); hostgroup *add_hostgroup(char *, char *, char *, char *, char *); /* adds a hostgroup definition */ hostsmember *add_host_to_hostgroup(hostgroup *, char *); /* adds a host to a hostgroup definition */ servicegroup *add_servicegroup(char *, char *, char *, char *, char *); /* adds a servicegroup definition */ servicesmember *add_service_to_servicegroup(servicegroup *, char *, char *); /* adds a service to a servicegroup definition */ contactgroup *add_contactgroup(char *, char *); /* adds a contactgroup definition */ contactsmember *add_contact_to_contactgroup(contactgroup *, char *); /* adds a contact to a contact group definition */ command *add_command(char *, char *); /* adds a command definition */ service *add_service(char *, char *, char *, char *, int, int, int, int, double, double, double, double, char *, int, int, int, int, int, int, int, int, char *, int, char *, int, int, double, double, int, int, int, int, int, int, int, int, int, int, char *, int, int, char *, char *, char *, char *, char *, int, int, int); /* adds a service definition */ contactgroupsmember *add_contactgroup_to_service(service *, char *); /* adds a contact group to a service definition */ contactsmember *add_contact_to_service(service *, char *); /* adds a contact to a host definition */ serviceescalation *add_serviceescalation(char *, char *, int, int, double, char *, int, int, int, int); /* adds a service escalation definition */ contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *, char *); /* adds a contact group to a service escalation definition */ contactsmember *add_contact_to_serviceescalation(serviceescalation *, char *); /* adds a contact to a service escalation definition */ customvariablesmember *add_custom_variable_to_service(service *, char *, char *); /* adds a custom variable to a service definition */ servicedependency *add_service_dependency(char *, char *, char *, char *, int, int, int, int, int, int, int, char *); /* adds a service dependency definition */ hostdependency *add_host_dependency(char *, char *, int, int, int, int, int, int, char *); /* adds a host dependency definition */ hostescalation *add_hostescalation(char *, int, int, double, char *, int, int, int); /* adds a host escalation definition */ contactsmember *add_contact_to_hostescalation(hostescalation *, char *); /* adds a contact to a host escalation definition */ contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *, char *); /* adds a contact group to a host escalation definition */ contactsmember *add_contact_to_object(contactsmember **, char *); /* adds a contact to an object */ customvariablesmember *add_custom_variable_to_object(customvariablesmember **, char *, char *); /* adds a custom variable to an object */ servicesmember *add_service_link_to_host(host *, service *); /*** Object Skiplist Functions ****/ int init_object_skiplists(void); int free_object_skiplists(void); int skiplist_compare_text(const char *val1a, const char *val1b, const char *val2a, const char *val2b); int skiplist_compare_host(void *a, void *b); int skiplist_compare_service(void *a, void *b); int skiplist_compare_command(void *a, void *b); int skiplist_compare_timeperiod(void *a, void *b); int skiplist_compare_contact(void *a, void *b); int skiplist_compare_contactgroup(void *a, void *b); int skiplist_compare_hostgroup(void *a, void *b); int skiplist_compare_servicegroup(void *a, void *b); int skiplist_compare_hostescalation(void *a, void *b); int skiplist_compare_serviceescalation(void *a, void *b); int skiplist_compare_hostdependency(void *a, void *b); int skiplist_compare_servicedependency(void *a, void *b); int get_host_count(void); int get_service_count(void); /**** Object Search Functions ****/ timeperiod *find_timeperiod(char *); /* finds a timeperiod object */ host *find_host(char *); /* finds a host object */ hostgroup *find_hostgroup(char *); /* finds a hostgroup object */ servicegroup *find_servicegroup(char *); /* finds a servicegroup object */ contact *find_contact(char *); /* finds a contact object */ contactgroup *find_contactgroup(char *); /* finds a contactgroup object */ command *find_command(char *); /* finds a command object */ service *find_service(char *, char *); /* finds a service object */ /**** Object Traversal Functions ****/ hostescalation *get_first_hostescalation_by_host(char *, void **); hostescalation *get_next_hostescalation_by_host(char *, void **); serviceescalation *get_first_serviceescalation_by_service(char *, char *, void **); serviceescalation *get_next_serviceescalation_by_service(char *, char *, void **); hostdependency *get_first_hostdependency_by_dependent_host(char *, void **); hostdependency *get_next_hostdependency_by_dependent_host(char *, void **); servicedependency *get_first_servicedependency_by_dependent_service(char *, char *, void **); servicedependency *get_next_servicedependency_by_dependent_service(char *, char *, void **); #ifdef NSCORE int add_object_to_objectlist(objectlist **, void *); int free_objectlist(objectlist **); #endif /**** Object Query Functions ****/ int is_host_immediate_child_of_host(host *, host *); /* checks if a host is an immediate child of another host */ int is_host_primary_immediate_child_of_host(host *, host *); /* checks if a host is an immediate child (and primary child) of another host */ int is_host_immediate_parent_of_host(host *, host *); /* checks if a host is an immediate child of another host */ int is_host_member_of_hostgroup(hostgroup *, host *); /* tests whether or not a host is a member of a specific hostgroup */ int is_host_member_of_servicegroup(servicegroup *, host *); /* tests whether or not a service is a member of a specific servicegroup */ int is_service_member_of_servicegroup(servicegroup *, service *); /* tests whether or not a service is a member of a specific servicegroup */ int is_contact_member_of_contactgroup(contactgroup *, contact *); /* tests whether or not a contact is a member of a specific contact group */ int is_contact_for_host(host *, contact *); /* tests whether or not a contact is a contact member for a specific host */ int is_escalated_contact_for_host(host *, contact *); /* checks whether or not a contact is an escalated contact for a specific host */ int is_contact_for_service(service *, contact *); /* tests whether or not a contact is a contact member for a specific service */ int is_escalated_contact_for_service(service *, contact *); /* checks whether or not a contact is an escalated contact for a specific service */ int is_host_immediate_parent_of_host(host *, host *); /* tests whether or not a host is an immediate parent of another host */ int number_of_immediate_child_hosts(host *); /* counts the number of immediate child hosts for a particular host */ int number_of_total_child_hosts(host *); /* counts the number of total child hosts for a particular host */ int number_of_immediate_parent_hosts(host *); /* counts the number of immediate parents hosts for a particular host */ int number_of_total_parent_hosts(host *); /* counts the number of total parents hosts for a particular host */ #ifdef NSCORE int check_for_circular_servicedependency_path(servicedependency *, servicedependency *, int); /* checks if a circular dependency exists for a given service */ int check_for_circular_hostdependency_path(hostdependency *, hostdependency *, int); /* checks if a circular dependency exists for a given host */ #endif /**** Object Cleanup Functions ****/ int free_object_data(void); /* frees all allocated memory for the object definitions */ NAGIOS_END_DECL #endif