Merge branch 'sh/perl' into collectd-4
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Wed, 18 Apr 2007 16:00:42 +0000 (18:00 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Wed, 18 Apr 2007 16:00:42 +0000 (18:00 +0200)
ChangeLog
configure.in
src/Makefile.am
src/collectd-nagios.pod [new file with mode: 0644]
src/nut.c
src/ping.c

index b3aaed8..25c75bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -19,6 +19,8 @@
          communicate with the daemon while it is running. Right now the
          commands `GETVAL' and `PUTVAL' are implemented, but more are to
          come.
+       * perl plugin: The new `perl' plugin allows you to write extensions
+         for collectd in the scripting-language Perl.
        * logfile plugin: The new `logfile' plugin writes logmessages to files
          or STDOUT or STDERR.
        * syslog plugin: The new `syslog' plugin sends logmessages to the
index 91d13e8..c16d135 100644 (file)
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT(collectd, 4.0.0-rc3)
+AC_INIT(collectd, 4.0.0-rc4)
 AC_CONFIG_SRCDIR(src/collectd.c)
 AC_CONFIG_HEADERS(src/config.h)
 AM_INIT_AUTOMAKE(dist-bzip2)
@@ -1304,8 +1304,10 @@ AC_COLLECTD([wireless],  [disable], [module], [wireless link statistics])
 
 AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/liboconfig/Makefile src/liboping/Makefile)
 
-if test "x$with_libperl" != "xyes"
+if test "x$with_libperl" = "xyes"
 then
+       with_libperl="yes (version `perl -MConfig -e 'print $Config{version};'`)"
+else
        enable_perl="no (needs libperl)"
 fi
 
index 1016bfe..99a8de2 100644 (file)
@@ -541,7 +541,7 @@ collectd_LDADD += "-dlopen" wireless.la
 collectd_DEPENDENCIES += wireless.la
 endif
 
-dist_man_MANS = collectd.1 collectd.conf.5
+dist_man_MANS = collectd.1 collectd-nagios.1 collectd.conf.5
 #collectd_1_SOURCES = collectd.pod
 
 #EXTRA_DIST = $(man_MANS)
diff --git a/src/collectd-nagios.pod b/src/collectd-nagios.pod
new file mode 100644 (file)
index 0000000..ea274bb
--- /dev/null
@@ -0,0 +1,98 @@
+=head1 NAME
+
+collectd-nagios - Nagios plugin for querying collectd
+
+=head1 SYNOPSIS
+
+collectd-nagios B<-s> I<socket> B<-n> I<value_spec> B<-H> I<hostname> I<[options]>
+
+=head1 DESCRIPTION
+
+This small program is the glue between collectd and nagios. collectd collects
+various performance statistics which is provides via the C<unixsock plugin>.
+This program is called by Nagios, connects to the UNIX socket and reads the
+values from collectd. It then returns B<OKAY>, B<WARNING> or B<CRITICAL>
+depending on the values and the ranges provided by Nagios.
+
+=head1 ARGUMENTS AND OPTIONS
+
+The following arguments and options are required and understood by
+collectd-nagios. The order of the arguments generally doesn't matter, as long
+as no argument is passed more than once.
+
+=over 4
+
+=item B<-s> I<socket>
+
+Path of the UNIX socket opened by collectd's C<unixsock plugin>.
+
+=item B<-n> I<value_spec>
+
+The value to read from collectd. The argument is in the form
+C<plugin[-instance]/type[-instance]>.
+
+=item B<-H> I<hostname>
+
+Hostname to query the values for.
+
+=item B<-d> I<data_source>
+
+Each I<value_spec> may be made of multiple "data sources". With this option you
+can select one or more data sources. To select multiple data sources simply
+specify this option again. If multiple data sources are examined they are
+handled according to the consolidation function given with the B<-g> option.
+
+=item B<-g> B<none>I<|>B<average>I<|>B<sum>
+
+When multiple data sources are selected from a value spec they can be handled
+differently dependin on this option. The values of the following meaning:
+
+=over 4
+
+=item B<none>
+
+No consolidation if done and the warning and critical regions are applied to
+each value independently.
+
+=item B<average>
+
+The warning and critical ranges are applied to the average of all values.
+
+=item B<sum>
+
+The warning and critical ranges are applied to the sum of all values.
+
+=back
+
+=item B<-c> I<range>
+
+=item B<-w> I<range>
+
+Set the critical (B<-c>) and warning (B<-w>) ranges. These options mostly
+follow the normal syntax of Nagios plugins. The general format is
+"I<min>B<:>I<max>". If a value if smaller than I<min> or bigger than I<max> a
+warning or critical is returned, otherwise okay is returned. I<min> (and the
+colon) may be omitted and are then assumed to be zero. If I<max> (but not the
+colon) is omitted I<max> is set to positive infinity. If either I<min> or
+I<max> if set to B<~> they are set to negative and positive infinity,
+respectively.
+
+=back
+
+=head1 RETURN VALUE
+
+As usual for Nagios plugins this program writes a short, one line status
+message to STDOUT and signals success or failure with it's return value. It
+exists with a return value of B<0> for success or B<1> or B<2> for warning and
+critical, respectively. If the values is not available or some other error
+occured it returnes B<3> for "unknown". 
+
+=head1 SEE ALSO
+
+L<collectd(1)>, L<collectd.conf(5)>, L<http://nagios.org/>
+
+=head1 AUTHOR
+
+Florian Forster E<lt>octo@verplant.orgE<gt>
+
+=cut
index d839ba4..f6b9faf 100644 (file)
--- a/src/nut.c
+++ b/src/nut.c
@@ -119,7 +119,7 @@ struct nut_ups_s;
 typedef struct nut_ups_s nut_ups_t;
 struct nut_ups_s
 {
-  UPSCONN    conn;
+  UPSCONN   *conn;
   char      *upsname;
   char      *hostname;
   int        port;
@@ -139,10 +139,14 @@ static int config_keys_num = STATIC_ARRAY_SIZE(config_keys);
 
 static void free_nut_ups_t (nut_ups_t *ups)
 {
-    upscli_disconnect (&ups->conn);
-    sfree (ups->hostname);
-    sfree (ups->upsname);
-    sfree (ups);
+  if (ups->conn != NULL)
+  {
+    upscli_disconnect (ups->conn);
+    sfree (ups->conn);
+  }
+  sfree (ups->hostname);
+  sfree (ups->upsname);
+  sfree (ups);
 } /* void free_nut_ups_t */
 
 static int nut_add_ups (const char *name)
@@ -169,16 +173,6 @@ static int nut_add_ups (const char *name)
     return (1);
   }
 
-  status = upscli_connect (&ups->conn, ups->hostname, ups->port,
-      UPSCLI_CONN_TRYSSL);
-  if (status != 0)
-  {
-    ERROR ("nut plugin: nut_add_ups: upscli_connect (%s, %i) failed: %s",
-       ups->hostname, ups->port, upscli_strerror (&ups->conn));
-    free_nut_ups_t (ups);
-    return (1);
-  }
-
   if (upslist_head == NULL)
     upslist_head = ups;
   else
@@ -235,17 +229,43 @@ static int nut_read_one (nut_ups_t *ups)
   unsigned int answer_num;
   int status;
 
+  /* (Re-)Connect if we have no connection */
+  if (ups->conn == NULL)
+  {
+    ups->conn = (UPSCONN *) malloc (sizeof (UPSCONN));
+    if (ups->conn == NULL)
+    {
+      ERROR ("nut plugin: malloc failed.");
+      return (-1);
+    }
+
+    status = upscli_connect (ups->conn, ups->hostname, ups->port,
+       UPSCLI_CONN_TRYSSL);
+    if (status != 0)
+    {
+      ERROR ("nut plugin: nut_read_one: upscli_connect (%s, %i) failed: %s",
+         ups->hostname, ups->port, upscli_strerror (ups->conn));
+      sfree (ups->conn);
+      return (-1);
+    }
+
+    INFO ("nut plugin: Connection to (%s, %i) established.",
+       ups->hostname, ups->port);
+  } /* if (ups->conn == NULL) */
+
   /* nut plugin: nut_read_one: upscli_list_start (adpos) failed: Protocol
    * error */
-  status = upscli_list_start (&ups->conn, query_num, query);
+  status = upscli_list_start (ups->conn, query_num, query);
   if (status != 0)
   {
     ERROR ("nut plugin: nut_read_one: upscli_list_start (%s) failed: %s",
-       ups->upsname, upscli_strerror (&ups->conn));
+       ups->upsname, upscli_strerror (ups->conn));
+    upscli_disconnect (ups->conn);
+    sfree (ups->conn);
     return (-1);
   }
 
-  while ((status = upscli_list_next (&ups->conn, query_num, query,
+  while ((status = upscli_list_next (ups->conn, query_num, query,
          &answer_num, &answer)) == 1)
   {
     char  *key;
index 6dcd9ec..eb716a4 100644 (file)
@@ -75,14 +75,16 @@ static void add_hosts (void)
        hl_prev = NULL;
        while (hl_this != NULL)
        {
-               DEBUG ("host = %s, wait_left = %i, wait_time = %i, next = %p",
-                               hl_this->host, hl_this->wait_left, hl_this->wait_time, (void *) hl_this->next);
+               DEBUG ("ping plugin: host = %s, wait_left = %i, "
+                               "wait_time = %i, next = %p",
+                               hl_this->host, hl_this->wait_left,
+                               hl_this->wait_time, (void *) hl_this->next);
 
                if (hl_this->wait_left <= 0)
                {
                        if (ping_host_add (pingobj, hl_this->host) == 0)
                        {
-                               DEBUG ("Successfully added host %s", hl_this->host);
+                               DEBUG ("ping plugin: Successfully added host %s", hl_this->host);
                                /* Remove the host from the linked list */
                                if (hl_prev != NULL)
                                        hl_prev->next = hl_this->next;
@@ -94,6 +96,9 @@ static void add_hosts (void)
                        }
                        else
                        {
+                               WARNING ("ping plugin: Failed adding host "
+                                               "`%s': %s", hl_this->host,
+                                               ping_get_error (pingobj));
                                hl_this->wait_left = hl_this->wait_time;
                                hl_this->wait_time *= 2;
                                if (hl_this->wait_time > 86400)
