diff --git a/src/collectd-nagios.c b/src/collectd-nagios.c
index 1d989cbd747ac9de096777d81c02760972c18db1..45162bd3de607170e3b34399e078b851fd4a58bd 100644 (file)
--- a/src/collectd-nagios.c
+++ b/src/collectd-nagios.c
* Florian octo Forster <octo at verplant.org>
**/
-/* Set to C99 and POSIX code */
-#ifndef _ISOC99_SOURCE
-# define _ISOC99_SOURCE
-#endif
-#ifndef _POSIX_SOURCE
-# define _POSIX_SOURCE
-#endif
-#ifndef _POSIX_C_SOURCE
-# define _POSIX_C_SOURCE 200112L
-#endif
-#ifndef _REENTRANT
-# define _REENTRANT
-#endif
-
-/* Disable non-standard extensions */
-#ifdef _BSD_SOURCE
-# undef _BSD_SOURCE
-#endif
-#ifdef _SVID_SOURCE
-# undef _SVID_SOURCE
-#endif
-#ifdef _GNU_SOURCE
-# undef _GNU_SOURCE
+#if HAVE_CONFIG_H
+# include "config.h"
#endif
#if !defined(__GNUC__) || !__GNUC__
# define __attribute__(x) /**/
#endif
-#include "config.h"
-
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
return (RET_UNKNOWN);
}
- for (i = 0; i < match_ds_num_g; i++)
+ for (i = 0; i < (size_t) match_ds_num_g; i++)
{
size_t j;
" -d <ds> Select the DS to examine. May be repeated to examine multiple\n"
" DSes. By default all DSes are used.\n"
" -g <consol> Method to use to consolidate several DSes.\n"
- " Valid arguments are `none', `average' and `sum'\n"
+ " See below for a list of valid arguments.\n"
" -H <host> Hostname to query the values for.\n"
" -c <range> Critical range\n"
" -w <range> Warning range\n"
" average: Calculate the average of all matching DSes and apply the\n"
" warning- and critical-ranges to the calculated average.\n"
" sum: Apply the ranges to the sum of all DSes.\n"
+ " percentage: Apply the ranges to the ratio (in percent) of the first value\n"
+ " and the sum of all values."
"\n", name);
exit (1);
} /* void usage */
int num_okay = 0;
const char *status_str = "UNKNOWN";
int status_code = RET_UNKNOWN;
- int i;
+ size_t i;
for (i = 0; i < values_num; i++)
{
{
printf (" |");
for (i = 0; i < values_num; i++)
- printf (" %s=%g;;;;", values_names[i], values[i]);
+ printf (" %s=%f;;;;", values_names[i], values[i]);
}
printf ("\n");
static int do_check_con_average (size_t values_num,
double *values, char **values_names)
{
- int i;
+ size_t i;
double total;
int total_num;
double average;
printf ("%s: %g average |", status_str, average);
for (i = 0; i < values_num; i++)
- printf (" %s=%g;;;;", values_names[i], values[i]);
+ printf (" %s=%f;;;;", values_names[i], values[i]);
printf ("\n");
return (status_code);
static int do_check_con_sum (size_t values_num,
double *values, char **values_names)
{
- int i;
+ size_t i;
double total;
int total_num;
const char *status_str = "UNKNOWN";
printf ("%s: %g sum |", status_str, total);
for (i = 0; i < values_num; i++)
- printf (" %s=%g;;;;", values_names[i], values[i]);
+ printf (" %s=%f;;;;", values_names[i], values[i]);
printf ("\n");
return (status_code);
} /* int do_check_con_sum */
-static int do_check_con_percentage (int values_num, double *values, char **values_names)
+static int do_check_con_percentage (size_t values_num,
+ double *values, char **values_names)
{
- int i;
+ size_t i;
+ double sum = 0.0;
double percentage;
- if (values_num != 2)
- return (RET_WARNING);
- if (isnan (values[0]) || isnan (values[1]))
- return (RET_WARNING);
- if ((values[0] + values[1]) == 0)
- return (RET_WARNING);
+ const char *status_str = "UNKNOWN";
+ int status_code = RET_UNKNOWN;
- percentage = 100 * values[1] / ( values[0] + values[1] );
+ if ((values_num < 1) || (isnan (values[0])))
+ {
+ printf ("WARNING: The first value is not defined\n");
+ return (RET_WARNING);
+ }
- printf ("%lf percentage |", percentage);
for (i = 0; i < values_num; i++)
- printf (" %s=%lf;;;;", values_names[i], values[i]);
+ if (!isnan (values[i]))
+ sum += values[i];
+
+ if (sum == 0.0)
+ {
+ printf ("WARNING: Values sum up to zero\n");
+ return (RET_WARNING);
+ }
+
+ percentage = 100.0 * values[0] / sum;
if (match_range (&range_critical_g, percentage) != 0)
{
- printf ("CRITICAL: percentage = %lf\n", percentage);
- return (RET_CRITICAL);
+ status_str = "CRITICAL";
+ status_code = RET_CRITICAL;
}
else if (match_range (&range_warning_g, percentage) != 0)
{
- printf ("WARNING: percentage = %lf\n", percentage);
- return (RET_WARNING);
- }
+ status_str = "WARNING";
+ status_code = RET_WARNING;
+ }
+ else
+ {
+ status_str = "OKAY";
+ status_code = RET_OKAY;
+ }
- printf ("OKAY: percentage = %lf\n", percentage);
- return (RET_OKAY);
+ printf ("%s: %lf percent |", status_str, percentage);
+ for (i = 0; i < values_num; i++)
+ printf (" %s=%lf;;;;", values_names[i], values[i]);
+ return (status_code);
} /* int do_check_con_percentage */
static int do_check (void)
else if (strcasecmp (optarg, "percentage") == 0)
consolitation_g = CON_PERCENTAGE;
else
+ {
+ fprintf (stderr, "Unknown consolidation function `%s'.\n",
+ optarg);
usage (argv[0]);
+ }
break;
case 'd':
{
if ((socket_file_g == NULL) || (value_string_g == NULL)
|| (hostname_g == NULL))
+ {
+ fprintf (stderr, "Missing required arguments.\n");
usage (argv[0]);
+ }
return (do_check ());
} /* int main */