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
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)
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
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)
--- /dev/null
+=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
typedef struct nut_ups_s nut_ups_t;
struct nut_ups_s
{
- UPSCONN conn;
+ UPSCONN *conn;
char *upsname;
char *hostname;
int port;
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)
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
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;
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;
}
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)
{
if ((pingobj = ping_construct ()) == NULL)
{
- ERROR ("ping: `ping_construct' failed: %s",
- ping_get_error (pingobj));
+ ERROR ("ping plugin: `ping_construct' failed.");
return (1);
}
}
char host[512];
double latency;
size_t buf_len;
+ int number_of_hosts;
if (pingobj == NULL)
return (-1);
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))
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)