@@ -127,8 +132,7 @@ static int ping_config (const char *key, const char *value)
        {
                if ((pingobj = ping_construct ()) == NULL)
                {
-                       ERROR ("ping: `ping_construct' failed: %s",
-                                       ping_get_error (pingobj));
+                       ERROR ("ping plugin: `ping_construct' failed.");
                        return (1);
                }
        }
@@ -204,6 +208,7 @@ static int ping_read (void)
        char   host[512];
        double latency;
        size_t buf_len;
+       int    number_of_hosts;
 
        if (pingobj == NULL)
                return (-1);
@@ -213,11 +218,12 @@ static int ping_read (void)
 
        if (ping_send (pingobj) < 0)
        {
-               ERROR ("ping: `ping_send' failed: %s",
+               ERROR ("ping plugin: `ping_send' failed: %s",
                                ping_get_error (pingobj));
                return (-1);
        }
 
+       number_of_hosts = 0;
        for (iter = ping_iterator_get (pingobj);
                        iter != NULL;
                        iter = ping_iterator_next (iter))
@@ -225,18 +231,32 @@ static int ping_read (void)
                buf_len = sizeof (host);
                if (ping_iterator_get_info (iter, PING_INFO_HOSTNAME,
                                        host, &buf_len))
+               {
+                       WARNING ("ping plugin: ping_iterator_get_info "
+                                       "(PING_INFO_HOSTNAME) failed.");
                        continue;
+               }
 
                buf_len = sizeof (latency);
                if (ping_iterator_get_info (iter, PING_INFO_LATENCY,
                                        &latency, &buf_len))
+               {
+                       WARNING ("ping plugin: ping_iterator_get_info (%s, "
+                                       "PING_INFO_LATENCY) failed.", host);
                        continue;
+               }
 
-               DEBUG ("host = %s, latency = %f", host, latency);
+               DEBUG ("ping plugin: host = %s, latency = %f", host, latency);
                ping_submit (host, latency);
+               number_of_hosts++;
        }
 
-       return (0);
+       if ((number_of_hosts == 0) && (getuid != 0))
+       {
+               ERROR ("ping plugin: All hosts failed. Try starting collectd as root.");
+       }
+
+       return (number_of_hosts == 0 ? -1 : 0);
 } /* int ping_read */
 
 void module_register (modreg_e load)