279 lines
9.7 KiB
C
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
|