Large scale network monitoring limits with nagios
Noah Leaman
noah at mac.com
Mon Mar 15 20:11:41 CET 2004
Thanks Michael,
For some reason I missed your replies the first time with your patches
included. Got it now and I'll be applying them soon.
--
Noah
On Friday, March 12, 2004, at 04:25 AM, michael at optusnet.com.au wrote:
> Noah Leaman <noah at mac.com> writes:
>> Hopes it's o.k. cross posting to both groups on this matter...
>>
>> Using the concept of one service per up/down trap for each network
>> interface, I tested a little by creating a very simple set of nagios
>> configs, but with about 8000 PASSIVE service checks and no active
>> service checks. of course there was no problem in terms of scheduling
>> issues, but the CGIs all crawled to a snails pace. In my setup (nagios
>> 1.2, Dual G4 first-gen xServe) it takes about 30 secs to display the
>> Status Summary page.
>
> Yes, this is what I'd expect. The problem is that nagios out of the
> box has some terrible code in it. In particular, there's a lot of
> places (including the display cgi's) that use O(n^2) algorithms.
>
> Some of the time the problem is hidden; Upper level code will
> do "foreach (list) { action }" where 'action' calls a function
> also does a linear search of the same list. oops.
>
> Other times the problem is obvious: Code that adds elements
> to the end of a singly linked list. By doing a linear
> search from the beginning. For each item added. For 12,000
> items. oops.
>
> In our local version we create hash tables, and pre/post-sort lists to
> work around the worst of the problems.
>
> If you dig through the list archives you'll see the patches that
> were sent in to fix it for 1.1.
>
> That still leaves the other big problem with the passive service
> checks. Believe it or not, sending a passive result makes nagios
> fork()!! The parent process reads the check result, fork()s and then
> resends the result again to the parent. Rather wild stuff. :)
> Even better is that the child process has to wait around
> for the parent to handle the send.
>
> This is normally masked because the main event loop simply
> doesn't check the named pipe very frequently, so normally
> your external scripts will blow up with massive queues
> waiting for nagios to read the pipe.
>
> Nagios out of the box is simply not ready for reasonable
> scale yet.
>
> Michael.
>
> Ps. Ok. I saved you some effort. I dug up the local patches:
> (Note: I didn't write these)
>
> * Check the named pipe frequently.
> * Don't fork() too often when handling passive check results.
> * Use hash tables and sorted lists to get rid of most of the
> O(n^2) places.
> * Sleep only for a short time in the main loop.
> * allow check for auth-smtp.
> * fix a few bugs.
> * introduces depedancy on glib.
>
>
>
>
>
> diff -ru nagios-1.1-virgin/base/Makefile.in nagios-1.1/base/Makefile.in
> --- nagios-1.1-virgin/base/Makefile.in Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/base/Makefile.in Tue Oct 7 13:03:51 2003
> @@ -10,9 +10,9 @@
> SRC_XDATA=../xdata
>
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@ -DNSCORE
> +CFLAGS=@CFLAGS@ @DEFS@ -DNSCORE `pkg-config glib --cflags`
> #CFLAGS=-O3 -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
> -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
> -DHAVE_CONFIG_H -DNSCORE
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +LDFLAGS=@LDFLAGS@ @LIBS@ `pkg-config glib --libs`
>
> prefix=@prefix@
> exec_prefix=@exec_prefix@
> diff -ru nagios-1.1-virgin/cgi/Makefile.in nagios-1.1/cgi/Makefile.in
> --- nagios-1.1-virgin/cgi/Makefile.in Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/cgi/Makefile.in Tue Oct 7 13:03:51 2003
> @@ -25,9 +25,9 @@
>
> CP=@CP@
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@ -DNSCGI
> +CFLAGS=@CFLAGS@ @DEFS@ -DNSCGI `pkg-config glib --cflags`
> #CFLAGS=-O3 -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
> -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
> -DHAVE_CONFIG_H -DNSCGI
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +LDFLAGS=@LDFLAGS@ @LIBS@ `pkg-config glib --libs`
>
> CGIS=avail.cgi cmd.cgi config.cgi extinfo.cgi history.cgi
> notifications.cgi outages.cgi showlog.cgi status.cgi statuswml.cgi
> summary.cgi tac.cgi $(CGIEXTRAS)
>
> diff -ru nagios-1.1-virgin/common/common.h nagios-1.1/common/common.h
> --- nagios-1.1-virgin/common/common.h Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/common/common.h Tue Oct 7 13:03:51 2003
> @@ -208,8 +208,12 @@
> #define OK 0
> #define ERROR -2 /* value was changed from -1 so as to not
> interfere with STATUS_UNKNOWN plugin result */
>
> +#ifndef TRUE
> #define TRUE 1
> +#endif
> +#ifndef FALSE
> #define FALSE 0
> +#endif
>
>
> /****************** HOST CONFIG FILE READING OPTIONS
> ********************/
> diff -ru nagios-1.1-virgin/common/config.h.in
> nagios-1.1/common/config.h.in
> --- nagios-1.1-virgin/common/config.h.in Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/common/config.h.in Tue Oct 7 13:03:51 2003
> @@ -214,3 +214,7 @@
> #include <dirent.h>
> #endif
>
> +#define HAVE_GLIB_H 1
> +#ifdef HAVE_GLIB_H
> +#include <glib.h>
> +#endif
> diff -ru nagios-1.1-virgin/common/objects.c nagios-1.1/common/objects.c
> --- nagios-1.1-virgin/common/objects.c Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/common/objects.c Tue Oct 7 13:03:51 2003
> @@ -59,7 +59,10 @@
> servicedependency *servicedependency_list=NULL;
> hostdependency *hostdependency_list=NULL;
> hostescalation *hostescalation_list=NULL;
> +GTree *service_tree = NULL;
> +GHashTable *host_hash = NULL;
>
> +int service_list_add(char *key, service *v, void *data);
>
>
> /******************************************************************/
> @@ -99,6 +102,8 @@
> printf("read_object_config_data() end\n");
> #endif
>
> + g_tree_traverse(service_tree,
> (GTraverseFunc)service_list_add, G_IN_ORDER, NULL);
> +
> return result;
> }
>
> @@ -107,6 +112,13 @@
> /**************** OBJECT ADDITION FUNCTIONS ***********************/
> /******************************************************************/
>
> +int service_list_add(char *key, service *v, void *data)
> +{
> + v->next = service_list;
> + service_list = v;
> + return 0;
> +}
> +
>
>
> /* add a new timeperiod to the list in memory */
> @@ -747,6 +759,16 @@
> printf("\tNotification Interval:
> %d\n",new_host->notification_interval);
> printf("\tNotification Time Period:
> %s\n",new_host->notification_period);
> #endif
> +
> +#ifdef HAVE_GLIB_H
> + /* Cache host in hash table */
> + if (!host_hash)
> + host_hash = g_hash_table_new(g_str_hash, g_str_equal);
> +
> + if (host_hash)
> + g_hash_table_insert(host_hash, new_host->name, new_host);
> +#endif
> +
> #ifdef DEBUG0
> printf("add_host() end\n");
> #endif
> @@ -2173,40 +2195,7 @@
> strcpy(new_service->perf_data,"");
>
> #endif
> - /* add new service to service list, sorted by host name then service
> description */
> - last_service=service_list;
> -
> for(temp_service=service_list;temp_service!=NULL;temp_service=temp_serv
> ice->next){
> -
> - if(strcmp(new_service->host_name,temp_service->host_name)<0){
> - new_service->next=temp_service;
> - if(temp_service==service_list)
> - service_list=new_service;
> - else
> - last_service->next=new_service;
> - break;
> - }
> -
> - else if(strcmp(new_service->host_name,temp_service->host_name)==0
> && strcmp(new_service->description,temp_service->description)<0){
> - new_service->next=temp_service;
> - if(temp_service==service_list)
> - service_list=new_service;
> - else
> - last_service->next=new_service;
> - break;
> - }
>
> - else
> - last_service=temp_service;
> - }
> - if(service_list==NULL){
> - new_service->next=NULL;
> - service_list=new_service;
> - }
> - else if(temp_service==NULL){
> - new_service->next=NULL;
> - last_service->next=new_service;
> - }
> -
> #ifdef DEBUG1
> printf("\tHost: %s\n",new_service->host_name);
> printf("\tDescription: %s\n",new_service->description);
> @@ -2222,6 +2211,19 @@
> printf("\tEvent Handler:
> %s\n",(new_service->event_handler==NULL)?"N/A":new_service-
> >event_handler);
> #endif
>
> +#ifdef HAVE_GLIB_H
> + /* Cache service in tree */
> + if (!service_tree)
> + service_tree = g_tree_new((GCompareFunc)strcmp);
> +
> + if (service_tree)
> + {
> + char *key = calloc(strlen(new_service->host_name) +
> strlen(new_service->description) + 2, 1);
> + sprintf(key, "%s-%s", new_service->host_name,
> new_service->description);
> + g_tree_insert(service_tree, key, new_service);
> + }
> +#endif
> +
> #ifdef DEBUG0
> printf("add_service() end\n");
> #endif
> @@ -3226,6 +3228,13 @@
> if(name==NULL)
> return NULL;
>
> +#ifdef HAVE_GLIB_H
> + /* Lookup host in the hash */
> + if (host_hash)
> + return (host *)g_hash_table_lookup(host_hash, name);
> +#endif
> +
> +
> if(hst==NULL)
> temp_host=host_list;
> else
> @@ -3500,6 +3509,18 @@
> if(host_name==NULL || svc_desc==NULL)
> return NULL;
>
> +#ifdef HAVE_GLIB_H
> + /* Lookup service in the tree */
> + if (service_tree)
> + {
> + char *key = calloc(strlen(host_name) + strlen(svc_desc) + 2, 1);
> + sprintf(key, "%s-%s", host_name, svc_desc);
> + temp_service = (service *)g_tree_lookup(service_tree, key);
> + free(key);
> + return temp_service;
> + }
> +#endif
> +
> if(svcptr==NULL)
> temp_service=service_list;
> else
> diff -ru nagios-1.1-virgin/common/statusdata.c
> nagios-1.1/common/statusdata.c
> --- nagios-1.1-virgin/common/statusdata.c Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/common/statusdata.c Tue Oct 7 13:04:12 2003
> @@ -51,6 +51,7 @@
> #ifdef NSCGI
> hoststatus *hoststatus_list=NULL;
> servicestatus *servicestatus_list=NULL;
> +GTree *servicestatus_tree=NULL;
>
> time_t program_start;
> int daemon_mode;
> @@ -320,6 +321,7 @@
> /******************************************************************/
>
>
> +int servicestatus_list_add(servicestatus *key, void *v, void *data);
> /* reads in all status data */
> int read_status_data(char *config_file,int options){
> int result=OK;
> @@ -332,6 +334,7 @@
> result=xsddb_read_status_data(config_file,options);
> #endif
>
> + g_tree_traverse(servicestatus_tree,
> (GTraverseFunc)servicestatus_list_add, G_IN_ORDER, NULL);
> return result;
> }
>
> @@ -341,6 +344,12 @@
> /********************** ADDITION FUNCTIONS ************************/
> /******************************************************************/
>
> +int servicestatus_list_add(servicestatus *key, void *v, void *data)
> +{
> + key->next = servicestatus_list;
> + servicestatus_list = key;
> + return 0;
> +}
>
> /* sets program status variables */
> int add_program_status(time_t _program_start, int _nagios_pid, int
> _daemon_mode, time_t _last_command_check, time_t _last_log_rotation,
> int _enable_notifications,int _execute_service_checks,int
> _accept_passive_service_checks,int _enable_event_handlers,int
> _obsess_over_services, int _enable_flap_detection, int
> _enable_failure_prediction, int _process_performance_data){
> @@ -534,6 +543,16 @@
> return OK;
> }
>
> +int servicestatus_cmp(servicestatus *a, servicestatus *b)
> +{
> + int c;
> +
> + c = strcmp(b->host_name, a->host_name);
> + if (c)
> + return c;
> +
> + return strcmp(b->description, a->description);
> +}
>
> /* adds a service status entry to the list in memory */
> int add_service_status(char *host_name,char *svc_description,char
> *status_string,time_t last_update,int current_attempt,int
> max_attempts,int state_type,time_t last_check,time_t next_check,int
> check_type,int checks_enabled,int accept_passive_checks,int
> event_handler_enabled,time_t last_state_change,int
> problem_has_been_acknowledged,char *last_hard_state_string,unsigned
> long time_ok,unsigned long time_warning,unsigned long
> time_unknown,unsigned long time_critical,time_t last_notification,int
> current_notification_number,int notifications_enabled, int latency,
> int execution_time, int flap_detection_enabled, int is_flapping,
> double percent_state_change, int scheduled_downtime_depth, int
> failure_prediction_enabled, int process_performance_data, int
> obsess_over_service, char *plugin_output){
> @@ -543,6 +562,8 @@
> int status;
> int last_hard_state;
>
> + if (!servicestatus_tree)
> + servicestatus_tree = g_tree_new( (GCompareFunc) servicestatus_cmp);
>
> /* make sure we have what we need */
> if(host_name==NULL)
> @@ -724,41 +745,7 @@
> /* scheduled downtime depth */
> new_svcstatus->scheduled_downtime_depth=scheduled_downtime_depth;
>
> -
> - /* add new service status to list, sorted by host name then
> description */
> - last_svcstatus=servicestatus_list;
> -
> for(temp_svcstatus=servicestatus_list;temp_svcstatus!=NULL;temp_svcstat
> us=temp_svcstatus->next){
> -
> - if(strcmp(new_svcstatus->host_name,temp_svcstatus->host_name)<0){
> - new_svcstatus->next=temp_svcstatus;
> - if(temp_svcstatus==servicestatus_list)
> - servicestatus_list=new_svcstatus;
> - else
> - last_svcstatus->next=new_svcstatus;
> - break;
> - }
> -
> - else
> if(strcmp(new_svcstatus->host_name,temp_svcstatus->host_name)==0 &&
> strcmp(new_svcstatus->description,temp_svcstatus->description)<0){
> - new_svcstatus->next=temp_svcstatus;
> - if(temp_svcstatus==servicestatus_list)
> - servicestatus_list=new_svcstatus;
> - else
> - last_svcstatus->next=new_svcstatus;
> - break;
> - }
> -
> - else
> - last_svcstatus=temp_svcstatus;
> - }
> - if(servicestatus_list==NULL){
> - new_svcstatus->next=NULL;
> - servicestatus_list=new_svcstatus;
> - }
> - else if(temp_svcstatus==NULL){
> - new_svcstatus->next=NULL;
> - last_svcstatus->next=new_svcstatus;
> - }
> -
> + g_tree_insert(servicestatus_tree, new_svcstatus, new_svcstatus);
>
> return OK;
> }
> diff -ru nagios-1.1-virgin/contrib/Makefile.in
> nagios-1.1/contrib/Makefile.in
> --- nagios-1.1-virgin/contrib/Makefile.in Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/contrib/Makefile.in Tue Oct 7 13:03:51 2003
> @@ -5,8 +5,8 @@
> ###############################
>
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +CFLAGS=@CFLAGS@ @DEFS@ `pkg-config glib --cflags`
> +LDFLAGS=@LDFLAGS@ @LIBS@ `pkg-config glib --libs`
>
> # Source code directories
> SRC_COMMON=../common
> diff -ru nagios-1.1-virgin/html/Makefile.in nagios-1.1/html/Makefile.in
> --- nagios-1.1-virgin/html/Makefile.in Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/html/Makefile.in Tue Oct 7 13:03:51 2003
> @@ -1,6 +1,6 @@
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +CFLAGS=@CFLAGS@ @DEFS@ `pkg-config glib --cflags`
> +LDFLAGS=@LDFLAGS@ @LIBS@ `pkg-config glib --libs`
>
> prefix=@prefix@
> exec_prefix=@exec_prefix@
> diff -ru nagios-1.1-virgin/cgi/status.c nagios-1.1/cgi/status.c
> --- nagios-1.1-virgin/cgi/status.c Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/cgi/status.c Tue Oct 7 12:29:00 2003
> @@ -1151,6 +1151,7 @@
> printf("<TH CLASS='status'>Attempt <A
> HREF='%s&sorttype=%d&sortoption=%d'><IMG SRC='%s%s' BORDER=0 ALT='Sort
> by current attempt (ascending)'></A><A
> HREF='%s&sorttype=%d&sortoption=%d'><IMG SRC='%s%s' BORDER=0 ALT='Sort
> by current attempt
> (descending)'></A></
> TH>",temp_url,SORT_ASCENDING,SORT_CURRENTATTEMPT,url_images_path,UP_ARR
> OW_ICON,temp_url,SORT_DESCENDING,SORT_CURRENTATTEMPT,url_images_path,DO
> WN_ARROW_ICON);
>
> printf("<TH CLASS='status'>Status Information</TH>\n");
> + printf("<TH CLASS='status'>Ack</TH>\n");
> printf("</TR>\n");
>
>
> @@ -1499,6 +1500,15 @@
> printf("<TD CLASS='status%s'
> nowrap>%s</TD>\n",status_bg_class,state_duration);
> printf("<TD
> CLASS='status%s'>%d/%d</TD>\n",status_bg_class,temp_status-
> >current_attempt,temp_status->max_attempts);
> printf("<TD
> CLASS='status%s'>%s </TD>\n",status_bg_class,temp_status-
> >information);
> + if (temp_status->status==SERVICE_OK)
> + {
> + printf("<TD CLASS='status%s'> </TD>\n",status_bg_class);
> + }
> + else
> + {
> + printf("<TD CLASS='status%s'><A HREF='%s?cmd_typ=34&host=%s",
> status_bg_class, COMMAND_CGI, url_encode(temp_status->host_name));
> + printf("&service=%s'>Ack</A></TD>\n",
> url_encode(temp_status->description));
> + }
>
> printf("</TR>\n");
>
> diff -u -b -B -r1.1.1.1 Makefile.in
> --- base/Makefile.in 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ base/Makefile.in 29 Jul 2003 08:22:54 -0000
> @@ -10,9 +10,9 @@
> SRC_XDATA=../xdata
>
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@ -DNSCORE
> +CFLAGS=@CFLAGS@ @DEFS@ -DNSCORE `glib-config --cflags`
> #CFLAGS=-O3 -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
> -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
> -DHAVE_CONFIG_H -DNSCORE
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +LDFLAGS=@LDFLAGS@ @LIBS@ `glib-config --libs`
>
> prefix=@prefix@
> exec_prefix=@exec_prefix@
> diff -u -b -B -r1.1.1.1 Makefile.in
> --- cgi/Makefile.in 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ cgi/Makefile.in 29 Jul 2003 08:22:54 -0000
> @@ -25,9 +25,9 @@
>
> CP=@CP@
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@ -DNSCGI
> +CFLAGS=@CFLAGS@ @DEFS@ -DNSCGI `glib-config --cflags`
> #CFLAGS=-O3 -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align
> -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs
> -DHAVE_CONFIG_H -DNSCGI
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +LDFLAGS=@LDFLAGS@ @LIBS@ `glib-config --libs`
>
> CGIS=avail.cgi cmd.cgi config.cgi extinfo.cgi history.cgi
> notifications.cgi outages.cgi showlog.cgi status.cgi statuswml.cgi
> summary.cgi tac.cgi $(CGIEXTRAS)
>
> diff -u -b -B -r1.1.1.2 common.h
> --- common/common.h 23 Jun 2003 01:57:24 -0000 1.1.1.2
> +++ common/common.h 29 Jul 2003 08:22:54 -0000
> @@ -208,8 +208,12 @@
> #define OK 0
> #define ERROR -2 /* value was changed from -1 so as to not
> interfere with STATUS_UNKNOWN plugin result */
>
> +#ifndef TRUE
> #define TRUE 1
> +#endif
> +#ifndef FALSE
> #define FALSE 0
> +#endif
>
>
> /****************** HOST CONFIG FILE READING OPTIONS
> ********************/
> diff -u -b -B -r1.1.1.1 config.h.in
> --- common/config.h.in 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ common/config.h.in 29 Jul 2003 08:22:54 -0000
> @@ -214,3 +214,7 @@
> #include <dirent.h>
> #endif
>
> +#define HAVE_GLIB_H 1
> +#ifdef HAVE_GLIB_H
> +#include <glib.h>
> +#endif
> diff -u -b -B -r1.1.1.1 objects.c
> --- common/objects.c 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ common/objects.c 29 Jul 2003 08:22:54 -0000
> @@ -59,6 +59,7 @@
> servicedependency *servicedependency_list=NULL;
> hostdependency *hostdependency_list=NULL;
> hostescalation *hostescalation_list=NULL;
> +GHashTable *service_hash = NULL;
>
>
>
> @@ -2222,6 +2223,19 @@
> printf("\tEvent Handler:
> %s\n",(new_service->event_handler==NULL)?"N/A":new_service-
> >event_handler);
> #endif
>
> +#ifdef HAVE_GLIB_H
> + /* Cache service in hash table */
> + if (!service_hash)
> + service_hash = g_hash_table_new(g_str_hash, g_str_equal);
> +
> + if (service_hash)
> + {
> + char *key = calloc(strlen(new_service->host_name) +
> strlen(new_service->description) + 2, 1);
> + sprintf(key, "%s-%s", new_service->host_name,
> new_service->description);
> + g_hash_table_insert(service_hash, key, new_service);
> + }
> +#endif
> +
> #ifdef DEBUG0
> printf("add_service() end\n");
> #endif
> @@ -3500,6 +3514,18 @@
> if(host_name==NULL || svc_desc==NULL)
> return NULL;
>
> +#ifdef HAVE_GLIB_H
> + /* Lookup service in the hash */
> + if (service_hash)
> + {
> + char *key = calloc(strlen(host_name) + strlen(svc_desc) + 2, 1);
> + sprintf(key, "%s-%s", host_name, svc_desc);
> + temp_service = (service *)g_hash_table_lookup(service_hash, key);
> + free(key);
> + return temp_service;
> + }
> +#endif
> +
> if(svcptr==NULL)
> temp_service=service_list;
> else
> diff -u -b -B -r1.1.1.2 Makefile.in
> --- contrib/Makefile.in 23 Jun 2003 01:57:24 -0000 1.1.1.2
> +++ contrib/Makefile.in 29 Jul 2003 08:22:54 -0000
> @@ -5,8 +5,8 @@
> ###############################
>
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +CFLAGS=@CFLAGS@ @DEFS@ `glib-config --cflags`
> +LDFLAGS=@LDFLAGS@ @LIBS@ `glib-config --libs`
>
> # Source code directories
> SRC_COMMON=../common
> diff -u -b -B -r1.1.1.1 Makefile.in
> --- html/Makefile.in 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ html/Makefile.in 29 Jul 2003 08:22:54 -0000
> @@ -1,6 +1,6 @@
> CC=@CC@
> -CFLAGS=@CFLAGS@ @DEFS@
> -LDFLAGS=@LDFLAGS@ @LIBS@
> +CFLAGS=@CFLAGS@ @DEFS@ `glib-config --cflags`
> +LDFLAGS=@LDFLAGS@ @LIBS@ `glib-config --libs`
>
> prefix=@prefix@
> exec_prefix=@exec_prefix@
> diff -ru nagios-1.1-virgin/cgi/status.c nagios-1.1/cgi/status.c
> --- nagios-1.1-virgin/cgi/status.c Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/cgi/status.c Wed Nov 26 18:01:16 2003
> @@ -1293,9 +1293,15 @@
> strncpy(status,"CRITICAL",sizeof(status));
> status_class="CRITICAL";
> if(temp_status->problem_has_been_acknowledged==TRUE)
> + {
> status_bg_class="BGCRITICALACK";
> + status_class="BGCRITICALACK";
> + }
> else if(temp_status->scheduled_downtime_depth>0)
> + {
> status_bg_class="BGCRITICALSCHED";
> + status_class="BGCRITICALSCHED";
> + }
> else
> status_bg_class="BGCRITICAL";
> }
> diff -ur nagios-1.1-virgin/base/nagios.c nagios-1.1/base/nagios.c
> --- nagios-1.1-virgin/base/nagios.c Thu Jul 10 08:30:10 2003
> +++ nagios-1.1/base/nagios.c Thu Jul 10 08:32:20 2003
> @@ -51,6 +51,8 @@
> #include <getopt.h>
> #endif
>
> +#include <time.h>
> +
> /******** BEGIN EMBEDDED PERL INTERPRETER DECLARATIONS ********/
>
> #ifdef EMBEDDEDPERL
> @@ -1497,6 +1499,8 @@
> printf("Current/Max Outstanding Checks:
> %d/> %d\n",currently_running_service_checks,max_parallel_service_checks);
> #endif
>
> + check_for_external_commands();
> +
> /* handle high priority events */
> if(event_list_high!=NULL &&
> (current_time>=event_list_high->run_time)){
>
> @@ -1594,8 +1598,13 @@
> }
>
> /* wait a second so we don't hog the CPU... */
> - else
> - sleep((unsigned int)sleep_time);
> + else {
> + struct timespec t;
> + t.tv_sec = 0;
> + t.tv_nsec = 1000 * 1000 * 50;
> + nanosleep(&t, NULL);
> + //check_for_external_commands();
> + }
> }
>
> /* we don't have anything to do at this moment in time */
> @@ -1606,7 +1615,12 @@
> check_for_external_commands();
>
> /* wait a second so we don't hog the CPU... */
> - sleep((unsigned int)sleep_time);
> +
> + { struct timespec t;
> + t.tv_sec = 0;
> + t.tv_nsec = 1000 * 1000 * 50;
> + nanosleep(&t, NULL); }
> +
> }
> }
>
> --- commands.c.old Sat Aug 2 14:13:23 2003
> +++ nagios-1.1/base/commands.c Sat Aug 2 14:13:53 2003
> @@ -347,8 +347,19 @@
>
>
> /**** PROCESS ALL PASSIVE CHECK RESULTS AT ONE TIME ****/
> - if(passive_check_result_list!=NULL)
> - process_passive_service_checks();
> + {
> + static unsigned int last_checked = 0;
> + unsigned int t;
> +
> + /* Don't process more frequently than once
> every 5 seconds. */
> + /* This does a fork!!! */
> + time(&t);
> + if(passive_check_result_list!=NULL && ((t -
> last_checked) > 5) ) {
> + process_passive_service_checks();
> + last_checked = t;
> + }
> + }
> +
>
>
> #ifdef DEBUG0
> --- commands.c.old Sat Aug 2 15:37:31 2003
> +++ nagios-1.1/base/commands.c Sat Aug 2 15:44:36 2003
> @@ -63,7 +63,7 @@
>
> extern FILE *command_file_fp;
>
> -passive_check_result *passive_check_result_list;
> +passive_check_result *passive_check_result_list = NULL;
>
> int flush_pending_commands=FALSE;
>
> @@ -96,9 +96,6 @@
> /* update the status log with new program information */
> update_program_status(FALSE);
>
> - /* reset passive check result list pointer */
> - passive_check_result_list=NULL;
> -
> /* reset flush flag */
> flush_pending_commands=FALSE;
>
> @@ -1279,13 +1276,9 @@
>
> new_pcr->next=NULL;
>
> - /* add the passive check result to the end of the list in memory */
> - if(passive_check_result_list==NULL)
> - passive_check_result_list=new_pcr;
> - else{
> - for(temp_pcr=passive_check_result_list;temp_pcr-
> >next!=NULL;temp_pcr=temp_pcr->next);
> - temp_pcr->next=new_pcr;
> - }
> + /* add the passive check result to the head of the list in memory */
> + new_pcr->next = passive_check_result_list;
> + passive_check_result_list = new_pcr;
>
> #ifdef DEBUG0
> printf("cmd_process_service_check_result() end\n");
> @@ -2845,6 +2838,17 @@
>
> /* the grandchild process should submit the service check result...
> */
> if(pid==0){
> + passive_check_result *t, *t1;
> + /* Reverse passive list to correct the reverse that happened in
> collection. */
> +
> + t = passive_check_result_list;
> + passive_check_result_list = NULL;
> + while (t) {
> + t1 = t->next;
> + t->next = passive_check_result_list;
> + passive_check_result_list = t;
> + t = t1;
> + }
>
> /* write all service checks to the IPC pipe for later processing
> by the grandparent */
>
>
> for(temp_pcr=passive_check_result_list;temp_pcr!=NULL;temp_pcr=temp_pcr
> ->next){
> Index: base/checks.c
> ===================================================================
> RCS file: /home/cvs/repos/nagios_source/base/checks.c,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 checks.c
> --- base/checks.c 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ base/checks.c 7 Dec 2003 21:15:43 -0000
> @@ -522,6 +522,7 @@
> time_t current_time;
> int first_check=FALSE;
> int state_was_logged=FALSE;
> + int output_changed = FALSE;
> char old_plugin_output[MAX_PLUGINOUTPUT_LENGTH]="";
> char temp_plugin_output[MAX_PLUGINOUTPUT_LENGTH]="";
> char *temp_ptr;
> @@ -617,6 +618,7 @@
> dependency_result=DEPENDENCIES_OK;
> first_check=FALSE;
> state_was_logged=FALSE;
> + output_changed=FALSE;
> strcpy(old_plugin_output,"");
> strcpy(temp_plugin_output,"");
>
> @@ -705,6 +707,9 @@
> /* grab the return code */
> temp_service->current_state=queued_svc_msg.return_code;
> }
> +
> + if (strcmp(old_plugin_output,temp_service->plugin_output))
> + output_changed = TRUE;
>
> /* get the host that this service runs on */
> temp_host=find_host(temp_service->host_name,NULL);
> @@ -835,7 +840,7 @@
> state_was_logged=TRUE;
>
> /* notify contacts about the service recovery */
> - service_notification(temp_service,NULL);
> + service_notification(temp_service,NULL,output_changed);
>
> /* run the service event handler to handle the hard state change
> */
> handle_service_event(temp_service,HARD_STATE);
> @@ -1064,7 +1069,7 @@
> check_pending_flex_service_downtime(temp_service);
>
> /* (re)send notifications out about this service problem if the
> host is up (and was at last check also) and the dependencies were
> okay... */
> - service_notification(temp_service,NULL);
> + service_notification(temp_service,NULL,output_changed);
>
> /* run the service event handler if we changed state from the
> last hard state or if this service is flagged as being volatile */
> if(hard_state_change==TRUE || temp_service->is_volatile==TRUE)
> @@ -1103,7 +1108,6 @@
>
> /* if we're stalking this state type and state was not already
> logged AND the plugin output changed since last check, log it now.. */
> if(temp_service->state_type==HARD_STATE && state_change==FALSE &&
> state_was_logged==FALSE &&
> strcmp(old_plugin_output,temp_service->plugin_output)){
> -
> if((temp_service->current_state==STATE_OK &&
> temp_service->stalk_on_ok==TRUE))
> log_service_event(temp_service,HARD_STATE);
>
> Index: base/commands.c
> ===================================================================
> RCS file: /home/cvs/repos/nagios_source/base/commands.c,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 commands.c
> --- base/commands.c 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ base/commands.c 7 Dec 2003 21:15:43 -0000
> @@ -2277,7 +2277,7 @@
>
> /* send out an acknowledgement notification */
> if(notify==TRUE)
> - service_notification(svc,ack_data);
> + service_notification(svc,ack_data,0);
>
> /* set the acknowledgement flag */
> svc->problem_has_been_acknowledged=TRUE;
> Index: base/flapping.c
> ===================================================================
> RCS file: /home/cvs/repos/nagios_source/base/flapping.c,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 flapping.c
> --- base/flapping.c 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ base/flapping.c 7 Dec 2003 21:15:43 -0000
> @@ -321,7 +321,7 @@
>
> /* should we send a recovery notification? */
> if(svc->check_flapping_recovery_notification==TRUE &&
> svc->current_state==STATE_OK)
> - service_notification(svc,NULL);
> + service_notification(svc,NULL,0);
>
> /* clear the recovery notification flag */
> svc->check_flapping_recovery_notification=FALSE;
> Index: base/nagios.h.in
> ===================================================================
> RCS file: /home/cvs/repos/nagios_source/base/nagios.h.in,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 nagios.h.in
> --- base/nagios.h.in 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ base/nagios.h.in 7 Dec 2003 21:15:44 -0000
> @@ -367,10 +367,10 @@
>
>
> /**** Notification Functions ****/
> -int check_service_notification_viability(service *,char *); /*
> checks viability of notifying all contacts about a service */
> +int check_service_notification_viability(service *,char *,int); /*
> checks viability of notifying all contacts about a service */
> int is_valid_escalation_for_service_notification(service
> *,serviceescalation *); /* checks if an escalation entry is valid for
> a particular service notification */
> int should_service_notification_be_escalated(service *); /* checks
> if a service notification should be escalated */
> -int service_notification(service *,char *);
> /* notify all contacts about a service (problem or recovery) */
> +int service_notification(service *,char *,int);
> /* notify all contacts about a service (problem or recovery) */
> int check_contact_service_notification_viability(contact *, service
> *); /* checks viability of notifying a contact about a service */
> int notify_contact_of_service(contact *,service *,char *); /*
> notify a single contact about a service */
> int check_host_notification_viability(host *,int,char *); /* checks
> viability of notifying all contacts about a host */
> Index: base/notifications.c
> ===================================================================
> RCS file: /home/cvs/repos/nagios_source/base/notifications.c,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 notifications.c
> --- base/notifications.c 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ base/notifications.c 7 Dec 2003 21:15:44 -0000
> @@ -58,7 +58,7 @@
>
>
> /* notify contacts about a service problem or recovery */
> -int service_notification(service *svc, char *ack_data){
> +int service_notification(service *svc, char *ack_data, int
> output_changed) {
> host *temp_host;
> notification *temp_notification;
> time_t current_time;
> @@ -87,7 +87,7 @@
> }
>
> /* check the viability of sending out a service notification */
> - if(check_service_notification_viability(svc,ack_data)==ERROR){
> +
> if(check_service_notification_viability(svc,ack_data,output_changed)==E
> RROR){
> #ifdef DEBUG4
> printf("\tSending out a notification for this service is not viable
> at this time.\n");
> #endif
> @@ -200,7 +200,7 @@
>
>
> /* checks the viability of sending out a service alert (top level
> filters) */
> -int check_service_notification_viability(service *svc, char
> *ack_data){
> +int check_service_notification_viability(service *svc, char
> *ack_data, int output_changed){
> host *temp_host;
> time_t current_time;
> time_t timeperiod_start;
> @@ -371,7 +371,12 @@
> }
>
> /* don't notify if we haven't waited long enough since the last time
> (and the service is not marked as being volatile) */
> - if((current_time < svc->next_notification) &&
> svc->is_volatile==FALSE){
> + if((current_time < svc->next_notification) &&
> svc->is_volatile==FALSE &&
> + (!output_changed ||
> + (svc->current_state==STATE_OK && !svc->stalk_on_ok) ||
> + (svc->current_state==STATE_WARNING && !svc->stalk_on_warning) ||
> + (svc->current_state==STATE_UNKNOWN && !svc->stalk_on_unknown) ||
> + (svc->current_state==STATE_CRITICAL && !svc->stalk_on_critical) )){
> #ifdef DEBUG4
> printf("\tWe haven't waited long enough to re-notify contacts about
> this service!\n");
> printf("\tNext valid notification time:
> %s",ctime(&svc->next_notification));
> ? cgi/Makefile
> ? cgi/authall.patch
> ? cgi/avail.cgi
> ? cgi/cgiutils.h
> ? cgi/cmd.cgi
> ? cgi/config.cgi
> ? cgi/extinfo.cgi
> ? cgi/histogram.cgi
> ? cgi/history.cgi
> ? cgi/notifications.cgi
> ? cgi/outages.cgi
> ? cgi/showlog.cgi
> ? cgi/status.cgi
> ? cgi/statusmap.cgi
> ? cgi/statuswml.cgi
> ? cgi/statuswrl.cgi
> ? cgi/summary.cgi
> ? cgi/tac.cgi
> ? cgi/trends.cgi
> Index: cgi/auth.c
> ===================================================================
> RCS file: /home/cvs/repos/nagios_source/cgi/auth.c,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 auth.c
> --- cgi/auth.c 23 Jun 2003 01:56:10 -0000 1.1.1.1
> +++ cgi/auth.c 25 Feb 2004 00:35:29 -0000
> @@ -198,9 +198,6 @@
> int is_authorized_for_host(host *hst, authdata *authinfo){
> contact *temp_contact;
>
> - if(hst==NULL)
> - return FALSE;
> -
> /* if we're not using authentication, fake it */
> if(use_authentication==FALSE)
> return TRUE;
> @@ -213,6 +210,9 @@
> if(is_authorized_for_all_hosts(authinfo)==TRUE)
> return TRUE;
>
> + if(hst==NULL)
> + return FALSE;
> +
> /* find the contact */
> temp_contact=find_contact(authinfo->username,NULL);
>
> @@ -252,9 +252,6 @@
> host *temp_host;
> contact *temp_contact;
>
> - if(svc==NULL)
> - return FALSE;
> -
> /* if we're not using authentication, fake it */
> if(use_authentication==FALSE)
> return TRUE;
> @@ -266,6 +263,9 @@
> /* if this user is authorized for all services, they are for this
> one... */
> if(is_authorized_for_all_services(authinfo)==TRUE)
> return TRUE;
> +
> + if(svc==NULL)
> + return FALSE;
>
> /* find the host */
> temp_host=find_host(svc->host_name,NULL);
> diff -ruN nagios-plugins-1.3.0.orig/plugins/check_smtp.c
> nagios-plugins-1.3.0/plugins/check_smtp.c
> --- nagios-plugins-1.3.0.orig/plugins/check_smtp.c 2003-02-15
> 23:48:46.000000000 +1100
> +++ nagios-plugins-1.3.0/plugins/check_smtp.c 2003-08-12
> 15:00:07.000000000 +1000
> @@ -69,12 +69,77 @@
> char *server_address = NULL;
> char *server_expect = NULL;
> char *from_arg = " ";
> +char *authtype = NULL;
> +char *authuser = NULL;
> +char *authpass = NULL;
> int warning_time = 0;
> int check_warning_time = FALSE;
> int critical_time = 0;
> int check_critical_time = FALSE;
> int verbose = FALSE;
>
> +/* encode64 routine from
> http://www.experts-exchange.com/Programming/Programming_Languages/C/
> Q_20245582.html */
> +
> +#define BUFOVER (-2)
> +#define CHAR64(c) (((c) < 0 || (c) > 127) ? -1 :
> index_64[(c)])
> +static char basis_64[] =
> +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
> ???????????????????????????????????????????????????????????????????????
> ????????????????????????????????????????????????????????????????????";
> +static char index_64[128] = {
> + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
> + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
> + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
> + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
> + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
> + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
> + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
> + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
> +};
> +
> +static int
> +encode64(const char *_in, unsigned inlen, char *_out, unsigned
> outmax, unsigned *outlen)
> +{
> +
> + const unsigned char *in = (const unsigned char *) _in;
> + unsigned char *out = (unsigned char *) _out;
> + unsigned char oval;
> + char *blah;
> + unsigned olen;
> +
> + olen = (inlen + 2) / 3 * 4;
> + if (outlen)
> + *outlen = olen;
> + if (outmax < olen)
> + return BUFOVER;
> +
> + blah = (char *) out;
> + while (inlen >= 3)
> + {
> +/* user provided max buffer size; make sure we don't go over it */
> + *out++ = basis_64[in[0] >> 2];
> + *out++ = basis_64[((in[0] << 4) & 0x30) | (in[1] >> 4)];
> + *out++ = basis_64[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
> + *out++ = basis_64[in[2] & 0x3f];
> + in += 3;
> + inlen -= 3;
> + }
> + if (inlen > 0)
> + {
> +/* user provided max buffer size; make sure we don't go over it */
> + *out++ = basis_64[in[0] >> 2];
> + oval = (in[0] << 4) & 0x30;
> + if (inlen > 1)
> + oval |= in[1] >> 4;
> + *out++ = basis_64[oval];
> + *out++ = (inlen < 2) ? '=' : basis_64[(in[1] << 2) & 0x3c];
> + *out++ = '=';
> + }
> +
> + if (olen < outmax)
> + *out = '\0';
> +
> + return OK;
> +}
> +
> int
> main (int argc, char **argv)
> {
> @@ -83,6 +148,7 @@
> char buffer[MAX_INPUT_BUFFER] = "";
> char *from_str = NULL;
> char *helocmd = NULL;
> + char *error_msg = NULL;
>
> if (process_arguments (argc, argv) != OK)
> usage ("Invalid command arguments supplied\n");
> @@ -124,41 +190,134 @@
> if (result == -1) {
> printf ("recv() failed\n");
> result = STATE_WARNING;
> + } else
> + result = STATE_OK;
> +
> + /* make sure we find the response we are looking for */
> + if (result == STATE_OK && !strstr (buffer, server_expect)) {
> + if (server_port == SMTP_PORT)
> + printf ("Invalid SMTP response received from host\n");
> + else
> + printf ("Invalid SMTP response received from host on port %d\n",
> + server_port);
> + result = STATE_WARNING;
> }
> -
> - else {
> -
> - /* make sure we find the response we are looking for */
> - if (!strstr (buffer, server_expect)) {
> - if (server_port == SMTP_PORT)
> - printf ("Invalid SMTP response received from host\n");
> - else
> - printf ("Invalid SMTP response received from host on port %d\n",
> - server_port);
> - result = STATE_WARNING;
> +
> + if (result == STATE_OK && authtype != NULL) {
> + if (strcmp (authtype, "LOGIN") == 0) {
> + char abuf[MAX_INPUT_BUFFER];
> + unsigned alen;
> + int ret;
> + do {
> + if (authuser == NULL) {
> + result = STATE_CRITICAL;
> + error_msg = "no authuser specified";
> + break;
> + }
> + if (authpass == NULL) {
> + result = STATE_CRITICAL;
> + error_msg = "no authpass specified";
> + break;
> + }
> + send(sd, "AUTH LOGIN\r\n", strlen("AUTH LOGIN\r\n"), 0);
> + if (verbose == TRUE) {
> + printf ("sent AUTH LOGIN\n");
> + }
> + if ((ret = recv(sd, buffer, MAX_INPUT_BUFFER-1, 0)) == -1) {
> + result = STATE_CRITICAL;
> + error_msg = "recv() failed after AUTH LOGIN";
> + break;
> + }
> + buffer[ret] = 0;
> + if (verbose == TRUE) {
> + printf ("received %s\n", buffer);
> + }
> + if (strncmp (buffer, "334", 3) != 0) {
> + result = STATE_CRITICAL;
> + error_msg = "invalid response received after AUTH LOGIN";
> + break;
> + }
> + if (encode64 (authuser, strlen(authuser), abuf,
> MAX_INPUT_BUFFER, &alen) != OK) {
> + result = STATE_CRITICAL;
> + error_msg = "failed to base64-encode authuser";
> + break;
> + }
> + strcat (abuf, "\r\n");
> + send(sd, abuf, strlen(abuf), 0);
> + if (verbose == TRUE) {
> + printf ("sent %s\n", abuf);
> + }
> + if ((ret = recv(sd, buffer, MAX_INPUT_BUFFER-1, 0)) == -1) {
> + result = STATE_CRITICAL;
> + error_msg = "recv() failed after sending authuser";
> + break;
> + }
> + buffer[ret] = 0;
> + if (verbose == TRUE) {
> + printf ("received %s\n", buffer);
> + }
> + if (strncmp (buffer, "334", 3) != 0) {
> + result = STATE_CRITICAL;
> + error_msg = "invalid response received after authuser";
> + break;
> + }
> + if (encode64 (authpass, strlen(authpass), abuf,
> MAX_INPUT_BUFFER, &alen) != OK) {
> + result = STATE_CRITICAL;
> + error_msg = "failed to base64-encode authpass";
> + break;
> + }
> + strcat (abuf, "\r\n");
> + send(sd, abuf, strlen(abuf), 0);
> + if (verbose == TRUE) {
> + printf ("sent %s\n", abuf);
> + }
> + if ((ret = recv(sd, buffer, MAX_INPUT_BUFFER-1, 0)) == -1) {
> + result = STATE_CRITICAL;
> + error_msg = "recv() failed after sending authpass";
> + break;
> + }
> + buffer[ret] = 0;
> + if (verbose == TRUE) {
> + printf ("received %s\n", buffer);
> + }
> + if (strncmp (buffer, "235", 3) != 0) {
> + result = STATE_CRITICAL;
> + error_msg = "invalid response received after authpass";
> + break;
> + }
> + break;
> + } while (0);
> + } else {
> + result = STATE_CRITICAL;
> + error_msg = "only authtype LOGIN is supported";
> }
> + }
> +
> + time (&end_time);
>
> - else {
> -
> - time (&end_time);
> -
> - result = STATE_OK;
> -
> - if (check_critical_time == TRUE
> - && (end_time - start_time) > critical_time) result =
> - STATE_CRITICAL;
> - else if (check_warning_time == TRUE
> - && (end_time - start_time) > warning_time) result =
> - STATE_WARNING;
> -
> - if (verbose == TRUE)
> - printf ("SMTP %s - %d sec. response time, %s\n",
> - state_text (result), (int) (end_time - start_time), buffer);
> - else
> - printf ("SMTP %s - %d second response time\n", state_text
> (result),
> - (int) (end_time - start_time));
> + if (check_critical_time == TRUE
> + && (end_time - start_time) > critical_time) result =
> + STATE_CRITICAL;
> + else if (check_warning_time == TRUE
> + && (end_time - start_time) > warning_time) result =
> + STATE_WARNING;
> +
> + if (verbose == TRUE)
> + if (error_msg == NULL) {
> + printf ("SMTP %s - %d sec. response time, %s\n",
> + state_text (result), (int) (end_time - start_time),
> buffer);
> + } else {
> + printf ("SMTP %s - %s, %d sec. response time, %s\n",
> + state_text (result), error_msg, (int) (end_time -
> start_time), buffer);
> + }
> + else
> + if (error_msg == NULL) {
> + printf ("SMTP %s - %d second response time\n",
> + state_text (result), (int) (end_time - start_time));
> + } else {
> + printf ("SMTP %s - %s, %d second response time\n",
> + state_text (result), error_msg, (int) (end_time -
> start_time));
> }
> - }
>
> /* close the connection */
>
> @@ -211,6 +370,9 @@
> {"warning", required_argument, 0, 'w'},
> {"port", required_argument, 0, 'p'},
> {"from", required_argument, 0, 'f'},
> + {"authtype", required_argument, 0, 'A'},
> + {"authuser", required_argument, 0, 'U'},
> + {"authpass", required_argument, 0, 'P'},
> {"verbose", no_argument, 0, 'v'},
> {"version", no_argument, 0, 'V'},
> {"help", no_argument, 0, 'h'},
> @@ -233,10 +395,10 @@
> while (1) {
> #ifdef HAVE_GETOPT_H
> c =
> - getopt_long (argc, argv, "+hVvt:p:f:e:c:w:H:", long_options,
> + getopt_long (argc, argv, "+hVvt:p:f:e:c:w:H:A:U:P:", long_options,
> &option_index);
> #else
> - c = getopt (argc, argv, "+?hVvt:p:f:e:c:w:H:");
> + c = getopt (argc, argv, "+?hVvt:p:f:e:c:w:H:A:U:P:");
> #endif
> if (c == -1 || c == EOF)
> break;
> @@ -261,6 +423,15 @@
> case 'f': /* from argument */
> from_arg = optarg;
> break;
> + case 'A':
> + authtype = optarg;
> + break;
> + case 'U':
> + authuser = optarg;
> + break;
> + case 'P':
> + authpass = optarg;
> + break;
> case 'e': /* server expect string on 220 */
> server_expect = optarg;
> break;
> @@ -355,6 +526,12 @@
> " String to expect in first line of server response (default:
> %s)\n"
> " -f, --from=STRING\n"
> " from address to include in MAIL command (default NULL,
> Exchange2000 requires one)\n"
> + " -A, --authtype=STRING\n"
> + " SMTP AUTH type to check (default none, only LOGIN supported)\n"
> + " -U, --authuser=STRING\n"
> + " SMTP AUTH username\n"
> + " -P, --authpass=STRING\n"
> + " SMTP AUTH password\n"
> " -w, --warning=INTEGER\n"
> " Seconds necessary to result in a warning status\n"
> " -c, --critical=INTEGER\n"
> @@ -379,7 +556,7 @@
> print_usage (void)
> {
> printf
> - ("Usage: %s -H host [-e expect] [-p port] [-f from addr] [-w warn]
> [-c crit] [-t timeout] [-v]\n"
> + ("Usage: %s -H host [-e expect] [-p port] [-f from addr] [-A
> authtype -U authuser -P authpass] [-w warn] [-c crit] [-t timeout]
> [-v]\n"
> " %s --help\n"
> " %s --version\n", progname, progname, progname);
> }
> --- /tmp/nagios-plugins-1.3.0/plugins/check_time.c 2003-02-15
> 23:48:46.000000000 +1100
> +++ nagios-plugins-1.3.0/plugins/check_time.c 2003-06-06
> 10:43:32.000000000 +1000
> @@ -61,7 +61,7 @@
> int check_critical_diff = FALSE;
> int server_port = TIME_PORT;
> char *server_address = NULL;
> -
> +int use_udp = FALSE;
>
> int process_arguments (int, char **);
> void print_usage (void);
> @@ -85,7 +85,13 @@
> time (&start_time);
>
> /* try to connect to the host at the given port number */
> - if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK) {
> + if (use_udp) {
> + result = my_udp_connect (server_address, server_port, &sd);
> + } else {
> + result = my_tcp_connect (server_address, server_port, &sd);
> + }
> +
> + if (result != STATE_OK) {
> if (check_critical_time == TRUE)
> result = STATE_CRITICAL;
> else if (check_warning_time == TRUE)
> @@ -94,7 +100,21 @@
> result = STATE_UNKNOWN;
> terminate (result,
> "TIME UNKNOWN - could not connect to server %s, port
> %d\n",
> - server_address, server_port);
> + server_address, server_port);
> + }
> +
> + if (use_udp) {
> + if (send (sd, "", 0, 0) < 0) {
> + if (check_critical_time == TRUE)
> + result = STATE_CRITICAL;
> + else if (check_warning_time == TRUE)
> + result = STATE_WARNING;
> + else
> + result = STATE_UNKNOWN;
> + terminate (result,
> + "TIME UNKNOWN - could not send UDP request to server
> %s, port %d\n",
> + server_address, server_port);
> + }
> }
>
> /* watch for the connection string */
> @@ -170,6 +190,7 @@
> {"timeout", required_argument, 0, 't'},
> {"version", no_argument, 0, 'V'},
> {"help", no_argument, 0, 'h'},
> + {"udp", no_argument, 0, 'u'},
> {0, 0, 0, 0}
> };
> #endif
> @@ -193,10 +214,10 @@
> while (1) {
> #ifdef HAVE_GETOPT_H
> c =
> - getopt_long (argc, argv, "hVH:w:c:W:C:p:t:", long_options,
> + getopt_long (argc, argv, "hVH:w:c:W:C:p:t:u", long_options,
> &option_index);
> #else
> - c = getopt (argc, argv, "hVH:w:c:W:C:p:t:");
> + c = getopt (argc, argv, "hVH:w:c:W:C:p:t:u");
> #endif
>
> if (c == -1 || c == EOF)
> @@ -275,6 +296,9 @@
> usage ("Timeout interval must be a nonnegative integer\n");
> socket_timeout = atoi (optarg);
> break;
> + case 'u':
> + /* udp */
> + use_udp = TRUE;
> }
> }
>
> @@ -338,6 +362,8 @@
> " Seconds before connection times out (default: %d)\n"
> " -p, --port=INTEGER\n"
> " Port number (default: %d)\n"
> + " -u, --udp\n"
> + " Use UDP to connect, not TCP\n"
> " -h, --help\n"
> " Print detailed help screen\n"
> " -V, --version\n"
> --- nagios-plugins-1.3.0/plugins/check_udp.c 2003-02-19
> 09:24:35.000000000 +1100
> +++ nagios-plugins-r1_3_0-200306050007/plugins/check_udp.c 2003-03-07
> 17:40:33.000000000 +1100
> @@ -6,7 +6,7 @@
> * License: GPL
> * Copyright (c) 1999 Ethan Galstad (nagios at nagios.org)
> *
> -* Last Modified: $Date: 2003/02/18 22:24:35 $
> +* Last Modified: $Date: 2003/03/07 06:40:33 $
> *
> * Command line: CHECK_UDP <host_address> [-p port] [-s send] [-e
> expect] \
> * [-wt warn_time] [-ct crit_time] [-to to_sec]
> @@ -173,7 +173,7 @@
> print_help ();
> exit (STATE_OK);
> case 'V': /* version */
> - print_revision (progname, "$Revision: 1.4 $");
> + print_revision (progname, "$Revision: 1.4.2.1 $");
> exit (STATE_OK);
> case 'v': /* verbose mode */
> verbose = TRUE;
> @@ -220,9 +220,9 @@
> usage ("Invalid host name/address\n");
> server_address = argv[c++];
> }
> - else {
> +
> + if (server_address == NULL)
> usage ("Host name was not supplied\n");
> - }
>
> return c;
> }
> @@ -246,7 +246,7 @@
> void
> print_help (void)
> {
> - print_revision (progname, "$Revision: 1.4 $");
> + print_revision (progname, "$Revision: 1.4.2.1 $");
> printf
> ("Copyright (c) 1999 Ethan Galstad (nagios at nagios.org)\n\n"
> "This plugin tests an UDP connection with the specified
> host.\n\n");
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by: IBM Linux Tutorials
> Free Linux tutorial presented by Daniel Robbins, President and CEO of
> GenToo technologies. Learn everything from fundamentals to system
> administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
> _______________________________________________
> Nagios-devel mailing list
> Nagios-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/nagios-devel
>
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
More information about the Developers
mailing list