/************************************************************************** * * OBJECTJSON.C - Nagios CGI for returning JSON-formatted object data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * 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. *************************************************************************/ /* TODO: Add code to display customvariables Add sort criteria for *list queries Add core3 flag for backward compatible display of flags that were combined into a single variable in core4 Implement internationalized day of week, month names, and formats for timeperiod details Implement raw numbers for day of week, month for timeperiod details */ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include "../include/jsonutils.h" #include "../include/objectjson.h" #define THISCGI "objectjson.cgi" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char *status_file; extern host *host_list; extern hostgroup *hostgroup_list; extern service *service_list; extern servicegroup *servicegroup_list; extern contact *contact_list; extern contactgroup *contactgroup_list; extern timeperiod *timeperiod_list; extern command *command_list; extern servicedependency *servicedependency_list; extern serviceescalation *serviceescalation_list; extern hostdependency *hostdependency_list; extern hostescalation *hostescalation_list; void document_header(int); void document_footer(void); void init_cgi_data(object_json_cgi_data *); int process_cgivars(json_object *, object_json_cgi_data *, time_t); void free_cgi_data(object_json_cgi_data *); int validate_arguments(json_object *, object_json_cgi_data *, time_t); authdata current_authdata; const string_value_mapping valid_queries[] = { { "hostcount", OBJECT_QUERY_HOSTCOUNT, "Return the number of hosts" }, { "hostlist", OBJECT_QUERY_HOSTLIST, "Return a list of hosts" }, { "host", OBJECT_QUERY_HOST, "Return the configuration for a single host" }, { "hostgroupcount", OBJECT_QUERY_HOSTGROUPCOUNT, "Return the number of host groups" }, { "hostgrouplist", OBJECT_QUERY_HOSTGROUPLIST, "Return a list of host groups" }, { "hostgroup", OBJECT_QUERY_HOSTGROUP, "Return the configuration for a single hostgroup" }, { "servicecount", OBJECT_QUERY_SERVICECOUNT, "Return a list of services" }, { "servicelist", OBJECT_QUERY_SERVICELIST, "Return a list of services" }, { "service", OBJECT_QUERY_SERVICE, "Return the configuration for a single service" }, { "servicegroupcount", OBJECT_QUERY_SERVICEGROUPCOUNT, "Return the number of service groups" }, { "servicegrouplist", OBJECT_QUERY_SERVICEGROUPLIST, "Return a list of service groups" }, { "servicegroup", OBJECT_QUERY_SERVICEGROUP, "Return the configuration for a single servicegroup" }, { "contactcount", OBJECT_QUERY_CONTACTCOUNT, "Return the number of contacts" }, { "contactlist", OBJECT_QUERY_CONTACTLIST, "Return a list of contacts" }, { "contact", OBJECT_QUERY_CONTACT, "Return the configuration for a single contact" }, { "contactgroupcount", OBJECT_QUERY_CONTACTGROUPCOUNT, "Return the number of contact groups" }, { "contactgrouplist", OBJECT_QUERY_CONTACTGROUPLIST, "Return a list of contact groups" }, { "contactgroup", OBJECT_QUERY_CONTACTGROUP, "Return the configuration for a single contactgroup" }, { "timeperiodcount", OBJECT_QUERY_TIMEPERIODCOUNT, "Return the number of time periods" }, { "timeperiodlist", OBJECT_QUERY_TIMEPERIODLIST, "Return a list of time periods" }, { "timeperiod", OBJECT_QUERY_TIMEPERIOD, "Return the configuration for a single timeperiod" }, { "commandcount", OBJECT_QUERY_COMMANDCOUNT, "Return the number of commands" }, { "commandlist", OBJECT_QUERY_COMMANDLIST, "Return a list of commands" }, { "command", OBJECT_QUERY_COMMAND, "Return the configuration for a single command" }, { "servicedependencycount", OBJECT_QUERY_SERVICEDEPENDENCYCOUNT, "Return the number of service dependencies" }, { "servicedependencylist", OBJECT_QUERY_SERVICEDEPENDENCYLIST, "Return a list of service dependencies" }, { "serviceescalationcount", OBJECT_QUERY_SERVICEESCALATIONCOUNT, "Return the number of service escalations" }, { "serviceescalationlist", OBJECT_QUERY_SERVICEESCALATIONLIST, "Return a list of service escalations" }, { "hostdependencycount", OBJECT_QUERY_HOSTDEPENDENCYCOUNT, "Return the number of host dependencies" }, { "hostdependencylist", OBJECT_QUERY_HOSTDEPENDENCYLIST, "Return a list of host dependencies" }, { "hostescalationcount", OBJECT_QUERY_HOSTESCALATIONCOUNT, "Return the number of host escalations" }, { "hostescalationlist", OBJECT_QUERY_HOSTESCALATIONLIST, "Return a list of host escalations" }, { "help", OBJECT_QUERY_HELP, "Display help for this CGI" }, { NULL, -1, NULL }, }; static const int query_status[][2] = { { OBJECT_QUERY_HOSTCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTGROUPCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTGROUPLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTGROUP, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICECOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICELIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICE, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEGROUPCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEGROUPLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEGROUP, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTGROUPCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTGROUPLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTGROUP, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_TIMEPERIODCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_TIMEPERIODLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_TIMEPERIOD, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_COMMANDCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_COMMANDLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_COMMAND, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEDEPENDENCYCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEDEPENDENCYLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEESCALATIONCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEESCALATIONLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTDEPENDENCYCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTDEPENDENCYLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTESCALATIONCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTESCALATIONLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HELP, QUERY_STATUS_RELEASED }, { -1, -1 }, }; option_help object_json_help[] = { { "query", "Query", "enumeration", { "all", NULL }, { NULL }, NULL, "Specifies the type of query to be executed.", valid_queries }, { "formatoptions", "Format Options", "list", { NULL }, { "all", NULL }, NULL, "Specifies the formatting options to be used when displaying the results. Multiple options are allowed and are separated by a plus (+) sign..", svm_format_options }, { "start", "Start", "integer", { NULL }, { "hostlist", "hostgrouplist", "servicelist", "servicegrouplist", "contactlist", "contactgrouplist", "timeperiodlist", "commandlist", "servicedependencylist", "serviceescalationlist", "hostdependencylist", "hostescalationlist", NULL }, NULL, "Specifies the index (zero-based) of the first object in the list to be returned.", NULL }, { "count", "Count", "integer", { NULL }, { "hostlist", "hostgrouplist", "servicelist", "servicegrouplist", "contactlist", "contactgrouplist", "timeperiodlist", "commandlist", "servicedependencylist", "serviceescalationlist", "hostdependencylist", "hostescalationlist", NULL }, NULL, "Specifies the number of objects in the list to be returned.", NULL }, { "dateformat", "Date Format", "string", { NULL }, { "all", NULL }, NULL, "strftime format string for values of type time_t. In the absence of a format, the Javascript default format of the number of milliseconds since the beginning of the Unix epoch is used. Because of URL encoding, percent signs must be encoded as %25 and a space must be encoded as a plus (+) sign.", NULL }, { "parenthost", "Parent Host", "nagios:objectjson/hostlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits the hosts or services returned to those whose host parent is specified. A value of 'none' returns all hosts or services reachable directly by the Nagios core host.", parent_host_extras }, { "childhost", "Child Host", "nagios:objectjson/hostlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits the hosts or services returned to those whose having the host specified as a child host. A value of 'none' returns all hosts or services with no child hosts.", child_host_extras }, { "details", "Show Details", "boolean", { NULL }, { "hostlist", "hostgrouplist", "servicelist", "servicegrouplist", "contactlist", "contactgrouplist", "timeperiodlist", "commandlist", NULL }, NULL, "If true, return the details for all entities in the list.", NULL }, { "hostname", "Host Name", "nagios:objectjson/hostlist", { "host", "service", NULL }, { "servicecount", "servicelist", "hostescalationlist", "serviceescalationlist", NULL }, NULL, "Name for the host requested.", NULL }, { "hostgroupmember", "Host Group Member", "nagios:objectjson/hostlist", { NULL }, { "hostgroupcount", "hostgrouplist", NULL }, NULL, "Limits the hostgroups returned to those containing the hostgroupmember.", NULL }, { "hostgroup", "Host Group", "nagios:objectjson/hostgrouplist", { "hostgroup", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "hostescalationcount", "hostescalationlist", "serviceescalationcount", "serviceescalationlist", NULL }, NULL, "Returns information applicable to the hostgroup or the hosts in the hostgroup depending on the query.", NULL }, { "servicegroup", "Service Group", "nagios:objectjson/servicegrouplist", { "servicegroup", NULL }, { "servicecount", "servicelist", "serviceescalationcount", "serviceescalationlist", NULL }, NULL, "Returns information applicable to the servicegroup or the services in the servicegroup depending on the query.", NULL }, { "parentservice", "Parent Service", "nagios:objectjson/servicelist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Limits the services returned to those whose service parent has the name specified. A value of 'none' returns all services with no service parent.", parent_service_extras }, { "childservice", "Child Service", "nagios:objectjson/servicelist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Limits the services returned to those whose having the named service as a child service. A value of 'none' returns all services with no child services.", child_service_extras }, { "contactgroup", "Contact Group", "nagios:objectjson/contactgrouplist", { "contactgroup", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "contactcount", "contactlist", "serviceescalationcount", "serviceescalationlist", "hostescalationcount", "hostescalationlist", NULL }, NULL, "Returns information applicable to the contactgroup or the contacts in the contactgroup depending on the query.", NULL }, { "servicedescription", "Service Description", "nagios:objectjson/servicelist", { "service", NULL }, { "servicecount", "servicelist", "serviceescalationcount", "serviceescalationlist", NULL }, "hostname", "Description for the service requested.", NULL }, { "servicegroupmemberhost", "Service Group Member Host", "nagios:objectjson/hostlist", { NULL }, { "servicegroupcount", "servicegrouplist", NULL }, NULL, "Limits the servicegroups returned to those containing the servicegroupmemberhost (and servicegroupmemberservice).", NULL }, { "servicegroupmemberservice", "Service Group Member Service", "nagios:objectjson/servicelist", { NULL }, { "servicegroupcount", "servicegrouplist", NULL }, "servicegroupmemberhost", "Limits the servicegroups returned to those containing the servicegroupmemberservice (and servicegroupmemberhost).", NULL }, { "contactname", "Contact Name", "nagios:objectjson/contactlist", { "contact", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "serviceescalationcount", "serviceescalationlist", "hostescalationcount", "hostescalationlist", NULL }, NULL, "Name for the contact requested.", NULL }, { "contactgroupmember", "Contact Group Member", "nagios:objectjson/contactlist", { NULL }, { "contactgroupcount", "contactgrouplist", NULL }, NULL, "Limits the contactgroups returned to those containing the contactgroupmember.", NULL }, { "timeperiod", "Timeperiod Name", "nagios:objectjson/timeperiodlist", { "timeperiod", NULL }, { NULL }, NULL, "Name for the timeperiod requested.", NULL }, { "checktimeperiod", "Check Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "hostcount","hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of a check timeperiod to be used as selection criteria.", NULL }, { "hostnotificationtimeperiod", "Host Notification Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "hostcount","hostlist", "contactcount", "contactlist", NULL }, NULL, "Name of a host notification timeperiod to be used as selection criteria.", NULL }, { "servicenotificationtimeperiod", "Service Notification Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "servicecount", "servicelist", "contactcount", "contactlist", NULL }, NULL, "Name of a service notification timeperiod to be used as selection criteria.", NULL }, { "command", "Command Name", "nagios:objectjson/commandlist", { "command", NULL }, { NULL }, NULL, "Name for the command requested.", NULL }, { "checkcommand", "Check Command Name", "nagios:objectjson/commandlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of a check command to be be used as a selector.", NULL }, { "eventhandler", "Event Handler Name", "nagios:objectjson/commandlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of an event handler to be be used as a selector.", NULL }, { "masterhostname", "Master Host Name", "nagios:objectjson/hostlist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a master host to be used as a selector.", NULL }, { "masterhostgroupname", "Master Hostgroup Name", "nagios:objectjson/hostgrouplist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a master hostgroup to be used as a selector.", NULL }, { "masterservicedescription", "Master Service Description", "nagios:objectjson/servicelist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, "masterhostname", "Description for a master service to be used as a selector.", NULL }, { "masterservicegroupname", "Master Servicegroup Name", "nagios:objectjson/servicegrouplist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a master servicegroup to be used as a selector.", NULL }, { "dependenthostname", "Dependent Host Name", "nagios:objectjson/hostlist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a dependent host to be used as a selector.", NULL }, { "dependenthostgroupname", "Dependent Hostgroup Name", "nagios:objectjson/hostgrouplist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a dependent hostgroup to be used as a selector.", NULL }, { "dependentservicedescription", "Dependent Service Description", "nagios:objectjson/servicelist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, "dependenthostname", "Description for a dependent service to be used as a selector.", NULL }, { "dependentservicegroupname", "Dependent Servicegroup Name", "nagios:objectjson/servicegrouplist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a dependent servicegroup to be used as a selector.", NULL }, { /* The last entry must contain all NULL entries */ NULL, NULL, NULL, { NULL }, { NULL }, NULL, NULL, NULL }, }; extern const json_escape percent_escapes; int json_object_host_passes_selection(host *, int, host *, int, host *, hostgroup *, contact *, contactgroup *, timeperiod *, timeperiod *, command *, command *); json_object *json_object_host_selectors(int, int, int, host *, int, host *, hostgroup *, contact *, contactgroup *, timeperiod *, timeperiod *, command *, command *); int json_object_hostgroup_passes_selection(hostgroup *, host *); json_object *json_object_hostgroup_selectors(int, int, host *); int json_object_service_passes_host_selection(host *, int, host *, int, host *, hostgroup *, host *); int json_object_service_passes_service_selection(service *, servicegroup *, contact *, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); json_object *json_object_service_selectors(int, int, int, host *, int, host *, hostgroup *, host *, servicegroup *, contact *, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); int json_object_servicegroup_passes_selection(servicegroup *, service *); json_object *json_object_servicegroup_display_selectors(int, int, service *); int json_object_contact_passes_selection(contact *, contactgroup *, timeperiod *, timeperiod *); json_object *json_object_contact_selectors(int, int, contactgroup *, timeperiod *, timeperiod *); int json_object_contactgroup_passes_selection(contactgroup *, contact *); json_object *json_object_contactgroup_display_selectors(int, int, contact *); json_object *json_object_timeperiod_selectors(int, int); json_object *json_object_command_selectors(int, int); int json_object_servicedependency_passes_selection(servicedependency *, host *, hostgroup *, char *, servicegroup *, host *, hostgroup *, char *, servicegroup *); json_object *json_object_servicedependency_selectors(int, int, host *, hostgroup *, char *, servicegroup *, host *, hostgroup *, char *, servicegroup *); int json_object_serviceescalation_passes_selection(serviceescalation *, host *, char *, hostgroup *, servicegroup *, contact *, contactgroup *); json_object *json_object_serviceescalation_selectors(int, int, host *, char *, hostgroup *, servicegroup *, contact *, contactgroup *); int json_object_hostdependency_passes_selection(hostdependency *, host *, hostgroup *, host *, hostgroup *); json_object *json_object_hostdependency_selectors(int, int, host *, hostgroup *, host *, hostgroup *); int json_object_hostescalation_passes_selection(hostescalation *, host *, hostgroup *, contact *, contactgroup *); json_object *json_object_hostescalation_selectors(int, int, host *, hostgroup *, contact *, contactgroup *); int main(void) { int result = OK; time_t query_time; object_json_cgi_data cgi_data; json_object *json_root; struct stat ocstat; time_t last_object_cache_update = (time_t)0; /* The official time of the query */ time(&query_time); json_root = json_new_object(); if(NULL == json_root) { printf( "Failed to create new json object\n"); exit( 1); } json_object_append_integer(json_root, "format_version", OUTPUT_FORMAT_VERSION); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); init_cgi_data(&cgi_data); document_header(cgi_data.format_options & JSON_FORMAT_WHITESPACE); /* get the arguments passed in the URL */ result = process_cgivars(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(object_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return result; } /* reset internal variables */ reset_cgi_vars(); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location(), NULL); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open CGI configuration file '%s' for reading!", get_cgi_config_location())); json_object_append_object(json_root, "data", json_help(object_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open main configuration file '%s' for reading!", main_config_file)); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read some or all object configuration data!")); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } /* Get the update time on the object cache file */ if(stat(object_cache_file, &ocstat) < 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not obtain object cache file status: %s!", strerror(errno))); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } last_object_cache_update = ocstat.st_mtime; /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read host and service status information!")); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } /* validate arguments in URL */ result = validate_arguments(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(object_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* get authentication information */ get_authentication_information(¤t_authdata); /* For most locales, floats get output with a comma instead of a * decimal point, which messes up the JSON data structure. */ setlocale(LC_NUMERIC, "C"); /* Return something to the user */ switch( cgi_data.query) { case OBJECT_QUERY_HOSTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostcount(cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.host_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_HOSTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.host_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_HOST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_host(cgi_data.format_options, cgi_data.host)); break; case OBJECT_QUERY_HOSTGROUPCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostgroupcount(cgi_data.format_options, cgi_data.hostgroup_member)); break; case OBJECT_QUERY_HOSTGROUPLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostgrouplist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.hostgroup_member)); break; case OBJECT_QUERY_HOSTGROUP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostgroup(cgi_data.format_options, cgi_data.hostgroup)); break; case OBJECT_QUERY_SERVICECOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicecount(cgi_data.host, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.service_description, cgi_data.parent_service_name, cgi_data.child_service_name, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.service_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_SERVICELIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicelist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.host, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.service_description, cgi_data.parent_service_name, cgi_data.child_service_name, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.service_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_SERVICE: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_service(cgi_data.format_options, cgi_data.service)); break; case OBJECT_QUERY_SERVICEGROUPCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicegroupcount(cgi_data.servicegroup_member)); break; case OBJECT_QUERY_SERVICEGROUPLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicegrouplist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.servicegroup_member)); break; case OBJECT_QUERY_SERVICEGROUP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicegroup(cgi_data.format_options, cgi_data.servicegroup)); break; case OBJECT_QUERY_CONTACTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactcount(cgi_data.contactgroup, cgi_data.host_notification_timeperiod, cgi_data.service_notification_timeperiod)); break; case OBJECT_QUERY_CONTACTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.contactgroup, cgi_data.host_notification_timeperiod, cgi_data.service_notification_timeperiod)); break; case OBJECT_QUERY_CONTACT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contact(cgi_data.format_options, cgi_data.contact)); break; case OBJECT_QUERY_CONTACTGROUPCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactgroupcount(cgi_data.contactgroup_member)); break; case OBJECT_QUERY_CONTACTGROUPLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactgrouplist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.contactgroup_member)); break; case OBJECT_QUERY_CONTACTGROUP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactgroup(cgi_data.format_options, cgi_data.contactgroup)); break; case OBJECT_QUERY_TIMEPERIODCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_timeperiodcount()); break; case OBJECT_QUERY_TIMEPERIODLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_timeperiodlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details)); break; case OBJECT_QUERY_TIMEPERIOD: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_timeperiod(cgi_data.format_options, cgi_data.timeperiod)); break; case OBJECT_QUERY_COMMANDCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_commandcount()); break; case OBJECT_QUERY_COMMANDLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_commandlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details)); break; case OBJECT_QUERY_COMMAND: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_command(cgi_data.format_options, cgi_data.command)); break; case OBJECT_QUERY_SERVICEDEPENDENCYCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicedependencycount(cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.master_service_description, cgi_data.master_servicegroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup, cgi_data.dependent_service_description, cgi_data.dependent_servicegroup)); break; case OBJECT_QUERY_SERVICEDEPENDENCYLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicedependencylist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.master_service_description, cgi_data.master_servicegroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup, cgi_data.dependent_service_description, cgi_data.dependent_servicegroup)); break; case OBJECT_QUERY_SERVICEESCALATIONCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_serviceescalationcount(cgi_data.host, cgi_data.service_description, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_SERVICEESCALATIONLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_serviceescalationlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.host, cgi_data.service_description, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_HOSTDEPENDENCYCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostdependencycount(cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup)); break; case OBJECT_QUERY_HOSTDEPENDENCYLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostdependencylist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup)); break; case OBJECT_QUERY_HOSTESCALATIONCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostescalationcount(cgi_data.host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_HOSTESCALATIONLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostescalationlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_HELP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), compile_time(__DATE__, __TIME__), ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_help(object_json_help)); break; default: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_OPTION_MISSING, "Error: Object Type not specified. See data for help.")); json_object_append_object(json_root, "data", json_help(object_json_help)); break; } json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); /* free all allocated memory */ free_cgi_data( &cgi_data); json_free_object(json_root, 1); free_memory(); return OK; } void document_header(int whitespace) { char date_time[MAX_DATETIME_LENGTH]; time_t expire_time; time_t current_time; time(¤t_time); printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: application/json; charset=utf-8\r\n\r\n"); return; } void document_footer(void) { printf( "\n"); return; } void init_cgi_data(object_json_cgi_data *cgi_data) { cgi_data->format_options = 0; cgi_data->query = OBJECT_QUERY_INVALID; cgi_data->start = 0; cgi_data->count = 0; cgi_data->details = 0; cgi_data->strftime_format = NULL; cgi_data->parent_host_name = NULL; cgi_data->use_parent_host = 0; cgi_data->parent_host = NULL; cgi_data->child_host_name = NULL; cgi_data->use_child_host = 0; cgi_data->child_host = NULL; cgi_data->host_name = NULL; cgi_data->host = NULL; cgi_data->hostgroup_member_name = NULL; cgi_data->hostgroup_member = NULL; cgi_data->hostgroup_name = NULL; cgi_data->hostgroup = NULL; cgi_data->servicegroup_name = NULL; cgi_data->servicegroup = NULL; cgi_data->service_description = NULL; cgi_data->service = NULL; cgi_data->servicegroup_member_host_name = NULL; cgi_data->servicegroup_member_service_description = NULL; cgi_data->servicegroup_member = NULL; cgi_data->parent_service_name = NULL; cgi_data->child_service_name = NULL; cgi_data->contactgroup_name = NULL; cgi_data->contactgroup = NULL; cgi_data->contact_name = NULL; cgi_data->contact = NULL; cgi_data->contactgroup_member_name = NULL; cgi_data->contactgroup_member = NULL; cgi_data->timeperiod_name = NULL; cgi_data->timeperiod = NULL; cgi_data->check_timeperiod_name = NULL; cgi_data->check_timeperiod = NULL; cgi_data->host_notification_timeperiod_name = NULL; cgi_data->host_notification_timeperiod = NULL; cgi_data->service_notification_timeperiod_name = NULL; cgi_data->service_notification_timeperiod = NULL; cgi_data->command_name = NULL; cgi_data->command = NULL; cgi_data->check_command_name = NULL; cgi_data->check_command = NULL; cgi_data->event_handler_name = NULL; cgi_data->event_handler = NULL; cgi_data->master_host_name = NULL; cgi_data->master_host = NULL; cgi_data->master_hostgroup_name = NULL; cgi_data->master_hostgroup = NULL; cgi_data->master_service_description = NULL; cgi_data->master_service = NULL; cgi_data->master_servicegroup_name = NULL; cgi_data->master_servicegroup = NULL; cgi_data->dependent_host_name = NULL; cgi_data->dependent_host = NULL; cgi_data->dependent_hostgroup_name = NULL; cgi_data->dependent_hostgroup = NULL; cgi_data->dependent_service_description = NULL; cgi_data->dependent_service = NULL; cgi_data->dependent_servicegroup_name = NULL; cgi_data->dependent_servicegroup = NULL; } void free_cgi_data( object_json_cgi_data *cgi_data) { if( NULL != cgi_data->strftime_format) free( cgi_data->strftime_format); if( NULL != cgi_data->parent_host_name) free( cgi_data->parent_host_name); if( NULL != cgi_data->child_host_name) free( cgi_data->child_host_name); if( NULL != cgi_data->host_name) free( cgi_data->host_name); if( NULL != cgi_data->hostgroup_member_name) free( cgi_data->hostgroup_member_name); if( NULL != cgi_data->hostgroup_name) free( cgi_data->hostgroup_name); if( NULL != cgi_data->servicegroup_name) free(cgi_data->servicegroup_name); if( NULL != cgi_data->service_description) free(cgi_data->service_description); if( NULL != cgi_data->servicegroup_member_host_name) free(cgi_data->servicegroup_member_host_name); if( NULL != cgi_data->servicegroup_member_service_description) free(cgi_data->servicegroup_member_service_description); if( NULL != cgi_data->parent_service_name) free( cgi_data->parent_service_name); if( NULL != cgi_data->child_service_name) free( cgi_data->child_service_name); if( NULL != cgi_data->contactgroup_name) free(cgi_data->contactgroup_name); if( NULL != cgi_data->contact_name) free(cgi_data->contact_name); if( NULL != cgi_data->contactgroup_member_name) free(cgi_data->contactgroup_member_name); if( NULL != cgi_data->timeperiod_name) free(cgi_data->timeperiod_name); if( NULL != cgi_data->check_timeperiod_name) free(cgi_data->check_timeperiod_name); if( NULL != cgi_data->host_notification_timeperiod_name) free(cgi_data->host_notification_timeperiod_name); if( NULL != cgi_data->service_notification_timeperiod_name) free(cgi_data->service_notification_timeperiod_name); if( NULL != cgi_data->command_name) free(cgi_data->command_name); if( NULL != cgi_data->check_command_name) free(cgi_data->check_command_name); if( NULL != cgi_data->event_handler_name) free(cgi_data->event_handler_name); if( NULL != cgi_data->master_host_name) free(cgi_data->master_host_name); if( NULL != cgi_data->master_hostgroup_name) free(cgi_data->master_hostgroup_name); if( NULL != cgi_data->master_service_description) free(cgi_data->master_service_description); if( NULL != cgi_data->master_servicegroup_name) free(cgi_data->master_servicegroup_name); if( NULL != cgi_data->dependent_host_name) free(cgi_data->dependent_host_name); if( NULL != cgi_data->dependent_hostgroup_name) free(cgi_data->dependent_hostgroup_name); if( NULL != cgi_data->dependent_service_description) free(cgi_data->dependent_service_description); if( NULL != cgi_data->dependent_servicegroup_name) free(cgi_data->dependent_servicegroup_name); } int process_cgivars(json_object *json_root, object_json_cgi_data *cgi_data, time_t query_time) { char **variables; int result = RESULT_SUCCESS; int x; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ variables = getcgivars(); for(x = 0; variables[x]; x++) { /* We set these each iteration because they could change with each iteration */ if(!strcmp(variables[x], "query")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_queries, &(cgi_data->query))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "formatoptions")) { cgi_data->format_options = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_format_options, &(cgi_data->format_options))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "start")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->start))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "count")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->count))) != RESULT_SUCCESS) { break; } if(cgi_data->count == 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "The count option value is invalid. " "It must be an integer greater than zero")); result = RESULT_OPTION_VALUE_INVALID; break; } x++; } else if(!strcmp(variables[x], "parenthost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childhost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostgroupmember")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->hostgroup_member_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "parentservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_service_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_service_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contactgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroupmemberhost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_member_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroupmemberservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_member_service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contact_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactgroupmember")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contactgroup_member_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "timeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "checktimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->check_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostnotificationtimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_notification_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicenotificationtimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_notification_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "command")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->command_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "checkcommand")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->check_command_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "eventhandler")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->event_handler_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterhostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterhostgroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterservicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterservicegroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependenthostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependenthostgroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependentservicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependentservicegroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "details")) { if((result = parse_boolean_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->details))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dateformat")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->strftime_format))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "NagFormId")) ++x; else if(!strcmp(variables[x], "")); else { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_INVALID, "Invalid option: '%s'.", variables[x])); result = RESULT_OPTION_INVALID; break; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return result; } int validate_arguments(json_object *json_root, object_json_cgi_data *cgi_data, time_t query_time) { int result = RESULT_SUCCESS; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; service *temp_service = NULL; contactgroup *temp_contactgroup = NULL; contact *temp_contact = NULL; timeperiod *temp_timeperiod = NULL; command *temp_command = NULL; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ /* Validate that required parameters were supplied */ switch(cgi_data->query) { case OBJECT_QUERY_HOSTCOUNT: break; case OBJECT_QUERY_HOSTLIST: break; case OBJECT_QUERY_HOST: if( NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Host information requested, but no host name specified.")); } break; case OBJECT_QUERY_HOSTGROUPCOUNT: break; case OBJECT_QUERY_HOSTGROUPLIST: break; case OBJECT_QUERY_HOSTGROUP: if( NULL == cgi_data->hostgroup_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Hostgroup information requested, but no hostgroup name specified.")); } break; case OBJECT_QUERY_SERVICECOUNT: break; case OBJECT_QUERY_SERVICELIST: break; case OBJECT_QUERY_SERVICE: if( NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service information requested, but no host name specified.")); } if( NULL == cgi_data->service_description) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service information requested, but no service description specified.")); } break; case OBJECT_QUERY_SERVICEGROUPCOUNT: break; case OBJECT_QUERY_SERVICEGROUPLIST: break; case OBJECT_QUERY_SERVICEGROUP: if( NULL == cgi_data->servicegroup_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service group information requested, but no service group name specified.")); } break; case OBJECT_QUERY_CONTACTCOUNT: break; case OBJECT_QUERY_CONTACTLIST: break; case OBJECT_QUERY_CONTACT: if( NULL == cgi_data->contact_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Contact information requested, but no contact name specified.")); } break; case OBJECT_QUERY_CONTACTGROUPCOUNT: break; case OBJECT_QUERY_CONTACTGROUPLIST: break; case OBJECT_QUERY_CONTACTGROUP: if( NULL == cgi_data->contactgroup_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Contactgroup information requested, but no contactgroup name specified.")); } break; case OBJECT_QUERY_TIMEPERIODCOUNT: break; case OBJECT_QUERY_TIMEPERIODLIST: break; case OBJECT_QUERY_TIMEPERIOD: if( NULL == cgi_data->timeperiod_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Timeperiod information requested, but no timeperiod name specified.")); } break; case OBJECT_QUERY_COMMANDCOUNT: break; case OBJECT_QUERY_COMMANDLIST: break; case OBJECT_QUERY_COMMAND: if( NULL == cgi_data->command_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Command information requested, but no command name specified.")); } break; case OBJECT_QUERY_SERVICEDEPENDENCYCOUNT: break; case OBJECT_QUERY_SERVICEDEPENDENCYLIST: break; case OBJECT_QUERY_SERVICEESCALATIONCOUNT: break; case OBJECT_QUERY_SERVICEESCALATIONLIST: break; case OBJECT_QUERY_HOSTDEPENDENCYCOUNT: break; case OBJECT_QUERY_HOSTDEPENDENCYLIST: break; case OBJECT_QUERY_HOSTESCALATIONCOUNT: break; case OBJECT_QUERY_HOSTESCALATIONLIST: break; case OBJECT_QUERY_HELP: break; default: result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Missing validation for object type %u.", cgi_data->query)); break; } /* Validate the requested parent host */ if( NULL != cgi_data->parent_host_name) { cgi_data->use_parent_host = 1; cgi_data->parent_host = NULL; if(strcmp(cgi_data->parent_host_name, "none")) { temp_host = find_host(cgi_data->parent_host_name); if( NULL == temp_host) { cgi_data->use_parent_host = 0; result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The parenthost '%s' could not be found.", cgi_data->parent_host_name)); } else { cgi_data->parent_host = temp_host; } } } /* Validate the requested child host */ if( NULL != cgi_data->child_host_name) { cgi_data->use_child_host = 1; cgi_data->child_host = NULL; if(strcmp(cgi_data->child_host_name, "none")) { temp_host = find_host(cgi_data->child_host_name); if( NULL == temp_host) { cgi_data->use_child_host = 0; result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The childhost '%s' could not be found.", cgi_data->child_host_name)); } else { cgi_data->child_host = temp_host; } } } /* Validate the requested host */ if( NULL != cgi_data->host_name) { temp_host = find_host(cgi_data->host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The host '%s' could not be found.", cgi_data->host_name)); } else { cgi_data->host = temp_host; } } /* Validate the requested hostgroup member */ if( NULL != cgi_data->hostgroup_member_name) { temp_host = find_host(cgi_data->hostgroup_member_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The hostgroup member '%s' could not be found.", cgi_data->hostgroup_member_name)); } else { cgi_data->hostgroup_member = temp_host; } } /* Validate the requested hostgroup */ if( NULL != cgi_data->hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The hostgroup '%s' could not be found.", cgi_data->hostgroup_name)); } else { cgi_data->hostgroup = temp_hostgroup; } } /* Validate the requested servicegroup */ if( NULL != cgi_data->servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The servicegroup '%s' could not be found.", cgi_data->servicegroup_name)); } else { cgi_data->servicegroup = temp_servicegroup; } } /* Validate the requested contactgroup */ if( NULL != cgi_data->contactgroup_name) { temp_contactgroup = find_contactgroup(cgi_data->contactgroup_name); if( NULL == temp_contactgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contactgroup '%s' could not be found.", cgi_data->contactgroup_name)); } else { cgi_data->contactgroup = temp_contactgroup; } } /* Validate the requested service. Note that the host name is not a required parameter for all queries and so it may not make sense to try to obtain the service associated with a service description */ if((NULL != cgi_data->service_description) && (NULL != cgi_data->host_name)) { temp_service = find_service(cgi_data->host_name, cgi_data->service_description); if( NULL == temp_service) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The service '%s' on host '%s' could not be found.", cgi_data->service_description, cgi_data->host_name)); } else { cgi_data->service = temp_service; } } /* Validate the requested servicegroup member host name and service description */ if( NULL != cgi_data->servicegroup_member_host_name || NULL != cgi_data->servicegroup_member_service_description) { if( NULL == cgi_data->servicegroup_member_host_name || NULL == cgi_data->servicegroup_member_service_description) { result = RESULT_OPTION_VALUE_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "If either the servicegroupmemberhost or servicegroupmemberservice is specified, both must be specified.")); } else { temp_service = find_service( cgi_data->servicegroup_member_host_name, cgi_data->servicegroup_member_service_description); if( NULL == temp_service) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The servicegroup member service '%s' on host '%s' could not be found.", cgi_data->servicegroup_member_service_description, cgi_data->servicegroup_member_host_name)); } else { cgi_data->servicegroup_member = temp_service; } } } /* Validate the requested contact */ if( NULL != cgi_data->contact_name) { temp_contact = find_contact(cgi_data->contact_name); if( NULL == temp_contact) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contact '%s' could not be found.", cgi_data->contact_name)); } else { cgi_data->contact = temp_contact; } } /* Validate the requested contactgroup member */ if( NULL != cgi_data->contactgroup_member_name) { temp_contact = find_contact(cgi_data->contactgroup_member_name); if( NULL == temp_contact) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contactgroup member '%s' could not be found.", cgi_data->contactgroup_member_name)); } else { cgi_data->contactgroup_member = temp_contact; } } /* Validate the requested timeperiod */ if( NULL != cgi_data->timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The timeperiod '%s' could not be found.", cgi_data->timeperiod_name)); } else { cgi_data->timeperiod = temp_timeperiod; } } /* Validate the requested check timeperiod */ if( NULL != cgi_data->check_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->check_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The check timeperiod '%s' could not be found.", cgi_data->check_timeperiod_name)); } else { cgi_data->check_timeperiod = temp_timeperiod; } } /* Validate the requested host notification timeperiod */ if( NULL != cgi_data->host_notification_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->host_notification_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The host notification timeperiod '%s' could not be found.", cgi_data->host_notification_timeperiod_name)); } else { cgi_data->host_notification_timeperiod = temp_timeperiod; } } /* Validate the requested service notification timeperiod */ if( NULL != cgi_data->service_notification_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->service_notification_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The service notification timeperiod '%s' could not be found.", cgi_data->service_notification_timeperiod_name)); } else { cgi_data->service_notification_timeperiod = temp_timeperiod; } } /* Validate the requested command */ if( NULL != cgi_data->command_name) { temp_command = find_command(cgi_data->command_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The command '%s' could not be found.", cgi_data->command_name)); } else { cgi_data->command = temp_command; } } /* Validate the requested check command */ if( NULL != cgi_data->check_command_name) { temp_command = find_command(cgi_data->check_command_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The check command '%s' could not be found.", cgi_data->check_command_name)); } else { cgi_data->check_command = temp_command; } } /* Validate the requested event handler */ if( NULL != cgi_data->event_handler_name) { temp_command = find_command(cgi_data->event_handler_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The event handler '%s' could not be found.", cgi_data->event_handler_name)); } else { cgi_data->event_handler = temp_command; } } /* Validate the requested master host */ if( NULL != cgi_data->master_host_name) { temp_host = find_host(cgi_data->master_host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The master host '%s' could not be found.", cgi_data->master_host_name)); } else { cgi_data->master_host = temp_host; } } /* Validate the requested master hostgroup */ if( NULL != cgi_data->master_hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->master_hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The master hostgroup '%s' could not be found.", cgi_data->master_hostgroup_name)); } else { cgi_data->master_hostgroup = temp_hostgroup; } } /* Validate the requested master servicegroup */ if( NULL != cgi_data->master_servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->master_servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The master servicegroup '%s' could not be found.", cgi_data->master_servicegroup_name)); } else { cgi_data->master_servicegroup = temp_servicegroup; } } /* Validate the requested dependent host */ if( NULL != cgi_data->dependent_host_name) { temp_host = find_host(cgi_data->dependent_host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The dependent host '%s' could not be found.", cgi_data->dependent_host_name)); } else { cgi_data->dependent_host = temp_host; } } /* Validate the requested dependent hostgroup */ if( NULL != cgi_data->dependent_hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->dependent_hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The dependent hostgroup '%s' could not be found.", cgi_data->dependent_hostgroup_name)); } else { cgi_data->dependent_hostgroup = temp_hostgroup; } } /* Validate the requested dependent servicegroup */ if( NULL != cgi_data->dependent_servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->dependent_servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The dependent servicegroup '%s' could not be found.", cgi_data->dependent_servicegroup_name)); } else { cgi_data->dependent_servicegroup = temp_servicegroup; } } return result; } json_object * json_object_custom_variables(struct customvariablesmember *custom_variables) { json_object *json_custom_variables; customvariablesmember *temp_custom_variablesmember; json_custom_variables = json_new_object(); for(temp_custom_variablesmember = custom_variables; temp_custom_variablesmember != NULL; temp_custom_variablesmember = temp_custom_variablesmember->next) { json_object_append_string(json_custom_variables, temp_custom_variablesmember->variable_name, &percent_escapes, temp_custom_variablesmember->variable_value); } return json_custom_variables; } int json_object_host_passes_selection(host *temp_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { host *temp_host2; /* Skip if user is not authorized for this host */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { return 0; } /* If the host parent was specified, skip this host if it's parent is not the parent host specified */ if( 1 == use_parent_host && FALSE == is_host_immediate_child_of_host(parent_host, temp_host)) { return 0; } /* If the hostgroup was specified, skip this host if it is not a member of the hostgroup specified */ if( NULL != temp_hostgroup && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_host))) { return 0; } /* If the contact was specified, skip this host if it does not have the contact specified */ if( NULL != temp_contact && ( FALSE == is_contact_for_host(temp_host, temp_contact))) { return 0; } /* If a contactgroup was specified, skip this host if it does not have the contactgroup specified */ if(NULL != temp_contactgroup && (FALSE == is_contactgroup_for_host(temp_host, temp_contactgroup))) { return 0; } /* If a check timeperiod was specified, skip this host if it does not have the check timeperiod specified */ if(NULL != check_timeperiod && (check_timeperiod != temp_host->check_period_ptr)) { return 0; } /* If a notification timeperiod was specified, skip this host if it does not have the notification timeperiod specified */ if(NULL != notification_timeperiod && (notification_timeperiod != temp_host->notification_period_ptr)) { return 0; } /* If a check command was specified, skip this host if it does not have the check command specified */ if(NULL != check_command && (check_command != temp_host->check_command_ptr)) { return 0; } /* If an event handler was specified, skip this host if it does not have the event handler specified */ if(NULL != event_handler && (event_handler != temp_host->event_handler_ptr)) { return 0; } /* If a child host was specified... */ if(1 == use_child_host) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } return 1; } json_object * json_object_host_selectors(int start, int count, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( 1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if( NULL != temp_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, temp_hostgroup->group_name); } if( NULL != temp_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, temp_contact->name); } if( NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if( NULL != check_timeperiod) { json_object_append_string(json_selectors, "checktimeperiod", &percent_escapes, check_timeperiod->name); } if( NULL != notification_timeperiod) { json_object_append_string(json_selectors, "hostnotificationtimeperiod", &percent_escapes, notification_timeperiod->name); } if( NULL != check_command) { json_object_append_string(json_selectors, "checkcommand", &percent_escapes, check_command->name); } if( NULL != event_handler) { json_object_append_string(json_selectors, "eventhandler", &percent_escapes, event_handler->name); } return json_selectors; } json_object * json_object_hostcount(int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; host *temp_host; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_host_selectors(0, 0, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_object_host_passes_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object * json_object_hostlist(unsigned format_options, int start, int count, int details, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_hostlist_object = NULL; json_array *json_hostlist_array = NULL; json_object *json_host_details; host *temp_host; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_host_selectors(start, count, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); if(details > 0) { json_hostlist_object = json_new_object(); } else { json_hostlist_array = json_new_array(); } for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_object_host_passes_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_host_details = json_new_object(); json_object_host_details(json_host_details, format_options, temp_host); json_object_append_object(json_hostlist_object, temp_host->name, json_host_details); } else { json_array_append_string(json_hostlist_array, &percent_escapes, temp_host->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "hostlist", json_hostlist_object); } else { json_object_append_array(json_data, "hostlist", json_hostlist_array); } return json_data; } json_object *json_object_host(unsigned format_options, host *temp_host) { json_object *json_host = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); json_object_host_details(json_details, format_options, temp_host); json_object_append_object(json_host, "host", json_details); return json_host; } void json_object_host_details(json_object *json_details, unsigned format_options, host *temp_host) { json_array *json_parent_hosts; json_array *json_child_hosts; json_array *json_services; json_array *json_contactgroups; json_array *json_contacts; hostsmember *temp_hostsmember; servicesmember *temp_servicesmember; contactgroupsmember *temp_contact_groupsmember; #ifdef NSCORE contactsmember *temp_contactsmember; #else contact *temp_contact; #endif json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); json_object_append_string(json_details, "display_name", &percent_escapes, temp_host->display_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_host->alias); json_object_append_string(json_details, "address", &percent_escapes, temp_host->address); json_parent_hosts = json_new_array(); for(temp_hostsmember = temp_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { json_array_append_string(json_parent_hosts, &percent_escapes, temp_hostsmember->host_name); } json_object_append_array(json_details, "parent_hosts", json_parent_hosts); json_child_hosts = json_new_array(); for(temp_hostsmember = temp_host->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { json_array_append_string(json_child_hosts, &percent_escapes, temp_hostsmember->host_name); } json_object_append_array(json_details, "child_hosts", json_child_hosts); json_services = json_new_array(); for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { json_array_append_string(json_services, &percent_escapes, temp_servicesmember->service_description); } json_object_append_array(json_details, "services", json_services); #ifdef JSON_NAGIOS_4X json_object_append_string(json_details, "check_command", &percent_escapes, temp_host->check_command); #else json_object_append_string(json_details, "host_check_command", &percent_escapes, temp_host->host_check_command); #endif json_enumeration(json_details, format_options, "initial_state", temp_host->initial_state, svm_host_states); json_object_append_real(json_details, "check_interval", temp_host->check_interval); json_object_append_real(json_details, "retry_interval", temp_host->retry_interval); json_object_append_integer(json_details, "max_attempts", temp_host->max_attempts); json_object_append_string(json_details, "event_handler", &percent_escapes, temp_host->event_handler); json_contactgroups = json_new_array(); for(temp_contact_groupsmember = temp_host->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_array(); #ifdef NSCORE for(temp_contactsmember = temp_host->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } #else for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(TRUE == is_contact_for_host(temp_host, temp_contact)) { json_array_append_string(json_contacts, &percent_escapes, temp_contact->name); } } #endif json_object_append_array(json_details, "contacts", json_contacts); json_object_append_real(json_details, "notification_interval", temp_host->notification_interval); json_object_append_real(json_details, "first_notification_delay", temp_host->first_notification_delay); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_down", flag_isset(temp_host->notification_options, OPT_DOWN)); json_object_append_boolean(json_details, "notify_on_unreachable", flag_isset(temp_host->notification_options, OPT_UNREACHABLE)); json_object_append_boolean(json_details, "notify_on_recovery", flag_isset(temp_host->notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_flapping", flag_isset(temp_host->notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_downtime", flag_isset(temp_host->notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "notifications_options", temp_host->notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_down", temp_host->notify_on_down); json_object_append_boolean(json_details, "notify_on_unreachable", temp_host->notify_on_unreachable); json_object_append_boolean(json_details, "notify_on_recovery", temp_host->notify_on_recovery); json_object_append_boolean(json_details, "notify_on_flapping", temp_host->notify_on_flapping); json_object_append_boolean(json_details, "notify_on_downtime", temp_host->notify_on_downtime); #endif json_object_append_string(json_details, "notification_period", &percent_escapes, temp_host->notification_period); json_object_append_string(json_details, "check_period", &percent_escapes, temp_host->check_period); json_object_append_boolean(json_details, "flap_detection_enabled", temp_host->flap_detection_enabled); json_object_append_real(json_details, "low_flap_threshold", temp_host->low_flap_threshold); json_object_append_real(json_details, "high_flap_threshold", temp_host->high_flap_threshold); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details "flap_detection_on_up", flag_isset(temp_host->flap_detection_options, OPT_UP)); json_object_append_boolean(json_details "flap_detection_on_down", flag_isset(temp_host->flap_detection_options, OPT_DOWN)); json_object_append_boolean(json_details "flap_detection_on_unreachable", flag_isset(temp_host->flap_detection_options, OPT_UNREACHABLE)); } else { #endif json_bitmask(json_details, format_options, "flap_detection_options", temp_host->flap_detection_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "flap_detection_on_up", temp_host->flap_detection_on_up); json_object_append_boolean(json_details, "flap_detection_on_down", temp_host->flap_detection_on_down); json_object_append_boolean(json_details, "flap_detection_on_unreachable", temp_host->flap_detection_on_unreachable); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "stalk_on_up", flag_isset(temp_host->stalking_options, OPT_UP)); json_object_append_boolean(json_details, "stalk_on_down", flag_isset(temp_host->stalking_options, OPT_DOWN)); json_object_append_boolean(json_details, "stalk_on_unreachable", flag_isset(temp_host->stalking_options, OPT_UNREACHABLE)); } else { #endif json_bitmask(json_details, format_options, "stalking_options", temp_host->stalking_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "stalk_on_up", temp_host->stalk_on_up); json_object_append_boolean(json_details, "stalk_on_down", temp_host->stalk_on_down); json_object_append_boolean(json_details, "stalk_on_unreachable", temp_host->stalk_on_unreachable); #endif json_object_append_boolean(json_details, "check_freshness", temp_host->check_freshness); json_object_append_integer(json_details, "freshness_threshold", temp_host->freshness_threshold); json_object_append_boolean(json_details, "process_performance_data", temp_host->process_performance_data); json_object_append_boolean(json_details, "checks_enabled", temp_host->checks_enabled); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "accept_passive_host_checks", temp_host->accept_passive_checks); } else { #endif json_object_append_boolean(json_details, "accept_passive_checks", temp_host->accept_passive_checks); #if 0 } #endif #else json_object_append_boolean(json_details, "accept_passive_host_checks", temp_host->accept_passive_host_checks); #endif json_object_append_boolean(json_details, "event_handler_enabled", temp_host->event_handler_enabled); json_object_append_boolean(json_details, "retain_status_information", temp_host->retain_status_information); json_object_append_boolean(json_details, "retain_nonstatus_information", temp_host->retain_nonstatus_information); #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_details, "failure_prediction_enabled", temp_host->failure_prediction_enabled); json_object_append_string(json_details, "failure_prediction_options", NULL, temp_host->failure_prediction_options); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "obsess_over_host", temp_host->obsess); } else { #endif json_object_append_boolean(json_details, "obsess", temp_host->obsess); #if 0 } #endif #else json_object_append_boolean(json_details, "obsess_over_host", temp_host->obsess_over_host); #endif #ifdef JSON_NAGIOS_4X json_object_append_integer(json_details, "hourly_value", temp_host->hourly_value); #endif json_object_append_string(json_details, "notes", &percent_escapes, temp_host->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_host->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_host->action_url); json_object_append_string(json_details, "icon_image", &percent_escapes, temp_host->icon_image); json_object_append_string(json_details, "icon_image_alt", &percent_escapes, temp_host->icon_image_alt); json_object_append_string(json_details, "vrml_image", &percent_escapes, temp_host->vrml_image); json_object_append_string(json_details, "statusmap_image", &percent_escapes, temp_host->statusmap_image); json_object_append_boolean(json_details, "have_2d_coords", temp_host->have_2d_coords); json_object_append_integer(json_details, "x_2d", temp_host->x_2d); json_object_append_integer(json_details, "y_2d", temp_host->y_2d); json_object_append_boolean(json_details, "have_3d_coords", temp_host->have_3d_coords); json_object_append_real(json_details, "x_3d", temp_host->x_3d); json_object_append_real(json_details, "y_3d", temp_host->y_3d); json_object_append_real(json_details, "z_3d", temp_host->z_3d); json_object_append_boolean(json_details, "should_be_drawn", temp_host->should_be_drawn); json_object_append_object(json_details, "custom_variables", json_object_custom_variables(temp_host->custom_variables)); } int json_object_hostgroup_passes_selection(hostgroup *temp_hostgroup, host *temp_hostgroup_member) { /* Skip if user is not authorized for this hostgroup */ if(FALSE == is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata)) { return 0; } /* Skip if a hostgroup member is specified and the hostgroup member host is not a member of the hostgroup */ if( NULL != temp_hostgroup_member && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_hostgroup_member))) { return 0; } return 1; } json_object *json_object_hostgroup_selectors(int start, int count, host *temp_hostgroup_member) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_hostgroup_member) { json_object_append_string(json_selectors, "hostgroupmember", &percent_escapes, temp_hostgroup_member->name); } return json_selectors; } json_object *json_object_hostgroupcount(unsigned format_options, host *temp_hostgroup_member) { json_object *json_data; hostgroup *temp_hostgroup; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostgroup_selectors(0, 0, temp_hostgroup_member)); for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(json_object_hostgroup_passes_selection(temp_hostgroup, temp_hostgroup_member) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_hostgrouplist(unsigned format_options, int start, int count, int details, host *temp_hostgroup_member) { json_object *json_data; json_object *json_hostgrouplist_object = NULL; json_array *json_hostgrouplist_array = NULL; json_object *json_hostgroup_details; hostgroup *temp_hostgroup; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostgroup_selectors(start, count, temp_hostgroup_member)); if(details > 0) { json_hostgrouplist_object = json_new_object(); } else { json_hostgrouplist_array = json_new_array(); } for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(json_object_hostgroup_passes_selection(temp_hostgroup, temp_hostgroup_member) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_hostgroup_details = json_new_object(); json_object_hostgroup_details(json_hostgroup_details, format_options, temp_hostgroup); json_object_append_object(json_hostgrouplist_object, temp_hostgroup->group_name, json_hostgroup_details); } else { json_array_append_string(json_hostgrouplist_array, &percent_escapes, temp_hostgroup->group_name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "hostgrouplist", json_hostgrouplist_object); } else { json_object_append_array(json_data, "hostgrouplist", json_hostgrouplist_array); } return json_data; } json_object *json_object_hostgroup(unsigned format_options, hostgroup *temp_hostgroup) { json_object *json_hostgroup = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "group_name", &percent_escapes, temp_hostgroup->group_name); json_object_hostgroup_details(json_details, format_options, temp_hostgroup); json_object_append_object(json_hostgroup, "hostgroup", json_details); return json_hostgroup; } void json_object_hostgroup_details(json_object *json_details, unsigned format_options, hostgroup *temp_hostgroup) { json_array *json_members; hostsmember *temp_member; json_object_append_string(json_details, "group_name", &percent_escapes, temp_hostgroup->group_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_hostgroup->alias); json_members = json_new_array(); for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { json_array_append_string(json_members, &percent_escapes, temp_member->host_name); } json_object_append_array(json_details, "members", json_members); json_object_append_string(json_details, "notes", &percent_escapes, temp_hostgroup->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_hostgroup->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_hostgroup->action_url); } int json_object_service_passes_host_selection(host *temp_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, host *match_host) { host *temp_host2; /* Skip if user is not authorized for this host */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { return 0; } /* If the host parent was specified, skip the services whose host is not a child of the parent host specified */ if( 1 == use_parent_host && NULL != temp_host && FALSE == is_host_immediate_child_of_host(parent_host, temp_host)) { return 0; } /* If the hostgroup was specified, skip the services on hosts that are not members of the hostgroup specified */ if( NULL != temp_hostgroup && NULL != temp_host && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_host))) { return 0; } /* If the host was specified, skip the services not on the host specified */ if( NULL != match_host && NULL != temp_host && temp_host != match_host) { return 0; } /* If a child host was specified... */ if(1 == use_child_host) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } return 1; } int json_object_service_passes_service_selection(service *temp_service, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { servicesmember *temp_servicesmember; /* Skip if user is not authorized for this service */ if(FALSE == is_authorized_for_service(temp_service, ¤t_authdata)) { return 0; } /* If the servicegroup was specified, skip the services that are not members of the servicegroup specified */ if( NULL != temp_servicegroup && ( FALSE == is_service_member_of_servicegroup(temp_servicegroup, temp_service))) { return 0; } /* If the contact was specified, skip the services that do not have the contact specified */ if( NULL != temp_contact && ( FALSE == is_contact_for_service(temp_service, temp_contact))) { return 0; } /* If a contactgroup was specified, skip the services that do not have the contactgroup specified */ if(NULL != temp_contactgroup && (FALSE == is_contactgroup_for_service(temp_service, temp_contactgroup))) { return 0; } /* If the service description was supplied, skip the services that do not have this service description */ if((NULL != service_description) && strcmp(temp_service->description, service_description)) { return 0; } /* If a check timeperiod was specified, skip this service if it does not have the check timeperiod specified */ if(NULL != check_timeperiod && (check_timeperiod != temp_service->check_period_ptr)) { return 0; } /* If a notification timeperiod was specified, skip this service if it does not have the notification timeperiod specified */ if(NULL != notification_timeperiod && (notification_timeperiod != temp_service->notification_period_ptr)) { return 0; } /* If a check command was specified, skip this service if it does not have the check command specified */ if(NULL != check_command && (check_command != temp_service->check_command_ptr)) { return 0; } /* If an event handler was specified, skip this service if it does not have the event handler specified */ if(NULL != event_handler && (event_handler != temp_service->event_handler_ptr)) { return 0; } /* If a parent service was specified... */ if(NULL != parent_service_name) { /* If the parent service is "none", skip this service if it has parentren */ if(!strcmp(parent_service_name,"none")) { if(NULL != temp_service->parents) { return 0; } } /* Otherwise, skip this service if it does not have the specified service as a parent */ else { int found = 0; for(temp_servicesmember = temp_service->parents; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->service_description, parent_service_name)) { found = 1; } } if(0 == found) { return 0; } } } /* If a child service was specified... */ if(NULL != child_service_name) { /* If the child service is "none", skip this service if it has children */ if(!strcmp(child_service_name,"none")) { if(NULL != temp_service->children) { return 0; } } /* Otherwise, skip this service if it does not have the specified service as a child */ else { int found = 0; for(temp_servicesmember = temp_service->children; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->service_description, child_service_name)) { found = 1; } } if(0 == found) { return 0; } } } return 1; } json_object *json_object_service_selectors(int start, int count, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, host *match_host, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != match_host) { json_object_append_string(json_selectors, "host", &percent_escapes, match_host->name); } if( 1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if( NULL != temp_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, temp_hostgroup->group_name); } if( NULL != temp_servicegroup) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, temp_servicegroup->group_name); } if(NULL != temp_contact) { json_object_append_string(json_selectors, "contact",&percent_escapes, temp_contact->name); } if(NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if( NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if( NULL != parent_service_name) { json_object_append_string(json_selectors, "parentservice", &percent_escapes, parent_service_name); } if( NULL != child_service_name) { json_object_append_string(json_selectors, "childservice", &percent_escapes, child_service_name); } if( NULL != check_timeperiod) { json_object_append_string(json_selectors, "checktimeperiod", &percent_escapes, check_timeperiod->name); } if( NULL != notification_timeperiod) { json_object_append_string(json_selectors, "servicenotificationtimeperiod", &percent_escapes, notification_timeperiod->name); } if( NULL != check_command) { json_object_append_string(json_selectors, "checkcommand", &percent_escapes, check_command->name); } if( NULL != event_handler) { json_object_append_string(json_selectors, "eventhandler", &percent_escapes, event_handler->name); } return json_selectors; } json_object *json_object_servicecount(host *match_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; host *temp_host; service *temp_service; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_service_selectors(0, 0, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { temp_host = find_host(temp_service->host_name); if(NULL == temp_host) { continue; } if(json_object_service_passes_host_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host) == 0) { continue; } if(json_object_service_passes_service_selection(temp_service, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_servicelist(unsigned format_options, int start, int count, int details, host *match_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_hostlist; json_object *json_servicelist_object = NULL; json_array *json_servicelist_array = NULL; json_object *json_service_details; host *temp_host; service *temp_service; int current = 0; int counted = 0; int service_count; char *buf; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_service_selectors(start, count, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); json_hostlist = json_new_object(); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_object_service_passes_host_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host) == 0) { continue; } service_count = 0; if(details > 0) { json_servicelist_object = json_new_object(); } else { json_servicelist_array = json_new_array(); } for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(json_object_service_passes_service_selection(temp_service, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* If this service isn't on the host we're currently working with, skip it */ if( strcmp( temp_host->name, temp_service->host_name)) continue; /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_service_details = json_new_object(); json_object_service_details(json_service_details, format_options, temp_service); asprintf(&buf, "%s", temp_service->description); json_object_append_object(json_servicelist_object, buf, json_service_details); } else { json_array_append_string(json_servicelist_array, &percent_escapes, temp_service->description); } counted++; service_count++; } current++; } if(service_count > 0) { if(details > 0) { json_object_append_object(json_hostlist, temp_host->name, json_servicelist_object); } else { json_object_append_array(json_hostlist, temp_host->name, json_servicelist_array); } } } json_object_append_object(json_data, "servicelist", json_hostlist); return json_data; } json_object *json_object_service(unsigned format_options, service *temp_service) { json_object *json_service = json_new_object(); json_object *json_details = json_new_object(); /* host_name and description are included when json_object_service_details() is called, so we don't need them here */ /* json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); */ json_object_service_details(json_details, format_options, temp_service); json_object_append_object(json_service, "service", json_details); return json_service; } void json_object_service_details(json_object *json_details, unsigned format_options, service *temp_service) { json_array *json_contactgroups; json_array *json_contacts; contactgroupsmember *temp_contact_groupsmember; #ifdef NSCORE contactsmember *temp_contactsmember; #else contact *temp_contact; #endif #ifdef JSON_NAGIOS_4X servicesmember *temp_servicesmember; json_object *json_parent_service; json_array *json_parent_services; json_object *json_child_service; json_array *json_child_services; #endif json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); json_object_append_string(json_details, "display_name", &percent_escapes, temp_service->display_name); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_string(json_details, "service_check_command", &percent_escapes, temp_service->check_command); } else { #endif json_object_append_string(json_details, "check_command", &percent_escapes, temp_service->check_command); #if 0 } #endif #else json_object_append_string(json_details, "service_check_command", &percent_escapes, temp_service->service_check_command); #endif json_object_append_string(json_details, "event_handler", &percent_escapes, temp_service->event_handler); json_enumeration(json_details, format_options, "initial_state", temp_service->initial_state, svm_service_states); json_object_append_real(json_details, "check_interval", temp_service->check_interval); json_object_append_real(json_details, "retry_interval", temp_service->retry_interval); json_object_append_integer(json_details, "max_attempts", temp_service->max_attempts); json_object_append_boolean(json_details, "parallelize", temp_service->parallelize); json_contactgroups = json_new_array(); for(temp_contact_groupsmember = temp_service->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_array(); #ifdef NSCORE for(temp_contactsmember = temp_service->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } #else for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(TRUE == is_contact_for_service(temp_service, temp_contact)) { json_array_append_string(json_contacts, &percent_escapes, temp_contact->name); } } #endif json_object_append_array(json_details, "contacts", json_contacts); json_object_append_real(json_details, "notification_interval", temp_service->notification_interval); json_object_append_real(json_details, "first_notification_delay", temp_service->first_notification_delay); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_unknown", flag_isset(temp_service->notification_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "notify_on_warning", flag_isset(temp_service->notification_options, OPT_WARNING)); json_object_append_boolean(json_details, "notify_on_critical", flag_isset(temp_service->notification_options, OPT_CRITICAL)); json_object_append_boolean(json_details, "notify_on_recovery", flag_isset(temp_service->notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_flapping", flag_isset(temp_service->notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_downtime", flag_isset(temp_service->notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "notifications_options", temp_service->notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_unknown", temp_service->notify_on_unknown); json_object_append_boolean(json_details, "notify_on_warning", temp_service->notify_on_warning); json_object_append_boolean(json_details, "notify_on_critical", temp_service->notify_on_critical); json_object_append_boolean(json_details, "notify_on_recovery", temp_service->notify_on_recovery); json_object_append_boolean(json_details, "notify_on_flapping", temp_service->notify_on_flapping); json_object_append_boolean(json_details, "notify_on_downtime", temp_service->notify_on_downtime); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "stalk_on_ok", flag_isset(temp_service->stalking_options, OPT_OK)); json_object_append_boolean(json_details, "stalk_on_warning", flag_isset(temp_service->stalking_options, OPT_WARNING)); json_object_append_boolean(json_details, "stalk_on_unknown", flag_isset(temp_service->stalking_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "stalk_on_critical", flag_isset(temp_service->stalking_options, OPT_CRITICAL)); } else { #endif json_bitmask(json_details, format_options, "stalking_options", temp_service->stalking_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "stalk_on_ok", temp_service->stalk_on_ok); json_object_append_boolean(json_details, "stalk_on_warning", temp_service->stalk_on_warning); json_object_append_boolean(json_details, "stalk_on_unknown", temp_service->stalk_on_unknown); json_object_append_boolean(json_details, "stalk_on_critical", temp_service->stalk_on_critical); #endif json_object_append_boolean(json_details, "is_volatile", temp_service->is_volatile); json_object_append_string(json_details, "notification_period", &percent_escapes, temp_service->notification_period); json_object_append_string(json_details, "check_period", &percent_escapes, temp_service->check_period); json_object_append_boolean(json_details, "flap_detection_enabled", temp_service->flap_detection_enabled); json_object_append_real(json_details, "low_flap_threshold", temp_service->low_flap_threshold); json_object_append_real(json_details, "high_flap_threshold", temp_service->high_flap_threshold); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "flap_detection_on_ok", flag_isset(temp_service->flap_detection_options, OPT_OK)); json_object_append_boolean(json_details, "flap_detection_on_warning", flag_isset(temp_service->flap_detection_options, OPT_WARNING)); json_object_append_boolean(json_details, "flap_detection_on_unknown", flag_isset(temp_service->flap_detection_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "flap_detection_on_critical", flag_isset(temp_service->flap_detection_options, OPT_CRITICAL)); } else { #endif json_bitmask(json_details, format_options, "flap_detection_options", temp_service->flap_detection_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "flap_detection_on_ok", temp_service->flap_detection_on_ok); json_object_append_boolean(json_details, "flap_detection_on_warning", temp_service->flap_detection_on_warning); json_object_append_boolean(json_details, "flap_detection_on_unknown", temp_service->flap_detection_on_unknown); json_object_append_boolean(json_details, "flap_detection_on_critical", temp_service->flap_detection_on_critical); #endif json_object_append_boolean(json_details, "process_performance_data", temp_service->process_performance_data); json_object_append_boolean(json_details, "check_freshness", temp_service->check_freshness); json_object_append_integer(json_details, "freshness_threshold", temp_service->freshness_threshold); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "accept_passive_service_checks", temp_service->accept_passive_checks); } else { #endif json_object_append_boolean(json_details, "accept_passive_checks", temp_service->accept_passive_checks); #if 0 } #endif #else json_object_append_boolean(json_details, "accept_passive_service_checks", temp_service->accept_passive_service_checks); #endif json_object_append_boolean(json_details, "event_handler_enabled", temp_service->event_handler_enabled); json_object_append_boolean(json_details, "checks_enabled", temp_service->checks_enabled); json_object_append_boolean(json_details, "retain_status_information", temp_service->retain_status_information); json_object_append_boolean(json_details, "retain_nonstatus_information", temp_service->retain_nonstatus_information); json_object_append_boolean(json_details, "notifications_enabled", temp_service->notifications_enabled); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "obsess_over_service", temp_service->obsess); } else { #endif json_object_append_boolean(json_details, "obsess", temp_service->obsess); #if 0 } #endif #else json_object_append_boolean(json_details, "obsess_over_service", temp_service->obsess_over_service); #endif #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_details, "failure_prediction_enabled", temp_service->failure_prediction_enabled); json_object_append_string(json_details, "failure_prediction_options", NULL, temp_service->failure_prediction_options); #endif #ifdef JSON_NAGIOS_4X json_object_append_integer(json_details, "hourly_value", temp_service->hourly_value); #endif #ifdef JSON_NAGIOS_4X json_parent_services = json_new_array(); for(temp_servicesmember = temp_service->parents; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { json_parent_service = json_new_object(); json_object_append_string(json_parent_service, "host_name", &percent_escapes, temp_servicesmember->host_name); json_object_append_string(json_parent_service, "service_description", &percent_escapes, temp_servicesmember->service_description); json_array_append_object(json_parent_services, json_parent_service); } json_object_append_array(json_details, "parents", json_parent_services); json_child_services = json_new_array(); for(temp_servicesmember = temp_service->children; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { json_child_service = json_new_object(); json_object_append_string(json_child_service, "host_name", &percent_escapes, temp_servicesmember->host_name); json_object_append_string(json_child_service, "service_description", &percent_escapes, temp_servicesmember->service_description); json_array_append_object(json_child_services, json_child_service); } json_object_append_array(json_details, "children", json_child_services); #endif json_object_append_string(json_details, "notes", &percent_escapes, temp_service->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_service->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_service->action_url); json_object_append_string(json_details, "icon_image", &percent_escapes, temp_service->icon_image); json_object_append_string(json_details, "icon_image_alt", &percent_escapes, temp_service->icon_image_alt); json_object_append_object(json_details, "custom_variables", json_object_custom_variables(temp_service->custom_variables)); } int json_object_servicegroup_passes_selection(servicegroup *temp_servicegroup, service *temp_servicegroup_member) { /* Skip if user is not authorized for this hostgroup */ if(FALSE == is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata)) { return 0; } /* Skip if a servicegroup member is specified and the servicegroup member service is not a member of the servicegroup */ if( NULL != temp_servicegroup_member && ( FALSE == is_service_member_of_servicegroup(temp_servicegroup, temp_servicegroup_member))) { return 0; } return 1; } json_object * json_object_servicegroup_selectors(int start, int count, service *temp_servicegroup_member) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_servicegroup_member) { json_object_append_string(json_selectors, "servicegroupmemberhost", &percent_escapes, temp_servicegroup_member->host_name); json_object_append_string(json_selectors, "servicegroupmemberservice", &percent_escapes, temp_servicegroup_member->description); } return json_selectors; } json_object *json_object_servicegroupcount(service *temp_servicegroup_member) { json_object *json_data; servicegroup *temp_servicegroup; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicegroup_selectors(0, 0, temp_servicegroup_member)); for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(json_object_servicegroup_passes_selection(temp_servicegroup, temp_servicegroup_member) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_servicegrouplist(unsigned format_options, int start, int count, int details, service *temp_servicegroup_member) { json_object *json_data; json_object *json_servicegrouplist_object = NULL; json_array *json_servicegrouplist_array = NULL; json_object *json_servicegroup_details; servicegroup *temp_servicegroup; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicegroup_selectors(start, count, temp_servicegroup_member)); if(details > 0) { json_servicegrouplist_object = json_new_object(); } else { json_servicegrouplist_array = json_new_array(); } for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(json_object_servicegroup_passes_selection(temp_servicegroup, temp_servicegroup_member) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_servicegroup_details = json_new_object(); json_object_servicegroup_details(json_servicegroup_details, format_options, temp_servicegroup); json_object_append_object(json_servicegrouplist_object, temp_servicegroup->group_name, json_servicegroup_details); } else { json_object_append_string(json_servicegrouplist_array, NULL, &percent_escapes, temp_servicegroup->group_name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "servicegrouplist", json_servicegrouplist_object); } else { json_object_append_array(json_data, "servicegrouplist", json_servicegrouplist_array); } return json_data; } json_object * json_object_servicegroup(unsigned format_options, servicegroup *temp_servicegroup) { json_object *json_servicegroup = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "group_name", &percent_escapes, temp_servicegroup->group_name); json_object_servicegroup_details(json_details, format_options, temp_servicegroup); json_object_append_object(json_servicegroup, "servicegroup", json_details); return json_servicegroup; } void json_object_servicegroup_details(json_object *json_details, unsigned format_options, servicegroup *temp_servicegroup) { json_array *json_members; servicesmember *temp_member; json_object *json_member; json_object_append_string(json_details, "group_name", &percent_escapes, temp_servicegroup->group_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_servicegroup->alias); json_members = json_new_array(); for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { json_member = json_new_object(); json_object_append_string(json_member, "host_name", &percent_escapes, temp_member->host_name); json_object_append_string(json_member, "service_description", &percent_escapes, temp_member->service_description); json_array_append_object(json_members, json_member); } json_object_append_array(json_details, "members", json_members); json_object_append_string(json_details, "notes", &percent_escapes, temp_servicegroup->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_servicegroup->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_servicegroup->action_url); } int json_object_contact_passes_selection(contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { /* If the contactgroup was specified, skip the contacts that are not members of the contactgroup specified */ if( NULL != temp_contactgroup && ( FALSE == is_contact_member_of_contactgroup(temp_contactgroup, temp_contact))) { return 0; } /* If a host notification timeperiod was specified, skip this contact if it does not have the host notification timeperiod specified */ if(NULL != host_notification_timeperiod && (host_notification_timeperiod != temp_contact->host_notification_period_ptr)) { return 0; } /* If a service notification timeperiod was specified, skip this contact if it does not have the service notification timeperiod specified */ if(NULL != service_notification_timeperiod && (service_notification_timeperiod != temp_contact->service_notification_period_ptr)) { return 0; } return 1; } json_object *json_object_contact_display_selectors(int start, int count, contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if( NULL != host_notification_timeperiod) { json_object_append_string(json_selectors, "hostnotificationtimeperiod", &percent_escapes, host_notification_timeperiod->name); } if( NULL != service_notification_timeperiod) { json_object_append_string(json_selectors, "servicenotificationtimeperiod", &percent_escapes, service_notification_timeperiod->name); } return json_selectors; } json_object *json_object_contactcount(contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { json_object *json_data; contact *temp_contact; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contact_display_selectors(0, 0, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod)); for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(json_object_contact_passes_selection(temp_contact, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_contactlist(unsigned format_options, int start, int count, int details, contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { json_object *json_data; json_object *json_contactlist_object = NULL; json_array *json_contactlist_array = NULL; json_object *json_contact_details; contact *temp_contact; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contact_display_selectors(start, count, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod)); if(details > 0) { json_contactlist_object = json_new_object(); } else { json_contactlist_array = json_new_array(); } for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(json_object_contact_passes_selection(temp_contact, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_contact_details = json_new_object(); json_object_contact_details(json_contact_details, format_options, temp_contact); json_object_append_object(json_contactlist_object, temp_contact->name, json_contact_details); } else { json_array_append_string(json_contactlist_array, &percent_escapes, temp_contact->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "contactlist", json_contactlist_object); } else { json_object_append_array(json_data, "contactlist", json_contactlist_array); } return json_data; } json_object *json_object_contact(unsigned format_options, contact *temp_contact) { json_object *json_contact = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_contact->name); json_object_contact_details(json_details, format_options, temp_contact); json_object_append_object(json_contact, "contact", json_details); return json_contact; } void json_object_contact_details(json_object *json_details, unsigned format_options, contact *temp_contact) { json_array *json_addresses; json_array *json_host_commands; json_array *json_service_commands; int x; commandsmember *temp_commandsmember; json_object_append_string(json_details, "name", &percent_escapes, temp_contact->name); json_object_append_string(json_details, "alias", &percent_escapes, temp_contact->alias); json_object_append_string(json_details, "email", &percent_escapes, temp_contact->email); json_object_append_string(json_details, "pager", &percent_escapes, temp_contact->pager); json_addresses = json_new_array(); for( x = 0; x < MAX_CONTACT_ADDRESSES; x++) { if( NULL != temp_contact->address[ x]) { json_array_append_string(json_addresses, &percent_escapes, temp_contact->address[ x]); } } json_object_append_array(json_details, "addresses", json_addresses); json_host_commands = json_new_array(); for(temp_commandsmember = temp_contact->host_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { json_array_append_string(json_host_commands, &percent_escapes, temp_commandsmember->command); } json_object_append_array(json_details, "host_notification_commands", json_host_commands); json_service_commands = json_new_array(); for(temp_commandsmember = temp_contact->service_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { json_array_append_string(json_service_commands, &percent_escapes, temp_commandsmember->command); } json_object_append_array(json_details, "service_notification_commands", json_service_commands); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_service_unknown", flag_isset(temp_contact->service_notification_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "notify_on_service_warning", flag_isset(temp_contact->service_notification_options, OPT_WARNING)); json_object_append_boolean(json_details, "notify_on_service_critical", flag_isset(temp_contact->service_notification_options, OPT_CRITICAL)); json_object_append_boolean(json_details, "notify_on_service_recovery", flag_isset(temp_contact->service_notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_service_flapping", flag_isset(temp_contact->service_notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_service_downtime", flag_isset(temp_contact->service_notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "service_notification_options", temp_contact->service_notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_service_unknown", temp_contact->notify_on_service_unknown); json_object_append_boolean(json_details, "notify_on_service_warning", temp_contact->notify_on_service_warning); json_object_append_boolean(json_details, "notify_on_service_critical", temp_contact->notify_on_service_critical); json_object_append_boolean(json_details, "notify_on_service_recovery", temp_contact->notify_on_service_recovery); json_object_append_boolean(json_details, "notify_on_service_flapping", temp_contact->notify_on_service_flapping); json_object_append_boolean(json_details, "notify_on_service_downtime", temp_contact->notify_on_service_downtime); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_host_down", flag_isset(temp_contact->host_notification_options, OPT_DOWN)); json_object_append_boolean(json_details, "notify_on_host_unreachable", flag_isset(temp_contact->host_notification_options, OPT_UNREACHABLE)); json_object_append_boolean(json_details, "notify_on_host_recovery", flag_isset(temp_contact->host_notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_host_flapping", flag_isset(temp_contact->host_notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_host_downtime", flag_isset(temp_contact->host_notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "host_notification_options", temp_contact->host_notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_host_down", temp_contact->notify_on_host_down); json_object_append_boolean(json_details, "notify_on_host_unreachable", temp_contact->notify_on_host_unreachable); json_object_append_boolean(json_details, "notify_on_host_recovery", temp_contact->notify_on_host_recovery); json_object_append_boolean(json_details, "notify_on_host_flapping", temp_contact->notify_on_host_flapping); json_object_append_boolean(json_details, "notify_on_host_downtime", temp_contact->notify_on_host_downtime); #endif json_object_append_string(json_details, "host_notification_period", &percent_escapes, temp_contact->host_notification_period); json_object_append_string(json_details, "service_notification_period", &percent_escapes, temp_contact->service_notification_period); json_object_append_boolean(json_details, "host_notifications_enabled", temp_contact->host_notifications_enabled); json_object_append_boolean(json_details, "service_notifications_enabled", temp_contact->service_notifications_enabled); json_object_append_boolean(json_details, "can_submit_commands", temp_contact->can_submit_commands); json_object_append_boolean(json_details, "retain_status_information", temp_contact->retain_status_information); json_object_append_boolean(json_details, "retain_nonstatus_information", temp_contact->retain_nonstatus_information); #ifdef JSON_NAGIOS_4X json_object_append_integer(json_details, "minimum_value", temp_contact->minimum_value); #endif json_object_append_object(json_details, "custom_variables", json_object_custom_variables(temp_contact->custom_variables)); } int json_object_contactgroup_passes_selection(contactgroup *temp_contactgroup, contact *temp_contactgroup_member) { /* Skip if a contactgroup member is specified and the contactgroup member contact is not a member of the contactgroup */ if( NULL != temp_contactgroup_member && ( FALSE == is_contact_member_of_contactgroup(temp_contactgroup, temp_contactgroup_member))) { return 0; } return 1; } json_object *json_object_contactgroup_display_selectors( int start, int count, contact *temp_contactgroup_member) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_contactgroup_member) { json_object_append_string(json_selectors, "contactgroupmember", &percent_escapes, temp_contactgroup_member->name); } return json_selectors; } json_object *json_object_contactgroupcount(contact * temp_contactgroup_member) { json_object *json_data; contactgroup *temp_contactgroup; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contactgroup_display_selectors(0, 0, temp_contactgroup_member)); for(temp_contactgroup = contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { if(json_object_contactgroup_passes_selection(temp_contactgroup, temp_contactgroup_member) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_contactgrouplist(unsigned format_options, int start, int count, int details, contact * temp_contactgroup_member) { json_object *json_data; json_object *json_contactgrouplist_object = NULL; json_array *json_contactgrouplist_array = NULL; json_object *json_contactgroup_details; contactgroup *temp_contactgroup; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contactgroup_display_selectors(start, count, temp_contactgroup_member)); if(details > 0) { json_contactgrouplist_object = json_new_object(); } else { json_contactgrouplist_array = json_new_array(); } for(temp_contactgroup = contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { if(json_object_contactgroup_passes_selection(temp_contactgroup, temp_contactgroup_member) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_contactgroup_details = json_new_object(); json_object_contactgroup_details(json_contactgroup_details, format_options, temp_contactgroup); json_object_append_object(json_contactgrouplist_object, temp_contactgroup->group_name, json_contactgroup_details); } else { json_array_append_string(json_contactgrouplist_array, &percent_escapes, temp_contactgroup->group_name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "contactgrouplist", json_contactgrouplist_object); } else { json_object_append_array(json_data, "contactgrouplist", json_contactgrouplist_array); } return json_data; } json_object *json_object_contactgroup(unsigned format_options, contactgroup *temp_contactgroup) { json_object *json_contactgroup = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "group_name", &percent_escapes, temp_contactgroup->group_name); json_object_contactgroup_details(json_details, format_options, temp_contactgroup); json_object_append_object(json_contactgroup, "contactgroup", json_details); return json_contactgroup; } void json_object_contactgroup_details(json_object *json_details, unsigned format_options, contactgroup *temp_contactgroup) { json_array *json_members; contactsmember *temp_member; json_object_append_string(json_details, "group_name", &percent_escapes, temp_contactgroup->group_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_contactgroup->alias); json_members = json_new_array(); for(temp_member = temp_contactgroup->members; temp_member != NULL; temp_member = temp_member->next) { json_array_append_string(json_members, &percent_escapes, temp_member->contact_name); } json_object_append_array(json_details, "members", json_members); } json_object *json_object_timeperiod_selectors(int start, int count) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } return json_selectors; } json_object *json_object_timeperiodcount(void) { json_object *json_data; timeperiod *temp_timeperiod; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_timeperiod_selectors(0, 0)); for(temp_timeperiod = timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) { count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_timeperiodlist(unsigned format_options, int start, int count, int details) { json_object *json_data; json_object *json_timeperiodlist_object = NULL; json_array *json_timeperiodlist_array = NULL; json_object *json_timeperiod_details; timeperiod *temp_timeperiod; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_timeperiod_selectors(start, count)); if(details > 0) { json_timeperiodlist_object = json_new_object(); } else { json_timeperiodlist_array = json_new_array(); } for(temp_timeperiod = timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) { /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_timeperiod_details = json_new_object(); json_object_timeperiod_details(json_timeperiod_details, format_options, temp_timeperiod); json_object_append_object(json_timeperiodlist_object, temp_timeperiod->name, json_timeperiod_details); } else { json_array_append_string(json_timeperiodlist_array, &percent_escapes, temp_timeperiod->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "timeperiodlist", json_timeperiodlist_object); } else { json_object_append_array(json_data, "timeperiodlist", json_timeperiodlist_array); } return json_data; } json_object *json_object_timeperiod(unsigned format_options, timeperiod *temp_timeperiod) { json_object *json_timeperiod = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_timeperiod->name); json_object_timeperiod_details(json_details, format_options, temp_timeperiod); json_object_append_object(json_timeperiod, "timeperiod", json_details); return json_timeperiod; } void json_object_timeperiod_details(json_object *json_details, unsigned format_options, timeperiod *temp_timeperiod) { json_object *json_days; int x; json_array *json_timeranges; json_array *json_exceptions; json_array *json_exclusions; daterange *temp_daterange; timeperiodexclusion *temp_timeperiodexclusion; json_object_append_string(json_details, "name", &percent_escapes, temp_timeperiod->name); json_object_append_string(json_details, "alias", &percent_escapes, temp_timeperiod->alias); json_days = json_new_object(); for(x = 0; x < sizeof(temp_timeperiod->days) / sizeof(temp_timeperiod->days[0]); x++) { if( NULL != temp_timeperiod->days[x]) { json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_timeperiod->days[x]); json_object_append_array(json_days, (char *)dayofweek[x], json_timeranges); } } json_object_append_object(json_details, "days", json_days); json_exceptions = json_new_array(); for(x = 0; x < DATERANGE_TYPES; x++) { for(temp_daterange = temp_timeperiod->exceptions[x]; temp_daterange != NULL; temp_daterange = temp_daterange->next) { json_array_append_object(json_exceptions, json_object_daterange(format_options, temp_daterange, x)); } } json_object_append_array(json_details, "exceptions", json_exceptions); json_exclusions = json_new_array(); for(temp_timeperiodexclusion = temp_timeperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { json_array_append_string(json_exclusions, &percent_escapes, temp_timeperiodexclusion->timeperiod_name); } json_object_append_array(json_details, "exclusions", json_exclusions); } json_object * json_object_daterange(unsigned format_options, daterange *temp_daterange, int daterange_type) { json_object *json_daterange; json_array *json_timeranges; json_daterange = json_new_object(); switch(daterange_type) { case DATERANGE_CALENDAR_DATE: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_CALENDAR_DATE"); if(temp_daterange->syear == temp_daterange->eyear && temp_daterange->smon == temp_daterange->emon && temp_daterange->smday == temp_daterange->emday) { json_object_append_string(json_daterange, "date", NULL, "%4d-%02d-%02d", temp_daterange->syear, temp_daterange->smon+1, temp_daterange->smday); } else { json_object_append_string(json_daterange, "startdate", NULL, "%4d-%02d-%02d", temp_daterange->syear, temp_daterange->smon+1, temp_daterange->smday); json_object_append_string(json_daterange, "enddate", NULL, "%4d-%02d-%02d", temp_daterange->eyear, temp_daterange->emon+1, temp_daterange->emday); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_MONTH_DATE: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_MONTH_DATE"); if(temp_daterange->smon == temp_daterange->emon && temp_daterange->smday == temp_daterange->emday) { json_object_append_string(json_daterange, "month", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_integer(json_daterange, "day", temp_daterange->smday); } else { json_object_append_string(json_daterange, "startmonth", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_integer(json_daterange, "startday", temp_daterange->smday); json_object_append_string(json_daterange, "endmonth", &percent_escapes, (char *)month[temp_daterange->emon]); json_object_append_integer(json_daterange, "endday", temp_daterange->emday); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_MONTH_DAY: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_MONTH_DAY"); if(temp_daterange->smday == temp_daterange->emday) { json_object_append_integer(json_daterange, "day", temp_daterange->smday); } else { json_object_append_integer(json_daterange, "startday", temp_daterange->smday); json_object_append_integer(json_daterange, "endday", temp_daterange->emday); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_MONTH_WEEK_DAY: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_MONTH_WEEK_DAY"); if(temp_daterange->smon == temp_daterange->emon && temp_daterange->swday == temp_daterange->ewday && temp_daterange->swday_offset == temp_daterange->ewday_offset) { json_object_append_string(json_daterange, "month", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_string(json_daterange, "weekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "weekdayoffset", temp_daterange->swday_offset); } else { json_object_append_string(json_daterange, "startmonth", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_string(json_daterange, "startweekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "startweekdayoffset", temp_daterange->swday_offset); json_object_append_string(json_daterange, "endmonth", &percent_escapes, (char *)month[temp_daterange->emon]); json_object_append_string(json_daterange, "endweekday", &percent_escapes, (char *)dayofweek[temp_daterange->ewday]); json_object_append_integer(json_daterange, "endweekdayoffset", temp_daterange->ewday_offset); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_WEEK_DAY: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_WEEK_DAY"); if(temp_daterange->swday == temp_daterange->ewday && temp_daterange->swday_offset == temp_daterange->ewday_offset) { json_object_append_string(json_daterange, "weekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "weekdayoffset", temp_daterange->swday_offset); } else { json_object_append_string(json_daterange, "startweekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "startweekdayoffset", temp_daterange->swday_offset); json_object_append_string(json_daterange, "endweekday", &percent_escapes, (char *)dayofweek[temp_daterange->ewday]); json_object_append_integer(json_daterange, "endweekdayoffset", temp_daterange->ewday_offset); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; default: json_object_append_string(json_daterange, "type", NULL, "Unknown daterange type: %u", daterange_type); break; } return json_daterange; } void json_object_timerange(json_array *json_parent, unsigned format_options, timerange *temp_timerange) { json_object *json_timerange; for(; temp_timerange != NULL; temp_timerange = temp_timerange->next) { json_timerange = json_new_object(); json_object_append_time(json_timerange, "range_start", temp_timerange->range_start); json_object_append_time(json_timerange, "range_end", temp_timerange->range_end); json_array_append_object(json_parent, json_timerange); } } json_object *json_object_command_selectors(int start, int count) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } return json_selectors; } json_object *json_object_commandcount(void) { json_object *json_data; command *temp_command; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_command_selectors(0, 0)); for(temp_command = command_list; temp_command != NULL; temp_command = temp_command->next) { count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_commandlist(unsigned format_options, int start, int count, int details) { json_object *json_data; json_object *json_commandlist_object = NULL; json_array *json_commandlist_array = NULL; json_object *json_command_details; command *temp_command; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_command_selectors(start, count)); if(details > 0) { json_commandlist_object = json_new_object(); } else { json_commandlist_array = json_new_array(); } for(temp_command = command_list; temp_command != NULL; temp_command = temp_command->next) { /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_command_details = json_new_object(); json_object_command_details(json_command_details, format_options, temp_command); json_object_append_object(json_commandlist_object, temp_command->name, json_command_details); } else { json_array_append_string(json_commandlist_array, &percent_escapes, temp_command->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "commandlist", json_commandlist_object); } else { json_object_append_array(json_data, "commandlist", json_commandlist_array); } return json_data; } json_object *json_object_command(unsigned format_options, command *temp_command) { json_object *json_command = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_command->name); json_object_command_details(json_details, format_options, temp_command); json_object_append_object(json_command, "command", json_details); return json_command; } void json_object_command_details(json_object *json_details, unsigned format_options, command *temp_command) { json_object_append_string(json_details, "name", &percent_escapes, temp_command->name); json_object_append_string(json_details, "command_line", &percent_escapes, temp_command->command_line); } int json_object_servicedependency_passes_selection( servicedependency *temp_servicedependency, host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { host *temp_host = NULL; service *temp_service = NULL; /* Skip if the servicedependency does not have the specified master host */ if(NULL != master_host && strcmp(temp_servicedependency->host_name, master_host->name)) { return 0; } /* Skip if the servicedependency does not have a master host in the specified hostgroup */ if(NULL != master_hostgroup) { temp_host = find_host(temp_servicedependency->host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(master_hostgroup, temp_host))) { return 0; } } /* Skip if the servicedependency does not have the specified master service */ if(NULL != master_service_description && strcmp(temp_servicedependency->service_description, master_service_description)) { return 0; } /* Skip if the servicedependency does not have a master service in the specified servicegroup */ if(NULL != master_servicegroup) { temp_service = find_service(temp_servicedependency->host_name, temp_servicedependency->service_description); if((NULL != temp_service) && (FALSE == is_service_member_of_servicegroup(master_servicegroup, temp_service))) { return 0; } } /* Skip if the servicedependency does not have the specified dependent host */ if(NULL != dependent_host && strcmp(temp_servicedependency->dependent_host_name, dependent_host->name)) { return 0; } /* Skip if the servicedependency does not have a dependent host in the specified hostgroup */ if(NULL != dependent_hostgroup) { temp_host = find_host(temp_servicedependency->dependent_host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(dependent_hostgroup, temp_host))) { return 0; } } /* Skip if the servicedependency does not have the specified dependent service */ if(NULL != dependent_service_description && strcmp(temp_servicedependency->dependent_service_description, dependent_service_description)) { return 0; } /* Skip if the servicedependency does not have a dependent service in the specified servicegroup */ if(NULL != dependent_servicegroup) { temp_service = find_service(temp_servicedependency->dependent_host_name, temp_servicedependency->dependent_service_description); if((NULL != temp_service) && (FALSE == is_service_member_of_servicegroup(dependent_servicegroup, temp_service))) { return 0; } } return 1; } json_object *json_object_servicedependency_selectors(int start, int count, host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(NULL != master_host) { json_object_append_string(json_selectors, "masterhostname", &percent_escapes, master_host->name); } if(NULL != master_hostgroup) { json_object_append_string(json_selectors, "masterhostgroupname", &percent_escapes, master_hostgroup->group_name); } if(NULL != master_service_description) { json_object_append_string(json_selectors, "masterservicedescription", &percent_escapes, master_service_description); } if(NULL != master_servicegroup) { json_object_append_string(json_selectors, "masterservicegroupname", &percent_escapes, master_servicegroup->group_name); } if(NULL != dependent_host) { json_object_append_string(json_selectors, "dependenthostname", &percent_escapes, dependent_host->name); } if(NULL != dependent_hostgroup) { json_object_append_string(json_selectors, "dependenthostgroupname", &percent_escapes, dependent_hostgroup->group_name); } if(NULL != dependent_service_description) { json_object_append_string(json_selectors, "dependentservicedescription", &percent_escapes, dependent_service_description); } if(NULL != dependent_servicegroup) { json_object_append_string(json_selectors, "dependentservicegroupname", &percent_escapes, dependent_servicegroup->group_name); } return json_selectors; } json_object *json_object_servicedependencycount(host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif servicedependency *temp_servicedependency; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicedependency_selectors(0, 0, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.servicedependencies; x++) { temp_servicedependency = servicedependency_ary[ x]; #else for(temp_servicedependency = servicedependency_list; temp_servicedependency != NULL; temp_servicedependency = temp_servicedependency->next) { #endif if(json_object_servicedependency_passes_selection(temp_servicedependency, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)) { count++; } } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_servicedependencylist(unsigned format_options, int start, int count, host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { json_object *json_data; json_array *json_servicedependencylist; json_object *json_servicedependency_details; #ifdef JSON_NAGIOS_4X int x; #endif servicedependency *temp_servicedependency; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicedependency_selectors(start, count, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)); json_servicedependencylist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.servicedependencies; x++) { temp_servicedependency = servicedependency_ary[ x]; #else for(temp_servicedependency = servicedependency_list; temp_servicedependency != NULL; temp_servicedependency = temp_servicedependency->next) { #endif if(!json_object_servicedependency_passes_selection(temp_servicedependency, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_servicedependency_details = json_new_object(); json_object_servicedependency_details(json_servicedependency_details, format_options, temp_servicedependency); json_array_append_object(json_servicedependencylist, json_servicedependency_details); } counted++; current++; } json_object_append_array(json_data, "servicedependencylist", json_servicedependencylist); return json_data; } void json_object_servicedependency_details(json_object *json_details, unsigned format_options, servicedependency *temp_servicedependency) { json_object_append_integer(json_details, "dependency_type", temp_servicedependency->dependency_type); json_object_append_string(json_details, "dependent_host_name", &percent_escapes, temp_servicedependency->dependent_host_name); json_object_append_string(json_details, "dependent_service_description", &percent_escapes, temp_servicedependency->dependent_service_description); json_object_append_string(json_details, "host_name", &percent_escapes, temp_servicedependency->host_name); json_object_append_string(json_details, "service_description", &percent_escapes, temp_servicedependency->service_description); json_object_append_string(json_details, "dependency_period", &percent_escapes, temp_servicedependency->dependency_period); json_object_append_boolean(json_details, "inherits_parent", temp_servicedependency->inherits_parent); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "fail_on_ok", flag_isset(temp_servicedependency->failure_options, OPT_OK)); json_object_append_boolean(json_details, "fail_on_warning", flag_isset(temp_servicedependency->failure_options, OPT_WARNING)); json_object_append_boolean(json_details, "fail_on_unknown", flag_isset(temp_servicedependency->failure_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "fail_on_critical", flag_isset(temp_servicedependency->failure_options, OPT_CRITICAL)); json_object_append_boolean(json_details, "fail_on_pending", flag_isset(temp_servicedependency->failure_options, OPT_PENDING)); } else { #endif json_bitmask(json_details, format_options, "failure_options", temp_servicedependency->failure_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "fail_on_ok", temp_servicedependency->fail_on_ok); json_object_append_boolean(json_details, "fail_on_warning", temp_servicedependency->fail_on_warning); json_object_append_boolean(json_details, "fail_on_unknown", temp_servicedependency->fail_on_unknown); json_object_append_boolean(json_details, "fail_on_critical", temp_servicedependency->fail_on_critical); json_object_append_boolean(json_details, "fail_on_pending", temp_servicedependency->fail_on_pending); #endif } int json_object_serviceescalation_passes_selection(serviceescalation *temp_serviceescalation, host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { int found; hostsmember *temp_hostsmember; servicesmember *temp_servicesmember; /* Skip if the serviceescalation is not for the specified host */ if( NULL != match_host && strcmp( temp_serviceescalation->host_name, match_host->name)) { return 0; } if((NULL != service_description) && strcmp(temp_serviceescalation->description, service_description)) { return 0; } if(NULL != match_hostgroup) { found = 0; for(temp_hostsmember = match_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(!strcmp(temp_hostsmember->host_name, temp_serviceescalation->host_name)) { found = 1; break; } } if(0 == found) { return 0; } } if(NULL != match_servicegroup) { found = 0; for(temp_servicesmember = match_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->host_name, temp_serviceescalation->host_name) && !strcmp(temp_servicesmember->service_description, temp_serviceescalation->description)) { found = 1; break; } } if(0 == found) { return 0; } } /* If a contact was specified, skip this service escalation if it does not have the contact specified */ if( NULL != match_contact && ( FALSE == is_contact_for_service_escalation(temp_serviceescalation, match_contact))) { return 0; } /* If a contactgroup was specified, skip this service escalation if it does not have the contactgroup specified */ if(NULL != match_contactgroup && (FALSE == is_contactgroup_for_service_escalation(temp_serviceescalation, match_contactgroup))) { return 0; } return 1; } json_object *json_object_serviceescalation_selectors(int start, int count, host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_selectors; json_selectors = json_new_object(); if(start > 0) { json_object_append_integer(json_selectors, "start", start); } if(count > 0) { json_object_append_integer(json_selectors, "count", count); } if(NULL != match_host) { json_object_append_string(json_selectors, "hostname", &percent_escapes, match_host->name); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if(NULL != match_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, match_hostgroup->group_name); } if(NULL != match_servicegroup) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, match_servicegroup->group_name); } if( NULL != match_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, match_contact->name); } if( NULL != match_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, match_contactgroup->group_name); } return json_selectors; } json_object *json_object_serviceescalationcount(host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif serviceescalation *temp_serviceescalation; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_serviceescalation_selectors(0, 0, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.serviceescalations; x++) { temp_serviceescalation=serviceescalation_ary[ x]; #else for(temp_serviceescalation = serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { #endif if(json_object_serviceescalation_passes_selection(temp_serviceescalation, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_serviceescalationlist(unsigned format_options, int start, int count, host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; json_array *json_serviceescalationlist; json_object *json_serviceescalation_details; #ifdef JSON_NAGIOS_4X int x; #endif serviceescalation *temp_serviceescalation; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_serviceescalation_selectors(start, count, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup)); json_serviceescalationlist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.serviceescalations; x++) { temp_serviceescalation=serviceescalation_ary[ x]; #else for(temp_serviceescalation = serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { #endif if(json_object_serviceescalation_passes_selection(temp_serviceescalation, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_serviceescalation_details = json_new_object(); json_object_serviceescalation_details(json_serviceescalation_details, format_options, temp_serviceescalation); json_array_append_object(json_serviceescalationlist, json_serviceescalation_details); } counted++; current++; } json_object_append_array(json_data, "serviceescalationlist", json_serviceescalationlist); return json_data; } void json_object_serviceescalation_details(json_object *json_details, unsigned format_options, serviceescalation *temp_serviceescalation) { json_array *json_contactgroups; json_array *json_contacts; contactgroupsmember *temp_contact_groupsmember; contactsmember *temp_contactsmember; json_object_append_string(json_details, "host_name", &percent_escapes, temp_serviceescalation->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_serviceescalation->description); json_object_append_integer(json_details, "first_notification", temp_serviceescalation->first_notification); json_object_append_integer(json_details, "last_notification", temp_serviceescalation->last_notification); json_object_append_real(json_details, "notification_interval", temp_serviceescalation->notification_interval); json_object_append_string(json_details, "escalation_period", &percent_escapes, temp_serviceescalation->escalation_period); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "escalate_on_recovery", flag_isset(temp_serviceescalation->escalation_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "escalate_on_warning", flag_isset(temp_serviceescalation->escalation_options, OPT_WARNING)); json_object_append_boolean(json_details, "escalate_on_unknown", flag_isset(temp_serviceescalation->escalation_options, OPT_UNKNOWN))); json_object_append_boolean(json_details, "escalate_on_critical", flag_isset(temp_serviceescalation->escalation_options, OPT_CRITICAL)); } else { #endif json_bitmask(json_details, format_options, "escalation_options", temp_serviceescalation->escalation_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "escalate_on_recovery", temp_serviceescalation->escalate_on_recovery); json_object_append_boolean(json_details, "escalate_on_warning", temp_serviceescalation->escalate_on_warning); json_object_append_boolean(json_details, "escalate_on_unknown", temp_serviceescalation->escalate_on_unknown); json_object_append_boolean(json_details, "escalate_on_critical", temp_serviceescalation->escalate_on_critical); #endif json_contactgroups = json_new_object(); for(temp_contact_groupsmember = temp_serviceescalation->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_object(); for(temp_contactsmember = temp_serviceescalation->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } json_object_append_array(json_details, "contacts", json_contacts); } int json_object_hostdependency_passes_selection( hostdependency *temp_hostdependency, host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { host *temp_host = NULL; /* Skip if the hostdependency does not have the specified master host */ if(NULL != master_host && strcmp(temp_hostdependency->host_name, master_host->name)) { return 0; } /* Skip if the hostdependency does not have a master host in the specified hostgroup*/ if(NULL != master_hostgroup) { temp_host = find_host(temp_hostdependency->host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(master_hostgroup, temp_host))) { return 0; } } /* Skip if the hostdependency does not have the specified dependent host */ if(NULL != dependent_host && strcmp(temp_hostdependency->dependent_host_name, dependent_host->name)) { return 0; } /* Skip if the hostdependency does not have a dependent host in the specified hostgroup*/ if(NULL != dependent_hostgroup) { temp_host = find_host(temp_hostdependency->dependent_host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(dependent_hostgroup, temp_host))) { return 0; } } return 1; } json_object *json_object_hostdependency_selectors(int start, int count, host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(NULL != master_host) { json_object_append_string(json_selectors, "masterhostname", &percent_escapes, master_host->name); } if(NULL != master_hostgroup) { json_object_append_string(json_selectors, "masterhostgroupname", &percent_escapes, master_hostgroup->group_name); } if(NULL != dependent_host) { json_object_append_string(json_selectors, "dependenthostname", &percent_escapes, dependent_host->name); } if(NULL != dependent_hostgroup) { json_object_append_string(json_selectors, "dependenthostgroupname", &percent_escapes, dependent_hostgroup->group_name); } return json_selectors; } json_object *json_object_hostdependencycount(host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif hostdependency *temp_hostdependency; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostdependency_selectors(0, 0, master_host, master_hostgroup, dependent_host, dependent_hostgroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostdependencies; x++) { temp_hostdependency = hostdependency_ary[ x]; #else for(temp_hostdependency = hostdependency_list; temp_hostdependency != NULL; temp_hostdependency = temp_hostdependency->next) { #endif if(json_object_hostdependency_passes_selection( temp_hostdependency, master_host, master_hostgroup, dependent_host, dependent_hostgroup)) { count++; } } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_hostdependencylist(unsigned format_options, int start, int count, host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { json_object *json_data; json_array *json_hostdependencylist; #ifdef JSON_NAGIOS_4X int x; #endif json_object *json_hostdependency_details; hostdependency *temp_hostdependency; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostdependency_selectors(start, count, master_host, master_hostgroup, dependent_host, dependent_hostgroup)); json_hostdependencylist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostdependencies; x++) { temp_hostdependency = hostdependency_ary[ x]; #else for(temp_hostdependency = hostdependency_list; temp_hostdependency != NULL; temp_hostdependency = temp_hostdependency->next) { #endif if(!json_object_hostdependency_passes_selection( temp_hostdependency, master_host, master_hostgroup, dependent_host, dependent_hostgroup)) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_hostdependency_details = json_new_object(); json_object_hostdependency_details(json_hostdependency_details, format_options, temp_hostdependency); json_array_append_object(json_hostdependencylist, json_hostdependency_details); } counted++; current++; } json_object_append_array(json_data, "hostdependencylist", json_hostdependencylist); return json_data; } void json_object_hostdependency_details(json_object *json_details, unsigned format_options, hostdependency *temp_hostdependency) { json_object_append_integer(json_details, "dependency_type", temp_hostdependency->dependency_type); json_object_append_string(json_details, "dependent_host_name", &percent_escapes, temp_hostdependency->dependent_host_name); json_object_append_string(json_details, "host_name", &percent_escapes, temp_hostdependency->host_name); json_object_append_string(json_details, "dependency_period", &percent_escapes, temp_hostdependency->dependency_period); json_object_append_boolean(json_details, "inherits_parent", temp_hostdependency->inherits_parent); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "fail_on_up", flag_isset(temp_hostdependency->failure_options, OPT_UP)); json_object_append_boolean(json_details, "fail_on_down", flag_isset(temp_hostdependency->failure_options, OPT_DOWN)); json_object_append_boolean(json_details, "fail_on_unreachable", flag_isset(temp_hostdependency->failure_options, OPT_UNREACHABLE)); json_object_append_boolean(json_details, "fail_on_pending", flag_isset(temp_hostdependency->failure_options, OPT_PENDING)); } else { #endif json_bitmask(json_details, format_options, "failure_options", temp_hostdependency->failure_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "fail_on_up", temp_hostdependency->fail_on_up); json_object_append_boolean(json_details, "fail_on_down", temp_hostdependency->fail_on_down); json_object_append_boolean(json_details, "fail_on_unreachable", temp_hostdependency->fail_on_unreachable); json_object_append_boolean(json_details, "fail_on_pending", temp_hostdependency->fail_on_pending); #endif } int json_object_hostescalation_passes_selection(hostescalation *temp_hostescalation, host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { int found; hostsmember *temp_hostsmember; /* Skip if the hostescalation is not for the specified host */ if( NULL != match_host && strcmp( temp_hostescalation->host_name, match_host->name)) { return 0; } if(NULL != match_hostgroup) { found = 0; for(temp_hostsmember = match_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(!strcmp(temp_hostsmember->host_name, temp_hostescalation->host_name)) { found = 1; break; } } if(0 == found) { return 0; } } /* If a contact was specified, skip this host escalation if it does not have the contact specified */ if( NULL != match_contact && ( FALSE == is_contact_for_host_escalation(temp_hostescalation, match_contact))) { return 0; } /* If a contactgroup was specified, skip this host escalation if it does not have the contactgroup specified */ if(NULL != match_contactgroup && (FALSE == is_contactgroup_for_host_escalation(temp_hostescalation, match_contactgroup))) { return 0; } return 1; } json_object *json_object_hostescalation_selectors(int start, int count, host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != match_host) { json_object_append_string(json_selectors, "hostname", &percent_escapes, match_host->name); } if(NULL != match_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, match_hostgroup->group_name); } if( NULL != match_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, match_contact->name); } if( NULL != match_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, match_contactgroup->group_name); } return json_selectors; } json_object *json_object_hostescalationcount(host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif hostescalation *temp_hostescalation; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostescalation_selectors(0, 0, match_host, match_hostgroup, match_contact, match_contactgroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostescalations; x++) { temp_hostescalation = hostescalation_ary[ x]; #else for(temp_hostescalation = hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { #endif if(json_object_hostescalation_passes_selection(temp_hostescalation, match_host, match_hostgroup, match_contact, match_contactgroup) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_hostescalationlist(unsigned format_options, int start, int count, host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; json_array *json_hostescalationlist; json_object *json_hostescalation_details; #ifdef JSON_NAGIOS_4X int x; #endif hostescalation *temp_hostescalation; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostescalation_selectors(start, count, match_host, match_hostgroup, match_contact, match_contactgroup)); json_hostescalationlist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostescalations; x++) { temp_hostescalation = hostescalation_ary[ x]; #else for(temp_hostescalation = hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { #endif if(json_object_hostescalation_passes_selection(temp_hostescalation, match_host, match_hostgroup, match_contact, match_contactgroup) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_hostescalation_details = json_new_object(); json_object_hostescalation_details(json_hostescalation_details, format_options, temp_hostescalation); json_array_append_object(json_hostescalationlist, json_hostescalation_details); } counted++; current++; } json_object_append_array(json_data, "hostescalationlist", json_hostescalationlist); return json_data; } void json_object_hostescalation_details(json_object *json_details, unsigned format_options, hostescalation *temp_hostescalation) { json_array *json_contactgroups; json_array *json_contacts; contactgroupsmember *temp_contact_groupsmember; contactsmember *temp_contactsmember; json_object_append_string(json_details, "host_name", &percent_escapes, temp_hostescalation->host_name); json_object_append_integer(json_details, "first_notification", temp_hostescalation->first_notification); json_object_append_integer(json_details, "last_notification", temp_hostescalation->last_notification); json_object_append_real(json_details, "notification_interval", temp_hostescalation->notification_interval); json_object_append_string(json_details, "escalation_period", &percent_escapes, temp_hostescalation->escalation_period); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "escalate_on_recovery", flag_isset(temp_hostescalation->escalation_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "escalate_on_down", flag_isset(temp_hostescalation->escalation_options, OPT_DOWN)); json_object_append_boolean(json_details, "escalate_on_unreachable", flag_isset(temp_hostescalation->escalation_options, OPT_UNREACHABLE)); } else { #endif json_bitmask(json_details, format_options, "escalation_options", temp_hostescalation->escalation_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "escalate_on_recovery", temp_hostescalation->escalate_on_recovery); json_object_append_boolean(json_details, "escalate_on_down", temp_hostescalation->escalate_on_down); json_object_append_boolean(json_details, "escalate_on_unreachable", temp_hostescalation->escalate_on_unreachable); #endif json_contactgroups = json_new_array(); for(temp_contact_groupsmember = temp_hostescalation->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_array(); for(temp_contactsmember = temp_hostescalation->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } json_object_append_array(json_details, "contacts", json_contacts); }