nagios4/include/archiveutils.h
2017-05-19 23:37:19 +02:00

279 lines
9.7 KiB
C

/**************************************************************************
*
* ARCHIVEUTILS.H - Utility information for Nagios CGI that read archives
*
* Copyright (c) 2013 Nagios Enterprises, LLC
* Last Modified: 06-30-2013
*
* License:
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*************************************************************************/
#ifndef ARCHIVEUTILS_H_INCLUDED
#define ARCHIVEUTILS_H_INCLUDED
#include "../include/jsonutils.h"
/* Archive utilities object types */
#define AU_OBJTYPE_NONE 0
#define AU_OBJTYPE_HOST (1<<0)
#define AU_OBJTYPE_SERVICE (1<<1)
#define AU_OBJTYPE_HOSTGROUP (1<<2)
#define AU_OBJTYPE_SERVICEGROUP (1<<3)
#define AU_OBJTYPE_ALL (AU_OBJTYPE_HOST | AU_OBJTYPE_SERVICE)
/* Archive utilities state types */
#define AU_STATETYPE_HARD (1<<0)
#define AU_STATETYPE_SOFT (1<<1)
#define AU_STATETYPE_NO_DATA (1<<2)
#define AU_STATETYPE_ALL (AU_STATETYPE_HARD | AU_STATETYPE_SOFT)
/* Archive utilities states */
#define AU_STATE_NO_DATA 0
#define AU_STATE_HOST_UP (1<<0)
#define AU_STATE_HOST_DOWN (1<<1)
#define AU_STATE_HOST_UNREACHABLE (1<<2)
#define AU_STATE_SERVICE_OK (1<<3)
#define AU_STATE_SERVICE_WARNING (1<<4)
#define AU_STATE_SERVICE_CRITICAL (1<<5)
#define AU_STATE_SERVICE_UNKNOWN (1<<6)
#define AU_STATE_PROGRAM_START (1<<7) /* Nagios program start */
#define AU_STATE_PROGRAM_END (1<<8) /* Nagios program end */
#define AU_STATE_DOWNTIME_START (1<<9) /* Downtime start */
#define AU_STATE_DOWNTIME_END (1<<10) /* Downtime end */
#define AU_STATE_CURRENT_STATE (1<<11) /* Host or service current state */
#define AU_STATE_HOST_ALL (AU_STATE_HOST_UP | \
AU_STATE_HOST_DOWN | \
AU_STATE_HOST_UNREACHABLE)
#define AU_STATE_SERVICE_ALL (AU_STATE_SERVICE_OK | \
AU_STATE_SERVICE_WARNING | \
AU_STATE_SERVICE_CRITICAL | \
AU_STATE_SERVICE_UNKNOWN)
#define AU_STATE_ALL (AU_STATE_HOST_ALL | AU_STATE_SERVICE_ALL)
/* Archive utilities log types */
#define AU_LOGTYPE_ALERT (1<<0)
#define AU_LOGTYPE_STATE_INITIAL (1<<1)
#define AU_LOGTYPE_STATE_CURRENT (1<<2)
#define AU_LOGTYPE_NOTIFICATION (1<<3)
#define AU_LOGTYPE_DOWNTIME (1<<4)
#define AU_LOGTYPE_NAGIOS (1<<5)
#define AU_LOGTYPE_STATE (AU_LOGTYPE_STATE_INITIAL | \
AU_LOGTYPE_STATE_CURRENT)
#define AU_LOGTYPE_ALL (AU_LOGTYPE_ALERT | \
AU_LOGTYPE_STATE | \
AU_LOGTYPE_NOTIFICATION | \
AU_LOGTYPE_DOWNTIME | \
AU_LOGTYPE_NAGIOS)
/* Archive utilities notification types */
#define AU_NOTIFICATION_NO_DATA 0
#define AU_NOTIFICATION_HOST_DOWN (1<<0)
#define AU_NOTIFICATION_HOST_UNREACHABLE (1<<1)
#define AU_NOTIFICATION_HOST_RECOVERY (1<<2)
#define AU_NOTIFICATION_HOST_CUSTOM (1<<3)
#define AU_NOTIFICATION_HOST_ACK (1<<4)
#define AU_NOTIFICATION_HOST_FLAPPING_START (1<<5)
#define AU_NOTIFICATION_HOST_FLAPPING_STOP (1<<6)
#define AU_NOTIFICATION_SERVICE_CRITICAL (1<<7)
#define AU_NOTIFICATION_SERVICE_WARNING (1<<8)
#define AU_NOTIFICATION_SERVICE_RECOVERY (1<<9)
#define AU_NOTIFICATION_SERVICE_CUSTOM (1<<10)
#define AU_NOTIFICATION_SERVICE_ACK (1<<11)
#define AU_NOTIFICATION_SERVICE_FLAPPING_START (1<<12)
#define AU_NOTIFICATION_SERVICE_FLAPPING_STOP (1<<13)
#define AU_NOTIFICATION_SERVICE_UNKNOWN (1<<14)
#define AU_NOTIFICATION_HOST_ALL (AU_NOTIFICATION_HOST_DOWN | \
AU_NOTIFICATION_HOST_UNREACHABLE | \
AU_NOTIFICATION_HOST_RECOVERY | \
AU_NOTIFICATION_HOST_CUSTOM | \
AU_NOTIFICATION_HOST_ACK | \
AU_NOTIFICATION_HOST_FLAPPING_START | \
AU_NOTIFICATION_HOST_FLAPPING_STOP)
#define AU_NOTIFICATION_SERVICE_ALL (AU_NOTIFICATION_SERVICE_CRITICAL | \
AU_NOTIFICATION_SERVICE_WARNING | \
AU_NOTIFICATION_SERVICE_RECOVERY | \
AU_NOTIFICATION_SERVICE_CUSTOM | \
AU_NOTIFICATION_SERVICE_ACK | \
AU_NOTIFICATION_SERVICE_FLAPPING_START | \
AU_NOTIFICATION_SERVICE_FLAPPING_STOP | \
AU_NOTIFICATION_SERVICE_UNKNOWN)
#define AU_NOTFICATION_ALL (AU_NOTFICATION_HOST_ALL | \
AU_NOTIFICATION_SERVICE_ALL)
typedef struct au_array_struct {
char *label;
int size;
int count;
void **members;
int new;
} au_array;
typedef struct au_node_struct {
void *data;
struct au_node_struct *next;
} au_node;
typedef struct au_linked_list_struct {
char *label;
au_node *head;
au_node *last_new;
} au_linked_list;
struct au_log_entry_struct;
/* au_availability keeps the availability information for a given host or
service */
typedef struct au_availability_struct {
unsigned long time_up;
unsigned long time_down;
unsigned long time_unreachable;
unsigned long time_ok;
unsigned long time_warning;
unsigned long time_unknown;
unsigned long time_critical;
unsigned long scheduled_time_up;
unsigned long scheduled_time_down;
unsigned long scheduled_time_unreachable;
unsigned long scheduled_time_ok;
unsigned long scheduled_time_warning;
unsigned long scheduled_time_unknown;
unsigned long scheduled_time_critical;
unsigned long scheduled_time_indeterminate;
unsigned long time_indeterminate_nodata;
unsigned long time_indeterminate_notrunning;
} au_availability;
/* au_host keeps information about a single host and all log entries that
pertain to that host, including global events such as Nagios starts and
stops */
typedef struct au_host_struct {
char *name;
host *hostp;
au_linked_list *log_entries;
au_availability *availability;
} au_host;
/* au_service keeps information about a single service and all log entries
that pertain to that service, including global events such as Nagios
starts and stops */
typedef struct au_service_struct {
char *host_name;
char *description;
service *servicep;
au_linked_list *log_entries;
au_availability *availability;
} au_service;
typedef struct au_contact_struct {
char *name;
contact *contactp;
} au_contact;
/* au_log_alert keeps information about alert and state type logs */
typedef struct au_log_alert_struct {
int obj_type; /* AU_OBJTYPE_HOST or AU_OBJTYPE_SERVICE */
void *object; /* au_host or au_service */
int state_type; /* hard, soft, or no data */
int state; /* any host or service state, or no data */
char *plugin_output;
} au_log_alert;
/* au_log_notification keeps information about notification logs */
typedef struct au_log_notification_struct {
int obj_type; /* AU_OBJTYPE_HOST or AU_OBJTYPE_SERVICE */
void *object; /* au_host or au_service */
au_contact *contact; /* notification contact */
int notification_type;
char *method;
char *message; /* informational method */
} au_log_notification;
/* au_log_downtime keeps information about downtime logs */
typedef struct au_log_downtime_struct {
int obj_type; /* AU_OBJTYPE_HOST or AU_OBJTYPE_SERVICE */
void *object; /* au_host or au_service */
int downtime_type; /* AU_STATE_DOWNTIME_START or
AU_STATE_DOWNTIME_END */
} au_log_downtime;
/* au_log_nagios keeps information about Nagios starts and stops */
typedef struct au_log_nagios_struct {
int type; /* AU_STATE_NAGIOS_START or
AU_STATE_NAGIOS_STOP */
char *description;
} au_log_nagios;
/* au_log_entry keeps information about each log entry */
typedef struct au_log_entry_struct {
time_t timestamp;
int entry_type; /* AU_LOGTYPE_* */
void *entry; /* au_log_alert *, au_log_notification *,
au_log_downtime *, or au_log_nagios * */
} au_log_entry;
typedef struct au_log_struct {
au_array *host_subjects; /* hosts to parse when specified
in the query */
au_array *service_subjects; /* services to parse when specified
in the query */
au_linked_list *entry_list; /* linked list of log entries */
au_array *hosts; /* list of hosts and their log entries
discovered during parsing */
au_array *services; /* list of services and the log
entries discovered during parsing */
au_array *contacts; /* list of contacts associated with
notification logs */
} au_log;
/* External functions */
extern au_log *au_init_log(void);
extern int read_archived_data(time_t, time_t, int, unsigned, unsigned,
unsigned, au_log *, time_t *);
extern int au_cmp_log_entries(const void *, const void *);
extern void au_free_log(au_log *);
extern au_node *au_list_add_node(au_linked_list *, void *,
int(*)(const void *, const void *));
extern int au_add_alert_or_state_log(au_log *, time_t, int, int, void *, int,
int, char *);
extern au_log_alert *au_create_alert_or_state_log(int, void *, int, int,
char *);
extern void au_free_alert_log(au_log_alert *);
extern au_host *au_add_host(au_array *, char *);
extern au_host *au_find_host(au_array *, char *);
extern au_service *au_add_service(au_array *, char *, char *);
extern au_service *au_find_service(au_array *, char *, char *);
extern au_array *au_init_array(char *);
extern void au_free_array(au_array *, void(*)(void *));
extern int au_array_append_member(au_array *, void *);
/* External variables */
extern const string_value_mapping svm_au_object_types[];
extern const string_value_mapping svm_au_state_types[];
extern const string_value_mapping svm_au_states[];
extern const string_value_mapping svm_au_log_types[];
extern const string_value_mapping svm_au_notification_types[];
#endif