/* * Copyright (C), 2000-2007 by the monit project group. * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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, see . */ #ifndef MONITOR_H #define MONITOR_H #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_PTHREAD_H #include #endif #ifdef HAVE_STDARG_H #include #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_REGEX_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #include "ssl.h" #include "socket.h" #define VERSION PACKAGE_VERSION #define MONITRC "monitrc" #define TIMEFORMAT "%Z %b %e %T" #define STRERROR strerror(errno) #define STRLEN 256 #define ARGMAX 64 #define HTTP_CONTENT_MAX (1024*1000) /* Set event queue directory mode: "drwx------" */ #define QUEUEMASK 0077 /* Set log file mode: "-rw-rw-r--" */ #define LOGMASK 0112 /* Set pid file mode: "-rw-r--r--" */ #define MYPIDMASK 0122 #define MYPIDDIR PIDDIR #define MYPIDFILE "monit.pid" #define MYSTATEFILE "monit.state" #define MYEVENTLISTBASE "/var/monit" #define LOCALHOST "localhost" #define PORT_SMTP 25 #define PORT_SMTPS 465 #define PORT_HTTP 80 #define PORT_HTTPS 443 #define SSL_TIMEOUT 15 #define START_HTTP 1 #define STOP_HTTP 2 #define TRUE 1 #define FALSE 0 #define MONITOR_NOT 0 #define MONITOR_YES 1 #define MONITOR_INIT 2 #define STATE_PASSED 0 #define STATE_FAILED 1 #define STATE_INIT 2 #define MODE_ACTIVE 0 #define MODE_PASSIVE 1 #define MODE_MANUAL 2 #define OPERATOR_GREATER 0 #define OPERATOR_LESS 1 #define OPERATOR_EQUAL 2 #define OPERATOR_NOTEQUAL 3 #define TIME_SECOND 1 #define TIME_MINUTE 60 #define TIME_HOUR 3600 #define TIME_DAY 86400 #define ACTION_IGNORE 0 #define ACTION_ALERT 1 #define ACTION_RESTART 2 #define ACTION_STOP 3 #define ACTION_EXEC 4 #define ACTION_UNMONITOR 5 #define ACTION_START 6 #define ACTION_MONITOR 7 #define TYPE_DEVICE 0 #define TYPE_DIRECTORY 1 #define TYPE_FILE 2 #define TYPE_PROCESS 3 #define TYPE_HOST 4 #define TYPE_SYSTEM 5 #define TYPE_FIFO 6 #define RESOURCE_ID_CPU_PERCENT 1 #define RESOURCE_ID_MEM_PERCENT 2 #define RESOURCE_ID_MEM_KBYTE 3 #define RESOURCE_ID_LOAD1 4 #define RESOURCE_ID_LOAD5 5 #define RESOURCE_ID_LOAD15 6 #define RESOURCE_ID_CHILDREN 7 #define RESOURCE_ID_TOTAL_MEM_KBYTE 8 #define RESOURCE_ID_TOTAL_MEM_PERCENT 9 #define RESOURCE_ID_INODE 10 #define RESOURCE_ID_SPACE 11 #define RESOURCE_ID_CPUUSER 12 #define RESOURCE_ID_CPUSYSTEM 13 #define RESOURCE_ID_CPUWAIT 14 #define DIGEST_CLEARTEXT 1 #define DIGEST_CRYPT 2 #define DIGEST_MD5 3 #define UNIT_BYTE 1 #define UNIT_KILOBYTE 1024 #define UNIT_MEGABYTE 1048580 #define UNIT_GIGABYTE 1073740000 #define HASH_UNKNOWN 0 #define HASH_MD5 1 #define HASH_SHA1 2 #define DEFAULT_HASH HASH_MD5 /* Length of the longest message digest in bytes */ #define MD_SIZE 65 #define PROTOCOL_NULL 0 #define PROTOCOL_HTTP 1 #define PROTOCOL_HTTPS 2 #define LEVEL_FULL 0 #define LEVEL_SUMMARY 1 #define LEVEL_NAME_FULL "full" #define LEVEL_NAME_SUMMARY "summary" #define HANDLER_PASSED 0x0 #define HANDLER_ALERT 0x1 #define HANDLER_COLLECTOR 0x2 #define HANDLER_MAX HANDLER_COLLECTOR #define ICMP_ATTEMPT_COUNT 3 #define ICMP_MAX_COUNT 20 /** ------------------------------------------------- Special purpose macros */ /* Replace the standard signal function with a more reliable using * sigaction. Taken from Stevens APUE book. */ typedef void Sigfunc(int); Sigfunc *signal(int signo, Sigfunc * func); #if defined(SIG_IGN) && !defined(SIG_ERR) #define SIG_ERR ((Sigfunc *)-1) #endif /** ------------------------------------------------- General purpose macros */ #undef MAX #define MAX(x,y) ((x) > (y) ? (x) : (y)) #undef MIN #define MIN(x,y) ((x) < (y) ? (x) : (y)) #define IS(a,b) ((a&&b)?!strcasecmp(a, b):0) #define DEBUG if(Run.debug) LogDebug #define FLAG(x, y) (x & y) == y #define NVLSTR(x) (x?x:"") /** ------------------------------------------------- Synchronization macros */ #define LOCK(mutex) do { pthread_mutex_t *_yymutex = &(mutex); \ pthread_mutex_lock(_yymutex); #define END_LOCK pthread_mutex_unlock(_yymutex); } while (0) /** ---------------------------------- Object Constructor/"Destructor" macro */ #define NEW(p) ((p)= xcalloc(1, (long)sizeof *(p))) #define FREE(p) ((void)(free(p), (p)= 0)) /** ------------------------------------------ Simple Assert Exception macro */ #define ASSERT(e) if(!(e)) { LogCritical("AssertException: " #e \ " at %s:%d\naborting..\n", __FILE__, __LINE__); abort(); } /* --------------------------------------------------------- Data structures */ /** Message Digest type with size for the longest digest we will compute */ typedef char MD_T[MD_SIZE]; /** * Defines a Command with ARGMAX optional arguments. The arguments * array must be NULL terminated and the first entry is the program * itself. In addition, a user and group may be set for the Command * which means that the Command should run as a certain user and with * certain group. */ typedef struct mycommand { char *arg[ARGMAX]; /**< Program with arguments */ int length; /**< The length of the arguments array */ int has_uid; /**< TRUE if a new uid is defined for this Command */ uid_t uid; /**< The user id to switch to when running this Command */ int has_gid; /**< TRUE if a new gid is defined for this Command */ gid_t gid; /**< The group id to switch to when running this Command */ unsigned timeout; /**< Max cycles which we wait for method to execute */ } *Command_T; /** Defines an event action object */ typedef struct myaction { int id; /**< Action to be done */ Command_T exec; /**< Optional command to be executed */ unsigned count; /**< Event count needed to trigger the action */ unsigned cycles; /**< Cycles during which count limit can be reached */ char description[PATH_MAX]; /**< Action description buffer */ } *Action_T; /** Defines event's up and down actions */ typedef struct myeventaction { Action_T failed; /**< Action in the case of failure down */ Action_T passed; /**< Action in the case of failure up */ } *EventAction_T; /** Defines an url object */ typedef struct myurl { char *url; /**< Full URL */ char *protocol; /**< URL protocol type */ char *user; /**< URL user part */ char *password; /**< URL password part */ char *hostname; /**< URL hostname part */ int port; /**< URL port part */ char *path; /**< URL path part */ char *query; /**< URL query part */ } *URL_T; /** Defines a HTTP client request object */ typedef struct myrequest { URL_T url; /**< URL request */ int operator; /**< Response content comparison operator */ #ifdef HAVE_REGEX_H regex_t *regex; /* regex used to test the response body */ #else char *regex; /* string to search for in the response body */ #endif } *Request_T; /** Defines an event notification and status receiver object */ typedef struct mycollector { URL_T url; /**< URL definition */ Ssl_T ssl; /**< SSL definition */ int timeout; /**< The timeout to wait for connection or i/o */ Socket_T socket; /**< Socket used for connection */ /** For internal use */ struct mycollector *next; /**< next receiver in chain */ } *Collector_T; /** Defines a mailinglist object */ typedef struct mymail { char *to; /**< Mail address for alert notification */ char *from; /**< The mail from address */ char *subject; /**< The mail subject */ char *message; /**< The mail message */ unsigned int events; /*< Events for which this mail object should be sent */ unsigned int reminder; /*< Send error reminder each Xth cycle */ /** For internal use */ struct mymail *next; /**< next recipient in chain */ } *Mail_T; /** Defines a mail server address */ typedef struct mymailserver { char *host; /**< Server host address, may be a IP or a hostname string */ int port; /**< Server port */ char *username; /** < Username for SMTP_AUTH */ char *password; /** < Password for SMTP_AUTH */ Ssl_T ssl; /**< SSL definition */ /** For internal use */ struct mymailserver *next; /**< Next server to try on connect error */ } *MailServer_T; typedef struct myauthentication { char *uname; /**< User allowed to connect to monit httpd */ char *passwd; /**< The users password data */ int digesttype; /**< How did we store the password */ int is_readonly; /**< TRUE if this is a read-only authenticated user*/ struct myauthentication *next; /**< Next credential or NULL if last */ } *Auth_T; /** Defines process tree - data storage backend*/ typedef struct myprocesstree { int pid; int ppid; int status_flag; int visited; int children_num; int children_sum; int cpu_percent; int cpu_percent_sum; unsigned long mem_kbyte; unsigned long mem_kbyte_sum; /** For internal use */ double time; /**< 1/10 seconds */ double time_prev; /**< 1/10 seconds */ long cputime; /**< 1/10 seconds */ long cputime_prev; /**< 1/10 seconds */ struct myprocesstree *parent; struct myprocesstree **children; } ProcessTree_T; /** Defines data for systemwide statistic */ typedef struct mysysteminfo { time_t collected; /**< When were data collected */ double loadavg[3]; /**< Load average triple */ unsigned long mem_kbyte_max; /**< Maximal system real memory */ unsigned long total_mem_kbyte; /**< Total real memory in use in the system */ int total_mem_percent; /**< Total real memory in use in the system */ int total_cpu_user_percent; /**< Total CPU in use in user space (pct.)*/ int total_cpu_syst_percent; /**< Total CPU in use in kernel space (pct.)*/ int total_cpu_wait_percent; /**< Total CPU in use in waiting (pct.)*/ } SystemInfo_T; /** Defines a protocol object with protocol functions */ typedef struct myprotocol { const char *name; /**< Protocol name */ int(*check)(Socket_T); /**< Protocol verification function */ } *Protocol_T; /** Defines a send/expect object used for generic protocol tests */ typedef struct mygenericproto { char *send; /* string to send, or NULL if expect */ #ifdef HAVE_REGEX_H regex_t *expect; /* regex code to expect, or NULL if send */ #else char *expect; /* string to expect, or NULL if send */ #endif /** For internal use */ struct mygenericproto *next; } *Generic_T; /** Defines a port object */ typedef struct myport { volatile int socket; /**< Socket used for connection */ int type; /**< Socket type used for connection (UDP/TCP) */ int family; /**< Socket family used for connection (INET/UNIX) */ char *hostname; /**< Hostname to check */ int port; /**< Portnumber */ char *request; /**< Specific protocol request */ char *request_checksum; /**< The optional checksum for a req. document */ int request_hashtype; /**< The optional type of hash for a req. document */ char *pathname; /**< Pathname, in case of an UNIX socket */ char *address; /**< Human readable destination of the socket */ Generic_T generic; /**< Generic test handle */ int timeout; /**< The timeout in seconds to wait for connect or read i/o */ int is_available; /**< TRUE if the server/port is available */ double response; /**< Socket connection response time */ EventAction_T action; /**< Description of the action upon event occurence */ /** Apache-status specific parameters */ struct apache_status { int loglimit; /**< Max percentatge of logging processes */ int loglimitOP; /**< loglimit operator */ int closelimit; /**< Max percentatge of closinging processes */ int closelimitOP; /**< closelimit operator */ int dnslimit; /**< Max percentatge of processes doing DNS lookup */ int dnslimitOP; /**< dnslimit operator */ int keepalivelimit; /**< Max percentatge of keepalive processes */ int keepalivelimitOP; /**< keepalivelimit operator */ int replylimit; /**< Max percentatge of replying processes */ int replylimitOP; /**< replylimit operator */ int requestlimit; /**< Max percentatge of processes reading requests */ int requestlimitOP; /**< requestlimit operator */ int startlimit; /**< Max percentatge of processes starting up */ int startlimitOP; /**< startlimit operator */ int waitlimit; /**< Min percentatge of processes waiting for connection */ int waitlimitOP; /**< waitlimit operator */ int gracefullimit;/**< Max percentatge of processes gracefully finishing */ int gracefullimitOP; /**< gracefullimit operator */ int cleanuplimit; /**< Max percentatge of processes in idle cleanup */ int cleanuplimitOP; /**< cleanuplimit operator */ } ApacheStatus; Ssl_T SSL; /**< SSL definition */ Protocol_T protocol; /**< Protocol object for testing a port's service */ Request_T url_request; /**< Optional url client request object */ /** For internal use */ struct myport *next; /**< next port in chain */ } *Port_T; /** Defines a ICMP object */ typedef struct myicmp { int type; /**< ICMP type used */ int count; /**< ICMP echo requests count */ int timeout; /**< The timeout in seconds to wait for response */ int is_available; /**< TRUE if the server is available */ double response; /**< ICMP ECHO response time */ EventAction_T action; /**< Description of the action upon event occurence */ /** For internal use */ struct myicmp *next; /**< next icmp in chain */ } *Icmp_T; typedef struct mydependant { char *dependant; /**< name of dependant service */ /** For internal use */ struct mydependant *next; /**< next dependant service in chain */ } *Dependant_T; /** Defines resource data */ typedef struct myresource { int resource_id; /**< Which value is checked */ long limit; /**< Limit of the resource */ int operator; /**< Comparison operator */ EventAction_T action; /**< Description of the action upon event occurence */ /** For internal use */ struct myresource *next; /**< next resource in chain */ } *Resource_T; /** Defines timestamp object */ typedef struct mytimestamp { int operator; /**< Comparison operator */ int time; /**< Timestamp watermark */ int test_changes; /**< TRUE if we only should test for changes */ time_t timestamp; /**< The original last modified timestamp for this object*/ EventAction_T action; /**< Description of the action upon event occurence */ /** For internal use */ struct mytimestamp *next; /**< next timestamp in chain */ } *Timestamp_T; /** Defines size object */ typedef struct mysize { int operator; /**< Comparison operator */ unsigned long long size; /**< Size watermark */ int test_changes; /**< TRUE if we only should test for changes */ EventAction_T action; /**< Description of the action upon event occurence */ /** For internal use */ struct mysize *next; /**< next timestamp in chain */ } *Size_T; /** Defines checksum object */ typedef struct mychecksum { char *hash; /**< A checksum hash computed for the path */ int type; /**< The type of hash (e.g. md5 or sha1) */ int length; /**< Length of the hash */ int test_changes; /**< TRUE if we only should test for changes */ EventAction_T action; /**< Description of the action upon event occurence */ } *Checksum_T; /** Defines permission object */ typedef struct myperm { int perm; /**< Access permission */ EventAction_T action; /**< Description of the action upon event occurence */ } *Perm_T; /** Defines match object */ typedef struct mymatch { int ignore; /**< Ignore match */ int not; /**< Invert match */ char *match_string; /**< Match string */ char *match_path; /**< File with matching rules */ #ifdef HAVE_REGEX_H regex_t *regex_comp; /**< Match compile */ #endif EventAction_T action; /**< Description of the action upon event occurence */ /** For internal use */ struct mymatch *next; /**< next match in chain */ } *Match_T; /** Defines uid object */ typedef struct myuid { uid_t uid; /**< Owner's uid */ EventAction_T action; /**< Description of the action upon event occurence */ } *Uid_T; /** Defines gid object */ typedef struct mygid { gid_t gid; /**< Owner's gid */ EventAction_T action; /**< Description of the action upon event occurence */ } *Gid_T; /** Defines filesystem device configuration */ typedef struct mydevice { int resource; /**< Whether to check inode or space */ int operator; /**< Comparison operator */ long limit_absolute; /**< Watermark - blocks */ int limit_percent; /**< Watermark - percent */ EventAction_T action; /**< Description of the action upon event occurence */ /** For internal use */ struct mydevice *next; /**< next device in chain */ } *Device_T; /** Defines service data */ typedef struct myinfo { /* Shared */ mode_t st_mode; /**< Permission */ uid_t st_uid; /**< Owner's uid */ gid_t st_gid; /**< Owner's gid */ ino_t st_ino; /**< Inode */ time_t timestamp; /**< Timestamp */ /* Device specific */ long f_bsize; /**< Transfer block size */ long f_blocks; /**< Total data blocks in filesystem */ long f_blocksfree; /**< Free blocks available to non-superuser */ long f_blocksfreetotal; /**< Free blocks in filesystem */ long f_files; /**< Total file nodes in filesystem */ long f_filesfree; /**< Free file nodes in filesystem */ char mntpath[STRLEN]; /**< Filesystem file, directory or mountpoint */ int inode_percent; /**< Used inode percentage * 10 */ long inode_total; /**< Used inode total objects */ int space_percent; /**< Used space percentage * 10 */ long space_total; /**< Used space total blocks */ int _flags; /**< Filesystem flags from last cycle */ int flags; /**< Filesystem flags from actual cycle */ /* File specific */ off_t st_size; /**< Size */ off_t readpos; /**< Position for regex matching */ ino_t st_ino_prev; /**< Previous inode for regex matching */ char *cs_sum; /**< Checksum */ /* Process specific */ int _pid; /**< Process PID from last cycle */ int _ppid; /**< Process parent PID from last cycle */ int pid; /**< Process PID from actual cycle */ int ppid; /**< Process parent PID from actual cycle */ int status_flag; int children; long mem_kbyte; long total_mem_kbyte; int mem_percent; /**< percentage * 10 */ int total_mem_percent; /**< percentage * 10 */ int cpu_percent; /**< percentage * 10 */ int total_cpu_percent; /**< percentage * 10 */ time_t uptime; /**< Process uptime */ } *Info_T; /** Defines service data */ typedef struct myservice { /** Common parameters */ char *name; /**< Service descriptive name */ char *group; /**< Service group name */ int (*check)(struct myservice *); /**< Service verification function */ int type; /**< Monitored service type */ int monitor; /**< Monitor state flag */ int mode; /**< Monitoring mode for the service */ int ncycle; /**< The number of the current cycle */ int nstart; /**< The number of current starts with this service */ int to_start; /**< Timeout start ceiling */ int to_cycle; /**< Timeout cycle ceiling */ int every; /**< Check this program at given cycles */ int nevery; /**< Counter for every. When nevery == every, check */ int def_timeout; /**< TRUE if timeout is defined for the service */ int def_every; /**< TRUE if every is defined for the service */ int visited; /**< Service visited flag, set if dependencies are used */ int depend_visited;/**< Depend visited flag, set if dependencies are used */ Command_T start; /**< The start command for the service */ Command_T stop; /**< The stop command for the service */ Dependant_T dependantlist; /**< Dependant service list */ Mail_T maillist; /**< Alert notification mailinglist */ /** Test rules and event handlers */ Checksum_T checksum; /**< Checksum check */ Device_T devicelist; /**< Device check list */ Gid_T gid; /**< Gid check */ Icmp_T icmplist; /**< ICMP check list */ Perm_T perm; /**< Permission check */ Port_T portlist; /**< Portnumbers to check, either local or at a host */ Resource_T resourcelist; /**< Resouce check list */ Size_T sizelist; /**< Size check list */ Match_T matchlist; /**< Content Match list */ Timestamp_T timestamplist; /**< Timestamp check list */ Uid_T uid; /**< Uid check */ EventAction_T action_PID; /**< Action upon pid change */ EventAction_T action_PPID; /**< Action upon ppid change */ EventAction_T action_FSFLAG; /**< Action upon filesystem flags change */ /** General event handlers */ EventAction_T action_DATA; /**< Description of the action upon event */ EventAction_T action_EXEC; /**< Description of the action upon event */ EventAction_T action_INVALID; /**< Description of the action upon event */ EventAction_T action_NONEXIST; /**< Description of the action upon event */ EventAction_T action_TIMEOUT; /**< Description of the action upon event */ /** Internal monit events */ EventAction_T action_MONIT_START; /**< Monit instance start action */ EventAction_T action_MONIT_STOP; /**< Monit instance stop action */ EventAction_T action_MONIT_RELOAD; /**< Monit instance reload action */ /** Runtime parameters */ unsigned long long error; /**< Error flags bitmap */ Info_T inf; /**< Service check result */ time_t collected; /**< When were data collected */ int doaction; /**< Action scheduled by http thread */ /** Events */ struct myevent { #define EVENT_VERSION 1 /**< The event structure version */ int id; /**< The event identification */ time_t collected; /**< When the event occured */ char *source; /**< Event source service name */ char *group; /**< Service group name */ int mode; /**< Monitoring mode for the service */ int type; /**< Monitored service type */ short state; /**< TRUE if failed, FALSE if passed */ short state_changed; /**< TRUE if state changed */ long long state_map; /**< Event bitmap for last cycles */ unsigned int count; /**< The event rate */ unsigned int flag; /**< The handlers state flag */ char *message; /**< Optional message describing the event */ EventAction_T action; /**< Description of the event action */ /** For internal use */ pthread_mutex_t mutex; /**< Mutex used for action synchronization */ struct myevent *next; /**< next event in chain */ struct myevent *previous; /**< previous event in chain */ } *eventlist; /**< Pending events list */ /** Context specific parameters */ char *path; /**< Path to the device, file, directory or process pid file */ /** For internal use */ pthread_mutex_t mutex; /**< Mutex used for action synchronization */ struct myservice *next; /**< next service in chain */ struct myservice *next_conf; /**< next service according to conf file */ struct myservice *next_depend; /**< next depend service in chain */ } *Service_T; typedef struct myevent *Event_T; /** Defines data for application runtime */ struct myrun { volatile int stopped;/**< TRUE if monit was stopped. Flag used by threads */ char *controlfile; /**< The file to read configuration from */ char *logfile; /**< The file to write logdata into */ char *localhostname; /**< The host name for localhost */ char *pidfile; /**< This programs pidfile */ char *statefile; /**< The file with the saved runtime state */ char *mygroup; /**< Group Name of the Service */ int debug; /**< Write debug information - TRUE or FALSE */ int use_syslog; /**< If TRUE write log to syslog */ int dolog; /**< TRUE if program should log actions, otherwise FALSE */ int isdaemon; /**< TRUE if program should run as a daemon */ int polltime; /**< In deamon mode, the sleeptime (sec) between run */ int dohttpd; /**< TRUE if monit HTTP server should run */ int httpdssl; /**< TRUE if monit HTTP server uses ssl */ char *httpsslpem; /**< PEM file for the HTTPS server */ int clientssl; /**< TRUE if monit HTTP server uses ssl with client auth */ char *httpsslclientpem; /**< PEM file/dir to check against at connect */ int allowselfcert; /**< TRUE if self certified client certs are allowed */ int httpdsig; /**< TRUE if monit HTTP server presents version signature */ int httpdport; /**< The monit http server's portnumber */ int once; /**< TRUE - run only once */ int init; /**< TRUE - don't background to run from init */ int facility; /** The facility to use when running openlog() */ int doprocess; /**< TRUE if process status engine is used */ char *bind_addr; /**< The address monit http will bind to */ volatile int doreload; /**< TRUE if a monit daemon should reinitialize */ volatile int dowakeup; /**< TRUE if a monit daemon was wake up by signal */ int doaction; /**< TRUE if some service(s) has action pending */ mode_t umask; /**< The initial umask monit was started with */ int testing; /**< Running in configuration testing mode - TRUE or FALSE */ int wait_start; /**< Number of threads waiting for process' start */ time_t incarnation; /**< Unique ID for running monit instance */ int handler_init; /**< The handlers queue initialization */ int handler_flag; /**< The handlers state flag */ int handler_queue[HANDLER_MAX+1]; /**< The handlers queue counter */ Service_T system; /**< The general system service */ char *eventlist_dir; /**< The event queue base directory */ int eventlist_slots; /**< The event queue size - number of slots */ /** An object holding program relevant "environment" data, see; env.c */ struct myenvironment { char *user; /**< The the effective user running this program */ char *home; /**< Users home directory */ char *cwd; /**< Current working directory */ } Env; int mailserver_timeout; /**< Connect and read timeout for a SMTP server */ Mail_T maillist; /**< Global alert notification mailinglist */ MailServer_T mailservers; /**< List of MTAs used for alert notification */ Collector_T collectors; /**< Event notification and status receivers list */ Auth_T credentials; /** A list holding Basic Authentication information */ Event_T eventlist; /** A list holding partialy handled events */ /** User selected standard mail format */ struct myformat { char *from; /**< The standard mail from address */ char *subject; /**< The standard mail subject */ char *message; /**< The standard mail message */ } MailFormat; pthread_mutex_t mutex; /**< Mutex used for service data synchronization */ }; /* -------------------------------------------------------- Global variables */ char *prog; /**< The Name of this Program */ struct myrun Run; /**< Struct holding runtime constants */ Service_T servicelist; /**< The service list (created in p.y) */ Service_T servicelist_conf; /**< The service list in conf file (c. in p.y) */ SystemInfo_T systeminfo; /**< System infomation */ extern ProcessTree_T *ptree; extern int ptreesize; extern ProcessTree_T *oldptree; extern int oldptreesize; /* ------------------------------------------------------- Public prototypes */ #include "util.h" #include "file.h" /* FIXME: move remaining prototypes into seperate header-files */ int parse(char *); void control_service(const char *, int); void control_service_string(const char *, const char *); void control_service_daemon(const char *, const char *); void setup_dependants(); void reset_depend(); void spawn(Service_T, Command_T, const char *); int status(char *); int log_init() ; void LogEmergency(const char *, ...); void LogAlert(const char *, ...); void LogCritical(const char *, ...); void LogError(const char *, ...); void LogWarning(const char *, ...); void LogNotice(const char *, ...); void LogInfo(const char *, ...); void LogDebug(const char *, ...); void log_close(); void validate() ; void daemonize() ; void gc(); void gc_mail_list(Mail_T *); void _gccmd(Command_T *); int kill_daemon(int); int exist_daemon(); int sendmail(Mail_T); int sock_msg(int, char *, ...); void init_env(); void *xmalloc (int); void *xcalloc(long, long); char *xstrdup(const char *); char *xstrndup(const char *, long); void *xresize(void *, long); void monit_http(int); int can_http(); char *format(const char *, va_list, long *); void redirect_stdfd(); void fd_close(); pid_t getpgid(pid_t); #if ! HAVE_MALLOC void *rpl_malloc (size_t __size); #endif void unset_signal_block(sigset_t *); void set_signal_block(sigset_t *, sigset_t *); int check_process(Service_T); int check_device(Service_T); int check_file(Service_T); int check_directory(Service_T); int check_remote_host(Service_T); int check_system(Service_T); int check_fifo(Service_T); int check_URL(Service_T s); int sha_md5_stream (FILE *, void *, void *); void reset_procinfo(Service_T); int check_service_status(Service_T); void printhash(char *); char *status_xml(Event_T, short); int handle_collector(Event_T); int do_wakeupcall(); #endif