2017-05-19 23:37:19 +02:00
/**************************************************************************
*
* STATUSJSON . C - Nagios CGI for returning JSON - formatted status 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 0213 9 , USA .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
TODO :
Return an error when the authenticated user is not authorized
for the requested host or service
Consolidate criteria functions for * count and * list queries
Move static programstatus information to objectjson . c ?
*/
# include "../include/config.h"
# include "../include/common.h"
# include "../include/objects.h"
# include "../include/statusdata.h"
# include "../include/comments.h"
# include "../include/downtime.h"
# include "../include/cgiutils.h"
# include "../include/getcgi.h"
# include "../include/cgiauth.h"
# include "../include/jsonutils.h"
# include "../include/objectjson.h"
# include "../include/statusjson.h"
# define THISCGI "statusjson.cgi"
# ifdef JSON_NAGIOS_4X
# define HOST_STATUS_ALL (SD_HOST_UP | SD_HOST_DOWN | SD_HOST_UNREACHABLE | HOST_PENDING)
# define SERVICE_STATUS_ALL (SERVICE_OK | SERVICE_WARNING | SERVICE_CRITICAL | SERVICE_UNKNOWN | SERVICE_PENDING)
# else
# define HOST_STATUS_ALL (HOST_UP | HOST_DOWN | HOST_UNREACHABLE | HOST_PENDING)
# define SERVICE_STATUS_ALL (SERVICE_OK | SERVICE_WARNING | SERVICE_CRITICAL | SERVICE_UNKNOWN | SERVICE_PENDING)
# endif
extern char main_config_file [ MAX_FILENAME_LENGTH ] ;
extern char * status_file ;
extern host * host_list ;
extern hoststatus * hoststatus_list ;
extern service * service_list ;
#if 0
extern contact * contact_list ;
# endif
extern servicestatus * servicestatus_list ;
extern nagios_comment * comment_list ;
extern scheduled_downtime * scheduled_downtime_list ;
/* Program status variables */
extern unsigned long modified_host_process_attributes ;
extern unsigned long modified_service_process_attributes ;
extern int nagios_pid ;
extern int daemon_mode ;
extern time_t program_start ;
# ifndef JSON_NAGIOS_4X
extern time_t last_command_check ;
# endif
extern time_t last_log_rotation ;
extern int enable_notifications ;
extern int execute_service_checks ;
extern int accept_passive_service_checks ;
extern int execute_host_checks ;
extern int accept_passive_host_checks ;
extern int enable_event_handlers ;
extern int obsess_over_services ;
extern int obsess_over_hosts ;
extern int check_service_freshness ;
extern int check_host_freshness ;
extern int enable_flap_detection ;
# ifndef JSON_NAGIOS_4X
extern int enable_failure_prediction ;
# endif
extern int process_performance_data ;
#if 0
extern char * global_host_event_handler ;
extern char * global_service_event_handler ;
extern unsigned long next_comment_id ;
extern unsigned long next_downtime_id ;
extern unsigned long next_event_id ;
extern unsigned long next_problem_id ;
extern unsigned long next_notification_id ;
extern int external_command_buffer_slots ;
extern check_stats check_statistics [ MAX_CHECK_STATS_TYPES ] ;
# endif
/* Performance data variables */
extern int program_stats [ MAX_CHECK_STATS_TYPES ] [ 3 ] ;
extern int buffer_stats [ 1 ] [ 3 ] ;
void document_header ( int ) ;
void document_footer ( void ) ;
void init_cgi_data ( status_json_cgi_data * ) ;
int process_cgivars ( json_object * , status_json_cgi_data * , time_t ) ;
void free_cgi_data ( status_json_cgi_data * ) ;
int validate_arguments ( json_object * , status_json_cgi_data * , time_t ) ;
authdata current_authdata ;
const string_value_mapping valid_queries [ ] = {
{ " hostcount " , STATUS_QUERY_HOSTCOUNT ,
" Return the number of hosts in each state " } ,
{ " hostlist " , STATUS_QUERY_HOSTLIST ,
" Return a list of hosts and their current status " } ,
{ " host " , STATUS_QUERY_HOST ,
" Return the status of a single host. " } ,
{ " servicecount " , STATUS_QUERY_SERVICECOUNT ,
" Return the number of services in each state " } ,
{ " servicelist " , STATUS_QUERY_SERVICELIST ,
" Return a list of services and their current status " } ,
{ " service " , STATUS_QUERY_SERVICE ,
" Return the status of a single service " } ,
#if 0
{ " contactcount " , STATUS_QUERY_CONTACTCOUNT ,
" Return the number of contacts " } ,
{ " contactlist " , STATUS_QUERY_CONTACTLIST ,
" Return a list of of contacts and their current status " } ,
{ " contact " , STATUS_QUERY_CONTACT ,
" Return a single contact " } ,
# endif
{ " commentcount " , STATUS_QUERY_COMMENTCOUNT ,
" Return the number of comments " } ,
{ " commentlist " , STATUS_QUERY_COMMENTLIST ,
" Return a list of comments " } ,
{ " comment " , STATUS_QUERY_COMMENT ,
" Return a single comment " } ,
{ " downtimecount " , STATUS_QUERY_DOWNTIMECOUNT ,
" Return the number of downtimes " } ,
{ " downtimelist " , STATUS_QUERY_DOWNTIMELIST ,
" Return a list of downtimes " } ,
{ " downtime " , STATUS_QUERY_DOWNTIME ,
" Return a single downtime " } ,
{ " programstatus " , STATUS_QUERY_PROGRAMSTATUS ,
" Return the Nagios Core program status " } ,
{ " performancedata " , STATUS_QUERY_PERFORMANCEDATA ,
" Return the Nagios Core performance data " } ,
{ " help " , STATUS_QUERY_HELP ,
" Display help for this CGI " } ,
{ NULL , - 1 , NULL } ,
} ;
static const int query_status [ ] [ 2 ] = {
{ STATUS_QUERY_HOSTCOUNT , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_HOSTLIST , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_HOST , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_SERVICECOUNT , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_SERVICELIST , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_SERVICE , QUERY_STATUS_RELEASED } ,
#if 0
{ STATUS_QUERY_CONTACTCOUNT , QUERY_STATUS_BETA } ,
{ STATUS_QUERY_CONTACTLIST , QUERY_STATUS_BETA } ,
{ STATUS_QUERY_CONTACT , QUERY_STATUS_BETA } ,
# endif
{ STATUS_QUERY_COMMENTCOUNT , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_COMMENTLIST , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_COMMENT , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_DOWNTIMECOUNT , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_DOWNTIMELIST , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_DOWNTIME , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_PROGRAMSTATUS , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_PERFORMANCEDATA , QUERY_STATUS_RELEASED } ,
{ STATUS_QUERY_HELP , QUERY_STATUS_RELEASED } ,
{ - 1 , - 1 } ,
} ;
const string_value_mapping svm_host_time_fields [ ] = {
{ " lastupdate " , STATUS_TIME_LAST_UPDATE , " Last Update " } ,
{ " lastcheck " , STATUS_TIME_LAST_CHECK , " Last Check " } ,
{ " nextcheck " , STATUS_TIME_NEXT_CHECK , " Next Check " } ,
{ " laststatechange " , STATUS_TIME_LAST_STATE_CHANGE , " Last State Change " } ,
{ " lasthardstatechange " , STATUS_TIME_LAST_HARD_STATE_CHANGE ,
" Last Hard State Change " } ,
{ " lasttimeup " , STATUS_TIME_LAST_TIME_UP , " Last Time Up " } ,
{ " lasttimedown " , STATUS_TIME_LAST_TIME_DOWN , " Last Time Down " } ,
{ " lasttimeunreachable " , STATUS_TIME_LAST_TIME_UNREACHABLE ,
" Last Time Unreachable " } ,
{ " lastnotification " , STATUS_TIME_LAST_NOTIFICATION , " Last Notification " } ,
{ " nextnotification " , STATUS_TIME_NEXT_NOTIFICATION , " Next Notification " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_service_time_fields [ ] = {
{ " lastupdate " , STATUS_TIME_LAST_UPDATE , " Last Update " } ,
{ " lastcheck " , STATUS_TIME_LAST_CHECK , " Last Check " } ,
{ " nextcheck " , STATUS_TIME_NEXT_CHECK , " Next Check " } ,
{ " laststatechange " , STATUS_TIME_LAST_STATE_CHANGE , " Last State Change " } ,
{ " lasthardstatechange " , STATUS_TIME_LAST_HARD_STATE_CHANGE ,
" Last Hard State Change " } ,
{ " lasttimeok " , STATUS_TIME_LAST_TIME_OK , " Last Time OK " } ,
{ " lasttimewarning " , STATUS_TIME_LAST_TIME_WARNING , " Last Time Warning " } ,
{ " lasttimecritical " , STATUS_TIME_LAST_TIME_CRITICAL ,
" Last Time Critical " } ,
{ " lasttimeunknown " , STATUS_TIME_LAST_TIME_UNKNOWN , " Last Time Unknown " } ,
{ " lastnotification " , STATUS_TIME_LAST_NOTIFICATION , " Last Notification " } ,
{ " nextnotification " , STATUS_TIME_NEXT_NOTIFICATION , " Next Notification " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_comment_types [ ] = {
{ " host " , COMMENT_TYPE_HOST , " Host Comment " } ,
{ " service " , COMMENT_TYPE_SERVICE , " Service Comment " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_comment_entry_types [ ] = {
{ " user " , COMMENT_ENTRY_USER , " User Comment " } ,
{ " downtime " , COMMENT_ENTRY_DOWNTIME , " Downtime Comment " } ,
{ " flapping " , COMMENT_ENTRY_FLAPPING , " Flapping Comment " } ,
{ " acknowledgement " , COMMENT_ENTRY_ACKNOWLEDGEMENT ,
" Acknowledgement Comment " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_persistence [ ] = {
{ " yes " , BOOLEAN_TRUE , " Persistent Comment " } ,
{ " no " , BOOLEAN_FALSE , " Non-Persistent Comment " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_expiration [ ] = {
{ " yes " , BOOLEAN_TRUE , " Comment Expires " } ,
{ " no " , BOOLEAN_FALSE , " Comment Does Not Expire " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_comment_time_fields [ ] = {
{ " entrytime " , STATUS_TIME_ENTRY_TIME , " Entry Time " } ,
{ " expiretime " , STATUS_TIME_EXPIRE_TIME , " Expiration Time " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_downtime_time_fields [ ] = {
{ " entrytime " , STATUS_TIME_ENTRY_TIME , " Entry Time " } ,
{ " starttime " , STATUS_TIME_START_TIME , " Start Time " } ,
{ " flexdowntimestart " , STATUS_TIME_FLEX_DOWNTIME_START ,
" Flex Downtime Start " } ,
{ " endtime " , STATUS_TIME_END_TIME , " End Time " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_downtime_object_types [ ] = {
{ " host " , DOWNTIME_OBJECT_TYPE_HOST , " Host Downtime " } ,
{ " service " , DOWNTIME_OBJECT_TYPE_SERVICE , " Service Downtime " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_downtime_types [ ] = {
{ " fixed " , DOWNTIME_TYPE_FIXED , " Fixed Downtime " } ,
{ " flexible " , DOWNTIME_TYPE_FLEXIBLE , " Flexible Downtime " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_triggered_status [ ] = {
{ " yes " , BOOLEAN_TRUE , " Downtime Triggered " } ,
{ " no " , BOOLEAN_FALSE , " Downtime Not Triggered " } ,
{ NULL , - 1 , NULL } ,
} ;
const string_value_mapping svm_valid_in_effect_status [ ] = {
{ " yes " , BOOLEAN_TRUE , " Downtime In Effect " } ,
{ " no " , BOOLEAN_FALSE , " Downtime Not In Effect " } ,
{ NULL , - 1 , NULL } ,
} ;
option_help status_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 " , " servicelist " , NULL } ,
NULL ,
" Specifies the index (zero-based) of the first object in the list to be returned. " ,
NULL
} ,
{
" count " ,
" Count " ,
" integer " ,
{ NULL } ,
{ " hostlist " , " servicelist " , NULL } ,
NULL ,
" Specifies the number of objects in the list to be returned. " ,
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 " , " servicelist " , " commentlist " , " downtimelist " , NULL } ,
NULL ,
" Returns the details for all entities in the list. " ,
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
} ,
{
" hostname " ,
" Host Name " ,
" nagios:objectjson/hostlist " ,
{ " host " , " service " , NULL } ,
{ " servicecount " , " servicelist " , " commentcount " , " commentlist " , " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" Name for the host requested. " ,
NULL
} ,
{
" hostgroup " ,
" Host Group " ,
" nagios:objectjson/hostgrouplist " ,
{ " hostgroup " , NULL } ,
{ " hostcount " , " hostlist " , " servicecount " , " servicelist " , NULL } ,
NULL ,
" Returns information applicable to the hostgroup or the hosts in the hostgroup depending on the query. " ,
NULL
} ,
{
" hoststatus " ,
" Host Status " ,
" list " ,
{ NULL } ,
{ " hostcount " , " hostlist " , " servicecount " , " servicelist " , NULL } ,
NULL ,
" Limits returned information to those hosts whose status matches this list. Host statuses are space separated. " ,
svm_host_statuses
} ,
{
" servicegroup " ,
" Service Group " ,
" nagios:objectjson/servicegrouplist " ,
{ " servicegroup " , NULL } ,
{ " servicecount " , " servicelist " , NULL } ,
NULL ,
" Returns information applicable to the servicegroup or the services in the servicegroup depending on the query. " ,
NULL
} ,
{
" servicestatus " ,
" Service Status " ,
" list " ,
{ NULL } ,
{ " servicecount " , " servicelist " } ,
NULL ,
" Limits returned information to those services whose status matches this list. Service statuses are space separated. " ,
svm_service_statuses
} ,
{
" 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 " , 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 " ,
/* "for query: 'service'",*/
{ " service " , NULL } ,
{ " servicecount " , " servicelist " , " commentcount " , " commentlist " , " downtimecount " , " downtimelist " , NULL } ,
" hostname " ,
" Description for the service 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 " , 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 " , NULL } ,
NULL ,
" Name of a service notification timeperiod to be used as selection criteria. " ,
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
} ,
{
" commenttypes " ,
" Comment Type " ,
" list " ,
{ NULL } ,
{ " commentcount " , " commentlist " , NULL } ,
NULL ,
" Comment type for the comment requested. " ,
svm_valid_comment_types
} ,
{
" entrytypes " ,
" Entry Type " ,
" list " ,
{ NULL } ,
{ " commentcount " , " commentlist " , NULL } ,
NULL ,
" Entry type for the comment requested. " ,
svm_valid_comment_entry_types
} ,
{
" persistence " ,
" Comment Persistence " ,
" list " ,
{ NULL } ,
{ " commentcount " , " commentlist " , NULL } ,
NULL ,
" Persistence for the comment requested. " ,
svm_valid_persistence
} ,
{
" expiring " ,
" Comment Expiration " ,
" list " ,
{ NULL } ,
{ " commentcount " , " commentlist " , NULL } ,
NULL ,
" Whether or not the comment expires. " ,
svm_valid_expiration
} ,
{
" downtimeobjecttypes " ,
" Downtime Object Type " ,
" list " ,
{ NULL } ,
{ " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" The type of object to which the downtime applies. " ,
svm_valid_downtime_object_types
} ,
{
" downtimetypes " ,
" Downtime Type " ,
" list " ,
{ NULL } ,
{ " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" The type of the downtime. " ,
svm_valid_downtime_types
} ,
{
" triggered " ,
" Downtime Triggered " ,
" list " ,
{ NULL } ,
{ " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" Whether or not the downtime is triggered. " ,
svm_valid_triggered_status
} ,
{
" triggeredby " ,
" Triggered By " ,
" nagios:statusjson/downtimelist " ,
{ NULL } ,
{ " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" ID of the downtime which triggers other downtimes. " ,
NULL
} ,
{
" ineffect " ,
" Downtime In Effect " ,
" list " ,
{ NULL } ,
{ " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" Whether or not the downtime is in effect. " ,
svm_valid_in_effect_status
} ,
{
" commentid " ,
" Comment ID " ,
" nagios:statusjson/commentlist " ,
{ " comment " , NULL } ,
{ NULL } ,
NULL ,
" Comment ID for the comment requested. " ,
NULL
} ,
{
" downtimeid " ,
" Downtime ID " ,
" nagios:statusjson/downtimelist " ,
{ " downtime " , NULL } ,
{ NULL } ,
NULL ,
" Downtime ID for the downtime requested. " ,
NULL
} ,
{
" contactname " ,
" Contact Name " ,
" nagios:objectjson/contactlist " ,
{ NULL } ,
{ " hostcount " , " hostlist " , " servicecount " , " servicelist " , NULL } ,
NULL ,
" Name for the contact requested. " ,
NULL
} ,
{
" hosttimefield " ,
" Host Time Field " ,
" enumeration " ,
{ NULL } ,
{ " hostcount " , " hostlist " , NULL } ,
NULL ,
" Field to use when comparing times on a hostlist query. " ,
svm_host_time_fields
} ,
{
" servicetimefield " ,
" Service Time Field " ,
" enumeration " ,
{ NULL } ,
{ " servicecount " , " servicelist " , NULL } ,
NULL ,
" Field to use when comparing times on a servicelist query. " ,
svm_service_time_fields
} ,
{
" commenttimefield " ,
" Comment Time Field " ,
" enumeration " ,
{ NULL } ,
{ " commentcount " , " commentlist " , NULL } ,
NULL ,
" Field to use when comparing times on a commentlist query. " ,
svm_comment_time_fields
} ,
{
" downtimetimefield " ,
" Downtime Time Field " ,
" enumeration " ,
{ NULL } ,
{ " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" Field to use when comparing times on a downtimelist query. " ,
svm_downtime_time_fields
} ,
{
" starttime " ,
" Start Time " ,
" integer " ,
{ NULL } ,
{ " hostcount " , " hostlist " , " servicecount " , " servicelist " , " commentcount " ,
" commentlist " , " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" Starting time to use when querying based on a time range. Not specifying a start time implies all entries since the beginning of time. Supplying a plus or minus sign means times relative to the query time. " ,
NULL ,
} ,
{
" endtime " ,
" End Time " ,
" integer " ,
{ NULL } ,
{ " hostcount " , " hostlist " , " servicecount " , " servicelist " , " commentcount " ,
" commentlist " , " downtimecount " , " downtimelist " , NULL } ,
NULL ,
" Ending time to use when querying based on a time range. Not specifying an end time implies all entries until the time of the query. Specifying plus or minus sign means times relative to the query time. " ,
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_status_host_passes_selection ( host * , int , host * , int , host * ,
hostgroup * , contact * , hoststatus * , int , time_t , time_t ,
contactgroup * , timeperiod * , timeperiod * , command * , command * ) ;
json_object * json_status_host_display_selectors ( unsigned , int , int , int , host * ,
int , host * , hostgroup * , int , contact * , int , time_t , time_t ,
contactgroup * , timeperiod * , timeperiod * , command * , command * ) ;
int json_status_service_passes_host_selection ( host * , int , host * , int , host * ,
hostgroup * , host * , int ) ;
int json_status_service_passes_service_selection ( service * , servicegroup * ,
contact * , servicestatus * , int , time_t , time_t , char * , char * ,
char * , contactgroup * , timeperiod * , timeperiod * , command * ,
command * ) ;
json_object * json_status_service_selectors ( unsigned , int , int , int , host * , int ,
host * , hostgroup * , host * , servicegroup * , int , int , contact * , int ,
time_t , time_t , char * , char * , char * , contactgroup * , timeperiod * ,
timeperiod * , command * , command * ) ;
int json_status_comment_passes_selection ( nagios_comment * , int , time_t , time_t ,
unsigned , unsigned , unsigned , unsigned , char * , char * ) ;
json_object * json_status_comment_selectors ( unsigned , int , int , int , time_t ,
time_t , unsigned , unsigned , unsigned , unsigned , char * , char * ) ;
int json_status_downtime_passes_selection ( scheduled_downtime * , int , time_t ,
time_t , unsigned , unsigned , unsigned , int , unsigned , char * , char * ) ;
json_object * json_status_downtime_selectors ( unsigned , int , int , int , time_t ,
time_t , unsigned , unsigned , unsigned , int , unsigned , char * , char * ) ;
int main ( void ) {
int result = OK ;
time_t query_time ;
status_json_cgi_data cgi_data ;
json_object * json_root ;
struct stat sdstat ;
time_t last_status_data_update = ( time_t ) 0 ;
hoststatus * temp_hoststatus = NULL ;
servicestatus * temp_servicestatus = NULL ;
/* 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 ( status_json_help ) ) ;
json_object_print ( json_root , 0 , 1 , cgi_data . strftime_format ,
cgi_data . format_options ) ;
document_footer ( ) ;
return ERROR ;
}
/* reset internal variables */
reset_cgi_vars ( ) ;
/* read the CGI configuration file */
2019-04-18 17:09:18 +02:00
result = read_cgi_config_file ( get_cgi_config_location ( ) , NULL ) ;
2017-05-19 23:37:19 +02:00
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 ( status_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 ( status_json_help ) ) ;
json_object_print ( json_root , 0 , 1 , cgi_data . strftime_format ,
cgi_data . format_options ) ;
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 ( status_json_help ) ) ;
json_object_print ( json_root , 0 , 1 , cgi_data . strftime_format ,
cgi_data . format_options ) ;
document_footer ( ) ;
return ERROR ;
}
/* Get the update time on the status data file. This needs to occur before
the status data is read because the read_all_status_data ( ) function
clears the name of the status file */
if ( stat ( status_file , & sdstat ) < 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 status data file status: %s! " ,
strerror ( errno ) ) ) ;
json_object_append_object ( json_root , " data " , json_help ( status_json_help ) ) ;
document_footer ( ) ;
return ERROR ;
}
last_status_data_update = sdstat . 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 ( status_json_help ) ) ;
json_object_print ( json_root , 0 , 1 , cgi_data . strftime_format ,
cgi_data . format_options ) ;
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 ( status_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 ( & current_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 STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_hostcount ( cgi_data . format_options ,
cgi_data . use_parent_host , cgi_data . parent_host ,
cgi_data . use_child_host , cgi_data . child_host ,
cgi_data . hostgroup , cgi_data . host_statuses , cgi_data . contact ,
cgi_data . host_time_field , cgi_data . start_time ,
cgi_data . end_time , cgi_data . contactgroup ,
cgi_data . check_timeperiod ,
cgi_data . host_notification_timeperiod , cgi_data . check_command ,
cgi_data . event_handler ) ) ;
break ;
case STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_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 . host_statuses ,
cgi_data . contact , cgi_data . host_time_field , cgi_data . start_time ,
cgi_data . end_time , cgi_data . contactgroup ,
cgi_data . check_timeperiod ,
cgi_data . host_notification_timeperiod , cgi_data . check_command ,
cgi_data . event_handler ) ) ;
break ;
case STATUS_QUERY_HOST :
temp_hoststatus = find_hoststatus ( cgi_data . host_name ) ;
if ( NULL = = temp_hoststatus ) {
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 , & current_authdata , RESULT_OPTION_VALUE_INVALID ,
" The status for host '%s' could not be found. " ,
cgi_data . host_name ) ) ;
result = ERROR ;
}
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 ) ,
last_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_host ( cgi_data . format_options , cgi_data . host ,
temp_hoststatus ) ) ;
}
break ;
case STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_servicecount ( cgi_data . format_options , 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 . host_statuses , cgi_data . service_statuses ,
cgi_data . contact , cgi_data . service_time_field ,
cgi_data . start_time , cgi_data . end_time ,
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 STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_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 . host_statuses , cgi_data . service_statuses ,
cgi_data . contact , cgi_data . service_time_field ,
cgi_data . start_time , cgi_data . end_time ,
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 STATUS_QUERY_SERVICE :
temp_servicestatus = find_servicestatus ( cgi_data . host_name ,
cgi_data . service_description ) ;
if ( NULL = = temp_servicestatus ) {
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 , & current_authdata , RESULT_OPTION_VALUE_INVALID ,
" The status for service '%s' on host '%s' could not be found. " ,
cgi_data . service_description , cgi_data . host_name ) ) ;
result = ERROR ;
}
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 ) ,
last_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_service ( cgi_data . format_options ,
cgi_data . service , temp_servicestatus ) ) ;
}
break ;
#if 0
case STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_status_contactcount ( 1 , cgi_data . format_options , cgi_data . start ,
cgi_data . count , cgi_data . details , cgi_data . contactgroup ) ;
break ;
case STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_status_contactlist ( 1 , cgi_data . format_options , cgi_data . start ,
cgi_data . count , cgi_data . details , cgi_data . contactgroup ) ;
break ;
case STATUS_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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_status_contact ( 1 , cgi_data . format_options , cgi_data . contact ) ;
break ;
# endif
case STATUS_QUERY_COMMENTCOUNT :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_commentcount ( cgi_data . format_options ,
cgi_data . comment_time_field , cgi_data . start_time ,
cgi_data . end_time , cgi_data . comment_types ,
cgi_data . entry_types , cgi_data . persistence ,
cgi_data . expiring , cgi_data . host_name ,
cgi_data . service_description ) ) ;
break ;
case STATUS_QUERY_COMMENTLIST :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_commentlist ( cgi_data . format_options , cgi_data . start ,
cgi_data . count , cgi_data . details , cgi_data . comment_time_field ,
cgi_data . start_time , cgi_data . end_time ,
cgi_data . comment_types , cgi_data . entry_types ,
cgi_data . persistence , cgi_data . expiring , cgi_data . host_name ,
cgi_data . service_description ) ) ;
break ;
case STATUS_QUERY_COMMENT :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_comment ( cgi_data . format_options , cgi_data . comment ) ) ;
break ;
case STATUS_QUERY_DOWNTIMECOUNT :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_downtimecount ( cgi_data . format_options ,
cgi_data . downtime_time_field , cgi_data . start_time ,
cgi_data . end_time , cgi_data . downtime_object_types ,
cgi_data . downtime_types , cgi_data . triggered ,
cgi_data . triggered_by , cgi_data . in_effect , cgi_data . host_name ,
cgi_data . service_description ) ) ;
break ;
case STATUS_QUERY_DOWNTIMELIST :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_downtimelist ( cgi_data . format_options ,
cgi_data . start , cgi_data . count , cgi_data . details ,
cgi_data . downtime_time_field , cgi_data . start_time ,
cgi_data . end_time , cgi_data . downtime_object_types ,
cgi_data . downtime_types , cgi_data . triggered ,
cgi_data . triggered_by , cgi_data . in_effect , cgi_data . host_name ,
cgi_data . service_description ) ) ;
break ;
case STATUS_QUERY_DOWNTIME :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_downtime ( cgi_data . format_options , cgi_data . downtime ) ) ;
break ;
case STATUS_QUERY_PROGRAMSTATUS :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " ,
json_status_program ( cgi_data . format_options ) ) ;
break ;
case STATUS_QUERY_PERFORMANCEDATA :
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_status_data_update , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " , json_status_performance ( ) ) ;
break ;
case STATUS_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__ ) , & current_authdata ,
RESULT_SUCCESS , " " ) ) ;
json_object_append_object ( json_root , " data " , json_help ( status_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 , & current_authdata , RESULT_OPTION_MISSING ,
" Error: Object Type not specified. See data for help. " ) ) ;
json_object_append_object ( json_root , " data " , json_help ( status_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 ( & current_time ) ;
printf ( " Cache-Control: no-store \r \n " ) ;
printf ( " Pragma: no-cache \r \n " ) ;
get_time_string ( & current_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 ( status_json_cgi_data * cgi_data ) {
cgi_data - > format_options = 0 ;
cgi_data - > query = STATUS_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 - > host_statuses = HOST_STATUS_ALL ;
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 - > service_statuses = SERVICE_STATUS_ALL ;
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 - > 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 - > check_command_name = NULL ;
cgi_data - > check_command = NULL ;
cgi_data - > event_handler_name = NULL ;
cgi_data - > event_handler = NULL ;
cgi_data - > comment_types = COMMENT_TYPE_ALL ;
cgi_data - > entry_types = COMMENT_ENTRY_ALL ;
cgi_data - > persistence = BOOLEAN_EITHER ;
cgi_data - > expiring = BOOLEAN_EITHER ;
cgi_data - > comment_id = - 1 ;
cgi_data - > comment = NULL ;
cgi_data - > downtime_id = - 1 ;
cgi_data - > downtime = NULL ;
cgi_data - > start_time = ( time_t ) 0 ;
cgi_data - > end_time = ( time_t ) 0 ;
cgi_data - > host_time_field = STATUS_TIME_INVALID ;
cgi_data - > service_time_field = STATUS_TIME_INVALID ;
cgi_data - > comment_time_field = STATUS_TIME_INVALID ;
cgi_data - > downtime_time_field = STATUS_TIME_INVALID ;
cgi_data - > downtime_object_types = DOWNTIME_OBJECT_TYPE_ALL ;
cgi_data - > downtime_types = DOWNTIME_TYPE_ALL ;
cgi_data - > triggered = BOOLEAN_EITHER ;
cgi_data - > triggered_by = - 1 ;
cgi_data - > in_effect = BOOLEAN_EITHER ;
}
void free_cgi_data ( status_json_cgi_data * cgi_data ) {
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_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 - > 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 - > 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 - > check_command_name ) free ( cgi_data - > check_command_name ) ;
if ( NULL ! = cgi_data - > event_handler_name ) free ( cgi_data - > event_handler_name ) ;
}
int process_cgivars ( json_object * json_root , status_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 ( ) ;
2019-04-18 17:09:18 +02:00
for ( x = 0 ; variables [ x ] ; x + + ) {
2017-05-19 23:37:19 +02:00
/* We set these each iteration because they could change with each
iteration */
/* we found the query argument */
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 ] , " 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 ] , " hoststatus " ) ) {
cgi_data - > host_statuses = 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_host_statuses ,
& ( cgi_data - > host_statuses ) ) ) ! = 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 ] , " servicestatus " ) ) {
cgi_data - > service_statuses = 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_service_statuses ,
& ( cgi_data - > service_statuses ) ) ) ! = 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 ] , " 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 ] , " 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 ] , " commenttypes " ) ) {
cgi_data - > comment_types = 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_valid_comment_types ,
& ( cgi_data - > comment_types ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " entrytypes " ) ) {
cgi_data - > entry_types = 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_valid_comment_entry_types ,
& ( cgi_data - > entry_types ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " persistence " ) ) {
cgi_data - > persistence = 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_valid_persistence ,
& ( cgi_data - > persistence ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " expiring " ) ) {
cgi_data - > expiring = 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_valid_expiration ,
& ( cgi_data - > expiring ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " commentid " ) ) {
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 - > comment_id ) ) )
! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " downtimeid " ) ) {
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 - > downtime_id ) ) )
! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " downtimeobjecttypes " ) ) {
cgi_data - > downtime_object_types = 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_valid_downtime_object_types ,
& ( cgi_data - > downtime_object_types ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " downtimetypes " ) ) {
cgi_data - > downtime_types = 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_valid_downtime_types ,
& ( cgi_data - > downtime_types ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " triggered " ) ) {
cgi_data - > triggered = 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_valid_triggered_status ,
& ( cgi_data - > triggered ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " triggeredby " ) ) {
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 - > triggered_by ) ) )
! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " ineffect " ) ) {
cgi_data - > in_effect = 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_valid_in_effect_status ,
& ( cgi_data - > in_effect ) ) ) ! = 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 ) {
result = ERROR ;
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 ] , " 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 ] , " 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 ] , " hosttimefield " ) ) {
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 ] , svm_host_time_fields ,
& ( cgi_data - > host_time_field ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " servicetimefield " ) ) {
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 ] , svm_service_time_fields ,
& ( cgi_data - > service_time_field ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " commenttimefield " ) ) {
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 ] , svm_comment_time_fields ,
& ( cgi_data - > comment_time_field ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " downtimetimefield " ) ) {
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 ] , svm_downtime_time_fields ,
& ( cgi_data - > downtime_time_field ) ) ) ! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " starttime " ) ) {
if ( ( result = parse_time_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_time ) ) )
! = RESULT_SUCCESS ) {
break ;
}
x + + ;
}
else if ( ! strcmp ( variables [ x ] , " endtime " ) ) {
if ( ( result = parse_time_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 - > end_time ) ) ) ! = RESULT_SUCCESS ) {
result = ERROR ;
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 , status_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 ;
timeperiod * temp_timeperiod = NULL ;
command * temp_command = NULL ;
contact * temp_contact = NULL ;
nagios_comment * temp_comment = NULL ;
scheduled_downtime * temp_downtime = 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 STATUS_QUERY_HOSTCOUNT :
break ;
case STATUS_QUERY_HOSTLIST :
if ( ( ( cgi_data - > start_time > 0 ) | | ( cgi_data - > end_time > 0 ) ) & &
( STATUS_TIME_INVALID = = cgi_data - > host_time_field ) ) {
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 ,
" Start and/or end time supplied, but time field specified. " ) ) ;
}
break ;
case STATUS_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 STATUS_QUERY_SERVICECOUNT :
break ;
case STATUS_QUERY_SERVICELIST :
if ( ( ( cgi_data - > start_time > 0 ) | | ( cgi_data - > end_time > 0 ) ) & &
( STATUS_TIME_INVALID = = cgi_data - > service_time_field ) ) {
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 ,
" Start and/or end time supplied, but time field specified. " ) ) ;
}
break ;
case STATUS_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 STATUS_QUERY_COMMENTCOUNT :
break ;
case STATUS_QUERY_COMMENTLIST :
if ( ( ( cgi_data - > start_time > 0 ) | | ( cgi_data - > end_time > 0 ) ) & &
( STATUS_TIME_INVALID = = cgi_data - > comment_time_field ) ) {
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 ,
" Start and/or end time supplied, but time field specified. " ) ) ;
}
break ;
case STATUS_QUERY_COMMENT :
if ( - 1 = = cgi_data - > comment_id ) {
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 ,
" Comment information requested, but no id specified. " ) ) ;
}
break ;
case STATUS_QUERY_DOWNTIMECOUNT :
break ;
case STATUS_QUERY_DOWNTIMELIST :
if ( ( ( cgi_data - > start_time > 0 ) | | ( cgi_data - > end_time > 0 ) ) & &
( STATUS_TIME_INVALID = = cgi_data - > downtime_time_field ) ) {
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 ,
" Start and/or end time supplied, but time field specified. " ) ) ;
}
break ;
case STATUS_QUERY_DOWNTIME :
if ( - 1 = = cgi_data - > downtime_id ) {
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 ,
" Downtime information requested, but no id specified. " ) ) ;
}
break ;
case STATUS_QUERY_PROGRAMSTATUS :
break ;
case STATUS_QUERY_PERFORMANCEDATA :
break ;
#if 0
case STATUS_QUERY_CONTACTCOUNT :
break ;
case STATUS_QUERY_CONTACTLIST :
break ;
case STATUS_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 ;
# endif
case STATUS_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 */
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. Because a service description may be
requested without specifying a host name , it may not make sense
to look for a specific service object */
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 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 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 comment */
if ( - 1 ! = cgi_data - > comment_id ) {
temp_comment = find_host_comment ( cgi_data - > comment_id ) ;
if ( NULL = = temp_comment ) {
temp_comment = find_service_comment ( cgi_data - > comment_id ) ;
}
if ( NULL = = temp_comment ) {
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 comment with ID '%d' could not be found. " ,
cgi_data - > comment_id ) ) ;
}
else {
cgi_data - > comment = temp_comment ;
}
}
/* Validate the requested downtime */
if ( - 1 ! = cgi_data - > downtime_id ) {
temp_downtime = find_downtime ( ANY_DOWNTIME , cgi_data - > downtime_id ) ;
if ( NULL = = temp_downtime ) {
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 downtime with ID '%d' could not be found. " ,
cgi_data - > downtime_id ) ) ;
}
else {
cgi_data - > downtime = temp_downtime ;
}
}
/* Validate the requested triggered-by downtime */
if ( - 1 ! = cgi_data - > triggered_by ) {
temp_downtime = find_downtime ( ANY_DOWNTIME , cgi_data - > triggered_by ) ;
if ( NULL = = temp_downtime ) {
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 triggering downtime with ID '%d' could not be found. " ,
cgi_data - > triggered_by ) ) ;
}
}
/* 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 start time is before the requested end time */
if ( ( cgi_data - > start_time > 0 ) & & ( cgi_data - > end_time > 0 ) & & (
cgi_data - > start_time > = cgi_data - > end_time ) ) {
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 requested start time must be before the end time. " ) ) ;
}
return result ;
}
int json_status_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 ,
hoststatus * temp_hoststatus , int time_field , time_t start_time ,
time_t end_time , 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 , & current_authdata ) ) {
return 0 ;
}
/* If the host parent was specified, skip the hosts whose 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 the hosts that are not members
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 the hosts that do 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 the hosts that do not have
the contactgroup specified */
if ( NULL ! = temp_contactgroup & &
( FALSE = = is_contactgroup_for_host ( temp_host , temp_contactgroup ) ) ) {
return 0 ;
}
switch ( time_field ) {
case STATUS_TIME_INVALID :
break ;
case STATUS_TIME_LAST_UPDATE :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_update < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_update > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_CHECK :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_check < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_check > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_NEXT_CHECK :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > next_check < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > next_check > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_STATE_CHANGE :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_state_change <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_state_change > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_HARD_STATE_CHANGE :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_hard_state_change <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_hard_state_change >
end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_UP :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_time_up < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_time_up > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_DOWN :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_time_down < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_time_down > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_UNREACHABLE :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_time_unreachable <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_time_unreachable >
end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_NOTIFICATION :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > last_notification <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > last_notification > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_NEXT_NOTIFICATION :
if ( ( start_time > 0 ) & & ( temp_hoststatus - > next_notification <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_hoststatus - > next_notification > end_time ) ) {
return 0 ;
}
break ;
default :
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... (leave this for last since it is the
most expensive check ) */
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_status_host_selectors ( unsigned format_options , int start ,
int count , int use_parent_host , host * parent_host , int use_child_host ,
host * child_host , hostgroup * temp_hostgroup , int host_statuses ,
contact * temp_contact , int time_field , time_t start_time ,
time_t end_time , 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 ( HOST_STATUS_ALL ! = host_statuses ) {
json_bitmask ( json_selectors , format_options , " hoststatus " ,
host_statuses , svm_host_statuses ) ;
}
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 ( time_field > 0 ) {
json_enumeration ( json_selectors , format_options , " hosttimefield " ,
time_field , svm_host_time_fields ) ;
}
if ( start_time > 0 ) {
json_object_append_time_t ( json_selectors , " starttime " , start_time ) ;
}
if ( end_time > 0 ) {
json_object_append_time_t ( json_selectors , " endtime " , end_time ) ;
}
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_status_hostcount ( unsigned format_options , int use_parent_host ,
host * parent_host , int use_child_host , host * child_host ,
hostgroup * temp_hostgroup , int host_statuses , contact * temp_contact ,
int time_field , time_t start_time , time_t end_time ,
contactgroup * temp_contactgroup , timeperiod * check_timeperiod ,
timeperiod * notification_timeperiod , command * check_command ,
command * event_handler ) {
json_object * json_data ;
json_object * json_count ;
host * temp_host ;
hoststatus * temp_hoststatus ;
int up = 0 ;
int down = 0 ;
int unreachable = 0 ;
int pending = 0 ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_host_selectors ( format_options , 0 , 0 , use_parent_host ,
parent_host , use_child_host , child_host , temp_hostgroup ,
host_statuses , temp_contact , time_field , start_time , end_time ,
temp_contactgroup , check_timeperiod , notification_timeperiod ,
check_command , event_handler ) ) ;
json_count = json_new_object ( ) ;
for ( temp_host = host_list ; temp_host ! = NULL ; temp_host = temp_host - > next ) {
/* If we cannot get the status of the host, skip it. This should
probably return an error and doing so is in the todo list . */
temp_hoststatus = find_hoststatus ( temp_host - > name ) ;
if ( NULL = = temp_hoststatus ) {
continue ;
}
if ( json_status_host_passes_selection ( temp_host , use_parent_host ,
parent_host , use_child_host , child_host , temp_hostgroup ,
temp_contact , temp_hoststatus , time_field , start_time ,
end_time , temp_contactgroup , check_timeperiod ,
notification_timeperiod , check_command , event_handler ) = = 0 ) {
continue ;
}
/* Count the hosts in each state */
switch ( temp_hoststatus - > status ) {
case HOST_PENDING :
pending + + ;
break ;
# ifdef JSON_NAGIOS_4X
case SD_HOST_UP :
# else
case HOST_UP :
# endif
up + + ;
break ;
# ifdef JSON_NAGIOS_4X
case SD_HOST_UNREACHABLE :
# else
case HOST_UNREACHABLE :
# endif
unreachable + + ;
break ;
# ifdef JSON_NAGIOS_4X
case SD_HOST_DOWN :
# else
case HOST_DOWN :
# endif
down + + ;
break ;
}
}
# ifdef JSON_NAGIOS_4X
if ( host_statuses & SD_HOST_UP )
# else
if ( host_statuses & HOST_UP )
# endif
json_object_append_integer ( json_count , " up " , up ) ;
# ifdef JSON_NAGIOS_4X
if ( host_statuses & SD_HOST_DOWN )
# else
if ( host_statuses & HOST_DOWN )
# endif
json_object_append_integer ( json_count , " down " , down ) ;
# ifdef JSON_NAGIOS_4X
if ( host_statuses & SD_HOST_UNREACHABLE )
# else
if ( host_statuses & HOST_UNREACHABLE )
# endif
json_object_append_integer ( json_count , " unreachable " , unreachable ) ;
if ( host_statuses & HOST_PENDING )
json_object_append_integer ( json_count , " pending " , pending ) ;
json_object_append_object ( json_data , " count " , json_count ) ;
return json_data ;
}
json_object * json_status_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 , int host_statuses ,
contact * temp_contact , int time_field , time_t start_time ,
time_t end_time , 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_host_details ;
host * temp_host ;
hoststatus * temp_hoststatus ;
int current = 0 ;
int counted = 0 ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_host_selectors ( format_options , start , count ,
use_parent_host , parent_host , use_child_host , child_host ,
temp_hostgroup , host_statuses , temp_contact , time_field , start_time ,
end_time , 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 we cannot get the status of the host, skip it. This should
probably return an error and doing so is in the todo list . */
temp_hoststatus = find_hoststatus ( temp_host - > name ) ;
if ( NULL = = temp_hoststatus ) {
continue ;
}
if ( json_status_host_passes_selection ( temp_host , use_parent_host ,
parent_host , use_child_host , child_host , temp_hostgroup ,
temp_contact , temp_hoststatus , time_field , start_time ,
end_time , temp_contactgroup , check_timeperiod ,
notification_timeperiod , check_command , event_handler ) = = 0 ) {
continue ;
}
/* If the status of the host does not match one of the status the
user requested , skip the host */
if ( ! ( temp_hoststatus - > status & host_statuses ) ) {
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_status_host_details ( json_host_details , format_options ,
temp_host , temp_hoststatus ) ;
json_object_append_object ( json_hostlist , temp_host - > name ,
json_host_details ) ;
}
else {
json_enumeration ( json_hostlist , format_options , temp_host - > name ,
temp_hoststatus - > status , svm_host_statuses ) ;
}
counted + + ;
}
current + + ;
}
json_object_append_object ( json_data , " hostlist " , json_hostlist ) ;
return json_data ;
}
json_object * json_status_host ( unsigned format_options , host * temp_host ,
hoststatus * temp_hoststatus ) {
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_status_host_details ( json_details , format_options , temp_host ,
temp_hoststatus ) ;
json_object_append_object ( json_host , " host " , json_details ) ;
return json_host ;
}
void json_status_host_details ( json_object * json_details , unsigned format_options ,
host * temp_host , hoststatus * temp_hoststatus ) {
json_object_append_string ( json_details , " name " , & percent_escapes ,
temp_host - > name ) ;
json_object_append_string ( json_details , " plugin_output " ,
& percent_escapes , temp_hoststatus - > plugin_output ) ;
json_object_append_string ( json_details , " long_plugin_output " ,
& percent_escapes , temp_hoststatus - > long_plugin_output ) ;
json_object_append_string ( json_details , " perf_data " ,
& percent_escapes , temp_hoststatus - > perf_data ) ;
json_enumeration ( json_details , format_options , " status " ,
temp_hoststatus - > status , svm_host_statuses ) ;
json_object_append_time_t ( json_details , " last_update " ,
temp_hoststatus - > last_update ) ;
json_object_append_boolean ( json_details , " has_been_checked " ,
temp_hoststatus - > has_been_checked ) ;
json_object_append_boolean ( json_details , " should_be_scheduled " ,
temp_hoststatus - > should_be_scheduled ) ;
json_object_append_integer ( json_details , " current_attempt " ,
temp_hoststatus - > current_attempt ) ;
json_object_append_integer ( json_details , " max_attempts " ,
temp_hoststatus - > max_attempts ) ;
json_object_append_time_t ( json_details , " last_check " ,
temp_hoststatus - > last_check ) ;
json_object_append_time_t ( json_details , " next_check " ,
temp_hoststatus - > next_check ) ;
json_bitmask ( json_details , format_options , " check_options " ,
temp_hoststatus - > check_options , svm_check_options ) ;
json_enumeration ( json_details , format_options , " check_type " ,
temp_hoststatus - > check_type , svm_host_check_types ) ;
json_object_append_time_t ( json_details , " last_state_change " ,
temp_hoststatus - > last_state_change ) ;
json_object_append_time_t ( json_details , " last_hard_state_change " ,
temp_hoststatus - > last_hard_state_change ) ;
json_enumeration ( json_details , format_options , " last_hard_state " ,
temp_hoststatus - > last_hard_state , svm_host_states ) ;
json_object_append_time_t ( json_details , " last_time_up " ,
temp_hoststatus - > last_time_up ) ;
json_object_append_time_t ( json_details , " last_time_down " ,
temp_hoststatus - > last_time_down ) ;
json_object_append_time_t ( json_details , " last_time_unreachable " ,
temp_hoststatus - > last_time_unreachable ) ;
json_enumeration ( json_details , format_options , " state_type " ,
temp_hoststatus - > state_type , svm_state_types ) ;
json_object_append_time_t ( json_details , " last_notification " ,
temp_hoststatus - > last_notification ) ;
json_object_append_time_t ( json_details , " next_notification " ,
temp_hoststatus - > next_notification ) ;
json_object_append_boolean ( json_details , " no_more_notifications " ,
temp_hoststatus - > no_more_notifications ) ;
json_object_append_boolean ( json_details , " notifications_enabled " ,
temp_hoststatus - > notifications_enabled ) ;
json_object_append_boolean ( json_details , " problem_has_been_acknowledged " ,
temp_hoststatus - > problem_has_been_acknowledged ) ;
json_enumeration ( json_details , format_options , " acknowledgement_type " ,
temp_hoststatus - > acknowledgement_type , svm_acknowledgement_types ) ;
json_object_append_integer ( json_details , " current_notification_number " ,
temp_hoststatus - > current_notification_number ) ;
# ifdef JSON_NAGIOS_4X
json_object_append_boolean ( json_details , " accept_passive_checks " ,
temp_hoststatus - > accept_passive_checks ) ;
# else
json_object_append_boolean ( json_details , " accept_passive_host_checks " ,
temp_hoststatus - > accept_passive_host_checks ) ;
# endif
json_object_append_boolean ( json_details , " event_handler_enabled " ,
temp_hoststatus - > event_handler_enabled ) ;
json_object_append_boolean ( json_details , " checks_enabled " ,
temp_hoststatus - > checks_enabled ) ;
json_object_append_boolean ( json_details , " flap_detection_enabled " ,
temp_hoststatus - > flap_detection_enabled ) ;
json_object_append_boolean ( json_details , " is_flapping " ,
temp_hoststatus - > is_flapping ) ;
json_object_append_real ( json_details , " percent_state_change " ,
temp_hoststatus - > percent_state_change ) ;
json_object_append_real ( json_details , " latency " , temp_hoststatus - > latency ) ;
json_object_append_real ( json_details , " execution_time " ,
temp_hoststatus - > execution_time ) ;
json_object_append_integer ( json_details , " scheduled_downtime_depth " ,
temp_hoststatus - > scheduled_downtime_depth ) ;
# ifndef JSON_NAGIOS_4X
json_object_append_boolean ( json_details , " failure_prediction_enabled " ,
temp_hoststatus - > failure_prediction_enabled ) ;
# endif
json_object_append_boolean ( json_details , " process_performance_data " ,
temp_hoststatus - > process_performance_data ) ;
# ifdef JSON_NAGIOS_4X
json_object_append_boolean ( json_details , " obsess " , temp_hoststatus - > obsess ) ;
# else
json_object_append_boolean ( json_details , " obsess_over_host " ,
temp_hoststatus - > obsess_over_host ) ;
# endif
}
int json_status_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 ,
int host_statuses ) {
hoststatus * temp_hoststatus ;
host * temp_host2 ;
/* Skip if user is not authorized for this service */
if ( FALSE = = is_authorized_for_host ( temp_host , & current_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 we cannot get the status of the host, skip it. This should
probably return an error and doing so is in the todo list . */
temp_hoststatus = find_hoststatus ( temp_host - > name ) ;
if ( NULL = = temp_hoststatus ) {
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_status_service_passes_service_selection ( service * temp_service ,
servicegroup * temp_servicegroup , contact * temp_contact ,
servicestatus * temp_servicestatus , int time_field , time_t start_time ,
time_t end_time , 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 ,
& current_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 ;
}
switch ( time_field ) {
case STATUS_TIME_INVALID :
break ;
case STATUS_TIME_LAST_UPDATE :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_update < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_update > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_CHECK :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_check < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_check > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_NEXT_CHECK :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > next_check < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > next_check > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_STATE_CHANGE :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_state_change <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_state_change > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_HARD_STATE_CHANGE :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_hard_state_change <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_hard_state_change >
end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_OK :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_time_ok < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_time_ok > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_WARNING :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_time_warning <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_time_warning > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_CRITICAL :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_time_critical <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_time_critical >
end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_TIME_UNKNOWN :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_time_unknown <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_time_unknown > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_LAST_NOTIFICATION :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > last_notification <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > last_notification > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_NEXT_NOTIFICATION :
if ( ( start_time > 0 ) & & ( temp_servicestatus - > next_notification <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_servicestatus - > next_notification > end_time ) ) {
return 0 ;
}
break ;
default :
return 0 ;
}
/* If a service description was specified, skip the services that do not
have the service description specified */
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 a 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_status_service_selectors ( unsigned format_options ,
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 , int host_statuses ,
int service_statuses , contact * temp_contact , int time_field ,
time_t start_time , time_t end_time , 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 ( 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 ( HOST_STATUS_ALL ! = host_statuses ) {
json_bitmask ( json_selectors , format_options , " host_status " ,
host_statuses , svm_host_statuses ) ;
}
if ( SERVICE_STATUS_ALL ! = service_statuses ) {
json_bitmask ( json_selectors , format_options , " service_status " ,
service_statuses , svm_service_statuses ) ;
}
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 ( time_field > 0 ) {
json_enumeration ( json_selectors , format_options , " servicetimefield " ,
time_field , svm_service_time_fields ) ;
}
if ( start_time > 0 ) {
json_object_append_time_t ( json_selectors , " starttime " , start_time ) ;
}
if ( end_time > 0 ) {
json_object_append_time_t ( json_selectors , " endtime " , end_time ) ;
}
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_status_servicecount ( unsigned format_options , host * match_host ,
int use_parent_host , host * parent_host , int use_child_host ,
host * child_host , hostgroup * temp_hostgroup ,
servicegroup * temp_servicegroup , int host_statuses ,
int service_statuses , contact * temp_contact , int time_field ,
time_t start_time , time_t end_time , 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_count ;
host * temp_host ;
service * temp_service ;
servicestatus * temp_servicestatus ;
int ok = 0 ;
int warning = 0 ;
int critical = 0 ;
int unknown = 0 ;
int pending = 0 ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_service_selectors ( format_options , 0 , 0 , use_parent_host ,
parent_host , use_child_host , child_host , temp_hostgroup , match_host ,
temp_servicegroup , host_statuses , service_statuses , temp_contact ,
time_field , start_time , end_time , service_description ,
parent_service_name , child_service_name , temp_contactgroup ,
check_timeperiod , notification_timeperiod , check_command ,
event_handler ) ) ;
json_count = json_new_object ( ) ;
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_status_service_passes_host_selection ( temp_host ,
use_parent_host , parent_host , use_child_host , child_host ,
temp_hostgroup , match_host , host_statuses ) ) {
continue ;
}
/* Get the service status. If we cannot get the status of
the service , skip it . This should probably return an
error and doing so is in the todo list . */
temp_servicestatus = find_servicestatus ( temp_service - > host_name ,
temp_service - > description ) ;
if ( NULL = = temp_servicestatus ) {
continue ;
}
if ( ! json_status_service_passes_service_selection ( temp_service ,
temp_servicegroup , temp_contact , temp_servicestatus ,
time_field , start_time , end_time , service_description ,
parent_service_name , child_service_name , temp_contactgroup ,
check_timeperiod , notification_timeperiod , check_command ,
event_handler ) ) {
continue ;
}
/* Count the services in each state */
switch ( temp_servicestatus - > status ) {
case SERVICE_PENDING :
pending + + ;
break ;
case SERVICE_OK :
ok + + ;
break ;
case SERVICE_WARNING :
warning + + ;
break ;
case SERVICE_CRITICAL :
critical + + ;
break ;
case SERVICE_UNKNOWN :
unknown + + ;
break ;
}
}
if ( service_statuses & SERVICE_OK )
json_object_append_integer ( json_count , " ok " , ok ) ;
if ( service_statuses & SERVICE_WARNING )
json_object_append_integer ( json_count , " warning " , warning ) ;
if ( service_statuses & SERVICE_CRITICAL )
json_object_append_integer ( json_count , " critical " , critical ) ;
if ( service_statuses & SERVICE_UNKNOWN )
json_object_append_integer ( json_count , " unknown " , unknown ) ;
if ( service_statuses & SERVICE_PENDING )
json_object_append_integer ( json_count , " pending " , pending ) ;
json_object_append_object ( json_data , " count " , json_count ) ;
return json_data ;
}
json_object * json_status_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 ,
int host_statuses , int service_statuses , contact * temp_contact ,
int time_field , time_t start_time , time_t end_time ,
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 ;
json_object * json_service_details ;
host * temp_host ;
service * temp_service ;
servicestatus * temp_servicestatus ;
int current = 0 ;
int counted = 0 ;
int service_count ; /* number of services on a host */
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_service_selectors ( format_options , start , count ,
use_parent_host , parent_host , use_child_host , child_host ,
temp_hostgroup , match_host , temp_servicegroup , host_statuses ,
service_statuses , temp_contact , time_field , start_time , end_time ,
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_status_service_passes_host_selection ( temp_host ,
use_parent_host , parent_host , use_child_host , child_host ,
temp_hostgroup , match_host , host_statuses ) = = 0 ) {
continue ;
}
json_servicelist = json_new_object ( ) ;
service_count = 0 ;
for ( temp_service = service_list ; temp_service ! = NULL ;
temp_service = temp_service - > next ) {
/* 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 ;
/* Get the service status. If we cannot get the status of
the service , skip it . This should probably return an
error and doing so is in the todo list . */
temp_servicestatus = find_servicestatus ( temp_service - > host_name ,
temp_service - > description ) ;
if ( NULL = = temp_servicestatus ) {
continue ;
}
if ( json_status_service_passes_service_selection ( temp_service ,
temp_servicegroup , temp_contact , temp_servicestatus ,
time_field , start_time , end_time ,
service_description , parent_service_name ,
child_service_name , temp_contactgroup ,
check_timeperiod , notification_timeperiod ,
check_command , event_handler ) = = 0 ) {
continue ;
}
/* If the status of the service does not match one of the status the
user requested , skip the service */
if ( ! ( temp_servicestatus - > status & service_statuses ) ) {
continue ;
}
service_count + + ;
/* 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_status_service_details ( json_service_details ,
format_options ,
temp_service , temp_servicestatus ) ;
json_object_append_object ( json_servicelist ,
temp_service - > description ,
json_service_details ) ;
}
else {
json_enumeration ( json_servicelist , format_options ,
temp_service - > description ,
temp_servicestatus - > status ,
svm_service_statuses ) ;
}
counted + + ;
}
current + + ;
}
if ( service_count > 0 ) {
json_object_append_object ( json_hostlist , temp_host - > name ,
json_servicelist ) ;
}
}
json_object_append_object ( json_data , " servicelist " , json_hostlist ) ;
return json_data ;
}
json_object * json_status_service ( unsigned format_options , service * temp_service ,
servicestatus * temp_servicestatus ) {
json_object * json_service = json_new_object ( ) ;
json_object * json_details = json_new_object ( ) ;
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_status_service_details ( json_details , format_options , temp_service ,
temp_servicestatus ) ;
json_object_append_object ( json_service , " service " , json_details ) ;
return json_service ;
}
void json_status_service_details ( json_object * json_details ,
unsigned format_options , service * temp_service ,
servicestatus * temp_servicestatus ) {
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 , " plugin_output " , & percent_escapes ,
temp_servicestatus - > plugin_output ) ;
json_object_append_string ( json_details , " long_plugin_output " ,
& percent_escapes , temp_servicestatus - > long_plugin_output ) ;
json_object_append_string ( json_details , " perf_data " , & percent_escapes ,
temp_servicestatus - > perf_data ) ;
json_object_append_integer ( json_details , " max_attempts " ,
temp_servicestatus - > max_attempts ) ;
json_object_append_integer ( json_details , " current_attempt " ,
temp_servicestatus - > current_attempt ) ;
json_enumeration ( json_details , format_options , " status " ,
temp_servicestatus - > status , svm_service_statuses ) ;
json_object_append_time_t ( json_details , " last_update " ,
temp_servicestatus - > last_update ) ;
json_object_append_boolean ( json_details , " has_been_checked " ,
temp_servicestatus - > has_been_checked ) ;
json_object_append_boolean ( json_details , " should_be_scheduled " ,
temp_servicestatus - > should_be_scheduled ) ;
json_object_append_time_t ( json_details , " last_check " ,
temp_servicestatus - > last_check ) ;
json_bitmask ( json_details , format_options , " check_options " ,
temp_servicestatus - > check_options , svm_check_options ) ;
json_enumeration ( json_details , format_options , " check_type " ,
temp_servicestatus - > check_type , svm_service_check_types ) ;
json_object_append_boolean ( json_details , " checks_enabled " ,
temp_servicestatus - > checks_enabled ) ;
json_object_append_time_t ( json_details , " last_state_change " ,
temp_servicestatus - > last_state_change ) ;
json_object_append_time_t ( json_details , " last_hard_state_change " ,
temp_servicestatus - > last_hard_state_change ) ;
json_enumeration ( json_details , format_options , " last_hard_state " ,
temp_servicestatus - > last_hard_state , svm_service_states ) ;
json_object_append_time_t ( json_details , " last_time_ok " ,
temp_servicestatus - > last_time_ok ) ;
json_object_append_time_t ( json_details , " last_time_warning " ,
temp_servicestatus - > last_time_warning ) ;
json_object_append_time_t ( json_details , " last_time_unknown " ,
temp_servicestatus - > last_time_unknown ) ;
json_object_append_time_t ( json_details , " last_time_critical " ,
temp_servicestatus - > last_time_critical ) ;
json_enumeration ( json_details , format_options , " state_type " ,
temp_servicestatus - > state_type , svm_state_types ) ;
json_object_append_time_t ( json_details , " last_notification " ,
temp_servicestatus - > last_notification ) ;
json_object_append_time_t ( json_details , " next_notification " ,
temp_servicestatus - > next_notification ) ;
json_object_append_time_t ( json_details , " next_check " ,
temp_servicestatus - > next_check ) ;
json_object_append_boolean ( json_details , " no_more_notifications " ,
temp_servicestatus - > no_more_notifications ) ;
json_object_append_boolean ( json_details , " notifications_enabled " ,
temp_servicestatus - > notifications_enabled ) ;
json_object_append_boolean ( json_details , " problem_has_been_acknowledged " ,
temp_servicestatus - > problem_has_been_acknowledged ) ;
json_enumeration ( json_details , format_options , " acknowledgement_type " ,
temp_servicestatus - > acknowledgement_type ,
svm_acknowledgement_types ) ;
json_object_append_integer ( json_details , " current_notification_number " ,
temp_servicestatus - > current_notification_number ) ;
# ifdef JSON_NAGIOS_4X
json_object_append_boolean ( json_details , " accept_passive_checks " ,
temp_servicestatus - > accept_passive_checks ) ;
# else
json_object_append_boolean ( json_details , " accept_passive_service_checks " ,
temp_servicestatus - > accept_passive_service_checks ) ;
# endif
json_object_append_boolean ( json_details , " event_handler_enabled " ,
temp_servicestatus - > event_handler_enabled ) ;
json_object_append_boolean ( json_details , " flap_detection_enabled " ,
temp_servicestatus - > flap_detection_enabled ) ;
json_object_append_boolean ( json_details , " is_flapping " ,
temp_servicestatus - > is_flapping ) ;
json_object_append_real ( json_details , " percent_state_change " ,
temp_servicestatus - > percent_state_change ) ;
json_object_append_real ( json_details , " latency " , temp_servicestatus - > latency ) ;
json_object_append_real ( json_details , " execution_time " ,
temp_servicestatus - > execution_time ) ;
json_object_append_integer ( json_details , " scheduled_downtime_depth " ,
temp_servicestatus - > scheduled_downtime_depth ) ;
# ifndef JSON_NAGIOS_4X
json_object_append_boolean ( json_details , " failure_prediction_enabled " ,
temp_servicestatus - > failure_prediction_enabled ) ;
# endif
json_object_append_boolean ( json_details , " process_performance_data " ,
temp_servicestatus - > process_performance_data ) ;
# ifdef JSON_NAGIOS_4X
json_object_append_boolean ( json_details , " obsess " ,
temp_servicestatus - > obsess ) ;
# else
json_object_append_boolean ( json_details , " obsess_over_service " ,
temp_servicestatus - > obsess_over_service ) ;
# endif
}
int json_status_comment_passes_selection ( nagios_comment * temp_comment ,
int time_field , time_t start_time , time_t end_time ,
unsigned comment_types , unsigned entry_types , unsigned persistence ,
unsigned expiring , char * host_name , char * service_description ) {
switch ( time_field ) {
case STATUS_TIME_INVALID :
break ;
case STATUS_TIME_ENTRY_TIME :
if ( ( start_time > 0 ) & & ( temp_comment - > entry_time < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_comment - > entry_time > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_EXPIRE_TIME :
if ( ( start_time > 0 ) & & ( temp_comment - > expire_time < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_comment - > expire_time > end_time ) ) {
return 0 ;
}
break ;
default :
return 0 ;
}
if ( comment_types ! = COMMENT_TYPE_ALL ) {
switch ( temp_comment - > comment_type ) {
case HOST_COMMENT :
if ( ! ( comment_types & COMMENT_TYPE_HOST ) ) {
return 0 ;
}
break ;
case SERVICE_COMMENT :
if ( ! ( comment_types & COMMENT_TYPE_SERVICE ) ) {
return 0 ;
}
break ;
}
}
if ( entry_types ! = COMMENT_ENTRY_ALL ) {
switch ( temp_comment - > entry_type ) {
case USER_COMMENT :
if ( ! ( entry_types & COMMENT_ENTRY_USER ) ) {
return 0 ;
}
break ;
case DOWNTIME_COMMENT :
if ( ! ( entry_types & COMMENT_ENTRY_DOWNTIME ) ) {
return 0 ;
}
break ;
case FLAPPING_COMMENT :
if ( ! ( entry_types & COMMENT_ENTRY_FLAPPING ) ) {
return 0 ;
}
break ;
case ACKNOWLEDGEMENT_COMMENT :
if ( ! ( entry_types & COMMENT_ENTRY_ACKNOWLEDGEMENT ) ) {
return 0 ;
}
break ;
}
}
if ( persistence ! = BOOLEAN_EITHER ) {
switch ( temp_comment - > persistent ) {
case 0 : /* false */
if ( ! ( persistence & BOOLEAN_FALSE ) ) {
return 0 ;
}
break ;
case 1 : /* true */
if ( ! ( persistence & BOOLEAN_TRUE ) ) {
return 0 ;
}
break ;
}
}
if ( expiring ! = BOOLEAN_EITHER ) {
switch ( temp_comment - > expires ) {
case 0 : /* false */
if ( ! ( expiring & BOOLEAN_FALSE ) ) {
return 0 ;
}
break ;
case 1 : /* true */
if ( ! ( expiring & BOOLEAN_TRUE ) ) {
return 0 ;
}
break ;
}
}
if ( NULL ! = host_name ) {
if ( ( NULL = = temp_comment - > host_name ) | |
strcmp ( temp_comment - > host_name , host_name ) ) {
return 0 ;
}
}
if ( NULL ! = service_description ) {
if ( ( NULL = = temp_comment - > service_description ) | |
strcmp ( temp_comment - > service_description ,
service_description ) ) {
return 0 ;
}
}
return 1 ;
}
json_object * json_status_comment_selectors ( unsigned format_options , int start ,
int count , int time_field , time_t start_time , time_t end_time ,
unsigned comment_types , unsigned entry_types , unsigned persistence ,
unsigned expiring , char * host_name , char * service_description ) {
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 ( time_field > 0 ) {
json_enumeration ( json_selectors , format_options , " commenttimefield " ,
time_field , svm_comment_time_fields ) ;
}
if ( start_time > 0 ) {
json_object_append_time_t ( json_selectors , " starttime " , start_time ) ;
}
if ( end_time > 0 ) {
json_object_append_time_t ( json_selectors , " endtime " , end_time ) ;
}
if ( comment_types ! = COMMENT_TYPE_ALL ) {
json_bitmask ( json_selectors , format_options , " commenttypes " ,
comment_types , svm_valid_comment_types ) ;
}
if ( entry_types ! = COMMENT_ENTRY_ALL ) {
json_bitmask ( json_selectors , format_options , " entrytypes " ,
entry_types , svm_valid_comment_entry_types ) ;
}
if ( persistence ! = BOOLEAN_EITHER ) {
json_bitmask ( json_selectors , format_options , " persistence " ,
persistence , svm_valid_persistence ) ;
}
if ( expiring ! = BOOLEAN_EITHER ) {
json_bitmask ( json_selectors , format_options , " expiring " ,
expiring , svm_valid_expiration ) ;
}
if ( NULL ! = host_name ) {
json_object_append_string ( json_selectors , " hostname " , & percent_escapes ,
host_name ) ;
}
if ( NULL ! = service_description ) {
json_object_append_string ( json_selectors , " servicedescription " ,
& percent_escapes , service_description ) ;
}
return json_selectors ;
}
json_object * json_status_commentcount ( unsigned format_options , int time_field ,
time_t start_time , time_t end_time , unsigned comment_types ,
unsigned entry_types , unsigned persistence , unsigned expiring ,
char * host_name , char * service_description ) {
json_object * json_data ;
nagios_comment * temp_comment ;
int count = 0 ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_comment_selectors ( format_options , 0 , 0 , time_field ,
start_time , end_time , comment_types , entry_types , persistence ,
expiring , host_name , service_description ) ) ;
for ( temp_comment = comment_list ; temp_comment ! = NULL ;
temp_comment = temp_comment - > next ) {
if ( json_status_comment_passes_selection ( temp_comment , time_field ,
start_time , end_time , comment_types , entry_types ,
persistence , expiring , host_name , service_description ) = = 0 ) {
continue ;
}
count + + ;
}
json_object_append_integer ( json_data , " count " , count ) ;
return json_data ;
}
json_object * json_status_commentlist ( unsigned format_options , int start ,
int count , int details , int time_field , time_t start_time ,
time_t end_time , unsigned comment_types , unsigned entry_types ,
unsigned persistence , unsigned expiring , char * host_name ,
char * service_description ) {
json_object * json_data ;
json_object * json_commentlist_object = NULL ;
json_object * json_commentlist_array = NULL ;
json_object * json_comment_details ;
nagios_comment * temp_comment ;
int current = 0 ;
int counted = 0 ;
char * buf ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_comment_selectors ( format_options , start , count ,
time_field , start_time , end_time , comment_types , entry_types ,
persistence , expiring , host_name , service_description ) ) ;
if ( details > 0 ) {
json_commentlist_object = json_new_object ( ) ;
}
else {
json_commentlist_array = json_new_array ( ) ;
}
for ( temp_comment = comment_list ; temp_comment ! = NULL ;
temp_comment = temp_comment - > next ) {
if ( json_status_comment_passes_selection ( temp_comment , time_field ,
start_time , end_time , comment_types , entry_types ,
persistence , expiring , host_name , service_description ) = = 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 ) {
asprintf ( & buf , " %lu " , temp_comment - > comment_id ) ;
json_comment_details = json_new_object ( ) ;
json_status_comment_details ( json_comment_details , format_options ,
temp_comment ) ;
json_object_append_object ( json_commentlist_object , buf ,
json_comment_details ) ;
}
else {
json_array_append_integer ( json_commentlist_array ,
temp_comment - > comment_id ) ;
}
counted + + ;
}
current + + ;
}
if ( details > 0 ) {
json_object_append_object ( json_data , " commentlist " ,
json_commentlist_object ) ;
}
else {
json_object_append_array ( json_data , " commentlist " ,
json_commentlist_array ) ;
}
return json_data ;
}
json_object * json_status_comment ( unsigned format_options ,
nagios_comment * temp_comment ) {
json_object * json_comment = json_new_object ( ) ;
json_object * json_details = json_new_object ( ) ;
json_object_append_integer ( json_details , " comment_id " ,
temp_comment - > comment_id ) ;
json_status_comment_details ( json_details , format_options , temp_comment ) ;
json_object_append_object ( json_comment , " comment " , json_details ) ;
return json_comment ;
}
void json_status_comment_details ( json_object * json_details ,
unsigned format_options , nagios_comment * temp_comment ) {
json_object_append_integer ( json_details , " comment_id " ,
temp_comment - > comment_id ) ;
json_enumeration ( json_details , format_options , " comment_type " ,
temp_comment - > comment_type , svm_comment_types ) ;
json_enumeration ( json_details , format_options , " entry_type " ,
temp_comment - > entry_type , svm_comment_entry_types ) ;
json_object_append_integer ( json_details , " source " , temp_comment - > source ) ;
json_object_append_boolean ( json_details , " persistent " ,
temp_comment - > persistent ) ;
json_object_append_time_t ( json_details , " entry_time " ,
temp_comment - > entry_time ) ;
json_object_append_boolean ( json_details , " expires " , temp_comment - > expires ) ;
json_object_append_time_t ( json_details , " expire_time " ,
temp_comment - > expire_time ) ;
json_object_append_string ( json_details , " host_name " , & percent_escapes ,
temp_comment - > host_name ) ;
if ( SERVICE_COMMENT = = temp_comment - > comment_type ) {
json_object_append_string ( json_details , " service_description " ,
& percent_escapes , temp_comment - > service_description ) ;
}
json_object_append_string ( json_details , " author " , & percent_escapes ,
temp_comment - > author ) ;
json_object_append_string ( json_details , " comment_data " , & percent_escapes ,
temp_comment - > comment_data ) ;
}
int json_status_downtime_passes_selection ( scheduled_downtime * temp_downtime ,
int time_field , time_t start_time , time_t end_time ,
unsigned object_types , unsigned downtime_types , unsigned triggered ,
int triggered_by , unsigned in_effect , char * host_name ,
char * service_description ) {
switch ( time_field ) {
case STATUS_TIME_INVALID :
break ;
case STATUS_TIME_ENTRY_TIME :
if ( ( start_time > 0 ) & & ( temp_downtime - > entry_time < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_downtime - > entry_time > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_START_TIME :
if ( ( start_time > 0 ) & & ( temp_downtime - > start_time < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_downtime - > start_time > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_FLEX_DOWNTIME_START :
if ( ( start_time > 0 ) & & ( temp_downtime - > flex_downtime_start <
start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_downtime - > flex_downtime_start > end_time ) ) {
return 0 ;
}
break ;
case STATUS_TIME_END_TIME :
if ( ( start_time > 0 ) & & ( temp_downtime - > end_time < start_time ) ) {
return 0 ;
}
if ( ( end_time > 0 ) & & ( temp_downtime - > end_time > end_time ) ) {
return 0 ;
}
break ;
default :
return 0 ;
}
if ( object_types ! = DOWNTIME_OBJECT_TYPE_ALL ) {
switch ( temp_downtime - > type ) {
case HOST_DOWNTIME :
if ( ! ( object_types & DOWNTIME_OBJECT_TYPE_HOST ) ) {
return 0 ;
}
break ;
case SERVICE_DOWNTIME :
if ( ! ( object_types & DOWNTIME_OBJECT_TYPE_SERVICE ) ) {
return 0 ;
}
break ;
}
}
if ( downtime_types ! = DOWNTIME_TYPE_ALL ) {
if ( temp_downtime - > fixed ) {
if ( ! ( downtime_types & DOWNTIME_TYPE_FIXED ) ) {
return 0 ;
}
}
else {
if ( ! ( downtime_types & DOWNTIME_TYPE_FLEXIBLE ) ) {
return 0 ;
}
}
}
if ( triggered ! = BOOLEAN_EITHER ) {
if ( 0 = = temp_downtime - > triggered_by ) {
if ( ! ( triggered & BOOLEAN_FALSE ) ) {
return 0 ;
}
}
else {
if ( ! ( triggered & BOOLEAN_TRUE ) ) {
return 0 ;
}
}
}
if ( triggered_by ! = - 1 ) {
if ( temp_downtime - > triggered_by ! = ( unsigned long ) triggered_by ) {
return 0 ;
}
}
if ( in_effect ! = BOOLEAN_EITHER ) {
if ( 0 = = temp_downtime - > is_in_effect ) {
if ( ! ( in_effect & BOOLEAN_FALSE ) ) {
return 0 ;
}
}
else {
if ( ! ( in_effect & BOOLEAN_TRUE ) ) {
return 0 ;
}
}
}
if ( NULL ! = host_name ) {
if ( ( NULL = = temp_downtime - > host_name ) | |
strcmp ( temp_downtime - > host_name , host_name ) ) {
return 0 ;
}
}
if ( NULL ! = service_description ) {
if ( ( NULL = = temp_downtime - > service_description ) | |
strcmp ( temp_downtime - > service_description ,
service_description ) ) {
return 0 ;
}
}
return 1 ;
}
json_object * json_status_downtime_selectors ( unsigned format_options , int start ,
int count , int time_field , time_t start_time , time_t end_time ,
unsigned object_types , unsigned downtime_types , unsigned triggered ,
int triggered_by , unsigned in_effect , char * host_name ,
char * service_description ) {
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 ( time_field > 0 ) {
json_enumeration ( json_selectors , format_options , " downtimetimefield " ,
time_field , svm_downtime_time_fields ) ;
}
if ( start_time > 0 ) {
json_object_append_time_t ( json_selectors , " starttime " , start_time ) ;
}
if ( end_time > 0 ) {
json_object_append_time_t ( json_selectors , " endtime " , end_time ) ;
}
if ( object_types ! = DOWNTIME_OBJECT_TYPE_ALL ) {
json_bitmask ( json_selectors , format_options , " downtimeobjecttypes " ,
object_types , svm_valid_downtime_object_types ) ;
}
if ( downtime_types ! = DOWNTIME_TYPE_ALL ) {
json_bitmask ( json_selectors , format_options , " downtimetypes " ,
downtime_types , svm_valid_downtime_types ) ;
}
if ( triggered ! = BOOLEAN_EITHER ) {
json_bitmask ( json_selectors , format_options , " triggered " ,
triggered , svm_valid_triggered_status ) ;
}
if ( triggered_by ! = - 1 ) {
json_object_append_integer ( json_selectors , " triggeredby " , triggered_by ) ;
}
if ( in_effect ! = BOOLEAN_EITHER ) {
json_bitmask ( json_selectors , format_options , " ineffect " ,
in_effect , svm_valid_in_effect_status ) ;
}
if ( NULL ! = host_name ) {
json_object_append_string ( json_selectors , " hostname " , & percent_escapes ,
host_name ) ;
}
if ( NULL ! = service_description ) {
json_object_append_string ( json_selectors , " servicedescription " ,
& percent_escapes , service_description ) ;
}
return json_selectors ;
}
json_object * json_status_downtimecount ( unsigned format_options , int time_field ,
time_t start_time , time_t end_time , unsigned object_types ,
unsigned downtime_types , unsigned triggered , int triggered_by ,
unsigned in_effect , char * host_name , char * service_description ) {
json_object * json_data ;
scheduled_downtime * temp_downtime ;
int count = 0 ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_downtime_selectors ( format_options , 0 , 0 , time_field ,
start_time , end_time , object_types , downtime_types , triggered ,
triggered_by , in_effect , host_name , service_description ) ) ;
for ( temp_downtime = scheduled_downtime_list ; temp_downtime ! = NULL ;
temp_downtime = temp_downtime - > next ) {
if ( ! json_status_downtime_passes_selection ( temp_downtime , time_field ,
start_time , end_time , object_types , downtime_types ,
triggered , triggered_by , in_effect , host_name ,
service_description ) ) {
continue ;
}
count + + ;
}
json_object_append_integer ( json_data , " count " , count ) ;
return json_data ;
}
json_object * json_status_downtimelist ( unsigned format_options , int start ,
int count , int details , int time_field , time_t start_time ,
time_t end_time , unsigned object_types , unsigned downtime_types ,
unsigned triggered , int triggered_by , unsigned in_effect ,
char * host_name , char * service_description ) {
json_object * json_data ;
json_object * json_downtimelist_object = NULL ;
json_object * json_downtimelist_array = NULL ;
json_object * json_downtime_details ;
scheduled_downtime * temp_downtime ;
int current = 0 ;
int counted = 0 ;
char * buf ;
json_data = json_new_object ( ) ;
json_object_append_object ( json_data , " selectors " ,
json_status_downtime_selectors ( format_options , start , count ,
time_field , start_time , end_time , object_types , downtime_types ,
triggered , triggered_by , in_effect , host_name ,
service_description ) ) ;
if ( details > 0 ) {
json_downtimelist_object = json_new_object ( ) ;
}
else {
json_downtimelist_array = json_new_array ( ) ;
}
for ( temp_downtime = scheduled_downtime_list ; temp_downtime ! = NULL ;
temp_downtime = temp_downtime - > next ) {
if ( ! json_status_downtime_passes_selection ( temp_downtime , time_field ,
start_time , end_time , object_types , downtime_types ,
triggered , triggered_by , in_effect , host_name ,
service_description ) ) {
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 ) {
asprintf ( & buf , " %lu " , temp_downtime - > downtime_id ) ;
json_downtime_details = json_new_object ( ) ;
json_status_downtime_details ( json_downtime_details ,
format_options , temp_downtime ) ;
json_object_append_object ( json_downtimelist_object , buf ,
json_downtime_details ) ;
}
else {
json_array_append_integer ( json_downtimelist_array ,
temp_downtime - > downtime_id ) ;
}
counted + + ;
}
current + + ;
}
if ( details > 0 ) {
json_object_append_object ( json_data , " downtimelist " ,
json_downtimelist_object ) ;
}
else {
json_object_append_array ( json_data , " downtimelist " ,
json_downtimelist_array ) ;
}
return json_data ;
}
json_object * json_status_downtime ( unsigned format_options ,
scheduled_downtime * temp_downtime ) {
json_object * json_downtime = json_new_object ( ) ;
json_object * json_details = json_new_object ( ) ;
json_object_append_integer ( json_details , " downtime_id " ,
temp_downtime - > downtime_id ) ;
json_status_downtime_details ( json_details , format_options , temp_downtime ) ;
json_object_append_object ( json_downtime , " downtime " , json_details ) ;
return json_downtime ;
}
void json_status_downtime_details ( json_object * json_details ,
unsigned format_options , scheduled_downtime * temp_downtime ) {
json_object_append_integer ( json_details , " downtime_id " ,
temp_downtime - > downtime_id ) ;
json_enumeration ( json_details , format_options , " type " , temp_downtime - > type ,
svm_downtime_types ) ;
json_object_append_string ( json_details , " host_name " , & percent_escapes ,
temp_downtime - > host_name ) ;
if ( SERVICE_DOWNTIME = = temp_downtime - > type ) {
json_object_append_string ( json_details , " service_description " ,
& percent_escapes , temp_downtime - > service_description ) ;
}
json_object_append_time_t ( json_details , " entry_time " ,
temp_downtime - > entry_time ) ;
json_object_append_time_t ( json_details , " start_time " ,
temp_downtime - > start_time ) ;
json_object_append_time_t ( json_details , " flex_downtime_start " ,
temp_downtime - > flex_downtime_start ) ;
json_object_append_time_t ( json_details , " end_time " , temp_downtime - > end_time ) ;
json_object_append_boolean ( json_details , " fixed " , temp_downtime - > fixed ) ;
json_object_append_integer ( json_details , " triggered_by " ,
( int ) temp_downtime - > triggered_by ) ;
json_object_append_integer ( json_details , " duration " ,
( int ) temp_downtime - > duration ) ;
json_object_append_boolean ( json_details , " is_in_effect " ,
temp_downtime - > is_in_effect ) ;
json_object_append_boolean ( json_details , " start_notification_sent " ,
temp_downtime - > start_notification_sent ) ;
json_object_append_string ( json_details , " author " , & percent_escapes ,
temp_downtime - > author ) ;
json_object_append_string ( json_details , " comment " , & percent_escapes ,
temp_downtime - > comment ) ;
}
json_object * json_status_program ( unsigned format_options ) {
json_object * json_data ;
json_object * json_status ;
json_data = json_new_object ( ) ;
json_status = json_new_object ( ) ;
#if 0
json_object_append_unsigned ( json_status , " modified_host_attributes " ,
( unsigned long long ) modified_host_process_attributes ) ;
json_object_append_unsigned ( json_status ,
" modified_service_process_attributes " ,
( unsigned long long ) modified_service_process_attributes ) ;
# endif
json_object_append_string ( json_status , " version " , NULL , PROGRAM_VERSION ) ;
json_object_append_integer ( json_status , " nagios_pid " , nagios_pid ) ;
json_object_append_boolean ( json_status , " daemon_mode " , daemon_mode ) ;
json_object_append_time_t ( json_status , " program_start " , program_start ) ;
# ifndef JSON_NAGIOS_4X
json_object_append_time_t ( json_status , " last_command_check " ,
last_command_check ) ;
# endif
json_object_append_time_t ( json_status , " last_log_rotation " ,
last_log_rotation ) ;
json_object_append_boolean ( json_status , " enable_notifications " ,
enable_notifications ) ;
json_object_append_boolean ( json_status , " execute_service_checks " ,
execute_service_checks ) ;
json_object_append_boolean ( json_status , " accept_passive_service_checks " ,
accept_passive_service_checks ) ;
json_object_append_boolean ( json_status , " execute_host_checks " ,
execute_host_checks ) ;
json_object_append_boolean ( json_status , " accept_passive_host_checks " ,
accept_passive_host_checks ) ;
json_object_append_boolean ( json_status , " enable_event_handlers " ,
enable_event_handlers ) ;
json_object_append_boolean ( json_status , " obsess_over_services " ,
obsess_over_services ) ;
json_object_append_boolean ( json_status , " obsess_over_hosts " ,
obsess_over_hosts ) ;
json_object_append_boolean ( json_status , " check_service_freshness " ,
check_service_freshness ) ;
json_object_append_boolean ( json_status , " check_host_freshness " ,
check_host_freshness ) ;
json_object_append_boolean ( json_status , " enable_flap_detection " ,
enable_flap_detection ) ;
# ifndef JSON_NAGIOS_4X
json_object_append_boolean ( json_status , " enable_failure_prediction " ,
enable_failure_prediction ) ;
# endif
json_object_append_boolean ( json_status , " process_performance_data " ,
process_performance_data ) ;
#if 0
json_object_append_string ( json_status , " global_host_event_handler " ,
& percent_escapes , global_host_event_handler ) ;
json_object_append_string ( json_status , " global_service_event_handler " ,
& percent_escapes , global_service_event_handler ) ;
json_object_append_unsigned ( json_status , " next_comment_id " ,
( unsigned long long ) next_comment_id ) ;
json_object_append_unsigned ( json_status , " next_downtime_id " ,
( unsigned long long ) next_downtime_id ) ;
json_object_append_unsigned ( json_status , " next_event_id " ,
( unsigned long long ) next_event_id ) ;
json_object_append_unsigned ( json_status , " next_problem_id " ,
( unsigned long long ) next_problem_id ) ;
json_object_append_unsigned ( json_status , " next_notification_id " ,
( unsigned long long ) next_notification_id ) ;
json_object_append_unsigned ( json_status ,
" total_external_command_buffer_slots " ,
( unsigned long long ) external_command_buffer_slots ) ;
json_object_append_unsigned ( json_status , " used_external_command_buffer_slots " ,
( unsigned long long ) used_external_command_buffer_slots ) ;
json_object_append_unsigned ( json_status , " high_external_command_buffer_slots " ,
( unsigned long long ) high_external_command_buffer_slots ) ;
json_object_append_string ( json_status , " active_scheduled_host_check_stats " ,
NULL , " %d,%d,%d " ,
check_statistics [ ACTIVE_SCHEDULED_HOST_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ ACTIVE_SCHEDULED_HOST_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ ACTIVE_SCHEDULED_HOST_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " active_ondemand_host_check_stats " ,
NULL , " %d,%d,%d " ,
check_statistics [ ACTIVE_ONDEMAND_HOST_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ ACTIVE_ONDEMAND_HOST_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ ACTIVE_ONDEMAND_HOST_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " passive_host_check_stats " , NULL ,
" %d,%d,%d " ,
check_statistics [ PASSIVE_HOST_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ PASSIVE_HOST_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ PASSIVE_HOST_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status ,
" active_scheduled_service_check_stats " , NULL , " %d,%d,%d " ,
check_statistics [ ACTIVE_SCHEDULED_SERVICE_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ ACTIVE_SCHEDULED_SERVICE_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ ACTIVE_SCHEDULED_SERVICE_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " active_ondemand_service_check_stats " ,
NULL , " %d,%d,%d " ,
check_statistics [ ACTIVE_ONDEMAND_SERVICE_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ ACTIVE_ONDEMAND_SERVICE_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ ACTIVE_ONDEMAND_SERVICE_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " passive_service_check_stats " ,
NULL , " %d,%d,%d " ,
check_statistics [ PASSIVE_SERVICE_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ PASSIVE_SERVICE_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ PASSIVE_SERVICE_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " cached_host_check_stats " , NULL ,
" %d,%d,%d " ,
check_statistics [ ACTIVE_CACHED_HOST_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ ACTIVE_CACHED_HOST_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ ACTIVE_CACHED_HOST_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " cached_service_check_stats " ,
NULL , " %d,%d,%d " ,
check_statistics [ ACTIVE_CACHED_SERVICE_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ ACTIVE_CACHED_SERVICE_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ ACTIVE_CACHED_SERVICE_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " external_command_stats " , NULL ,
" %d,%d,%d " ,
check_statistics [ EXTERNAL_COMMAND_STATS ] . minute_stats [ 0 ] ,
check_statistics [ EXTERNAL_COMMAND_STATS ] . minute_stats [ 1 ] ,
check_statistics [ EXTERNAL_COMMAND_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " parallel_host_check_stats " ,
NULL , " %d,%d,%d " ,
check_statistics [ PARALLEL_HOST_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ PARALLEL_HOST_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ PARALLEL_HOST_CHECK_STATS ] . minute_stats [ 2 ] ) ;
json_object_append_string ( json_status , " serial_host_check_stats " , NULL ,
" %d,%d,%d " ,
check_statistics [ SERIAL_HOST_CHECK_STATS ] . minute_stats [ 0 ] ,
check_statistics [ SERIAL_HOST_CHECK_STATS ] . minute_stats [ 1 ] ,
check_statistics [ SERIAL_HOST_CHECK_STATS ] . minute_stats [ 2 ] ) ;
# endif
json_object_append_object ( json_data , " programstatus " , json_status ) ;
return json_data ;
}
json_object * json_status_performance ( void ) {
service * temp_service = NULL ;
servicestatus * temp_servicestatus = NULL ;
host * temp_host = NULL ;
hoststatus * temp_hoststatus = NULL ;
int total_active_service_checks = 0 ;
int total_passive_service_checks = 0 ;
double min_service_execution_time = 0.0 ;
double max_service_execution_time = 0.0 ;
double total_service_execution_time = 0.0 ;
int have_min_service_execution_time = FALSE ;
int have_max_service_execution_time = FALSE ;
double min_service_latency = 0.0 ;
double max_service_latency = 0.0 ;
double long total_service_latency = 0.0 ;
int have_min_service_latency = FALSE ;
int have_max_service_latency = FALSE ;
double min_host_latency = 0.0 ;
double max_host_latency = 0.0 ;
double total_host_latency = 0.0 ;
int have_min_host_latency = FALSE ;
int have_max_host_latency = FALSE ;
double min_service_percent_change_a = 0.0 ;
double max_service_percent_change_a = 0.0 ;
double total_service_percent_change_a = 0.0 ;
int have_min_service_percent_change_a = FALSE ;
int have_max_service_percent_change_a = FALSE ;
double min_service_percent_change_b = 0.0 ;
double max_service_percent_change_b = 0.0 ;
double total_service_percent_change_b = 0.0 ;
int have_min_service_percent_change_b = FALSE ;
int have_max_service_percent_change_b = FALSE ;
int active_service_checks_1min = 0 ;
int active_service_checks_5min = 0 ;
int active_service_checks_15min = 0 ;
int active_service_checks_1hour = 0 ;
int active_service_checks_start = 0 ;
int active_service_checks_ever = 0 ;
int passive_service_checks_1min = 0 ;
int passive_service_checks_5min = 0 ;
int passive_service_checks_15min = 0 ;
int passive_service_checks_1hour = 0 ;
int passive_service_checks_start = 0 ;
int passive_service_checks_ever = 0 ;
int total_active_host_checks = 0 ;
int total_passive_host_checks = 0 ;
double min_host_execution_time = 0.0 ;
double max_host_execution_time = 0.0 ;
double total_host_execution_time = 0.0 ;
int have_min_host_execution_time = FALSE ;
int have_max_host_execution_time = FALSE ;
double min_host_percent_change_a = 0.0 ;
double max_host_percent_change_a = 0.0 ;
double total_host_percent_change_a = 0.0 ;
int have_min_host_percent_change_a = FALSE ;
int have_max_host_percent_change_a = FALSE ;
double min_host_percent_change_b = 0.0 ;
double max_host_percent_change_b = 0.0 ;
double total_host_percent_change_b = 0.0 ;
int have_min_host_percent_change_b = FALSE ;
int have_max_host_percent_change_b = FALSE ;
int active_host_checks_1min = 0 ;
int active_host_checks_5min = 0 ;
int active_host_checks_15min = 0 ;
int active_host_checks_1hour = 0 ;
int active_host_checks_start = 0 ;
int active_host_checks_ever = 0 ;
int passive_host_checks_1min = 0 ;
int passive_host_checks_5min = 0 ;
int passive_host_checks_15min = 0 ;
int passive_host_checks_1hour = 0 ;
int passive_host_checks_start = 0 ;
int passive_host_checks_ever = 0 ;
time_t current_time ;
json_object * json_data ;
json_object * json_programstatus ;
json_object * json_service_checks ;
json_object * json_host_checks ;
json_object * json_check_statistics ;
json_object * json_buffer_usage ;
json_object * json_active ;
json_object * json_passive ;
json_object * json_checks ;
json_object * json_metrics ;
json_object * json_temp ;
time ( & current_time ) ;
/* check all services */
for ( temp_servicestatus = servicestatus_list ; temp_servicestatus ! = NULL ;
temp_servicestatus = temp_servicestatus - > next ) {
/* find the service */
temp_service = find_service ( temp_servicestatus - > host_name ,
temp_servicestatus - > description ) ;
if ( NULL = = temp_service ) {
continue ;
}
/* make sure the user has rights to view service information */
if ( FALSE = = is_authorized_for_service ( temp_service ,
& current_authdata ) ) {
continue ;
}
/* is this an active or passive check? */
if ( SERVICE_CHECK_ACTIVE = = temp_servicestatus - > check_type ) {
total_active_service_checks + + ;
total_service_execution_time + = temp_servicestatus - > execution_time ;
if ( have_min_service_execution_time = = FALSE | |
temp_servicestatus - > execution_time <
min_service_execution_time ) {
have_min_service_execution_time = TRUE ;
min_service_execution_time = temp_servicestatus - > execution_time ;
}
if ( have_max_service_execution_time = = FALSE | |
temp_servicestatus - > execution_time >
max_service_execution_time ) {
have_max_service_execution_time = TRUE ;
max_service_execution_time = temp_servicestatus - > execution_time ;
}
total_service_percent_change_a + =
temp_servicestatus - > percent_state_change ;
if ( have_min_service_percent_change_a = = FALSE | |
temp_servicestatus - > percent_state_change <
min_service_percent_change_a ) {
have_min_service_percent_change_a = TRUE ;
min_service_percent_change_a =
temp_servicestatus - > percent_state_change ;
}
if ( have_max_service_percent_change_a = = FALSE | |
temp_servicestatus - > percent_state_change >
max_service_percent_change_a ) {
have_max_service_percent_change_a = TRUE ;
max_service_percent_change_a =
temp_servicestatus - > percent_state_change ;
}
total_service_latency + = temp_servicestatus - > latency ;
if ( have_min_service_latency = = FALSE | |
temp_servicestatus - > latency < min_service_latency ) {
have_min_service_latency = TRUE ;
min_service_latency = temp_servicestatus - > latency ;
}
if ( have_max_service_latency = = FALSE | |
temp_servicestatus - > latency > max_service_latency ) {
have_max_service_latency = TRUE ;
max_service_latency = temp_servicestatus - > latency ;
}
if ( temp_servicestatus - > last_check > = ( current_time - 60 ) )
active_service_checks_1min + + ;
if ( temp_servicestatus - > last_check > = ( current_time - 300 ) )
active_service_checks_5min + + ;
if ( temp_servicestatus - > last_check > = ( current_time - 900 ) )
active_service_checks_15min + + ;
if ( temp_servicestatus - > last_check > = ( current_time - 3600 ) )
active_service_checks_1hour + + ;
if ( temp_servicestatus - > last_check > = program_start )
active_service_checks_start + + ;
if ( temp_servicestatus - > last_check ! = ( time_t ) 0 )
active_service_checks_ever + + ;
}
else {
total_passive_service_checks + + ;
total_service_percent_change_b + =
temp_servicestatus - > percent_state_change ;
if ( have_min_service_percent_change_b = = FALSE | |
temp_servicestatus - > percent_state_change <
min_service_percent_change_b ) {
have_min_service_percent_change_b = TRUE ;
min_service_percent_change_b =
temp_servicestatus - > percent_state_change ;
}
if ( have_max_service_percent_change_b = = FALSE | |
temp_servicestatus - > percent_state_change >
max_service_percent_change_b ) {
have_max_service_percent_change_b = TRUE ;
max_service_percent_change_b =
temp_servicestatus - > percent_state_change ;
}
if ( temp_servicestatus - > last_check > = ( current_time - 60 ) )
passive_service_checks_1min + + ;
if ( temp_servicestatus - > last_check > = ( current_time - 300 ) )
passive_service_checks_5min + + ;
if ( temp_servicestatus - > last_check > = ( current_time - 900 ) )
passive_service_checks_15min + + ;
if ( temp_servicestatus - > last_check > = ( current_time - 3600 ) )
passive_service_checks_1hour + + ;
if ( temp_servicestatus - > last_check > = program_start )
passive_service_checks_start + + ;
if ( temp_servicestatus - > last_check ! = ( time_t ) 0 )
passive_service_checks_ever + + ;
}
}
/* check all hosts */
for ( temp_hoststatus = hoststatus_list ; temp_hoststatus ! = NULL ;
temp_hoststatus = temp_hoststatus - > next ) {
/* find the host */
temp_host = find_host ( temp_hoststatus - > host_name ) ;
if ( NULL = = temp_host ) {
continue ;
}
/* make sure the user has rights to view host information */
if ( FALSE = = is_authorized_for_host ( temp_host , & current_authdata ) ) {
continue ;
}
/* is this an active or passive check? */
if ( temp_hoststatus - > check_type = = HOST_CHECK_ACTIVE ) {
total_active_host_checks + + ;
total_host_execution_time + = temp_hoststatus - > execution_time ;
if ( have_min_host_execution_time = = FALSE | |
temp_hoststatus - > execution_time < min_host_execution_time ) {
have_min_host_execution_time = TRUE ;
min_host_execution_time = temp_hoststatus - > execution_time ;
}
if ( have_max_host_execution_time = = FALSE | |
temp_hoststatus - > execution_time > max_host_execution_time ) {
have_max_host_execution_time = TRUE ;
max_host_execution_time = temp_hoststatus - > execution_time ;
}
total_host_percent_change_a + =
temp_hoststatus - > percent_state_change ;
if ( have_min_host_percent_change_a = = FALSE | |
temp_hoststatus - > percent_state_change <
min_host_percent_change_a ) {
have_min_host_percent_change_a = TRUE ;
min_host_percent_change_a =
temp_hoststatus - > percent_state_change ;
}
if ( have_max_host_percent_change_a = = FALSE | |
temp_hoststatus - > percent_state_change >
max_host_percent_change_a ) {
have_max_host_percent_change_a = TRUE ;
max_host_percent_change_a =
temp_hoststatus - > percent_state_change ;
}
total_host_latency + = temp_hoststatus - > latency ;
if ( have_min_host_latency = = FALSE | |
temp_hoststatus - > latency < min_host_latency ) {
have_min_host_latency = TRUE ;
min_host_latency = temp_hoststatus - > latency ;
}
if ( have_max_host_latency = = FALSE | |
temp_hoststatus - > latency > max_host_latency ) {
have_max_host_latency = TRUE ;
max_host_latency = temp_hoststatus - > latency ;
}
if ( temp_hoststatus - > last_check > = ( current_time - 60 ) )
active_host_checks_1min + + ;
if ( temp_hoststatus - > last_check > = ( current_time - 300 ) )
active_host_checks_5min + + ;
if ( temp_hoststatus - > last_check > = ( current_time - 900 ) )
active_host_checks_15min + + ;
if ( temp_hoststatus - > last_check > = ( current_time - 3600 ) )
active_host_checks_1hour + + ;
if ( temp_hoststatus - > last_check > = program_start )
active_host_checks_start + + ;
if ( temp_hoststatus - > last_check ! = ( time_t ) 0 )
active_host_checks_ever + + ;
}
else {
total_passive_host_checks + + ;
total_host_percent_change_b + = temp_hoststatus - > percent_state_change ;
if ( have_min_host_percent_change_b = = FALSE | |
temp_hoststatus - > percent_state_change <
min_host_percent_change_b ) {
have_min_host_percent_change_b = TRUE ;
min_host_percent_change_b =
temp_hoststatus - > percent_state_change ;
}
if ( have_max_host_percent_change_b = = FALSE | |
temp_hoststatus - > percent_state_change >
max_host_percent_change_b ) {
have_max_host_percent_change_b = TRUE ;
max_host_percent_change_b =
temp_hoststatus - > percent_state_change ;
}
if ( temp_hoststatus - > last_check > = ( current_time - 60 ) )
passive_host_checks_1min + + ;
if ( temp_hoststatus - > last_check > = ( current_time - 300 ) )
passive_host_checks_5min + + ;
if ( temp_hoststatus - > last_check > = ( current_time - 900 ) )
passive_host_checks_15min + + ;
if ( temp_hoststatus - > last_check > = ( current_time - 3600 ) )
passive_host_checks_1hour + + ;
if ( temp_hoststatus - > last_check > = program_start )
passive_host_checks_start + + ;
if ( temp_hoststatus - > last_check ! = ( time_t ) 0 )
passive_host_checks_ever + + ;
}
}
/* Avoid divide by zero errors */
if ( 0 = = total_active_service_checks ) {
total_active_service_checks = 1 ;
}
if ( 0 = = total_passive_service_checks ) {
total_passive_service_checks = 1 ;
}
if ( 0 = = total_active_host_checks ) {
total_active_host_checks = 1 ;
}
if ( 0 = = total_passive_host_checks ) {
total_passive_host_checks = 1 ;
}
json_data = json_new_object ( ) ;
json_programstatus = json_new_object ( ) ;
json_service_checks = json_new_object ( ) ;
/* Active Service Checks */
json_active = json_new_object ( ) ;
json_checks = json_new_object ( ) ;
json_object_append_integer ( json_checks , " 1min " , active_service_checks_1min ) ;
json_object_append_integer ( json_checks , " 5min " , active_service_checks_5min ) ;
json_object_append_integer ( json_checks , " 15min " , active_service_checks_15min ) ;
json_object_append_integer ( json_checks , " 1hour " , active_service_checks_1hour ) ;
json_object_append_integer ( json_checks , " start " , active_service_checks_start ) ;
json_object_append_object ( json_active , " checks " , json_checks ) ;
json_metrics = json_new_object ( ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_service_execution_time ) ;
json_object_append_real ( json_temp , " max " , max_service_execution_time ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_service_execution_time / ( double ) total_active_service_checks ) ) ;
json_object_append_object ( json_metrics , " check_execution_time " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_service_latency ) ;
json_object_append_real ( json_temp , " max " , max_service_latency ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_service_latency / ( double ) total_active_service_checks ) ) ;
json_object_append_object ( json_metrics , " check_latency " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_service_percent_change_a ) ;
json_object_append_real ( json_temp , " max " , max_service_percent_change_a ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_service_percent_change_a / ( double ) total_active_service_checks ) ) ;
json_object_append_object ( json_metrics , " percent_state_change " , json_temp ) ;
json_object_append_object ( json_active , " metrics " , json_metrics ) ;
json_object_append_object ( json_service_checks , " active " , json_active ) ;
/* Passive Service Checks */
json_passive = json_new_object ( ) ;
json_checks = json_new_object ( ) ;
json_object_append_integer ( json_checks , " 1min " , passive_service_checks_1min ) ;
json_object_append_integer ( json_checks , " 5min " , passive_service_checks_5min ) ;
json_object_append_integer ( json_checks , " 15min " ,
passive_service_checks_15min ) ;
json_object_append_integer ( json_checks , " 1hour " ,
passive_service_checks_1hour ) ;
json_object_append_integer ( json_checks , " start " ,
passive_service_checks_start ) ;
json_object_append_object ( json_passive , " checks " , json_checks ) ;
json_metrics = json_new_object ( ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_service_percent_change_b ) ;
json_object_append_real ( json_temp , " max " , max_service_percent_change_b ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_service_percent_change_b / ( double ) total_active_service_checks ) ) ;
json_object_append_object ( json_metrics , " percent_state_change " , json_temp ) ;
json_object_append_object ( json_passive , " metrics " , json_metrics ) ;
json_object_append_object ( json_service_checks , " passive " , json_passive ) ;
json_object_append_object ( json_programstatus , " service_checks " ,
json_service_checks ) ;
json_host_checks = json_new_object ( ) ;
/* Active Host Checks */
json_active = json_new_object ( ) ;
json_checks = json_new_object ( ) ;
json_object_append_integer ( json_checks , " 1min " , active_host_checks_1min ) ;
json_object_append_integer ( json_checks , " 5min " , active_host_checks_5min ) ;
json_object_append_integer ( json_checks , " 15min " , active_host_checks_15min ) ;
json_object_append_integer ( json_checks , " 1hour " , active_host_checks_1hour ) ;
json_object_append_integer ( json_checks , " start " , active_host_checks_start ) ;
json_object_append_object ( json_active , " checks " , json_checks ) ;
json_metrics = json_new_object ( ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_host_execution_time ) ;
json_object_append_real ( json_temp , " max " , max_host_execution_time ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_host_execution_time / ( double ) total_active_host_checks ) ) ;
json_object_append_object ( json_metrics , " check_execution_time " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_host_latency ) ;
json_object_append_real ( json_temp , " max " , max_host_latency ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_host_latency / ( double ) total_active_host_checks ) ) ;
json_object_append_object ( json_metrics , " check_latency " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_host_percent_change_a ) ;
json_object_append_real ( json_temp , " max " , max_host_percent_change_a ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_host_percent_change_a / ( double ) total_active_host_checks ) ) ;
json_object_append_object ( json_metrics , " percent_state_change " , json_temp ) ;
json_object_append_object ( json_active , " metrics " , json_metrics ) ;
json_object_append_object ( json_host_checks , " active " , json_active ) ;
/* Passive Host Checks */
json_passive = json_new_object ( ) ;
json_checks = json_new_object ( ) ;
json_object_append_integer ( json_checks , " 1min " , passive_host_checks_1min ) ;
json_object_append_integer ( json_checks , " 5min " , passive_host_checks_5min ) ;
json_object_append_integer ( json_checks , " 15min " , passive_host_checks_15min ) ;
json_object_append_integer ( json_checks , " 1hour " , passive_host_checks_1hour ) ;
json_object_append_integer ( json_checks , " start " , passive_host_checks_start ) ;
json_object_append_object ( json_passive , " checks " , json_checks ) ;
json_metrics = json_new_object ( ) ;
json_temp = json_new_object ( ) ;
json_object_append_real ( json_temp , " min " , min_host_percent_change_b ) ;
json_object_append_real ( json_temp , " max " , max_host_percent_change_b ) ;
json_object_append_real ( json_temp , " average " ,
( double ) ( ( double ) total_host_percent_change_b / ( double ) total_active_host_checks ) ) ;
json_object_append_object ( json_metrics , " percent_state_change " , json_temp ) ;
json_object_append_object ( json_passive , " metrics " , json_metrics ) ;
json_object_append_object ( json_host_checks , " passive " , json_passive ) ;
json_object_append_object ( json_programstatus , " host_checks " ,
json_host_checks ) ;
/* Check Stats */
json_check_statistics = json_new_object ( ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ ACTIVE_SCHEDULED_HOST_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ ACTIVE_SCHEDULED_HOST_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ ACTIVE_SCHEDULED_HOST_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" active_scheduled_host_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ ACTIVE_ONDEMAND_HOST_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ ACTIVE_ONDEMAND_HOST_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ ACTIVE_ONDEMAND_HOST_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" active_ondemand_host_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ PARALLEL_HOST_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ PARALLEL_HOST_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ PARALLEL_HOST_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" parallel_host_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ SERIAL_HOST_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ SERIAL_HOST_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ SERIAL_HOST_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" serial_host_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ ACTIVE_CACHED_HOST_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ ACTIVE_CACHED_HOST_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ ACTIVE_CACHED_HOST_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" cached_host_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ PASSIVE_HOST_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ PASSIVE_HOST_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ PASSIVE_HOST_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" passive_host_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ ACTIVE_SCHEDULED_SERVICE_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ ACTIVE_SCHEDULED_SERVICE_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ ACTIVE_SCHEDULED_SERVICE_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" active_scheduled_service_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ ACTIVE_ONDEMAND_SERVICE_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ ACTIVE_ONDEMAND_SERVICE_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ ACTIVE_ONDEMAND_SERVICE_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" active_ondemand_service_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ ACTIVE_CACHED_SERVICE_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ ACTIVE_CACHED_SERVICE_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ ACTIVE_CACHED_SERVICE_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" cached_service_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ PASSIVE_SERVICE_CHECK_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ PASSIVE_SERVICE_CHECK_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ PASSIVE_SERVICE_CHECK_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" passive_service_checks " , json_temp ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " 1min " ,
program_stats [ EXTERNAL_COMMAND_STATS ] [ 0 ] ) ;
json_object_append_integer ( json_temp , " 5min " ,
program_stats [ EXTERNAL_COMMAND_STATS ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " 15min " ,
program_stats [ EXTERNAL_COMMAND_STATS ] [ 2 ] ) ;
json_object_append_object ( json_check_statistics ,
" external_commands " , json_temp ) ;
json_object_append_object ( json_programstatus , " check_statistics " ,
json_check_statistics ) ;
/* Buffer Stats */
json_buffer_usage = json_new_object ( ) ;
json_temp = json_new_object ( ) ;
json_object_append_integer ( json_temp , " in_use " , buffer_stats [ 0 ] [ 1 ] ) ;
json_object_append_integer ( json_temp , " max_used " , buffer_stats [ 0 ] [ 2 ] ) ;
json_object_append_integer ( json_temp , " total_available " , buffer_stats [ 0 ] [ 0 ] ) ;
json_object_append_object ( json_buffer_usage , " external_commands " , json_temp ) ;
json_object_append_object ( json_programstatus , " buffer_usage " ,
json_buffer_usage ) ;
json_object_append_object ( json_data , " programstatus " , json_programstatus ) ;
return json_data ;
}