New upstream version 2.3.4
This commit is contained in:
parent
e7bdd1c6c6
commit
de72f6f588
556 changed files with 90432 additions and 53391 deletions
|
@ -51,10 +51,10 @@ noinst_LIBRARIES = libnpcommon.a
|
|||
libnpcommon_a_SOURCES = utils.c netutils.c sslutils.c runcmd.c \
|
||||
popen.c utils.h netutils.h popen.h common.h runcmd.c runcmd.h
|
||||
|
||||
BASEOBJS = libnpcommon.a ../lib/libmonitoringplug.a ../gl/libgnu.a
|
||||
BASEOBJS = libnpcommon.a ../lib/libmonitoringplug.a ../gl/libgnu.a $(LIB_CRYPTO)
|
||||
NETOBJS = $(BASEOBJS) $(EXTRA_NETOBLS)
|
||||
NETLIBS = $(NETOBJS) $(SOCKETLIBS)
|
||||
SSLOBJS = $(BASEOBJS) $(NETLIBS) $(SSLLIBS)
|
||||
SSLOBJS = $(BASEOBJS) $(NETLIBS) $(SSLLIBS) $(LIB_CRYPTO)
|
||||
|
||||
TESTS_ENVIRONMENT = perl -I $(top_builddir) -I $(top_srcdir)
|
||||
|
||||
|
@ -112,7 +112,7 @@ check_tcp_LDADD = $(SSLOBJS)
|
|||
check_time_LDADD = $(NETLIBS)
|
||||
check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
|
||||
check_ups_LDADD = $(NETLIBS)
|
||||
check_users_LDADD = $(BASEOBJS) $(WTSAPI32LIBS)
|
||||
check_users_LDADD = $(BASEOBJS) $(WTSAPI32LIBS) $(SYSTEMDLIBS)
|
||||
check_by_ssh_LDADD = $(NETLIBS)
|
||||
check_ide_smart_LDADD = $(BASEOBJS)
|
||||
negate_LDADD = $(BASEOBJS)
|
||||
|
|
1234
plugins/Makefile.in
1234
plugins/Makefile.in
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -141,21 +141,28 @@ main (int argc, char **argv)
|
|||
if (verbose > 2)
|
||||
printf ("Initializing DBI\n");
|
||||
|
||||
if (dbi_initialize (NULL) < 0) {
|
||||
dbi_inst *instance_p;
|
||||
|
||||
if (dbi_initialize_r(NULL, instance_p) < 0) {
|
||||
printf ("UNKNOWN - failed to initialize DBI; possibly you don't have any drivers installed.\n");
|
||||
return STATE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (instance_p == NULL) {
|
||||
printf ("UNKNOWN - failed to initialize DBI.\n");
|
||||
return STATE_UNKNOWN;
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
printf ("Opening DBI driver '%s'\n", np_dbi_driver);
|
||||
|
||||
driver = dbi_driver_open (np_dbi_driver);
|
||||
driver = dbi_driver_open_r(np_dbi_driver, instance_p);
|
||||
if (! driver) {
|
||||
printf ("UNKNOWN - failed to open DBI driver '%s'; possibly it's not installed.\n",
|
||||
np_dbi_driver);
|
||||
|
||||
printf ("Known drivers:\n");
|
||||
for (driver = dbi_driver_list (NULL); driver; driver = dbi_driver_list (driver)) {
|
||||
for (driver = dbi_driver_list_r(NULL, instance_p); driver; driver = dbi_driver_list_r(driver, instance_p)) {
|
||||
printf (" - %s\n", dbi_driver_get_name (driver));
|
||||
}
|
||||
return STATE_UNKNOWN;
|
||||
|
@ -426,6 +433,7 @@ process_arguments (int argc, char **argv)
|
|||
else
|
||||
timeout_interval = atoi (optarg);
|
||||
|
||||
break;
|
||||
case 'H': /* host */
|
||||
if (!is_host (optarg))
|
||||
usage2 (_("Invalid hostname/address"), optarg);
|
||||
|
|
|
@ -93,11 +93,11 @@ static int stat_remote_fs = 0;
|
|||
|
||||
/* Linked list of filesystem types to omit.
|
||||
If the list is empty, don't exclude any types. */
|
||||
static struct name_list *fs_exclude_list;
|
||||
static struct regex_list *fs_exclude_list = NULL;
|
||||
|
||||
/* Linked list of filesystem types to check.
|
||||
If the list is empty, include all types. */
|
||||
static struct name_list *fs_include_list;
|
||||
static struct regex_list *fs_include_list;
|
||||
|
||||
static struct name_list *dp_exclude_list;
|
||||
|
||||
|
@ -112,11 +112,12 @@ enum
|
|||
{
|
||||
SYNC_OPTION = CHAR_MAX + 1,
|
||||
NO_SYNC_OPTION,
|
||||
BLOCK_SIZE_OPTION
|
||||
BLOCK_SIZE_OPTION,
|
||||
IGNORE_MISSING
|
||||
};
|
||||
|
||||
#ifdef _AIX
|
||||
#pragma alloca
|
||||
#pragma alloca
|
||||
#endif
|
||||
|
||||
int process_arguments (int, char **);
|
||||
|
@ -126,13 +127,10 @@ int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, ch
|
|||
void print_help (void);
|
||||
void print_usage (void);
|
||||
double calculate_percent(uintmax_t, uintmax_t);
|
||||
void stat_path (struct parameter_list *p);
|
||||
bool stat_path (struct parameter_list *p);
|
||||
void get_stats (struct parameter_list *p, struct fs_usage *fsp);
|
||||
void get_path_stats (struct parameter_list *p, struct fs_usage *fsp);
|
||||
|
||||
double w_dfp = -1.0;
|
||||
double c_dfp = -1.0;
|
||||
char *path;
|
||||
char *exclude_device;
|
||||
char *units;
|
||||
uintmax_t mult = 1024 * 1024;
|
||||
|
@ -140,6 +138,7 @@ int verbose = 0;
|
|||
int erronly = FALSE;
|
||||
int display_mntp = FALSE;
|
||||
int exact_match = FALSE;
|
||||
bool ignore_missing = false;
|
||||
int freespace_ignore_reserved = FALSE;
|
||||
int display_inodes_perfdata = FALSE;
|
||||
char *warn_freespace_units = NULL;
|
||||
|
@ -155,6 +154,7 @@ char *crit_usedinodes_percent = NULL;
|
|||
char *warn_freeinodes_percent = NULL;
|
||||
char *crit_freeinodes_percent = NULL;
|
||||
int path_selected = FALSE;
|
||||
bool path_ignored = false;
|
||||
char *group = NULL;
|
||||
struct stat *stat_buf;
|
||||
struct name_list *seen = NULL;
|
||||
|
@ -166,10 +166,12 @@ main (int argc, char **argv)
|
|||
int result = STATE_UNKNOWN;
|
||||
int disk_result = STATE_UNKNOWN;
|
||||
char *output;
|
||||
char *ignored;
|
||||
char *details;
|
||||
char *perf;
|
||||
char *perf_ilabel;
|
||||
char *preamble;
|
||||
char *preamble = " - free space:";
|
||||
char *ignored_preamble = " - ignored paths:";
|
||||
char *flag_header;
|
||||
int temp_result;
|
||||
|
||||
|
@ -181,8 +183,8 @@ main (int argc, char **argv)
|
|||
char mountdir[32];
|
||||
#endif
|
||||
|
||||
preamble = strdup (" - free space:");
|
||||
output = strdup ("");
|
||||
ignored = strdup ("");
|
||||
details = strdup ("");
|
||||
perf = strdup ("");
|
||||
perf_ilabel = strdup ("");
|
||||
|
@ -203,7 +205,7 @@ main (int argc, char **argv)
|
|||
/* If a list of paths has not been selected, find entire
|
||||
mount list and create list of paths
|
||||
*/
|
||||
if (path_selected == FALSE) {
|
||||
if (path_selected == FALSE && path_ignored == false) {
|
||||
for (me = mount_list; me; me = me->me_next) {
|
||||
if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) {
|
||||
path = np_add_parameter(&path_select_list, me->me_mountdir);
|
||||
|
@ -213,17 +215,40 @@ main (int argc, char **argv)
|
|||
set_all_thresholds(path);
|
||||
}
|
||||
}
|
||||
np_set_best_match(path_select_list, mount_list, exact_match);
|
||||
|
||||
if (path_ignored == false) {
|
||||
np_set_best_match(path_select_list, mount_list, exact_match);
|
||||
}
|
||||
|
||||
/* Error if no match found for specified paths */
|
||||
temp_list = path_select_list;
|
||||
|
||||
while (temp_list) {
|
||||
if (! temp_list->best_match) {
|
||||
die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), temp_list->name);
|
||||
while (path_select_list) {
|
||||
if (! path_select_list->best_match && ignore_missing == true) {
|
||||
/* If the first element will be deleted, the temp_list must be updated with the new start address as well */
|
||||
if (path_select_list == temp_list) {
|
||||
temp_list = path_select_list->name_next;
|
||||
}
|
||||
/* Add path argument to list of ignored paths to inform about missing paths being ignored and not alerted */
|
||||
xasprintf (&ignored, "%s %s;", ignored, path_select_list->name);
|
||||
/* Delete the path from the list so that it is not stat-checked later in the code. */
|
||||
path_select_list = np_del_parameter(path_select_list, path_select_list->name_prev);
|
||||
} else if (! path_select_list->best_match) {
|
||||
/* Without --ignore-missing option, exit with Critical state. */
|
||||
die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), path_select_list->name);
|
||||
} else {
|
||||
/* Continue jumping through the list */
|
||||
path_select_list = path_select_list->name_next;
|
||||
}
|
||||
}
|
||||
|
||||
temp_list = temp_list->name_next;
|
||||
path_select_list = temp_list;
|
||||
|
||||
if (! path_select_list && ignore_missing == true) {
|
||||
result = STATE_OK;
|
||||
if (verbose >= 2) {
|
||||
printf ("None of the provided paths were found\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Process for every path in list */
|
||||
|
@ -242,6 +267,10 @@ main (int argc, char **argv)
|
|||
|
||||
me = path->best_match;
|
||||
|
||||
if (!me) {
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
if (strncmp(path->name, "/cygdrive/", 10) != 0 || strlen(path->name) > 11)
|
||||
continue;
|
||||
|
@ -260,14 +289,18 @@ main (int argc, char **argv)
|
|||
if (path->group == NULL) {
|
||||
/* Skip remote filesystems if we're not interested in them */
|
||||
if (me->me_remote && show_local_fs) {
|
||||
if (stat_remote_fs)
|
||||
stat_path(path);
|
||||
if (stat_remote_fs) {
|
||||
if (!stat_path(path) && ignore_missing == true) {
|
||||
result = STATE_OK;
|
||||
xasprintf (&ignored, "%s %s;", ignored, path->name);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
/* Skip pseudo fs's if we haven't asked for all fs's */
|
||||
} else if (me->me_dummy && !show_all_fs) {
|
||||
continue;
|
||||
/* Skip excluded fstypes */
|
||||
} else if (fs_exclude_list && np_find_name (fs_exclude_list, me->me_type)) {
|
||||
} else if (fs_exclude_list && np_find_regmatch (fs_exclude_list, me->me_type)) {
|
||||
continue;
|
||||
/* Skip excluded fs's */
|
||||
} else if (dp_exclude_list &&
|
||||
|
@ -275,12 +308,18 @@ main (int argc, char **argv)
|
|||
np_find_name (dp_exclude_list, me->me_mountdir))) {
|
||||
continue;
|
||||
/* Skip not included fstypes */
|
||||
} else if (fs_include_list && !np_find_name (fs_include_list, me->me_type)) {
|
||||
} else if (fs_include_list && !np_find_regmatch(fs_include_list, me->me_type)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
stat_path(path);
|
||||
if (!stat_path(path)) {
|
||||
if (ignore_missing == true) {
|
||||
result = STATE_OK;
|
||||
xasprintf (&ignored, "%s %s;", ignored, path->name);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
get_fs_usage (me->me_mountdir, me->me_devname, &fsp);
|
||||
|
||||
if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) {
|
||||
|
@ -411,8 +450,12 @@ main (int argc, char **argv)
|
|||
if (verbose >= 2)
|
||||
xasprintf (&output, "%s%s", output, details);
|
||||
|
||||
if (strcmp(output, "") == 0 && ! erronly) {
|
||||
preamble = "";
|
||||
xasprintf (&output, " - No disks were found for provided parameters;");
|
||||
}
|
||||
|
||||
printf ("DISK %s%s%s|%s\n", state_text (result), (erronly && result==STATE_OK) ? "" : preamble, output, perf);
|
||||
printf ("DISK %s%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -481,6 +524,7 @@ process_arguments (int argc, char **argv)
|
|||
{"ignore-ereg-partition", required_argument, 0, 'i'},
|
||||
{"ignore-eregi-path", required_argument, 0, 'I'},
|
||||
{"ignore-eregi-partition", required_argument, 0, 'I'},
|
||||
{"ignore-missing", no_argument, 0, IGNORE_MISSING},
|
||||
{"local", no_argument, 0, 'l'},
|
||||
{"stat-remote-fs", no_argument, 0, 'L'},
|
||||
{"iperfdata", no_argument, 0, 'P'},
|
||||
|
@ -499,7 +543,7 @@ process_arguments (int argc, char **argv)
|
|||
if (argc < 2)
|
||||
return ERROR;
|
||||
|
||||
np_add_name(&fs_exclude_list, "iso9660");
|
||||
np_add_regex(&fs_exclude_list, "iso9660", REG_EXTENDED);
|
||||
|
||||
for (c = 1; c < argc; c++)
|
||||
if (strcmp ("-to", argv[c]) == 0)
|
||||
|
@ -540,7 +584,7 @@ process_arguments (int argc, char **argv)
|
|||
|
||||
/* Awful mistake where the range values do not make sense. Normally,
|
||||
you alert if the value is within the range, but since we are using
|
||||
freespace, we have to alert if outside the range. Thus we artifically
|
||||
freespace, we have to alert if outside the range. Thus we artificially
|
||||
force @ at the beginning of the range, so that it is backwards compatible
|
||||
*/
|
||||
case 'c': /* critical threshold */
|
||||
|
@ -579,21 +623,36 @@ process_arguments (int argc, char **argv)
|
|||
if (! strcasecmp (optarg, "bytes")) {
|
||||
mult = (uintmax_t)1;
|
||||
units = strdup ("B");
|
||||
} else if ( (! strcmp (optarg, "kB")) || (!strcmp(optarg, "KiB")) ) {
|
||||
} else if (!strcmp(optarg, "KiB")) {
|
||||
mult = (uintmax_t)1024;
|
||||
units = strdup ("kiB");
|
||||
} else if ( (! strcmp (optarg, "MB")) || (!strcmp(optarg, "MiB")) ) {
|
||||
units = strdup ("KiB");
|
||||
} else if (! strcmp (optarg, "kB")) {
|
||||
mult = (uintmax_t)1000;
|
||||
units = strdup ("kB");
|
||||
} else if (!strcmp(optarg, "MiB")) {
|
||||
mult = (uintmax_t)1024 * 1024;
|
||||
units = strdup ("MiB");
|
||||
} else if ( (! strcmp (optarg, "GB")) || (!strcmp(optarg, "GiB")) ) {
|
||||
} else if (! strcmp (optarg, "MB")) {
|
||||
mult = (uintmax_t)1000 * 1000;
|
||||
units = strdup ("MB");
|
||||
} else if (!strcmp(optarg, "GiB")) {
|
||||
mult = (uintmax_t)1024 * 1024 * 1024;
|
||||
units = strdup ("GiB");
|
||||
} else if ( (! strcmp (optarg, "TB")) || (!strcmp(optarg, "TiB")) ) {
|
||||
} else if (! strcmp (optarg, "GB")){
|
||||
mult = (uintmax_t)1000 * 1000 * 1000;
|
||||
units = strdup ("GB");
|
||||
} else if (!strcmp(optarg, "TiB")) {
|
||||
mult = (uintmax_t)1024 * 1024 * 1024 * 1024;
|
||||
units = strdup ("TiB");
|
||||
} else if ( (! strcmp (optarg, "PB")) || (!strcmp(optarg, "PiB")) ) {
|
||||
} else if (! strcmp (optarg, "TB")) {
|
||||
mult = (uintmax_t)1000 * 1000 * 1000 * 1000;
|
||||
units = strdup ("TB");
|
||||
} else if (!strcmp(optarg, "PiB")) {
|
||||
mult = (uintmax_t)1024 * 1024 * 1024 * 1024 * 1024;
|
||||
units = strdup ("PiB");
|
||||
} else if (! strcmp (optarg, "PB")){
|
||||
mult = (uintmax_t)1000 * 1000 * 1000 * 1000 * 1000;
|
||||
units = strdup ("PB");
|
||||
} else {
|
||||
die (STATE_UNKNOWN, _("unit type %s not known\n"), optarg);
|
||||
}
|
||||
|
@ -632,12 +691,19 @@ process_arguments (int argc, char **argv)
|
|||
/* add parameter if not found. overwrite thresholds if path has already been added */
|
||||
if (! (se = np_find_parameter(path_select_list, optarg))) {
|
||||
se = np_add_parameter(&path_select_list, optarg);
|
||||
|
||||
if (stat(optarg, &stat_buf[0]) && ignore_missing == true) {
|
||||
path_ignored = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
se->group = group;
|
||||
set_all_thresholds(se);
|
||||
|
||||
/* With autofs, it is required to stat() the path before re-populating the mount_list */
|
||||
stat_path(se);
|
||||
if (!stat_path(se)) {
|
||||
break;
|
||||
}
|
||||
/* NB: We can't free the old mount_list "just like that": both list pointers and struct
|
||||
* pointers are copied around. One of the reason it wasn't done yet is that other parts
|
||||
* of check_disk need the same kind of cleanup so it'd better be done as a whole */
|
||||
|
@ -650,10 +716,18 @@ process_arguments (int argc, char **argv)
|
|||
np_add_name(&dp_exclude_list, optarg);
|
||||
break;
|
||||
case 'X': /* exclude file system type */
|
||||
np_add_name(&fs_exclude_list, optarg);
|
||||
err = np_add_regex(&fs_exclude_list, optarg, REG_EXTENDED);
|
||||
if (err != 0) {
|
||||
regerror (err, &fs_exclude_list->regex, errbuf, MAX_INPUT_BUFFER);
|
||||
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
|
||||
}
|
||||
break;
|
||||
case 'N': /* include file system type */
|
||||
np_add_name(&fs_include_list, optarg);
|
||||
err = np_add_regex(&fs_include_list, optarg, REG_EXTENDED);
|
||||
if (err != 0) {
|
||||
regerror (err, &fs_exclude_list->regex, errbuf, MAX_INPUT_BUFFER);
|
||||
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
|
||||
}
|
||||
break;
|
||||
case 'v': /* verbose */
|
||||
verbose++;
|
||||
|
@ -718,6 +792,9 @@ process_arguments (int argc, char **argv)
|
|||
cflags = default_cflags;
|
||||
break;
|
||||
|
||||
case IGNORE_MISSING:
|
||||
ignore_missing = true;
|
||||
break;
|
||||
case 'A':
|
||||
optarg = strdup(".*");
|
||||
// Intentional fallthrough
|
||||
|
@ -729,7 +806,7 @@ process_arguments (int argc, char **argv)
|
|||
crit_freespace_percent || warn_usedspace_units || crit_usedspace_units ||
|
||||
warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent ||
|
||||
crit_usedinodes_percent || warn_freeinodes_percent || crit_freeinodes_percent )) {
|
||||
die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -r/-R\n"));
|
||||
die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -r/-R/-A (--ereg-path/--eregi-path/--all)\n"));
|
||||
}
|
||||
|
||||
err = regcomp(&re, optarg, cflags);
|
||||
|
@ -753,7 +830,11 @@ process_arguments (int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
if (!fnd)
|
||||
if (!fnd && ignore_missing == true) {
|
||||
path_ignored = true;
|
||||
/* path_selected = TRUE;*/
|
||||
break;
|
||||
} else if (!fnd)
|
||||
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"),
|
||||
_("Regular expression did not match any path or disk"), optarg);
|
||||
|
||||
|
@ -813,7 +894,7 @@ process_arguments (int argc, char **argv)
|
|||
if (crit_usedspace_percent == NULL && argc > c && is_intnonneg (argv[c]))
|
||||
crit_usedspace_percent = argv[c++];
|
||||
|
||||
if (argc > c && path == NULL) {
|
||||
if (argc > c) {
|
||||
se = np_add_parameter(&path_select_list, strdup(argv[c++]));
|
||||
path_selected = TRUE;
|
||||
set_all_thresholds(se);
|
||||
|
@ -923,22 +1004,33 @@ print_help (void)
|
|||
printf (" %s\n", _("Regular expression to ignore selected path/partition (case insensitive) (may be repeated)"));
|
||||
printf (" %s\n", "-i, --ignore-ereg-path=PATH, --ignore-ereg-partition=PARTITION");
|
||||
printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)"));
|
||||
printf (" %s\n", "--ignore-missing");
|
||||
printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible."));
|
||||
printf (" %s\n", _("(Provide this option before -p / -r / --ereg-path if used)"));
|
||||
printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
|
||||
printf (" %s\n", "-u, --units=STRING");
|
||||
printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)"));
|
||||
printf (UT_VERBOSE);
|
||||
printf (" %s\n", "-X, --exclude-type=TYPE");
|
||||
printf (" %s\n", _("Ignore all filesystems of indicated type (may be repeated)"));
|
||||
printf (" %s\n", "-N, --include-type=TYPE");
|
||||
printf (" %s\n", _("Check only filesystems of indicated type (may be repeated)"));
|
||||
printf (" %s\n", "-X, --exclude-type=TYPE_REGEX");
|
||||
printf (" %s\n", _("Ignore all filesystems of types matching given regex(7) (may be repeated)"));
|
||||
printf (" %s\n", "-N, --include-type=TYPE_REGEX");
|
||||
printf (" %s\n", _("Check only filesystems where the type matches this given regex(7) (may be repeated)"));
|
||||
|
||||
printf ("\n");
|
||||
printf ("%s\n", _("General usage hints:"));
|
||||
printf (" %s\n", _("- Arguments are positional! \"-w 5 -c 1 -p /foo -w6 -c2 -p /bar\" is not the same as"));
|
||||
printf (" %s\n", _("\"-w 5 -c 1 -p /bar w6 -c2 -p /foo\"."));
|
||||
printf (" %s\n", _("- The syntax is broadly: \"{thresholds a} {paths a} -C {thresholds b} {thresholds b} ...\""));
|
||||
|
||||
|
||||
|
||||
printf ("\n");
|
||||
printf ("%s\n", _("Examples:"));
|
||||
printf (" %s\n", "check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /");
|
||||
printf (" %s\n", _("Checks /tmp and /var at 10% and 5%, and / at 100MB and 50MB"));
|
||||
printf (" %s\n\n", _("Checks /tmp and /var at 10% and 5%, and / at 100MB and 50MB"));
|
||||
printf (" %s\n", "check_disk -w 100 -c 50 -C -w 1000 -c 500 -g sidDATA -r '^/oracle/SID/data.*$'");
|
||||
printf (" %s\n", _("Checks all filesystems not matching -r at 100M and 50M. The fs matching the -r regex"));
|
||||
printf (" %s\n", _("are grouped which means the freespace thresholds are applied to all disks together"));
|
||||
printf (" %s\n\n", _("are grouped which means the freespace thresholds are applied to all disks together"));
|
||||
printf (" %s\n", "check_disk -w 100 -c 50 -C -w 1000 -c 500 -p /foo -C -w 5% -c 3% -p /bar");
|
||||
printf (" %s\n", _("Checks /foo for 1000M/500M and /bar for 5/3%. All remaining volumes use 100M/50M"));
|
||||
|
||||
|
@ -951,12 +1043,12 @@ void
|
|||
print_usage (void)
|
||||
{
|
||||
printf ("%s\n", _("Usage:"));
|
||||
printf (" %s {-w absolute_limit |-w percentage_limit% | -W inode_percentage_limit } {-c absolute_limit|-c percentage_limit% | -K inode_percentage_limit } {-p path | -x device}\n", progname);
|
||||
printf (" %s {-w absolute_limit |-w percentage_limit%% | -W inode_percentage_limit } {-c absolute_limit|-c percentage_limit%% | -K inode_percentage_limit } {-p path | -x device}\n", progname);
|
||||
printf ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
|
||||
printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n");
|
||||
printf ("[-t timeout] [-u unit] [-v] [-X type_regex] [-N type]\n");
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
stat_path (struct parameter_list *p)
|
||||
{
|
||||
/* Stat entry to check that dir exists and is accessible */
|
||||
|
@ -965,9 +1057,14 @@ stat_path (struct parameter_list *p)
|
|||
if (stat (p->name, &stat_buf[0])) {
|
||||
if (verbose >= 3)
|
||||
printf("stat failed on %s\n", p->name);
|
||||
printf("DISK %s - ", _("CRITICAL"));
|
||||
die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno));
|
||||
if (ignore_missing == true) {
|
||||
return false;
|
||||
} else {
|
||||
printf("DISK %s - ", _("CRITICAL"));
|
||||
die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -987,7 +1084,8 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) {
|
|||
continue;
|
||||
#endif
|
||||
if (p_list->group && ! (strcmp(p_list->group, p->group))) {
|
||||
stat_path(p_list);
|
||||
if (! stat_path(p_list))
|
||||
continue;
|
||||
get_fs_usage (p_list->best_match->me_mountdir, p_list->best_match->me_devname, &tmpfsp);
|
||||
get_path_stats(p_list, &tmpfsp);
|
||||
if (verbose >= 3)
|
||||
|
@ -1045,7 +1143,7 @@ get_path_stats (struct parameter_list *p, struct fs_usage *fsp) {
|
|||
p->available_to_root = fsp->fsu_bfree;
|
||||
p->used = fsp->fsu_blocks - fsp->fsu_bfree;
|
||||
if (freespace_ignore_reserved) {
|
||||
/* option activated : we substract the root-reserved space from the total */
|
||||
/* option activated : we subtract the root-reserved space from the total */
|
||||
p->total = fsp->fsu_blocks - p->available_to_root + p->available;
|
||||
} else {
|
||||
/* default behaviour : take all the blocks into account */
|
||||
|
@ -1056,11 +1154,11 @@ get_path_stats (struct parameter_list *p, struct fs_usage *fsp) {
|
|||
p->dfree_units = p->available*fsp->fsu_blocksize/mult;
|
||||
p->dtotal_units = p->total*fsp->fsu_blocksize/mult;
|
||||
/* Free file nodes. Not sure the workaround is required, but in case...*/
|
||||
p->inodes_free = fsp->fsu_favail > fsp->fsu_ffree ? 0 : fsp->fsu_favail;
|
||||
p->inodes_free = fsp->fsu_ffree;
|
||||
p->inodes_free_to_root = fsp->fsu_ffree; /* Free file nodes for root. */
|
||||
p->inodes_used = fsp->fsu_files - fsp->fsu_ffree;
|
||||
if (freespace_ignore_reserved) {
|
||||
/* option activated : we substract the root-reserved inodes from the total */
|
||||
/* option activated : we subtract the root-reserved inodes from the total */
|
||||
/* not all OS report fsp->fsu_favail, only the ones with statvfs syscall */
|
||||
/* for others, fsp->fsu_ffree == fsp->fsu_favail */
|
||||
p->inodes_total = fsp->fsu_files - p->inodes_free_to_root + p->inodes_free;
|
||||
|
|
|
@ -75,7 +75,7 @@ main (int argc, char **argv)
|
|||
{
|
||||
char *command_line = NULL;
|
||||
char input_buffer[MAX_INPUT_BUFFER];
|
||||
char *address = NULL; /* comma seperated str with addrs/ptrs (sorted) */
|
||||
char *address = NULL; /* comma separated str with addrs/ptrs (sorted) */
|
||||
char **addresses = NULL;
|
||||
int n_addresses = 0;
|
||||
char *msg = NULL;
|
||||
|
|
|
@ -73,7 +73,7 @@ int wrta_p = FALSE;
|
|||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
/* normaly should be int result = STATE_UNKNOWN; */
|
||||
/* normally should be int result = STATE_UNKNOWN; */
|
||||
|
||||
int status = STATE_UNKNOWN;
|
||||
int result = 0;
|
||||
|
@ -354,6 +354,7 @@ process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'I': /* sourceip */
|
||||
sourceif = strscpy (sourceif, optarg);
|
||||
break;
|
||||
case '4': /* IPv4 only */
|
||||
address_family = AF_INET;
|
||||
break;
|
||||
|
|
|
@ -353,6 +353,7 @@ process_arguments (int argc, char **argv)
|
|||
usage2 (_("Port must be a positive short integer"), optarg);
|
||||
else
|
||||
port = atoi(optarg);
|
||||
break;
|
||||
case 'D': /* disable paper out check*/
|
||||
check_paper_out = 0;
|
||||
break;
|
||||
|
|
|
@ -198,7 +198,7 @@ test_file (char *path)
|
|||
|
||||
/*
|
||||
* process command-line arguments
|
||||
* returns true on succes, false otherwise
|
||||
* returns true on success, false otherwise
|
||||
*/
|
||||
bool process_arguments (int argc, char **argv)
|
||||
{
|
||||
|
@ -498,6 +498,7 @@ bool process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'R': /* regex */
|
||||
cflags |= REG_ICASE;
|
||||
// fall through
|
||||
case 'r': /* regex */
|
||||
strncpy (regexp, optarg, MAX_RE_SIZE - 1);
|
||||
regexp[MAX_RE_SIZE - 1] = 0;
|
||||
|
@ -1093,7 +1094,7 @@ check_http (void)
|
|||
microsec_firstbyte = deltime (tv_temp);
|
||||
elapsed_time_firstbyte = (double)microsec_firstbyte / 1.0e6;
|
||||
}
|
||||
while (pos = memchr(buffer, '\0', i)) {
|
||||
while ((pos = memchr(buffer, '\0', i))) {
|
||||
/* replace nul character with a blank */
|
||||
*pos = ' ';
|
||||
}
|
||||
|
@ -1278,7 +1279,7 @@ check_http (void)
|
|||
|
||||
regmatch_t chre_pmatch[1]; // We actually do not care about this, since we only want to know IF it was found
|
||||
|
||||
if (regexec(&chunked_header_regex, header, 1, chre_pmatch, 0) == 0) {
|
||||
if (!no_body && regexec(&chunked_header_regex, header, 1, chre_pmatch, 0) == 0) {
|
||||
if (verbose) {
|
||||
printf("Found chunked content\n");
|
||||
}
|
||||
|
@ -1391,7 +1392,6 @@ char *unchunk_content(const char *content) {
|
|||
// https://en.wikipedia.org/wiki/Chunked_transfer_encoding
|
||||
// https://www.rfc-editor.org/rfc/rfc7230#section-4.1
|
||||
char *result = NULL;
|
||||
size_t content_length = strlen(content);
|
||||
char *start_of_chunk;
|
||||
char* end_of_chunk;
|
||||
long size_of_chunk;
|
||||
|
@ -1462,7 +1462,13 @@ char *unchunk_content(const char *content) {
|
|||
memcpy(result + (overall_size - size_of_chunk), start_of_chunk, size_of_chunk);
|
||||
}
|
||||
|
||||
result[overall_size] = '\0';
|
||||
if (overall_size == 0 && result == NULL) {
|
||||
// We might just have received the end chunk without previous content, so result is never allocated
|
||||
result = calloc(1, sizeof(char));
|
||||
// No error handling here, we can only return NULL anyway
|
||||
} else {
|
||||
result[overall_size] = '\0';
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -1879,7 +1885,7 @@ print_usage (void)
|
|||
printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname);
|
||||
printf (" [-J <client certificate file>] [-K <private key>]\n");
|
||||
printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-E] [-a auth]\n");
|
||||
printf (" [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>]\n");
|
||||
printf (" [-b proxy_auth] [-f <ok|warning|critical|follow|sticky|stickyport>]\n");
|
||||
printf (" [-e <expect>] [-d string] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>]\n");
|
||||
printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n");
|
||||
printf (" [-A string] [-k string] [-S <version>] [--sni]\n");
|
||||
|
|
|
@ -97,9 +97,6 @@ main (int argc, char *argv[])
|
|||
int tls;
|
||||
int version=3;
|
||||
|
||||
/* for entry counting */
|
||||
|
||||
LDAPMessage *next_entry;
|
||||
int status_entries = STATE_OK;
|
||||
int num_entries = 0;
|
||||
|
||||
|
@ -222,7 +219,7 @@ main (int argc, char *argv[])
|
|||
/* reset the alarm handler */
|
||||
alarm (0);
|
||||
|
||||
/* calcutate the elapsed time and compare to thresholds */
|
||||
/* calculate the elapsed time and compare to thresholds */
|
||||
|
||||
microsec = deltime (tv);
|
||||
elapsed_time = (double)microsec / 1.0e6;
|
||||
|
|
|
@ -107,7 +107,7 @@ main (int argc, char **argv)
|
|||
int i;
|
||||
long numcpus;
|
||||
|
||||
double la[3] = { 0.0, 0.0, 0.0 }; /* NetBSD complains about unitialized arrays */
|
||||
double la[3] = { 0.0, 0.0, 0.0 }; /* NetBSD complains about uninitialized arrays */
|
||||
#ifndef HAVE_GETLOADAVG
|
||||
char input_buffer[MAX_INPUT_BUFFER];
|
||||
# ifdef HAVE_PROC_LOADAVG
|
||||
|
|
|
@ -34,7 +34,7 @@ const char *progname = "check_mysql";
|
|||
const char *copyright = "1999-2011";
|
||||
const char *email = "devel@monitoring-plugins.org";
|
||||
|
||||
#define SLAVERESULTSIZE 70
|
||||
#define SLAVERESULTSIZE 96
|
||||
|
||||
#include "common.h"
|
||||
#include "utils.h"
|
||||
|
@ -89,6 +89,8 @@ static const char *metric_counter[LENGTH_METRIC_COUNTER] = {
|
|||
"Uptime"
|
||||
};
|
||||
|
||||
#define MYSQLDUMP_THREADS_QUERY "SELECT COUNT(1) mysqldumpThreads FROM information_schema.processlist WHERE info LIKE 'SELECT /*!40001 SQL_NO_CACHE */%'"
|
||||
|
||||
thresholds *my_threshold = NULL;
|
||||
|
||||
int process_arguments (int, char **);
|
||||
|
@ -108,7 +110,7 @@ main (int argc, char **argv)
|
|||
|
||||
char *result = NULL;
|
||||
char *error = NULL;
|
||||
char slaveresult[SLAVERESULTSIZE];
|
||||
char slaveresult[SLAVERESULTSIZE] = { 0 };
|
||||
char* perf;
|
||||
|
||||
perf = strdup ("");
|
||||
|
@ -138,7 +140,10 @@ main (int argc, char **argv)
|
|||
mysql_ssl_set(&mysql,key,cert,ca_cert,ca_dir,ciphers);
|
||||
/* establish a connection to the server and error checking */
|
||||
if (!mysql_real_connect(&mysql,db_host,db_user,db_pass,db,db_port,db_socket,0)) {
|
||||
if (ignore_auth && mysql_errno (&mysql) == ER_ACCESS_DENIED_ERROR)
|
||||
/* Depending on internally-selected auth plugin MySQL might return */
|
||||
/* ER_ACCESS_DENIED_NO_PASSWORD_ERROR or ER_ACCESS_DENIED_ERROR. */
|
||||
/* Semantically these errors are the same. */
|
||||
if (ignore_auth && (mysql_errno (&mysql) == ER_ACCESS_DENIED_ERROR || mysql_errno (&mysql) == ER_ACCESS_DENIED_NO_PASSWORD_ERROR))
|
||||
{
|
||||
printf("MySQL OK - Version: %s (protocol %d)\n",
|
||||
mysql_get_server_info(&mysql),
|
||||
|
@ -275,11 +280,30 @@ main (int argc, char **argv)
|
|||
/* Save slave status in slaveresult */
|
||||
snprintf (slaveresult, SLAVERESULTSIZE, "Slave IO: %s Slave SQL: %s Seconds Behind Master: %s", row[slave_io_field], row[slave_sql_field], seconds_behind_field!=-1?row[seconds_behind_field]:"Unknown");
|
||||
|
||||
/* Raise critical error if SQL THREAD or IO THREAD are stopped */
|
||||
/* Raise critical error if SQL THREAD or IO THREAD are stopped, but only if there are no mysqldump threads running */
|
||||
if (strcmp (row[slave_io_field], "Yes") != 0 || strcmp (row[slave_sql_field], "Yes") != 0) {
|
||||
mysql_free_result (res);
|
||||
mysql_close (&mysql);
|
||||
die (STATE_CRITICAL, "%s\n", slaveresult);
|
||||
MYSQL_RES *res_mysqldump;
|
||||
MYSQL_ROW row_mysqldump;
|
||||
unsigned int mysqldump_threads = 0;
|
||||
|
||||
if (mysql_query (&mysql, MYSQLDUMP_THREADS_QUERY) == 0) {
|
||||
/* store the result */
|
||||
if ( (res_mysqldump = mysql_store_result (&mysql)) != NULL) {
|
||||
if (mysql_num_rows(res_mysqldump) == 1) {
|
||||
if ( (row_mysqldump = mysql_fetch_row (res_mysqldump)) != NULL) {
|
||||
mysqldump_threads = atoi(row_mysqldump[0]);
|
||||
}
|
||||
}
|
||||
/* free the result */
|
||||
mysql_free_result (res_mysqldump);
|
||||
}
|
||||
mysql_close (&mysql);
|
||||
}
|
||||
if (mysqldump_threads == 0) {
|
||||
die (STATE_CRITICAL, "%s\n", slaveresult);
|
||||
} else {
|
||||
strncat(slaveresult, " Mysqldump: in progress", SLAVERESULTSIZE-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (verbose >=3) {
|
||||
|
@ -291,7 +315,7 @@ main (int argc, char **argv)
|
|||
}
|
||||
|
||||
/* Check Seconds Behind against threshold */
|
||||
if ((seconds_behind_field != -1) && (strcmp (row[seconds_behind_field], "NULL") != 0)) {
|
||||
if ((seconds_behind_field != -1) && (row[seconds_behind_field] != NULL && strcmp (row[seconds_behind_field], "NULL") != 0)) {
|
||||
double value = atof(row[seconds_behind_field]);
|
||||
int status;
|
||||
|
||||
|
@ -551,7 +575,7 @@ print_help (void)
|
|||
printf (" %s\n", _("Exit with CRITICAL status if slave server is more then INTEGER seconds"));
|
||||
printf (" %s\n", _("behind master"));
|
||||
printf (" %s\n", "-l, --ssl");
|
||||
printf (" %s\n", _("Use ssl encryptation"));
|
||||
printf (" %s\n", _("Use ssl encryption"));
|
||||
printf (" %s\n", "-C, --ca-cert=STRING");
|
||||
printf (" %s\n", _("Path to CA signing the cert"));
|
||||
printf (" %s\n", "-a, --cert=STRING");
|
||||
|
|
|
@ -341,7 +341,7 @@ int main(int argc, char **argv){
|
|||
|
||||
2) If the counter you're going to measure is percent-based, the code will detect
|
||||
the percent sign in its name and will attribute minimum (0%) and maximum (100%)
|
||||
values automagically, as well the ¨%" sign to graph units.
|
||||
values automagically, as well the "%" sign to graph units.
|
||||
|
||||
3) OTOH, if the counter is "absolute", you'll have to provide the following
|
||||
the counter unit - that is, the dimensions of the counter you're getting. Examples:
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
*
|
||||
* This file contains the check_ntp plugin
|
||||
*
|
||||
* This plugin to check ntp servers independant of any commandline
|
||||
* This plugin to check ntp servers independent of any commandline
|
||||
* programs or external libraries.
|
||||
*
|
||||
*
|
||||
|
@ -79,7 +79,7 @@ typedef struct {
|
|||
/* this structure holds data about results from querying offset from a peer */
|
||||
typedef struct {
|
||||
time_t waiting; /* ts set when we started waiting for a response */
|
||||
int num_responses; /* number of successfully recieved responses */
|
||||
int num_responses; /* number of successfully received responses */
|
||||
uint8_t stratum; /* copied verbatim from the ntp_message */
|
||||
double rtdelay; /* converted from the ntp_message */
|
||||
double rtdisp; /* converted from the ntp_message */
|
||||
|
@ -100,7 +100,7 @@ typedef struct {
|
|||
/* NB: not necessarily NULL terminated! */
|
||||
} ntp_control_message;
|
||||
|
||||
/* this is an association/status-word pair found in control packet reponses */
|
||||
/* this is an association/status-word pair found in control packet responses */
|
||||
typedef struct {
|
||||
uint16_t assoc;
|
||||
uint16_t status;
|
||||
|
@ -486,7 +486,7 @@ double offset_request(const char *host, int *status){
|
|||
}
|
||||
|
||||
/* cleanup */
|
||||
/* FIXME: Not closing the socket to avoid re-use of the local port
|
||||
/* FIXME: Not closing the socket to avoid reuse of the local port
|
||||
* which can cause old NTP packets to be read instead of NTP control
|
||||
* packets in jitter_request(). THERE MUST BE ANOTHER WAY...
|
||||
* for(j=0; j<num_hosts; j++){ close(socklist[j]); } */
|
||||
|
@ -575,7 +575,7 @@ double jitter_request(int *status){
|
|||
}
|
||||
}
|
||||
}
|
||||
if(verbose) printf("%d candiate peers available\n", num_candidates);
|
||||
if(verbose) printf("%d candidate peers available\n", num_candidates);
|
||||
if(verbose && syncsource_found) printf("synchronization source found\n");
|
||||
if(! syncsource_found){
|
||||
*status = STATE_UNKNOWN;
|
||||
|
@ -597,7 +597,7 @@ double jitter_request(int *status){
|
|||
/* By spec, putting the variable name "jitter" in the request
|
||||
* should cause the server to provide _only_ the jitter value.
|
||||
* thus reducing net traffic, guaranteeing us only a single
|
||||
* datagram in reply, and making intepretation much simpler
|
||||
* datagram in reply, and making interpretation much simpler
|
||||
*/
|
||||
/* Older servers doesn't know what jitter is, so if we get an
|
||||
* error on the first pass we redo it with "dispersion" */
|
||||
|
|
|
@ -86,7 +86,7 @@ typedef struct {
|
|||
/* NB: not necessarily NULL terminated! */
|
||||
} ntp_control_message;
|
||||
|
||||
/* this is an association/status-word pair found in control packet reponses */
|
||||
/* this is an association/status-word pair found in control packet responses */
|
||||
typedef struct {
|
||||
uint16_t assoc;
|
||||
uint16_t status;
|
||||
|
@ -189,7 +189,7 @@ setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq){
|
|||
}
|
||||
|
||||
/* This function does all the actual work; roughly here's what it does
|
||||
* beside setting the offest, jitter and stratum passed as argument:
|
||||
* beside setting the offset, jitter and stratum passed as argument:
|
||||
* - offset can be negative, so if it cannot get the offset, offset_result
|
||||
* is set to UNKNOWN, otherwise OK.
|
||||
* - jitter and stratum are set to -1 if they cannot be retrieved so any
|
||||
|
@ -199,7 +199,7 @@ setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq){
|
|||
* status is pretty much useless as syncsource_found is a global variable
|
||||
* used later in main to check is the server was synchronized. It works
|
||||
* so I left it alone */
|
||||
int ntp_request(const char *host, double *offset, int *offset_result, double *jitter, int *stratum, int *num_truechimers){
|
||||
int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum, int *num_truechimers){
|
||||
int conn=-1, i, npeers=0, num_candidates=0;
|
||||
double tmp_offset = 0;
|
||||
int min_peer_sel=PEER_INCLUDED;
|
||||
|
@ -306,7 +306,7 @@ int ntp_request(const char *host, double *offset, int *offset_result, double *ji
|
|||
/* Putting the wanted variable names in the request
|
||||
* cause the server to provide _only_ the requested values.
|
||||
* thus reducing net traffic, guaranteeing us only a single
|
||||
* datagram in reply, and making intepretation much simpler
|
||||
* datagram in reply, and making interpretation much simpler
|
||||
*/
|
||||
/* Older servers doesn't know what jitter is, so if we get an
|
||||
* error on the first pass we redo it with "dispersion" */
|
||||
|
@ -585,8 +585,8 @@ int main(int argc, char *argv[]){
|
|||
/* set socket timeout */
|
||||
alarm (socket_timeout);
|
||||
|
||||
/* This returns either OK or WARNING (See comment preceeding ntp_request) */
|
||||
result = ntp_request(server_address, &offset, &offset_result, &jitter, &stratum, &num_truechimers);
|
||||
/* This returns either OK or WARNING (See comment preceding ntp_request) */
|
||||
result = ntp_request(&offset, &offset_result, &jitter, &stratum, &num_truechimers);
|
||||
|
||||
if(offset_result == STATE_UNKNOWN) {
|
||||
/* if there's no sync peer (this overrides ntp_request output): */
|
||||
|
|
|
@ -81,7 +81,7 @@ typedef struct {
|
|||
/* this structure holds data about results from querying offset from a peer */
|
||||
typedef struct {
|
||||
time_t waiting; /* ts set when we started waiting for a response */
|
||||
int num_responses; /* number of successfully recieved responses */
|
||||
int num_responses; /* number of successfully received responses */
|
||||
uint8_t stratum; /* copied verbatim from the ntp_message */
|
||||
double rtdelay; /* converted from the ntp_message */
|
||||
double rtdisp; /* converted from the ntp_message */
|
||||
|
|
|
@ -1668,7 +1668,7 @@ void print_help(void)
|
|||
|
||||
printf ("\n");
|
||||
printf ("%s\n", _("Notes:"));
|
||||
printf (" %s\n", _("- This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG"));
|
||||
printf (" %s\n", _("- This plugin requires that the MRTGEXT.NLM file from James Drews' MRTG"));
|
||||
printf (" %s\n", _(" extension for NetWare be loaded on the Novell servers you wish to check."));
|
||||
printf (" %s\n", _(" (available from http://www.engr.wisc.edu/~drews/mrtg/)"));
|
||||
printf (" %s\n", _("- Values for critical thresholds should be lower than warning thresholds"));
|
||||
|
|
|
@ -93,7 +93,7 @@ int verbose = 0;
|
|||
|
||||
/******************************************************************************
|
||||
|
||||
The (psuedo?)literate programming XML is contained within \@\@\- <XML> \-\@\@
|
||||
The (pseudo?)literate programming XML is contained within \@\@\- <XML> \-\@\@
|
||||
tags in the comments. With in the tags, the XML is assembled sequentially.
|
||||
You can define entities in tags. You also have all the #defines available as
|
||||
entities.
|
||||
|
@ -517,7 +517,10 @@ print_help (void)
|
|||
printf (" %s\n", _("connecting to the server. The result from the query has to be numeric."));
|
||||
printf (" %s\n", _("Multiple SQL commands, separated by semicolon, are allowed but the result "));
|
||||
printf (" %s\n", _("of the last command is taken into account only. The value of the first"));
|
||||
printf (" %s\n\n", _("column in the first row is used as the check result."));
|
||||
printf (" %s\n", _("column in the first row is used as the check result. If a second column is"));
|
||||
printf (" %s\n", _("present in the result set, this is added to the plugin output with a"));
|
||||
printf (" %s\n", _("prefix of \"Extra Info:\". This information can be displayed in the system"));
|
||||
printf (" %s\n\n", _("executing the plugin."));
|
||||
|
||||
printf (" %s\n", _("See the chapter \"Monitoring Database Activity\" of the PostgreSQL manual"));
|
||||
printf (" %s\n\n", _("for details about how to access internal statistics of the database server."));
|
||||
|
@ -557,6 +560,7 @@ do_query (PGconn *conn, char *query)
|
|||
PGresult *res;
|
||||
|
||||
char *val_str;
|
||||
char *extra_info;
|
||||
double value;
|
||||
|
||||
char *endptr = NULL;
|
||||
|
@ -621,6 +625,12 @@ do_query (PGconn *conn, char *query)
|
|||
printf ("|query=%f;%s;%s;;\n", value,
|
||||
query_warning ? query_warning : "",
|
||||
query_critical ? query_critical : "");
|
||||
if (PQnfields (res) > 1) {
|
||||
extra_info = PQgetvalue (res, 0, 1);
|
||||
if (extra_info != NULL) {
|
||||
printf ("Extra Info: %s\n", extra_info);
|
||||
}
|
||||
}
|
||||
return my_status;
|
||||
}
|
||||
|
||||
|
|
|
@ -70,6 +70,7 @@ int options = 0; /* bitmask of filter criteria to test against */
|
|||
#define PCPU 256
|
||||
#define ELAPSED 512
|
||||
#define EREG_ARGS 1024
|
||||
#define EXCLUDE_PROGS 2048
|
||||
|
||||
#define KTHREAD_PARENT "kthreadd" /* the parent process of kernel threads:
|
||||
ppid of procs are compared to pid of this proc*/
|
||||
|
@ -93,6 +94,9 @@ int rss;
|
|||
float pcpu;
|
||||
char *statopts;
|
||||
char *prog;
|
||||
char *exclude_progs;
|
||||
char **exclude_progs_arr = NULL;
|
||||
char exclude_progs_counter = 0;
|
||||
char *args;
|
||||
char *input_filename = NULL;
|
||||
regex_t re_args;
|
||||
|
@ -237,8 +241,9 @@ main (int argc, char **argv)
|
|||
|
||||
/* Ignore self */
|
||||
if ((usepid && mypid == procpid) ||
|
||||
(!usepid && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino) ||
|
||||
(ret == -1 && errno == ENOENT))) {
|
||||
( ((!usepid) && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino)) ||
|
||||
(ret == -1 && errno == ENOENT))
|
||||
) {
|
||||
if (verbose >= 3)
|
||||
printf("not considering - is myself or gone\n");
|
||||
continue;
|
||||
|
@ -250,7 +255,26 @@ main (int argc, char **argv)
|
|||
continue;
|
||||
}
|
||||
|
||||
/* filter kernel threads (childs of KTHREAD_PARENT)*/
|
||||
/* Ignore excluded processes by name */
|
||||
if(options & EXCLUDE_PROGS) {
|
||||
int found = 0;
|
||||
int i = 0;
|
||||
|
||||
for(i=0; i < (exclude_progs_counter); i++) {
|
||||
if(!strcmp(procprog, exclude_progs_arr[i])) {
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
if(found == 0) {
|
||||
resultsum |= EXCLUDE_PROGS;
|
||||
} else
|
||||
{
|
||||
if(verbose >= 3)
|
||||
printf("excluding - by ignorelist\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* filter kernel threads (children of KTHREAD_PARENT)*/
|
||||
/* TODO adapt for other OSes than GNU/Linux
|
||||
sorry for not doing that, but I've no other OSes to test :-( */
|
||||
if (kthread_filter == 1) {
|
||||
|
@ -409,6 +433,7 @@ process_arguments (int argc, char **argv)
|
|||
{"input-file", required_argument, 0, CHAR_MAX+2},
|
||||
{"no-kthreads", required_argument, 0, 'k'},
|
||||
{"traditional-filter", no_argument, 0, 'T'},
|
||||
{"exclude-process", required_argument, 0, 'X'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
@ -417,7 +442,7 @@ process_arguments (int argc, char **argv)
|
|||
strcpy (argv[c], "-t");
|
||||
|
||||
while (1) {
|
||||
c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T",
|
||||
c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T:X:",
|
||||
longopts, &option);
|
||||
|
||||
if (c == -1 || c == EOF)
|
||||
|
@ -490,6 +515,23 @@ process_arguments (int argc, char **argv)
|
|||
prog);
|
||||
options |= PROG;
|
||||
break;
|
||||
case 'X':
|
||||
if(exclude_progs)
|
||||
break;
|
||||
else
|
||||
exclude_progs = optarg;
|
||||
xasprintf (&fmt, _("%s%sexclude progs '%s'"), (fmt ? fmt : ""), (options ? ", " : ""),
|
||||
exclude_progs);
|
||||
char *p = strtok(exclude_progs, ",");
|
||||
|
||||
while(p){
|
||||
exclude_progs_arr = realloc(exclude_progs_arr, sizeof(char*) * ++exclude_progs_counter);
|
||||
exclude_progs_arr[exclude_progs_counter-1] = p;
|
||||
p = strtok(NULL, ",");
|
||||
}
|
||||
|
||||
options |= EXCLUDE_PROGS;
|
||||
break;
|
||||
case 'a': /* args (full path name with args) */
|
||||
/* TODO: allow this to be passed in with --metric */
|
||||
if (args)
|
||||
|
@ -745,6 +787,8 @@ print_help (void)
|
|||
printf (" %s\n", _("Only scan for processes with args that contain the regex STRING."));
|
||||
printf (" %s\n", "-C, --command=COMMAND");
|
||||
printf (" %s\n", _("Only scan for exact matches of COMMAND (without path)."));
|
||||
printf (" %s\n", "-X, --exclude-process");
|
||||
printf (" %s\n", _("Exclude processes which match this comma separated list"));
|
||||
printf (" %s\n", "-k, --no-kthreads");
|
||||
printf (" %s\n", _("Only scan for non kernel threads (works on Linux only)."));
|
||||
|
||||
|
@ -786,5 +830,5 @@ print_usage (void)
|
|||
printf ("%s\n", _("Usage:"));
|
||||
printf ("%s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n", progname);
|
||||
printf (" [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n");
|
||||
printf (" [-C command] [-k] [-t timeout] [-v]\n");
|
||||
printf (" [-C command] [-X process_to_exclude] [-k] [-t timeout] [-v]\n");
|
||||
}
|
||||
|
|
|
@ -97,7 +97,7 @@ int verbose = FALSE;
|
|||
|
||||
/******************************************************************************
|
||||
|
||||
The (psuedo?)literate programming XML is contained within \@\@\- <XML> \-\@\@
|
||||
The (pseudo?)literate programming XML is contained within \@\@\- <XML> \-\@\@
|
||||
tags in the comments. With in the tags, the XML is assembled sequentially.
|
||||
You can define entities in tags. You also have all the #defines available as
|
||||
entities.
|
||||
|
@ -155,7 +155,11 @@ main (int argc, char **argv)
|
|||
{
|
||||
struct sockaddr_storage ss;
|
||||
char name[HOST_NAME_MAX];
|
||||
#ifdef RC_BUFFER_LEN
|
||||
char msg[RC_BUFFER_LEN];
|
||||
#else
|
||||
char msg[BUFFER_LEN];
|
||||
#endif
|
||||
SEND_DATA data;
|
||||
int result = STATE_UNKNOWN;
|
||||
uint32_t client_id, service;
|
||||
|
@ -377,7 +381,7 @@ print_help (void)
|
|||
printf ("\n");
|
||||
printf ("%s\n", _("This plugin tests a RADIUS server to see if it is accepting connections."));
|
||||
printf ("%s\n", _("The server to test must be specified in the invocation, as well as a user"));
|
||||
printf ("%s\n", _("name and password. A configuration file may also be present. The format of"));
|
||||
printf ("%s\n", _("name and password. A configuration file must be present. The format of"));
|
||||
printf ("%s\n", _("the configuration file is described in the radiusclient library sources."));
|
||||
printf ("%s\n", _("The password option presents a substantial security issue because the"));
|
||||
printf ("%s\n", _("password can possibly be determined by careful watching of the command line"));
|
||||
|
|
|
@ -178,7 +178,7 @@ main (int argc, char **argv)
|
|||
|
||||
/* watch for the REAL connection string */
|
||||
result = recv (sd, buffer, MAX_INPUT_BUFFER - 1, 0);
|
||||
buffer[result] = '\0'; /* null terminate recieved buffer */
|
||||
buffer[result] = '\0'; /* null terminate received buffer */
|
||||
|
||||
/* return a CRITICAL status if we couldn't read any data */
|
||||
if (result == -1) {
|
||||
|
@ -436,7 +436,7 @@ print_help (void)
|
|||
|
||||
printf ("\n");
|
||||
printf ("%s\n", _("This plugin will attempt to open an RTSP connection with the host."));
|
||||
printf ("%s\n", _("Successul connects return STATE_OK, refusals and timeouts return"));
|
||||
printf ("%s\n", _("Successful connects return STATE_OK, refusals and timeouts return"));
|
||||
printf ("%s\n", _("STATE_CRITICAL, other errors return STATE_UNKNOWN. Successful connects,"));
|
||||
printf ("%s\n", _("but incorrect response messages from the host result in STATE_WARNING return"));
|
||||
printf ("%s\n", _("values."));
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Monitoring check_smtp plugin
|
||||
*
|
||||
* License: GPL
|
||||
* Copyright (c) 2000-2007 Monitoring Plugins Development Team
|
||||
* Copyright (c) 2000-2023 Monitoring Plugins Development Team
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
|
@ -42,16 +42,18 @@ const char *email = "devel@monitoring-plugins.org";
|
|||
#ifdef HAVE_SSL
|
||||
int check_cert = FALSE;
|
||||
int days_till_exp_warn, days_till_exp_crit;
|
||||
# define my_recv(buf, len) ((use_ssl && ssl_established) ? np_net_ssl_read(buf, len) : read(sd, buf, len))
|
||||
# define my_send(buf, len) ((use_ssl && ssl_established) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0))
|
||||
# define my_recv(buf, len) (((use_starttls || use_ssl) && ssl_established) ? np_net_ssl_read(buf, len) : read(sd, buf, len))
|
||||
# define my_send(buf, len) (((use_starttls || use_ssl) && ssl_established) ? np_net_ssl_write(buf, len) : send(sd, buf, len, 0))
|
||||
#else /* ifndef HAVE_SSL */
|
||||
# define my_recv(buf, len) read(sd, buf, len)
|
||||
# define my_send(buf, len) send(sd, buf, len, 0)
|
||||
#endif
|
||||
|
||||
enum {
|
||||
SMTP_PORT = 25
|
||||
SMTP_PORT = 25,
|
||||
SMTPS_PORT = 465
|
||||
};
|
||||
#define PROXY_PREFIX "PROXY TCP4 0.0.0.0 0.0.0.0 25 25\r\n"
|
||||
#define SMTP_EXPECT "220"
|
||||
#define SMTP_HELO "HELO "
|
||||
#define SMTP_EHLO "EHLO "
|
||||
|
@ -82,6 +84,7 @@ int eflags = 0;
|
|||
int errcode, excode;
|
||||
|
||||
int server_port = SMTP_PORT;
|
||||
int server_port_option = 0;
|
||||
char *server_address = NULL;
|
||||
char *server_expect = NULL;
|
||||
char *mail_command = NULL;
|
||||
|
@ -102,6 +105,9 @@ double critical_time = 0;
|
|||
int check_critical_time = FALSE;
|
||||
int verbose = 0;
|
||||
int use_ssl = FALSE;
|
||||
int use_starttls = FALSE;
|
||||
int use_sni = FALSE;
|
||||
short use_proxy_prefix = FALSE;
|
||||
short use_ehlo = FALSE;
|
||||
short use_lhlo = FALSE;
|
||||
short ssl_established = 0;
|
||||
|
@ -183,6 +189,26 @@ main (int argc, char **argv)
|
|||
result = my_tcp_connect (server_address, server_port, &sd);
|
||||
|
||||
if (result == STATE_OK) { /* we connected */
|
||||
/* If requested, send PROXY header */
|
||||
if (use_proxy_prefix) {
|
||||
if (verbose)
|
||||
printf ("Sending header %s\n", PROXY_PREFIX);
|
||||
my_send(PROXY_PREFIX, strlen(PROXY_PREFIX));
|
||||
}
|
||||
|
||||
#ifdef HAVE_SSL
|
||||
if (use_ssl) {
|
||||
result = np_net_ssl_init_with_hostname(sd, (use_sni ? server_address : NULL));
|
||||
if (result != STATE_OK) {
|
||||
printf (_("CRITICAL - Cannot create SSL context.\n"));
|
||||
close(sd);
|
||||
np_net_ssl_cleanup();
|
||||
return STATE_CRITICAL;
|
||||
} else {
|
||||
ssl_established = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* watch for the SMTP connection string and */
|
||||
/* return a WARNING status if we couldn't read any data */
|
||||
|
@ -195,7 +221,7 @@ main (int argc, char **argv)
|
|||
xasprintf(&server_response, "%s", buffer);
|
||||
|
||||
/* send the HELO/EHLO command */
|
||||
send(sd, helocmd, strlen(helocmd), 0);
|
||||
my_send(helocmd, strlen(helocmd));
|
||||
|
||||
/* allow for response to helo command to reach us */
|
||||
if (recvlines(buffer, MAX_INPUT_BUFFER) <= 0) {
|
||||
|
@ -208,14 +234,14 @@ main (int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
if(use_ssl && ! supports_tls){
|
||||
if(use_starttls && ! supports_tls){
|
||||
printf(_("WARNING - TLS not supported by server\n"));
|
||||
smtp_quit();
|
||||
return STATE_WARNING;
|
||||
}
|
||||
|
||||
#ifdef HAVE_SSL
|
||||
if(use_ssl) {
|
||||
if(use_starttls) {
|
||||
/* send the STARTTLS command */
|
||||
send(sd, SMTP_STARTTLS, strlen(SMTP_STARTTLS), 0);
|
||||
|
||||
|
@ -225,7 +251,7 @@ main (int argc, char **argv)
|
|||
smtp_quit();
|
||||
return STATE_UNKNOWN;
|
||||
}
|
||||
result = np_net_ssl_init(sd);
|
||||
result = np_net_ssl_init_with_hostname(sd, (use_sni ? server_address : NULL));
|
||||
if(result != STATE_OK) {
|
||||
printf (_("CRITICAL - Cannot create SSL context.\n"));
|
||||
close(sd);
|
||||
|
@ -454,6 +480,10 @@ process_arguments (int argc, char **argv)
|
|||
int c;
|
||||
char* temp;
|
||||
|
||||
enum {
|
||||
SNI_OPTION
|
||||
};
|
||||
|
||||
int option = 0;
|
||||
static struct option longopts[] = {
|
||||
{"hostname", required_argument, 0, 'H'},
|
||||
|
@ -475,9 +505,13 @@ process_arguments (int argc, char **argv)
|
|||
{"use-ipv6", no_argument, 0, '6'},
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"lmtp", no_argument, 0, 'L'},
|
||||
{"ssl", no_argument, 0, 's'},
|
||||
{"tls", no_argument, 0, 's'},
|
||||
{"starttls",no_argument,0,'S'},
|
||||
{"sni", no_argument, 0, SNI_OPTION},
|
||||
{"certificate",required_argument,0,'D'},
|
||||
{"ignore-quit-failure",no_argument,0,'q'},
|
||||
{"proxy",no_argument,0,'r'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
@ -494,7 +528,7 @@ process_arguments (int argc, char **argv)
|
|||
}
|
||||
|
||||
while (1) {
|
||||
c = getopt_long (argc, argv, "+hVv46Lt:p:f:e:c:w:H:C:R:SD:F:A:U:P:q",
|
||||
c = getopt_long (argc, argv, "+hVv46Lrt:p:f:e:c:w:H:C:R:sSD:F:A:U:P:q",
|
||||
longopts, &option);
|
||||
|
||||
if (c == -1 || c == EOF)
|
||||
|
@ -511,7 +545,7 @@ process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'p': /* port */
|
||||
if (is_intpos (optarg))
|
||||
server_port = atoi (optarg);
|
||||
server_port_option = atoi (optarg);
|
||||
else
|
||||
usage4 (_("Port must be a positive integer"));
|
||||
break;
|
||||
|
@ -616,11 +650,26 @@ process_arguments (int argc, char **argv)
|
|||
#else
|
||||
usage (_("SSL support not available - install OpenSSL and recompile"));
|
||||
#endif
|
||||
case 's':
|
||||
/* ssl */
|
||||
use_ssl = TRUE;
|
||||
server_port = SMTPS_PORT;
|
||||
break;
|
||||
case 'S':
|
||||
/* starttls */
|
||||
use_ssl = TRUE;
|
||||
use_starttls = TRUE;
|
||||
use_ehlo = TRUE;
|
||||
break;
|
||||
case SNI_OPTION:
|
||||
#ifdef HAVE_SSL
|
||||
use_sni = TRUE;
|
||||
#else
|
||||
usage (_("SSL support not available - install OpenSSL and recompile"));
|
||||
#endif
|
||||
break;
|
||||
case 'r':
|
||||
use_proxy_prefix = TRUE;
|
||||
break;
|
||||
case 'L':
|
||||
use_lhlo = TRUE;
|
||||
break;
|
||||
|
@ -667,6 +716,14 @@ process_arguments (int argc, char **argv)
|
|||
if (from_arg==NULL)
|
||||
from_arg = strdup(" ");
|
||||
|
||||
if (use_starttls && use_ssl) {
|
||||
usage4 (_("Set either -s/--ssl/--tls or -S/--starttls"));
|
||||
}
|
||||
|
||||
if (server_port_option != 0) {
|
||||
server_port = server_port_option;
|
||||
}
|
||||
|
||||
return validate_arguments ();
|
||||
}
|
||||
|
||||
|
@ -819,11 +876,18 @@ print_help (void)
|
|||
printf (" %s\n", _("FROM-address to include in MAIL command, required by Exchange 2000")),
|
||||
printf (" %s\n", "-F, --fqdn=STRING");
|
||||
printf (" %s\n", _("FQDN used for HELO"));
|
||||
printf (" %s\n", "-r, --proxy");
|
||||
printf (" %s\n", _("Use PROXY protocol prefix for the connection."));
|
||||
#ifdef HAVE_SSL
|
||||
printf (" %s\n", "-D, --certificate=INTEGER[,INTEGER]");
|
||||
printf (" %s\n", _("Minimum number of days a certificate has to be valid."));
|
||||
printf (" %s\n", "-s, --ssl, --tls");
|
||||
printf (" %s\n", _("Use SSL/TLS for the connection."));
|
||||
printf (_(" Sets default port to %d.\n"), SMTPS_PORT);
|
||||
printf (" %s\n", "-S, --starttls");
|
||||
printf (" %s\n", _("Use STARTTLS for the connection."));
|
||||
printf (" %s\n", "--sni");
|
||||
printf (" %s\n", _("Enable SSL/TLS hostname extension support (SNI)"));
|
||||
#endif
|
||||
|
||||
printf (" %s\n", "-A, --authtype=STRING");
|
||||
|
@ -844,7 +908,7 @@ print_help (void)
|
|||
printf (UT_VERBOSE);
|
||||
|
||||
printf("\n");
|
||||
printf ("%s\n", _("Successul connects return STATE_OK, refusals and timeouts return"));
|
||||
printf ("%s\n", _("Successful connects return STATE_OK, refusals and timeouts return"));
|
||||
printf ("%s\n", _("STATE_CRITICAL, other errors return STATE_UNKNOWN. Successful"));
|
||||
printf ("%s\n", _("connects, but incorrect response messages from the host result in"));
|
||||
printf ("%s\n", _("STATE_WARNING return values."));
|
||||
|
@ -860,6 +924,6 @@ print_usage (void)
|
|||
printf ("%s\n", _("Usage:"));
|
||||
printf ("%s -H host [-p port] [-4|-6] [-e expect] [-C command] [-R response] [-f from addr]\n", progname);
|
||||
printf ("[-A authtype -U authuser -P authpass] [-w warn] [-c crit] [-t timeout] [-q]\n");
|
||||
printf ("[-F fqdn] [-S] [-L] [-D warn days cert expire[,crit days cert expire]] [-v] \n");
|
||||
printf ("[-F fqdn] [-S] [-L] [-D warn days cert expire[,crit days cert expire]] [-r] [--sni] [-v] \n");
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ const char *email = "devel@monitoring-plugins.org";
|
|||
#define DEFAULT_PRIV_PROTOCOL "DES"
|
||||
#define DEFAULT_DELIMITER "="
|
||||
#define DEFAULT_OUTPUT_DELIMITER " "
|
||||
#define DEFAULT_BUFFER_SIZE 100
|
||||
|
||||
#define mark(a) ((a)!=0?"*":"")
|
||||
|
||||
|
@ -64,6 +65,7 @@ const char *email = "devel@monitoring-plugins.org";
|
|||
#define L_RATE_MULTIPLIER CHAR_MAX+2
|
||||
#define L_INVERT_SEARCH CHAR_MAX+3
|
||||
#define L_OFFSET CHAR_MAX+4
|
||||
#define L_IGNORE_MIB_PARSING_ERRORS CHAR_MAX+5
|
||||
|
||||
/* Gobble to string - stop incrementing c when c[0] match one of the
|
||||
* characters in s */
|
||||
|
@ -157,6 +159,9 @@ int perf_labels = 1;
|
|||
char* ip_version = "";
|
||||
double multiplier = 1.0;
|
||||
char *fmtstr = "";
|
||||
bool fmtstr_set = false;
|
||||
char buffer[DEFAULT_BUFFER_SIZE];
|
||||
bool ignore_mib_parsing_errors = false;
|
||||
|
||||
static char *fix_snmp_range(char *th)
|
||||
{
|
||||
|
@ -304,42 +309,55 @@ main (int argc, char **argv)
|
|||
}
|
||||
|
||||
/* 10 arguments to pass before context and authpriv options + 1 for host and numoids. Add one for terminating NULL */
|
||||
command_line = calloc (10 + numcontext + numauthpriv + 1 + numoids + 1, sizeof (char *));
|
||||
command_line[0] = snmpcmd;
|
||||
command_line[1] = strdup ("-Le");
|
||||
command_line[2] = strdup ("-t");
|
||||
xasprintf (&command_line[3], "%d", timeout_interval);
|
||||
command_line[4] = strdup ("-r");
|
||||
xasprintf (&command_line[5], "%d", retries);
|
||||
command_line[6] = strdup ("-m");
|
||||
command_line[7] = strdup (miblist);
|
||||
command_line[8] = "-v";
|
||||
command_line[9] = strdup (proto);
|
||||
|
||||
unsigned index = 0;
|
||||
command_line = calloc (11 + numcontext + numauthpriv + 1 + numoids + 1, sizeof (char *));
|
||||
|
||||
command_line[index++] = snmpcmd;
|
||||
command_line[index++] = strdup ("-Le");
|
||||
command_line[index++] = strdup ("-t");
|
||||
xasprintf (&command_line[index++], "%d", timeout_interval);
|
||||
command_line[index++] = strdup ("-r");
|
||||
xasprintf (&command_line[index++], "%d", retries);
|
||||
command_line[index++] = strdup ("-m");
|
||||
command_line[index++] = strdup (miblist);
|
||||
command_line[index++] = "-v";
|
||||
command_line[index++] = strdup (proto);
|
||||
|
||||
xasprintf(&cl_hidden_auth, "%s -Le -t %d -r %d -m %s -v %s",
|
||||
snmpcmd, timeout_interval, retries, strlen(miblist) ? miblist : "''", proto);
|
||||
|
||||
if (ignore_mib_parsing_errors) {
|
||||
command_line[index++] = "-Pe";
|
||||
xasprintf(&cl_hidden_auth, "%s -Pe", cl_hidden_auth);
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < numcontext; i++) {
|
||||
command_line[10 + i] = contextargs[i];
|
||||
command_line[index++] = contextargs[i];
|
||||
}
|
||||
|
||||
for (i = 0; i < numauthpriv; i++) {
|
||||
command_line[10 + numcontext + i] = authpriv[i];
|
||||
command_line[index++] = authpriv[i];
|
||||
}
|
||||
|
||||
xasprintf (&command_line[10 + numcontext + numauthpriv], "%s:%s", server_address, port);
|
||||
xasprintf (&command_line[index++], "%s:%s", server_address, port);
|
||||
|
||||
/* This is just for display purposes, so it can remain a string */
|
||||
xasprintf(&cl_hidden_auth, "%s -Le -t %d -r %d -m %s -v %s %s %s %s:%s",
|
||||
snmpcmd, timeout_interval, retries, strlen(miblist) ? miblist : "''", proto, "[context]", "[authpriv]",
|
||||
server_address, port);
|
||||
xasprintf(&cl_hidden_auth, "%s [context] [authpriv] %s:%s",
|
||||
cl_hidden_auth,
|
||||
server_address,
|
||||
port);
|
||||
|
||||
for (i = 0; i < numoids; i++) {
|
||||
command_line[10 + numcontext + numauthpriv + 1 + i] = oids[i];
|
||||
command_line[index++] = oids[i];
|
||||
xasprintf(&cl_hidden_auth, "%s %s", cl_hidden_auth, oids[i]);
|
||||
}
|
||||
|
||||
command_line[10 + numcontext + numauthpriv + 1 + numoids] = NULL;
|
||||
command_line[index++] = NULL;
|
||||
|
||||
if (verbose)
|
||||
if (verbose) {
|
||||
printf ("%s\n", cl_hidden_auth);
|
||||
}
|
||||
|
||||
/* Set signal handling and alarm */
|
||||
if (signal (SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) {
|
||||
|
@ -420,7 +438,8 @@ main (int argc, char **argv)
|
|||
}
|
||||
else if (strstr (response, "INTEGER: ")) {
|
||||
show = multiply (strstr (response, "INTEGER: ") + 9);
|
||||
if (fmtstr != "") {
|
||||
|
||||
if (fmtstr_set) {
|
||||
conv = fmtstr;
|
||||
}
|
||||
}
|
||||
|
@ -594,8 +613,9 @@ main (int argc, char **argv)
|
|||
len = sizeof(perfstr)-strlen(perfstr)-1;
|
||||
strncat(perfstr, show, len>ptr-show ? ptr-show : len);
|
||||
|
||||
if (type)
|
||||
if (strcmp(type, "") != 0) {
|
||||
strncat(perfstr, type, sizeof(perfstr)-strlen(perfstr)-1);
|
||||
}
|
||||
|
||||
if (warning_thresholds) {
|
||||
strncat(perfstr, ";", sizeof(perfstr)-strlen(perfstr)-1);
|
||||
|
@ -706,6 +726,7 @@ process_arguments (int argc, char **argv)
|
|||
{"ipv6", no_argument, 0, '6'},
|
||||
{"multiplier", required_argument, 0, 'M'},
|
||||
{"fmtstr", required_argument, 0, 'f'},
|
||||
{"ignore-mib-parsing-errors", no_argument, false, L_IGNORE_MIB_PARSING_ERRORS},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
@ -853,6 +874,7 @@ process_arguments (int argc, char **argv)
|
|||
break;
|
||||
case 'R': /* regex */
|
||||
cflags = REG_ICASE;
|
||||
// fall through
|
||||
case 'r': /* regex */
|
||||
cflags |= REG_EXTENDED | REG_NOSUB | REG_NEWLINE;
|
||||
strncpy (regex_expect, optarg, sizeof (regex_expect) - 1);
|
||||
|
@ -969,8 +991,11 @@ process_arguments (int argc, char **argv)
|
|||
case 'f':
|
||||
if (multiplier != 1.0) {
|
||||
fmtstr=optarg;
|
||||
fmtstr_set = true;
|
||||
}
|
||||
break;
|
||||
case L_IGNORE_MIB_PARSING_ERRORS:
|
||||
ignore_mib_parsing_errors = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1169,33 +1194,33 @@ multiply (char *str)
|
|||
double val;
|
||||
char *conv = "%f";
|
||||
|
||||
if(multiplier == 1)
|
||||
return(str);
|
||||
|
||||
if(verbose>2)
|
||||
printf(" multiply input: %s\n", str);
|
||||
|
||||
val = strtod (str, &endptr);
|
||||
if ((val == 0.0) && (endptr == str)) {
|
||||
if(multiplier != 1) {
|
||||
die(STATE_UNKNOWN, _("multiplier set (%.1f), but input is not a number: %s"), multiplier, str);
|
||||
}
|
||||
return str;
|
||||
die(STATE_UNKNOWN, _("multiplier set (%.1f), but input is not a number: %s"), multiplier, str);
|
||||
}
|
||||
|
||||
if(verbose>2)
|
||||
printf(" multiply extracted double: %f\n", val);
|
||||
val *= multiplier;
|
||||
if (fmtstr != "") {
|
||||
if (fmtstr_set) {
|
||||
conv = fmtstr;
|
||||
}
|
||||
if (val == (int)val) {
|
||||
sprintf(str, "%.0f", val);
|
||||
snprintf(buffer, DEFAULT_BUFFER_SIZE, "%.0f", val);
|
||||
} else {
|
||||
if(verbose>2)
|
||||
printf(" multiply using format: %s\n", conv);
|
||||
sprintf(str, conv, val);
|
||||
snprintf(buffer, DEFAULT_BUFFER_SIZE, conv, val);
|
||||
}
|
||||
if(verbose>2)
|
||||
printf(" multiply result: %s\n", str);
|
||||
return str;
|
||||
printf(" multiply result: %s\n", buffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1272,7 +1297,7 @@ print_help (void)
|
|||
printf (" %s\n", "--rate-multiplier");
|
||||
printf (" %s\n", _("Converts rate per second. For example, set to 60 to convert to per minute"));
|
||||
printf (" %s\n", "--offset=OFFSET");
|
||||
printf (" %s\n", _("Add/substract the specified OFFSET to numeric sensor data"));
|
||||
printf (" %s\n", _("Add/subtract the specified OFFSET to numeric sensor data"));
|
||||
|
||||
/* Tests Against Strings */
|
||||
printf (" %s\n", "-s, --string=STRING");
|
||||
|
@ -1304,6 +1329,9 @@ print_help (void)
|
|||
printf (" %s\n", "-O, --perf-oids");
|
||||
printf (" %s\n", _("Label performance data with OIDs instead of --label's"));
|
||||
|
||||
printf (" %s\n", "--ignore-mib-parsing-errors");
|
||||
printf (" %s\n", _("Tell snmpget to not print errors encountered when parsing MIB files"));
|
||||
|
||||
printf (UT_VERBOSE);
|
||||
|
||||
printf ("\n");
|
||||
|
|
|
@ -34,9 +34,6 @@ const char *email = "devel@monitoring-plugins.org";
|
|||
#include "common.h"
|
||||
#include "popen.h"
|
||||
#include "utils.h"
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <libintl.h>
|
||||
|
||||
#ifdef HAVE_DECL_SWAPCTL
|
||||
# ifdef HAVE_SYS_PARAM_H
|
||||
|
@ -181,7 +178,7 @@ main (int argc, char **argv)
|
|||
# ifdef _AIX
|
||||
if (!allswaps) {
|
||||
xasprintf(&swap_command, "%s", "/usr/sbin/lsps -s");
|
||||
xasprintf(&swap_format, "%s", "%f%*s %f");
|
||||
xasprintf(&swap_format, "%s", "%lu%*s %lu");
|
||||
conv_factor = 1;
|
||||
}
|
||||
# endif
|
||||
|
@ -208,9 +205,9 @@ main (int argc, char **argv)
|
|||
temp_buffer = strtok (input_buffer, " \n");
|
||||
while (temp_buffer) {
|
||||
if (strstr (temp_buffer, "blocks"))
|
||||
sprintf (str, "%s %s", str, "%f");
|
||||
sprintf (str, "%s %s", str, "%lu");
|
||||
else if (strstr (temp_buffer, "dskfree"))
|
||||
sprintf (str, "%s %s", str, "%f");
|
||||
sprintf (str, "%s %s", str, "%lu");
|
||||
else
|
||||
sprintf (str, "%s %s", str, "%*s");
|
||||
temp_buffer = strtok (NULL, " \n");
|
||||
|
@ -555,7 +552,7 @@ validate_arguments (void)
|
|||
}
|
||||
else if ((warn.is_percentage == crit.is_percentage) && (warn.value < crit.value)) {
|
||||
/* This is NOT triggered if warn and crit are different units, e.g warn is percentage
|
||||
* and crit is absolut. We cannot determine the condition at this point since we
|
||||
* and crit is absolute. We cannot determine the condition at this point since we
|
||||
* dont know the value of total swap yet
|
||||
*/
|
||||
usage4(_("Warning should be more than critical"));
|
||||
|
|
|
@ -128,7 +128,7 @@ main (int argc, char **argv)
|
|||
SERVICE[i] = toupper(SERVICE[i]);
|
||||
}
|
||||
|
||||
/* set up a resonable buffer at first (will be realloc()'ed if
|
||||
/* set up a reasonable buffer at first (will be realloc()'ed if
|
||||
* user specifies other options) */
|
||||
server_expect = calloc(sizeof(char *), 2);
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ char *ups_status;
|
|||
int temp_output_c = 0;
|
||||
|
||||
int determine_status (void);
|
||||
int get_ups_variable (const char *, char *, size_t);
|
||||
int get_ups_variable (const char *, char *);
|
||||
|
||||
int process_arguments (int, char **);
|
||||
int validate_arguments (void);
|
||||
|
@ -189,7 +189,7 @@ main (int argc, char **argv)
|
|||
}
|
||||
|
||||
/* get the ups utility voltage if possible */
|
||||
res=get_ups_variable ("input.voltage", temp_buffer, sizeof (temp_buffer));
|
||||
res=get_ups_variable ("input.voltage", temp_buffer);
|
||||
if (res == NOSUCHVAR) supported_options &= ~UPS_UTILITY;
|
||||
else if (res != OK)
|
||||
return STATE_CRITICAL;
|
||||
|
@ -224,7 +224,7 @@ main (int argc, char **argv)
|
|||
}
|
||||
|
||||
/* get the ups battery percent if possible */
|
||||
res=get_ups_variable ("battery.charge", temp_buffer, sizeof (temp_buffer));
|
||||
res=get_ups_variable ("battery.charge", temp_buffer);
|
||||
if (res == NOSUCHVAR) supported_options &= ~UPS_BATTPCT;
|
||||
else if ( res != OK)
|
||||
return STATE_CRITICAL;
|
||||
|
@ -253,7 +253,7 @@ main (int argc, char **argv)
|
|||
}
|
||||
|
||||
/* get the ups load percent if possible */
|
||||
res=get_ups_variable ("ups.load", temp_buffer, sizeof (temp_buffer));
|
||||
res=get_ups_variable ("ups.load", temp_buffer);
|
||||
if ( res == NOSUCHVAR ) supported_options &= ~UPS_LOADPCT;
|
||||
else if ( res != OK)
|
||||
return STATE_CRITICAL;
|
||||
|
@ -282,7 +282,7 @@ main (int argc, char **argv)
|
|||
}
|
||||
|
||||
/* get the ups temperature if possible */
|
||||
res=get_ups_variable ("ups.temperature", temp_buffer, sizeof (temp_buffer));
|
||||
res=get_ups_variable ("ups.temperature", temp_buffer);
|
||||
if ( res == NOSUCHVAR ) supported_options &= ~UPS_TEMP;
|
||||
else if ( res != OK)
|
||||
return STATE_CRITICAL;
|
||||
|
@ -342,7 +342,7 @@ determine_status (void)
|
|||
char *ptr;
|
||||
int res;
|
||||
|
||||
res=get_ups_variable ("ups.status", recv_buffer, sizeof (recv_buffer));
|
||||
res=get_ups_variable ("ups.status", recv_buffer);
|
||||
if (res == NOSUCHVAR) return OK;
|
||||
if (res != STATE_OK) {
|
||||
printf ("%s\n", _("Invalid response received from host"));
|
||||
|
@ -388,7 +388,7 @@ determine_status (void)
|
|||
|
||||
/* gets a variable value for a specific UPS */
|
||||
int
|
||||
get_ups_variable (const char *varname, char *buf, size_t buflen)
|
||||
get_ups_variable (const char *varname, char *buf)
|
||||
{
|
||||
/* char command[MAX_INPUT_BUFFER]; */
|
||||
char temp_buffer[MAX_INPUT_BUFFER];
|
||||
|
@ -507,7 +507,7 @@ process_arguments (int argc, char **argv)
|
|||
usage2 (_("Invalid hostname/address"), optarg);
|
||||
}
|
||||
break;
|
||||
case 'T': /* FIXME: to be improved (ie "-T C" for Celsius or "-T F" for Farenheit) */
|
||||
case 'T': /* FIXME: to be improved (ie "-T C" for Celsius or "-T F" for Fahrenheit) */
|
||||
temp_output_c = 1;
|
||||
break;
|
||||
case 'u': /* ups name */
|
||||
|
|
|
@ -1,33 +1,33 @@
|
|||
/*****************************************************************************
|
||||
*
|
||||
*
|
||||
* Monitoring check_users plugin
|
||||
*
|
||||
*
|
||||
* License: GPL
|
||||
* Copyright (c) 2000-2012 Monitoring Plugins Development Team
|
||||
*
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
*
|
||||
* This file contains the check_users plugin
|
||||
*
|
||||
*
|
||||
* This plugin checks the number of users currently logged in on the local
|
||||
* system and generates an error if the number exceeds the thresholds
|
||||
* specified.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
const char *progname = "check_users";
|
||||
|
@ -48,6 +48,11 @@ const char *email = "devel@monitoring-plugins.org";
|
|||
# include "popen.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
#include <systemd/sd-daemon.h>
|
||||
#include <systemd/sd-login.h>
|
||||
#endif
|
||||
|
||||
#define possibly_set(a,b) ((a) == 0 ? (b) : 0)
|
||||
|
||||
int process_arguments (int, char **);
|
||||
|
@ -85,6 +90,11 @@ main (int argc, char **argv)
|
|||
|
||||
users = 0;
|
||||
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
if (sd_booted () > 0)
|
||||
users = sd_get_sessions (NULL);
|
||||
else {
|
||||
#endif
|
||||
#if HAVE_WTSAPI32_H
|
||||
if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,
|
||||
0, 1, &wtsinfo, &wtscount)) {
|
||||
|
@ -156,6 +166,9 @@ main (int argc, char **argv)
|
|||
if (spclose (child_process))
|
||||
result = possibly_set (result, STATE_UNKNOWN);
|
||||
#endif
|
||||
#ifdef HAVE_LIBSYSTEMD
|
||||
}
|
||||
#endif
|
||||
|
||||
/* check the user count against warning and critical thresholds */
|
||||
result = get_status((double)users, thlds);
|
||||
|
@ -163,7 +176,7 @@ main (int argc, char **argv)
|
|||
if (result == STATE_UNKNOWN)
|
||||
printf ("%s\n", _("Unable to read output"));
|
||||
else {
|
||||
printf (_("USERS %s - %d users currently logged in |%s\n"),
|
||||
printf (_("USERS %s - %d users currently logged in |%s\n"),
|
||||
state_text(result), users,
|
||||
sperfdata_int("users", users, "", warning_range,
|
||||
critical_range, TRUE, 0, FALSE, 0));
|
||||
|
|
|
@ -225,18 +225,4 @@ enum {
|
|||
# define __attribute__(x) /* do nothing */
|
||||
#endif
|
||||
|
||||
/* Try sysconf(_SC_OPEN_MAX) first, as it can be higher than OPEN_MAX.
|
||||
* If that fails and the macro isn't defined, we fall back to an educated
|
||||
* guess. There's no guarantee that our guess is adequate and the program
|
||||
* will die with SIGSEGV if it isn't and the upper boundary is breached. */
|
||||
#define DEFAULT_MAXFD 256 /* fallback value if no max open files value is set */
|
||||
#define MAXFD_LIMIT 8192 /* upper limit of open files */
|
||||
#ifdef _SC_OPEN_MAX
|
||||
static long maxfd = 0;
|
||||
#elif defined(OPEN_MAX)
|
||||
# define maxfd OPEN_MAX
|
||||
#else /* sysconf macro unavailable, so guess (may be wildly inaccurate) */
|
||||
# define maxfd DEFAULT_MAXFD
|
||||
#endif
|
||||
|
||||
#endif /* _COMMON_H_ */
|
||||
|
|
|
@ -92,7 +92,7 @@ extern int econn_refuse_state;
|
|||
extern int was_refused;
|
||||
extern int address_family;
|
||||
|
||||
RETSIGTYPE socket_timeout_alarm_handler (int) __attribute__((noreturn));
|
||||
void socket_timeout_alarm_handler (int) __attribute__((noreturn));
|
||||
|
||||
/* SSL-Related functionality */
|
||||
#ifdef HAVE_SSL
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -400,7 +400,7 @@ int phr_parse_request(const char *buf_start, size_t len, const char **method, si
|
|||
*num_headers = 0;
|
||||
|
||||
/* if last_len != 0, check if the request is complete (a fast countermeasure
|
||||
againt slowloris */
|
||||
against slowloris */
|
||||
if (last_len != 0 && is_complete(buf, buf_end, last_len, &r) == NULL) {
|
||||
return r;
|
||||
}
|
||||
|
@ -435,7 +435,7 @@ static const char *parse_response(const char *buf, const char *buf_end, int *maj
|
|||
}
|
||||
PARSE_INT_3(status);
|
||||
|
||||
/* get message includig preceding space */
|
||||
/* get message including preceding space */
|
||||
if ((buf = get_token_to_eol(buf, buf_end, msg, msg_len, ret)) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* FILE * spopen(const char *);
|
||||
* int spclose(FILE *);
|
||||
*
|
||||
* Code taken with liitle modification from "Advanced Programming for the Unix
|
||||
* Code taken with little modification from "Advanced Programming for the Unix
|
||||
* Environment" by W. Richard Stevens
|
||||
*
|
||||
* This is considered safe in that no shell is spawned, and the environment
|
||||
|
@ -38,8 +38,9 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "common.h"
|
||||
#include "utils.h"
|
||||
#include "./common.h"
|
||||
#include "./utils.h"
|
||||
#include "../lib/maxfd.h"
|
||||
|
||||
/* extern so plugin has pid to kill exec'd process on timeouts */
|
||||
extern pid_t *childpid;
|
||||
|
@ -49,9 +50,9 @@ extern FILE *child_process;
|
|||
FILE *spopen (const char *);
|
||||
int spclose (FILE *);
|
||||
#ifdef REDHAT_SPOPEN_ERROR
|
||||
RETSIGTYPE popen_sigchld_handler (int);
|
||||
void popen_sigchld_handler (int);
|
||||
#endif
|
||||
RETSIGTYPE popen_timeout_alarm_handler (int);
|
||||
void popen_timeout_alarm_handler (int);
|
||||
|
||||
#include <stdarg.h> /* ANSI C header file */
|
||||
#include <fcntl.h>
|
||||
|
@ -177,8 +178,7 @@ spopen (const char *cmdstring)
|
|||
}
|
||||
argv[i] = NULL;
|
||||
|
||||
if(maxfd == 0)
|
||||
maxfd = open_max();
|
||||
long maxfd = mp_open_max();
|
||||
|
||||
if (childpid == NULL) { /* first time through */
|
||||
if ((childpid = calloc ((size_t)maxfd, sizeof (pid_t))) == NULL)
|
||||
|
@ -266,7 +266,7 @@ spclose (FILE * fp)
|
|||
}
|
||||
|
||||
#ifdef REDHAT_SPOPEN_ERROR
|
||||
RETSIGTYPE
|
||||
void
|
||||
popen_sigchld_handler (int signo)
|
||||
{
|
||||
if (signo == SIGCHLD)
|
||||
|
@ -274,7 +274,7 @@ popen_sigchld_handler (int signo)
|
|||
}
|
||||
#endif
|
||||
|
||||
RETSIGTYPE
|
||||
void
|
||||
popen_timeout_alarm_handler (int signo)
|
||||
{
|
||||
int fh;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
FILE *spopen (const char *);
|
||||
int spclose (FILE *);
|
||||
RETSIGTYPE popen_timeout_alarm_handler (int);
|
||||
void popen_timeout_alarm_handler (int);
|
||||
|
||||
pid_t *childpid=NULL;
|
||||
int *child_stderr_array=NULL;
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
# include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
#include "./utils.h"
|
||||
|
||||
/** macros **/
|
||||
#ifndef WEXITSTATUS
|
||||
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
|
||||
|
@ -58,6 +60,8 @@
|
|||
# define SIG_ERR ((Sigfunc *)-1)
|
||||
#endif
|
||||
|
||||
#include "../lib/maxfd.h"
|
||||
|
||||
/* This variable must be global, since there's no way the caller
|
||||
* can forcibly slay a dead or ungainly running program otherwise.
|
||||
* Multithreading apps and plugins can initialize it (via NP_RUNCMD_INIT)
|
||||
|
@ -86,8 +90,7 @@ extern void die (int, const char *, ...)
|
|||
* through this api and thus achieve async-safeness throughout the api */
|
||||
void np_runcmd_init(void)
|
||||
{
|
||||
if(maxfd == 0)
|
||||
maxfd = open_max();
|
||||
long maxfd = mp_open_max();
|
||||
if(!np_pids) np_pids = calloc(maxfd, sizeof(pid_t));
|
||||
}
|
||||
|
||||
|
@ -114,10 +117,6 @@ np_runcmd_open(const char *cmdstring, int *pfd, int *pfderr)
|
|||
env[0] = strdup("LC_ALL=C");
|
||||
env[1] = '\0';
|
||||
|
||||
/* if no command was passed, return with no error */
|
||||
if (cmdstring == NULL)
|
||||
return -1;
|
||||
|
||||
/* make copy of command string so strtok() doesn't silently modify it */
|
||||
/* (the calling program may want to access it later) */
|
||||
cmdlen = strlen(cmdstring);
|
||||
|
@ -194,6 +193,7 @@ np_runcmd_open(const char *cmdstring, int *pfd, int *pfderr)
|
|||
/* close all descriptors in np_pids[]
|
||||
* This is executed in a separate address space (pure child),
|
||||
* so we don't have to worry about async safety */
|
||||
long maxfd = mp_open_max();
|
||||
for (i = 0; i < maxfd; i++)
|
||||
if(np_pids[i] > 0)
|
||||
close (i);
|
||||
|
@ -203,7 +203,7 @@ np_runcmd_open(const char *cmdstring, int *pfd, int *pfderr)
|
|||
}
|
||||
|
||||
/* parent picks up execution here */
|
||||
/* close childs descriptors in our address space */
|
||||
/* close children descriptors in our address space */
|
||||
close(pfd[1]);
|
||||
close(pfderr[1]);
|
||||
|
||||
|
@ -221,6 +221,7 @@ np_runcmd_close(int fd)
|
|||
pid_t pid;
|
||||
|
||||
/* make sure this fd was opened by popen() */
|
||||
long maxfd = mp_open_max();
|
||||
if(fd < 0 || fd > maxfd || !np_pids || (pid = np_pids[fd]) == 0)
|
||||
return -1;
|
||||
|
||||
|
@ -244,6 +245,7 @@ runcmd_timeout_alarm_handler (int signo)
|
|||
if (signo == SIGALRM)
|
||||
puts(_("CRITICAL - Plugin timed out while executing system call"));
|
||||
|
||||
long maxfd = mp_open_max();
|
||||
if(np_pids) for(i = 0; i < maxfd; i++) {
|
||||
if(np_pids[i] != 0) kill(np_pids[i], SIGKILL);
|
||||
}
|
||||
|
|
|
@ -31,9 +31,8 @@
|
|||
#include "netutils.h"
|
||||
|
||||
#ifdef HAVE_SSL
|
||||
static SSL_CTX *c=NULL;
|
||||
static SSL_CTX *ctx=NULL;
|
||||
static SSL *s=NULL;
|
||||
static int initialized=0;
|
||||
|
||||
int np_net_ssl_init(int sd) {
|
||||
return np_net_ssl_init_with_hostname(sd, NULL);
|
||||
|
@ -48,24 +47,24 @@ int np_net_ssl_init_with_hostname_and_version(int sd, char *host_name, int versi
|
|||
}
|
||||
|
||||
int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int version, char *cert, char *privkey) {
|
||||
const SSL_METHOD *method = NULL;
|
||||
long options = 0;
|
||||
|
||||
if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL) {
|
||||
printf("%s\n", _("CRITICAL - Cannot create SSL context."));
|
||||
return STATE_CRITICAL;
|
||||
}
|
||||
|
||||
switch (version) {
|
||||
case MP_SSLv2: /* SSLv2 protocol */
|
||||
#if defined(USE_GNUTLS) || defined(OPENSSL_NO_SSL2)
|
||||
printf("%s\n", _("UNKNOWN - SSL protocol version 2 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
method = SSLv2_client_method();
|
||||
break;
|
||||
#endif
|
||||
case MP_SSLv3: /* SSLv3 protocol */
|
||||
#if defined(OPENSSL_NO_SSL3)
|
||||
printf("%s\n", _("UNKNOWN - SSL protocol version 3 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
method = SSLv3_client_method();
|
||||
SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION);
|
||||
SSL_CTX_set_max_proto_version(ctx, SSL3_VERSION);
|
||||
break;
|
||||
#endif
|
||||
case MP_TLSv1: /* TLSv1 protocol */
|
||||
|
@ -73,7 +72,8 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
|||
printf("%s\n", _("UNKNOWN - TLS protocol version 1 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
method = TLSv1_client_method();
|
||||
SSL_CTX_set_min_proto_version(ctx, TLS1_VERSION);
|
||||
SSL_CTX_set_max_proto_version(ctx, TLS1_VERSION);
|
||||
break;
|
||||
#endif
|
||||
case MP_TLSv1_1: /* TLSv1.1 protocol */
|
||||
|
@ -81,7 +81,8 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
|||
printf("%s\n", _("UNKNOWN - TLS protocol version 1.1 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
method = TLSv1_1_client_method();
|
||||
SSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION);
|
||||
SSL_CTX_set_max_proto_version(ctx, TLS1_1_VERSION);
|
||||
break;
|
||||
#endif
|
||||
case MP_TLSv1_2: /* TLSv1.2 protocol */
|
||||
|
@ -89,7 +90,8 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
|||
printf("%s\n", _("UNKNOWN - TLS protocol version 1.2 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
method = TLSv1_2_client_method();
|
||||
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
|
||||
SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION);
|
||||
break;
|
||||
#endif
|
||||
case MP_TLSv1_2_OR_NEWER:
|
||||
|
@ -97,47 +99,43 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
|||
printf("%s\n", _("UNKNOWN - Disabling TLSv1.1 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
options |= SSL_OP_NO_TLSv1_1;
|
||||
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
|
||||
break;
|
||||
#endif
|
||||
/* FALLTHROUGH */
|
||||
case MP_TLSv1_1_OR_NEWER:
|
||||
#if !defined(SSL_OP_NO_TLSv1)
|
||||
printf("%s\n", _("UNKNOWN - Disabling TLSv1 is not supported by your SSL library."));
|
||||
return STATE_UNKNOWN;
|
||||
#else
|
||||
options |= SSL_OP_NO_TLSv1;
|
||||
SSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION);
|
||||
break;
|
||||
#endif
|
||||
/* FALLTHROUGH */
|
||||
case MP_TLSv1_OR_NEWER:
|
||||
#if defined(SSL_OP_NO_SSLv3)
|
||||
options |= SSL_OP_NO_SSLv3;
|
||||
SSL_CTX_set_min_proto_version(ctx, TLS1_VERSION);
|
||||
break;
|
||||
#endif
|
||||
/* FALLTHROUGH */
|
||||
case MP_SSLv3_OR_NEWER:
|
||||
#if defined(SSL_OP_NO_SSLv2)
|
||||
options |= SSL_OP_NO_SSLv2;
|
||||
SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION);
|
||||
break;
|
||||
#endif
|
||||
case MP_SSLv2_OR_NEWER:
|
||||
/* FALLTHROUGH */
|
||||
default: /* Default to auto negotiation */
|
||||
method = SSLv23_client_method();
|
||||
}
|
||||
if (!initialized) {
|
||||
/* Initialize SSL context */
|
||||
SSLeay_add_ssl_algorithms();
|
||||
SSL_load_error_strings();
|
||||
OpenSSL_add_all_algorithms();
|
||||
initialized = 1;
|
||||
}
|
||||
if ((c = SSL_CTX_new(method)) == NULL) {
|
||||
printf("%s\n", _("CRITICAL - Cannot create SSL context."));
|
||||
return STATE_CRITICAL;
|
||||
}
|
||||
|
||||
if (cert && privkey) {
|
||||
SSL_CTX_use_certificate_chain_file(c, cert);
|
||||
SSL_CTX_use_PrivateKey_file(c, privkey, SSL_FILETYPE_PEM);
|
||||
#ifdef USE_OPENSSL
|
||||
if (!SSL_CTX_check_private_key(c)) {
|
||||
if (!SSL_CTX_use_certificate_chain_file(ctx, cert)) {
|
||||
#elif USE_GNUTLS
|
||||
if (!SSL_CTX_use_certificate_file(ctx, cert, SSL_FILETYPE_PEM)) {
|
||||
#else
|
||||
#error Unported for unknown SSL library
|
||||
#endif
|
||||
printf ("%s\n", _("CRITICAL - Unable to open certificate chain file!\n"));
|
||||
return STATE_CRITICAL;
|
||||
}
|
||||
SSL_CTX_use_PrivateKey_file(ctx, privkey, SSL_FILETYPE_PEM);
|
||||
#ifdef USE_OPENSSL
|
||||
if (!SSL_CTX_check_private_key(ctx)) {
|
||||
printf ("%s\n", _("CRITICAL - Private key does not seem to match certificate!\n"));
|
||||
return STATE_CRITICAL;
|
||||
}
|
||||
|
@ -146,9 +144,9 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
|||
#ifdef SSL_OP_NO_TICKET
|
||||
options |= SSL_OP_NO_TICKET;
|
||||
#endif
|
||||
SSL_CTX_set_options(c, options);
|
||||
SSL_CTX_set_mode(c, SSL_MODE_AUTO_RETRY);
|
||||
if ((s = SSL_new(c)) != NULL) {
|
||||
SSL_CTX_set_options(ctx, options);
|
||||
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
|
||||
if ((s = SSL_new(ctx)) != NULL) {
|
||||
#ifdef SSL_set_tlsext_host_name
|
||||
if (host_name != NULL)
|
||||
SSL_set_tlsext_host_name(s, host_name);
|
||||
|
@ -175,9 +173,9 @@ void np_net_ssl_cleanup() {
|
|||
#endif
|
||||
SSL_shutdown(s);
|
||||
SSL_free(s);
|
||||
if (c) {
|
||||
SSL_CTX_free(c);
|
||||
c=NULL;
|
||||
if (ctx) {
|
||||
SSL_CTX_free(ctx);
|
||||
ctx=NULL;
|
||||
}
|
||||
s=NULL;
|
||||
}
|
||||
|
@ -191,17 +189,6 @@ int np_net_ssl_read(void *buf, int num) {
|
|||
return SSL_read(s, buf, num);
|
||||
}
|
||||
|
||||
int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
|
||||
# ifdef USE_OPENSSL
|
||||
X509 *certificate = NULL;
|
||||
certificate=SSL_get_peer_certificate(s);
|
||||
return(np_net_ssl_check_certificate(certificate, days_till_exp_warn, days_till_exp_crit));
|
||||
# else /* ifndef USE_OPENSSL */
|
||||
printf("%s\n", _("WARNING - Plugin does not support checking certificates."));
|
||||
return STATE_WARNING;
|
||||
# endif /* USE_OPENSSL */
|
||||
}
|
||||
|
||||
int np_net_ssl_check_certificate(X509 *certificate, int days_till_exp_warn, int days_till_exp_crit){
|
||||
# ifdef USE_OPENSSL
|
||||
X509_NAME *subj=NULL;
|
||||
|
@ -328,4 +315,16 @@ int np_net_ssl_check_certificate(X509 *certificate, int days_till_exp_warn, int
|
|||
# endif /* USE_OPENSSL */
|
||||
}
|
||||
|
||||
int np_net_ssl_check_cert(int days_till_exp_warn, int days_till_exp_crit){
|
||||
# ifdef USE_OPENSSL
|
||||
X509 *certificate = NULL;
|
||||
certificate=SSL_get_peer_certificate(s);
|
||||
return(np_net_ssl_check_certificate(certificate, days_till_exp_warn, days_till_exp_crit));
|
||||
# else /* ifndef USE_OPENSSL */
|
||||
printf("%s\n", _("WARNING - Plugin does not support checking certificates."));
|
||||
return STATE_WARNING;
|
||||
# endif /* USE_OPENSSL */
|
||||
}
|
||||
|
||||
|
||||
#endif /* HAVE_SSL */
|
||||
|
|
|
@ -19,19 +19,19 @@ plan skip_all => "SSH_HOST and SSH_IDENTITY must be defined" unless ($ssh_servic
|
|||
plan tests => 42;
|
||||
|
||||
# Some random check strings/response
|
||||
my @responce = ('OK: Everything is fine',
|
||||
my @response = ('OK: Everything is fine',
|
||||
'WARNING: Hey, pick me, pick me',
|
||||
'CRITICAL: Shit happens',
|
||||
'UNKNOWN: What can I do for ya',
|
||||
'WOOPS: What did I smoke',
|
||||
);
|
||||
my @responce_re;
|
||||
my @response_re;
|
||||
my @check;
|
||||
for (@responce) {
|
||||
for (@response) {
|
||||
push(@check, "echo $_");
|
||||
my $re_str = $_;
|
||||
$re_str =~ s{(.)} { "\Q$1" }ge;
|
||||
push(@responce_re, $re_str);
|
||||
push(@response_re, $re_str);
|
||||
}
|
||||
|
||||
my $result;
|
||||
|
@ -47,7 +47,7 @@ for (my $i=0; $i<4; $i++) {
|
|||
"./check_by_ssh -i $ssh_key -H $ssh_service -C '$check[$i]; exit $i'"
|
||||
);
|
||||
cmp_ok($result->return_code, '==', $i, "Exit with return code $i");
|
||||
is($result->output, $responce[$i], "Status text is correct for check $i");
|
||||
is($result->output, $response[$i], "Status text is correct for check $i");
|
||||
}
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
|
@ -84,7 +84,7 @@ $result = NPTest->testCmd(
|
|||
"./check_by_ssh -i $ssh_key -H $ssh_service -C '$check[4]; exit 8'"
|
||||
);
|
||||
cmp_ok($result->return_code, '==', 8, "Exit with return code 8 (out of bounds)");
|
||||
is($result->output, $responce[4], "Return proper status text even with unknown status codes");
|
||||
is($result->output, $response[4], "Return proper status text even with unknown status codes");
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_by_ssh -i $ssh_key -H $ssh_service -F $ssh_conf -C 'exit 0'"
|
||||
|
@ -108,7 +108,7 @@ my %linemap = (
|
|||
foreach my $line (0, 2, 4, 6) {
|
||||
my $code = $linemap{$line};
|
||||
my $statline = $line+1;
|
||||
is($lines[$line], "$responce[$code]", "multiple checks status text is correct for line $line");
|
||||
is($lines[$line], "$response[$code]", "multiple checks status text is correct for line $line");
|
||||
is($lines[$statline], "STATUS CODE: $code", "multiple check status code is correct for line $line");
|
||||
}
|
||||
|
||||
|
@ -124,7 +124,7 @@ close(PASV) or die("Unable to close '/tmp/check_by_ssh.$$': $!");
|
|||
cmp_ok(scalar(@pasv), '==', 1, 'One passive result for one check performed');
|
||||
for (0) {
|
||||
if ($pasv[$_]) {
|
||||
like($pasv[$_], '/^\[\d+\] PROCESS_SERVICE_CHECK_RESULT;flint;serv;2;' . $responce_re[2] . '$/', 'proper result for passive check');
|
||||
like($pasv[$_], '/^\[\d+\] PROCESS_SERVICE_CHECK_RESULT;flint;serv;2;' . $response_re[2] . '$/', 'proper result for passive check');
|
||||
} else {
|
||||
fail('proper result for passive check');
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ for (0, 1, 2, 3, 4) {
|
|||
if ($pasv[$_]) {
|
||||
my $ret = $_;
|
||||
$ret = 9 if ($_ == 4);
|
||||
like($pasv[$_], '/^\[\d+\] PROCESS_SERVICE_CHECK_RESULT;flint;c' . $_ . ';' . $ret . ';' . $responce_re[$_] . '$/', "proper result for passive check $_");
|
||||
like($pasv[$_], '/^\[\d+\] PROCESS_SERVICE_CHECK_RESULT;flint;c' . $_ . ';' . $ret . ';' . $response_re[$_] . '$/', "proper result for passive check $_");
|
||||
} else {
|
||||
fail("proper result for passive check $_");
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth
|
|||
if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") {
|
||||
plan skip_all => "Need 2 mountpoints to test";
|
||||
} else {
|
||||
plan tests => 78;
|
||||
plan tests => 88;
|
||||
}
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
|
@ -326,19 +326,19 @@ cmp_ok( $result->return_code, '==', 0, "grouping: exit ok if the sum of free meg
|
|||
$result = NPTest->testCmd( "./check_disk -w ". ($free_mb_on_all - 1) ." -c ". ($free_mb_on_all - 1) ." -p $mountpoint_valid -g group -p $mountpoint2_valid" );
|
||||
cmp_ok( $result->return_code, '==', 3, "Invalid options: -p must come after groupname");
|
||||
|
||||
# regex: exit unknown if given regex is not compileable
|
||||
# regex: exit unknown if given regex is not compilable
|
||||
$result = NPTest->testCmd( "./check_disk -w 1 -c 1 -r '('" );
|
||||
cmp_ok( $result->return_code, '==', 3, "Exit UNKNOWN if regex is not compileable");
|
||||
cmp_ok( $result->return_code, '==', 3, "Exit UNKNOWN if regex is not compilable");
|
||||
|
||||
# ignore: exit unknown, if all pathes are deselected using -i
|
||||
# ignore: exit unknown, if all paths are deselected using -i
|
||||
$result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mountpoint2_valid -i '$mountpoint_valid' -i '$mountpoint2_valid'" );
|
||||
cmp_ok( $result->return_code, '==', 3, "ignore-ereg: Unknown if all fs are ignored (case sensitive)");
|
||||
|
||||
# ignore: exit unknown, if all pathes are deselected using -I
|
||||
# ignore: exit unknown, if all paths are deselected using -I
|
||||
$result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mountpoint2_valid -I '".uc($mountpoint_valid)."' -I '".uc($mountpoint2_valid)."'" );
|
||||
cmp_ok( $result->return_code, '==', 3, "ignore-ereg: Unknown if all fs are ignored (case insensitive)");
|
||||
|
||||
# ignore: exit unknown, if all pathes are deselected using -i
|
||||
# ignore: exit unknown, if all paths are deselected using -i
|
||||
$result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mountpoint2_valid -i '.*'" );
|
||||
cmp_ok( $result->return_code, '==', 3, "ignore-ereg: Unknown if all fs are ignored using -i '.*'");
|
||||
|
||||
|
@ -347,7 +347,32 @@ $result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mo
|
|||
like( $result->output, qr/$mountpoint_valid/, "output data does have $mountpoint_valid in it");
|
||||
unlike( $result->output, qr/$mountpoint2_valid/, "output data does not have $mountpoint2_valid in it");
|
||||
|
||||
# ignore: test if all pathes are listed when ignore regex doesn't match
|
||||
# ignore: test if all paths are listed when ignore regex doesn't match
|
||||
$result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mountpoint2_valid -i '^barbazJodsf\$'");
|
||||
like( $result->output, qr/$mountpoint_valid/, "ignore: output data does have $mountpoint_valid when regex doesn't match");
|
||||
like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mountpoint2_valid when regex doesn't match");
|
||||
|
||||
# ignore-missing: exit okay, when fs is not accessible
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob");
|
||||
like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /bob;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when regex does not match
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
like( $result->output, '/^DISK OK - No disks were found for provided parameters;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when fs with exact match (-E) is not found
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs");
|
||||
like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /etc;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex)
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
like( $result->output, '/^DISK OK - free space: \/ .*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path)
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
like( $result->output, '/^DISK OK - free space: / .*; - ignored paths: /bob;.*$/', 'Output OK');
|
|
@ -178,13 +178,13 @@ SKIP: {
|
|||
|
||||
$res = NPTest->testCmd( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -u http://$host_tcp_http -e 200,301,302");
|
||||
is( $res->return_code, 0, "Proxy HTTP works");
|
||||
like($res->output, qr/OK: Status line output matched/, "Proxy HTTP Output is sufficent");
|
||||
like($res->output, qr/OK: Status line output matched/, "Proxy HTTP Output is sufficient");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT");
|
||||
is( $res->return_code, 0, "Proxy HTTP CONNECT works");
|
||||
like($res->output, qr/HTTP OK:/, "Proxy HTTP CONNECT output sufficent");
|
||||
like($res->output, qr/HTTP OK:/, "Proxy HTTP CONNECT output sufficient");
|
||||
|
||||
$res = NPTest->testCmd( "./$plugin -I $host_tcp_proxy -p $port_tcp_proxy -H $host_tls_http -S -j CONNECT:HEAD");
|
||||
is( $res->return_code, 0, "Proxy HTTP CONNECT works with override method");
|
||||
like($res->output, qr/HTTP OK:/, "Proxy HTTP CONNECT output sufficent");
|
||||
like($res->output, qr/HTTP OK:/, "Proxy HTTP CONNECT output sufficient");
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ $t = NPTest->testCmd( "./check_imap $host_tcp_imap -p 143 -wt 9 -ct 9 -to 10 -e
|
|||
cmp_ok( $t->return_code, '==', 0, "Check old parameter options" );
|
||||
|
||||
$t = NPTest->testCmd( "./check_imap $host_nonresponsive" );
|
||||
cmp_ok( $t->return_code, '==', 2, "Get error with non reponsive host" );
|
||||
cmp_ok( $t->return_code, '==', 2, "Get error with non responsive host" );
|
||||
|
||||
$t = NPTest->testCmd( "./check_imap $hostname_invalid" );
|
||||
cmp_ok( $t->return_code, '==', 2, "Invalid hostname" );
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#
|
||||
#
|
||||
# These are the database permissions required for this test:
|
||||
# GRANT SELECT ON $db.* TO $user@$host INDENTIFIED BY '$password';
|
||||
# GRANT SELECT ON $db.* TO $user@$host IDENTIFIED BY '$password';
|
||||
# GRANT SUPER, REPLICATION CLIENT ON *.* TO $user@$host;
|
||||
# Check with:
|
||||
# mysql -u$user -p$password -h$host $db
|
||||
|
@ -23,9 +23,9 @@ plan tests => 15;
|
|||
my $bad_login_output = '/Access denied for user /';
|
||||
my $mysqlserver = getTestParameter("NP_MYSQL_SERVER", "A MySQL Server hostname or IP with no slaves setup");
|
||||
my $mysqlsocket = getTestParameter("NP_MYSQL_SOCKET", "Full path to a MySQL Server socket with no slaves setup");
|
||||
my $mysql_login_details = getTestParameter("NP_MYSQL_LOGIN_DETAILS", "Command line parameters to specify login access (requires REPLICATION CLIENT privleges)", "-u test -ptest");
|
||||
my $mysql_login_details = getTestParameter("NP_MYSQL_LOGIN_DETAILS", "Command line parameters to specify login access (requires REPLICATION CLIENT privileges)", "-u test -ptest");
|
||||
my $with_slave = getTestParameter("NP_MYSQL_WITH_SLAVE", "MySQL server with slaves setup");
|
||||
my $with_slave_login = getTestParameter("NP_MYSQL_WITH_SLAVE_LOGIN", "Login details for server with slave (requires REPLICATION CLIENT privleges)", $mysql_login_details || "-u test -ptest");
|
||||
my $with_slave_login = getTestParameter("NP_MYSQL_WITH_SLAVE_LOGIN", "Login details for server with slave (requires REPLICATION CLIENT privileges)", $mysql_login_details || "-u test -ptest");
|
||||
|
||||
my $result;
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ $result = NPTest->testCmd("./check_mysql_query -q 'SELECT 1+1' -H $mysqlserver $
|
|||
cmp_ok( $result->return_code, '==', 0, "Can run query");
|
||||
|
||||
$result = NPTest->testCmd("./check_mysql_query -H $mysqlserver $mysql_login_details");
|
||||
cmp_ok( $result->return_code, '==', 3, "Missing query parmeter");
|
||||
cmp_ok( $result->return_code, '==', 3, "Missing query parameter");
|
||||
like( $result->output, "/Must specify a SQL query to run/", "Missing query error message");
|
||||
|
||||
$result = NPTest->testCmd("./check_mysql_query -q 'SELECT 1+1' -H $mysqlserver -u dummy -d mysql");
|
||||
|
|
|
@ -36,7 +36,7 @@ cmp_ok( $result->return_code, '==', 1, "Log over 5 minutes old" );
|
|||
like ( $result->output, $warningOutput, "Output for warning correct" );
|
||||
|
||||
my $now = time;
|
||||
# This substitution is dependant on the testcase
|
||||
# This substitution is dependent on the testcase
|
||||
system( "perl -pe 's/1133537544/$now/' $nagios1 > $nagios1.tmp" ) == 0 or die "Problem with munging $nagios1";
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
|
|
|
@ -8,12 +8,14 @@ use strict;
|
|||
use Test::More;
|
||||
use NPTest;
|
||||
|
||||
my $host_tcp_smtp = getTestParameter( "NP_HOST_TCP_SMTP",
|
||||
my $host_tcp_smtp = getTestParameter( "NP_HOST_TCP_SMTP",
|
||||
"A host providing an SMTP Service (a mail server)", "mailhost");
|
||||
my $host_tcp_smtp_tls = getTestParameter( "NP_HOST_TCP_SMTP_TLS",
|
||||
my $host_tcp_smtp_starttls = getTestParameter( "NP_HOST_TCP_SMTP_STARTTLS",
|
||||
"A host providing SMTP with STARTTLS", $host_tcp_smtp);
|
||||
my $host_tcp_smtp_nostarttls = getTestParameter( "NP_HOST_TCP_SMTP_NOSTARTTLS",
|
||||
"A host providing SMTP without STARTTLS", "");
|
||||
my $host_tcp_smtp_tls = getTestParameter( "NP_HOST_TCP_SMTP_TLS",
|
||||
"A host providing SMTP with TLS", $host_tcp_smtp);
|
||||
my $host_tcp_smtp_notls = getTestParameter( "NP_HOST_TCP_SMTP_NOTLS",
|
||||
"A host providing SMTP without TLS", "");
|
||||
|
||||
my $host_nonresponsive = getTestParameter( "NP_HOST_NONRESPONSIVE",
|
||||
"The hostname of system not responsive to network requests", "10.0.0.1" );
|
||||
|
@ -22,7 +24,7 @@ my $hostname_invalid = getTestParameter( "NP_HOSTNAME_INVALID",
|
|||
"An invalid (not known to DNS) hostname", "nosuchhost" );
|
||||
my $res;
|
||||
|
||||
plan tests => 10;
|
||||
plan tests => 16;
|
||||
|
||||
SKIP: {
|
||||
skip "No SMTP server defined", 4 unless $host_tcp_smtp;
|
||||
|
@ -42,22 +44,38 @@ SKIP: {
|
|||
local $TODO = "Output is over two lines";
|
||||
like ( $res->output, qr/^SMTP WARNING/, "Correct error message" );
|
||||
}
|
||||
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp --ssl -p 25" );
|
||||
is ($res->return_code, 2, "Check rc of connecting to $host_tcp_smtp with TLS on standard SMTP port" );
|
||||
like ($res->output, qr/^CRITICAL - Cannot make SSL connection\./, "Check output of connecting to $host_tcp_smtp with TLS on standard SMTP port");
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "No SMTP server with TLS defined", 1 unless $host_tcp_smtp_tls;
|
||||
# SSL connection for TLS
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp_tls -p 25 -S" );
|
||||
skip "No SMTP server with STARTTLS defined", 1 unless $host_tcp_smtp_starttls;
|
||||
# SSL connection for STARTTLS
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp_starttls -p 25 -S" );
|
||||
is ($res->return_code, 0, "OK, with STARTTLS" );
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "No SMTP server without TLS defined", 2 unless $host_tcp_smtp_notls;
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp_notls -p 25 -S" );
|
||||
is ($res->return_code, 1, "OK, got warning from server without TLS");
|
||||
skip "No SMTP server without STARTTLS defined", 2 unless $host_tcp_smtp_nostarttls;
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp_nostarttls -p 25 -S" );
|
||||
is ($res->return_code, 1, "OK, got warning from server without STARTTLS");
|
||||
is ($res->output, "WARNING - TLS not supported by server", "Right error message" );
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "No SMTP server with TLS defined", 1 unless $host_tcp_smtp_tls;
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp_tls --ssl" );
|
||||
is ($res->return_code, 0, "Check rc of connecting to $host_tcp_smtp_tls with TLS" );
|
||||
like ($res->output, qr/^SMTP OK - /, "Check output of connecting to $host_tcp_smtp_tls with TLS" );
|
||||
|
||||
my $unused_port = 4465;
|
||||
$res = NPTest->testCmd( "./check_smtp -H $host_tcp_smtp_tls -p $unused_port --ssl" );
|
||||
is ($res->return_code, 2, "Check rc of connecting to $host_tcp_smtp_tls with TLS on unused port $unused_port" );
|
||||
like ($res->output, qr/^connect to address $host_tcp_smtp_tls and port $unused_port: Connection refused/, "Check output of connecting to $host_tcp_smtp_tls with TLS on unused port $unused_port");
|
||||
}
|
||||
|
||||
$res = NPTest->testCmd( "./check_smtp $host_nonresponsive" );
|
||||
is ($res->return_code, 2, "CRITICAL - host non responding" );
|
||||
|
||||
|
|
|
@ -26,22 +26,22 @@ $res = NPTest->testCmd( "./check_snmp -t 1" );
|
|||
is( $res->return_code, 3, "No host name" );
|
||||
is( $res->output, "No host specified" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H fakehostname" );
|
||||
$res = NPTest->testCmd( "./check_snmp -H fakehostname --ignore-mib-parsing-errors" );
|
||||
is( $res->return_code, 3, "No OIDs specified" );
|
||||
is( $res->output, "No OIDs specified" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3 -U not_a_user --seclevel=rubbish" );
|
||||
$res = NPTest->testCmd( "./check_snmp -H fakehost --ignore-mib-parsing-errors -o oids -P 3 -U not_a_user --seclevel=rubbish" );
|
||||
is( $res->return_code, 3, "Invalid seclevel" );
|
||||
like( $res->output, "/check_snmp: Invalid seclevel - rubbish/" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3c" );
|
||||
$res = NPTest->testCmd( "./check_snmp -H fakehost --ignore-mib-parsing-errors -o oids -P 3c" );
|
||||
is( $res->return_code, 3, "Invalid protocol" );
|
||||
like( $res->output, "/check_snmp: Invalid SNMP version - 3c/" );
|
||||
|
||||
SKIP: {
|
||||
skip "no snmp host defined", 50 if ( ! $host_snmp );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" );
|
||||
like($res->output, '/^SNMP OK - (\d+)/', "String contains SNMP OK");
|
||||
$res->output =~ /^SNMP OK - (\d+)/;
|
||||
|
@ -51,111 +51,111 @@ SKIP: {
|
|||
|
||||
|
||||
# some more threshold tests
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c 1");
|
||||
cmp_ok( $res->return_code, '==', 2, "Threshold test -c 1" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c 1:");
|
||||
cmp_ok( $res->return_code, '==', 0, "Threshold test -c 1:" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c ~:1");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c ~:1");
|
||||
cmp_ok( $res->return_code, '==', 2, "Threshold test -c ~:1" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1:10");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c 1:10");
|
||||
cmp_ok( $res->return_code, '==', 2, "Threshold test -c 1:10" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c \@1:10");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c \@1:10");
|
||||
cmp_ok( $res->return_code, '==', 0, "Threshold test -c \@1:10" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 10:1");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c 10:1");
|
||||
cmp_ok( $res->return_code, '==', 0, "Threshold test -c 10:1" );
|
||||
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:");
|
||||
cmp_ok( $res->return_code, '==', 0, "Test with numeric OID (no mibs loaded)" );
|
||||
like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysDescr.0");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" );
|
||||
unlike($res->perf_output, '/sysDescr/', "Perfdata doesn't contain string values");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0,system.sysDescr.0");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysDescr.0,system.sysDescr.0");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, comma-separated" );
|
||||
like($res->output, '/^SNMP OK - /', "String contains SNMP OK");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, repeated option" );
|
||||
like($res->output, '/^SNMP OK - /', "String contains SNMP OK");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrSWRunIndex.1" );
|
||||
like($res->output, '/^SNMP OK - 1\s.*$/', "String fits SNMP OK and output format");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0 -c 1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0 -c 1:");
|
||||
cmp_ok( $res->return_code, '==', 1, "Exit WARNING when querying hrSWRunIndex.1 and warn-th doesn't apply " );
|
||||
like($res->output, '/^SNMP WARNING - \*1\*\s.*$/', "String matches SNMP WARNING and output format");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0");
|
||||
cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" );
|
||||
like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2");
|
||||
cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" );
|
||||
like($res->output, "/^SNMP OK - 2 1/", "Got two values back" );
|
||||
like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
|
||||
like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2");
|
||||
cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" );
|
||||
like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" );
|
||||
like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" );
|
||||
like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" );
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrMemorySize and hrSystemProcesses");
|
||||
like($res->output, '/^SNMP OK - \d+ \d+/', "String contains hrMemorySize and hrSystemProcesses");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0");
|
||||
cmp_ok( $res->return_code, '==', 0, "Exit OK with inside-range thresholds");
|
||||
like($res->output, '/^SNMP OK - 1\s.*$/', "String matches SNMP OK and output format");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3");
|
||||
$res->output =~ m/^SNMP OK - (\d+\.\d{2})\s.*$/;
|
||||
my $lower = $1 - 0.05;
|
||||
my $higher = $1 + 0.05;
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher");
|
||||
cmp_ok( $res->return_code, '==', 1, "Exit WARNING with fractionnal arguments");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2");
|
||||
cmp_ok( $res->return_code, '==', 1, "Exit WARNING on 2nd threshold");
|
||||
like($res->output, '/^SNMP WARNING - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s+\*1\*\s.*$/', "First OID returned as string, 2nd checked for thresholds");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''");
|
||||
cmp_ok( $res->return_code, '==', 0, "Empty thresholds doesn't crash");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2");
|
||||
cmp_ok( $res->return_code, '==', 0, "Skipping first two thresholds on 2 OID check");
|
||||
like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping first two thresholds, result printed rather than parsed");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,");
|
||||
cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds");
|
||||
like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1000000000000: -u '1/100 sec'");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0 -c 1000000000000: -u '1/100 sec'");
|
||||
cmp_ok( $res->return_code, '==', 2, "Timetick used as a threshold");
|
||||
like($res->output, '/^SNMP CRITICAL - \*\d+\* 1\/100 sec.*$/', "Timetick used as a threshold, parsed as numeric");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o system.sysUpTime.0");
|
||||
cmp_ok( $res->return_code, '==', 0, "Timetick used as a string");
|
||||
like($res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "Timetick used as a string, result printed rather than parsed");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o HOST-RESOURCES-MIB::hrSWRunName.1");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -C $snmp_community -o HOST-RESOURCES-MIB::hrSWRunName.1");
|
||||
cmp_ok( $res->return_code, '==', 0, "snmp response without datatype");
|
||||
like( $res->output, '/^SNMP OK - "(systemd|init)" \| $/', "snmp response without datatype" );
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "no SNMP user defined", 1 if ( ! $user_snmp );
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp -o HOST-RESOURCES-MIB::hrSystemUptime.0 -P 3 -U $user_snmp -L noAuthNoPriv");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_snmp --ignore-mib-parsing-errors -o HOST-RESOURCES-MIB::hrSystemUptime.0 -P 3 -U $user_snmp -L noAuthNoPriv");
|
||||
like( $res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "noAuthNoPriv security level works properly" );
|
||||
}
|
||||
|
||||
|
@ -163,14 +163,14 @@ SKIP: {
|
|||
# the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway
|
||||
SKIP: {
|
||||
skip "no non responsive host defined", 2 if ( ! $host_nonresponsive );
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive --ignore-mib-parsing-errors -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
|
||||
cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL with non responsive host" );
|
||||
like($res->output, '/Plugin timed out while executing system call/', "String matches timeout problem");
|
||||
}
|
||||
|
||||
SKIP: {
|
||||
skip "no non invalid host defined", 2 if ( ! $hostname_invalid );
|
||||
$res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
|
||||
$res = NPTest->testCmd( "./check_snmp -H $hostname_invalid --ignore-mib-parsing-errors -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:");
|
||||
cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" );
|
||||
like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host)/', "String matches invalid host");
|
||||
like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host).*/s', "String matches invalid host");
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# Logged in Users Tests via check_users
|
||||
#
|
||||
# Trick: This ckeck requires at least 1 user logged in. These commands should
|
||||
# Trick: This check requires at least 1 user logged in. These commands should
|
||||
# leave a session open forever in the background:
|
||||
#
|
||||
# $ ssh -tt localhost </dev/null >/dev/null 2>/dev/null &
|
||||
|
|
|
@ -84,7 +84,7 @@ foreach my $current_state (keys(%state)) {
|
|||
foreach my $new_state (keys(%state)) {
|
||||
$res = NPTest->testCmd( "./negate -s --$current_state=$new_state ./check_dummy ".$state{$current_state}." 'Fake $new_state'" );
|
||||
is( $res->return_code, $state{$new_state}, "Got fake $new_state (with substitute)" );
|
||||
is( $res->output, uc($new_state).": Fake $new_state", "Substitued fake $new_state output");
|
||||
is( $res->output, uc($new_state).": Fake $new_state", "Substituted fake $new_state output");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
# Country Name (2 letter code) [AU]:DE
|
||||
# State or Province Name (full name) [Some-State]:Bavaria
|
||||
# Locality Name (eg, city) []:Munich
|
||||
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:Monitoring Plugins
|
||||
# Organization Name (eg, company) [Internet Widgets Pty Ltd]:Monitoring Plugins
|
||||
# Organizational Unit Name (eg, section) []:
|
||||
# Common Name (e.g. server FQDN or YOUR name) []:Monitoring Plugins
|
||||
# Email Address []:devel@monitoring-plugins.org
|
||||
|
|
|
@ -9,12 +9,14 @@ use strict;
|
|||
use Test::More;
|
||||
use NPTest;
|
||||
use FindBin qw($Bin);
|
||||
use IO::Socket::INET;
|
||||
|
||||
$ENV{'LC_TIME'} = "C";
|
||||
|
||||
my $common_tests = 71;
|
||||
my $virtual_port_tests = 8;
|
||||
my $ssl_only_tests = 12;
|
||||
my $chunked_encoding_special_tests = 1;
|
||||
# Check that all dependent modules are available
|
||||
eval "use HTTP::Daemon 6.01;";
|
||||
plan skip_all => 'HTTP::Daemon >= 6.01 required' if $@;
|
||||
|
@ -30,7 +32,7 @@ if ($@) {
|
|||
plan skip_all => "Missing required module for test: $@";
|
||||
} else {
|
||||
if (-x "./$plugin") {
|
||||
plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests;
|
||||
plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests + $chunked_encoding_special_tests;
|
||||
} else {
|
||||
plan skip_all => "No $plugin compiled";
|
||||
}
|
||||
|
@ -51,6 +53,7 @@ my $port_http = 50000 + int(rand(1000));
|
|||
my $port_https = $port_http + 1;
|
||||
my $port_https_expired = $port_http + 2;
|
||||
my $port_https_clientcert = $port_http + 3;
|
||||
my $port_hacked_http = $port_http + 4;
|
||||
|
||||
# This array keeps sockets around for implementing timeouts
|
||||
my @persist;
|
||||
|
@ -72,6 +75,28 @@ if (!$pid) {
|
|||
}
|
||||
push @pids, $pid;
|
||||
|
||||
# Fork the hacked HTTP server
|
||||
undef $pid;
|
||||
$pid = fork;
|
||||
defined $pid or die "Failed to fork";
|
||||
if (!$pid) {
|
||||
# this is the fork
|
||||
undef @pids;
|
||||
my $socket = new IO::Socket::INET (
|
||||
LocalHost => '0.0.0.0',
|
||||
LocalPort => $port_hacked_http,
|
||||
Proto => 'tcp',
|
||||
Listen => 5,
|
||||
Reuse => 1
|
||||
);
|
||||
die "cannot create socket $!n" unless $socket;
|
||||
my $local_sock = $socket->sockport();
|
||||
print "server waiting for client connection on port $local_sock\n";
|
||||
run_hacked_http_server ( $socket );
|
||||
die "hacked http server stopped";
|
||||
}
|
||||
push @pids, $pid;
|
||||
|
||||
if (exists $servers->{https}) {
|
||||
# Fork a normal HTTPS server
|
||||
$pid = fork;
|
||||
|
@ -207,6 +232,37 @@ sub run_server {
|
|||
}
|
||||
}
|
||||
|
||||
sub run_hacked_http_server {
|
||||
my $socket = shift;
|
||||
|
||||
# auto-flush on socket
|
||||
$| = 1;
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
# waiting for a new client connection
|
||||
my $client_socket = $socket->accept();
|
||||
|
||||
# get information about a newly connected client
|
||||
my $client_address = $client_socket->peerhost();
|
||||
my $client_portn = $client_socket->peerport();
|
||||
print "connection from $client_address:$client_portn";
|
||||
|
||||
# read up to 1024 characters from the connected client
|
||||
my $data = "";
|
||||
$client_socket->recv($data, 1024);
|
||||
print "received data: $data";
|
||||
|
||||
# write response data to the connected client
|
||||
$data = "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n";
|
||||
$client_socket->send($data);
|
||||
|
||||
# notify client that response has been sent
|
||||
shutdown($client_socket, 1);
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
foreach my $pid (@pids) {
|
||||
if ($pid) { print "Killing $pid\n"; kill "INT", $pid }
|
||||
|
@ -222,6 +278,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
|
|||
my $result;
|
||||
my $command = "./$plugin -H 127.0.0.1";
|
||||
|
||||
run_chunked_encoding_special_test( {command => "$command -p $port_hacked_http"});
|
||||
run_common_tests( { command => "$command -p $port_http" } );
|
||||
SKIP: {
|
||||
skip "HTTP::Daemon::SSL not installed", $common_tests + $ssl_only_tests if ! exists $servers->{https};
|
||||
|
@ -511,3 +568,14 @@ sub run_common_tests {
|
|||
};
|
||||
is( $@, "", $cmd );
|
||||
}
|
||||
|
||||
sub run_chunked_encoding_special_test {
|
||||
my ($opts) = @_;
|
||||
my $command = $opts->{command};
|
||||
|
||||
$cmd = "$command -u / -s 'ChunkedEncodingSpecialTest'";
|
||||
eval {
|
||||
$result = NPTest->testCmd( $cmd, 5 );
|
||||
};
|
||||
is( $@, "", $cmd );
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ use Test::More;
|
|||
use NPTest;
|
||||
|
||||
if (-x "./check_procs") {
|
||||
plan tests => 52;
|
||||
plan tests => 54;
|
||||
} else {
|
||||
plan skip_all => "No check_procs compiled";
|
||||
}
|
||||
|
@ -34,9 +34,13 @@ is( $result->return_code, 0, "Checking no threshold breeched" );
|
|||
is( $result->output, "PROCS OK: 95 processes | procs=95;100;200;0;", "Output correct" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -C launchd -c 5" );
|
||||
is( $result->return_code, 2, "Checking processes filtered by command name" );
|
||||
is( $result->return_code, 2, "Checking processes matched by command name" );
|
||||
is( $result->output, "PROCS CRITICAL: 6 processes with command name 'launchd' | procs=6;;5;0;", "Output correct" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -X bash -c 5" );
|
||||
is( $result->return_code, 2, "Checking processes excluded by command name" );
|
||||
is( $result->output, "PROCS CRITICAL: 95 processes with exclude progs 'bash' | procs=95;;5;0;", "Output correct" );
|
||||
|
||||
SKIP: {
|
||||
skip 'user with uid 501 required', 4 unless getpwuid(501);
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ if ($pid) {
|
|||
#print "child\n";
|
||||
|
||||
print "Please contact SNMP at: $port_snmp\n";
|
||||
close(STDERR); # Coment out to debug snmpd problems (most errors sent there are OK)
|
||||
close(STDERR); # Comment out to debug snmpd problems (most errors sent there are OK)
|
||||
exec("snmpd -c tests/conf/snmpd.conf -C -f -r udp:$port_snmp");
|
||||
}
|
||||
|
||||
|
@ -227,7 +227,7 @@ is($res->output, 'SNMP OK - "555\"I said\"" | ', "Check string with a double quo
|
|||
|
||||
$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.15 -r 'CUSTOM CHECK OK'" );
|
||||
is($res->return_code, 0, "String check should check whole string, not a parsed number" );
|
||||
is($res->output, 'SNMP OK - "CUSTOM CHECK OK: foo is 12345" | ', "String check witn numbers returns whole string");
|
||||
is($res->output, 'SNMP OK - "CUSTOM CHECK OK: foo is 12345" | ', "String check with numbers returns whole string");
|
||||
|
||||
$res = NPTest->testCmd( "./check_snmp -H 127.0.0.1 -C public -p $port_snmp -o .1.3.6.1.4.1.8072.3.2.67.16 -w -2: -c -3:" );
|
||||
is($res->return_code, 0, "Negative integer check OK" );
|
||||
|
|
|
@ -804,19 +804,3 @@ char *sperfdata_int (const char *label,
|
|||
|
||||
return data;
|
||||
}
|
||||
|
||||
int
|
||||
open_max (void)
|
||||
{
|
||||
errno = 0;
|
||||
if (maxfd > 0)
|
||||
return(maxfd);
|
||||
|
||||
if ((maxfd = sysconf (_SC_OPEN_MAX)) < 0) {
|
||||
if (errno == 0)
|
||||
maxfd = DEFAULT_MAXFD; /* it's indeterminate */
|
||||
else
|
||||
die (STATE_UNKNOWN, _("sysconf error for _SC_OPEN_MAX\n"));
|
||||
}
|
||||
return(maxfd);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
/* The purpose of this package is to provide safer alternatives to C
|
||||
functions that might otherwise be vulnerable to hacking. This
|
||||
currently includes a standard suite of validation routines to be sure
|
||||
that an string argument acually converts to its intended type and a
|
||||
that an string argument actually converts to its intended type and a
|
||||
suite of string handling routine that do their own memory management
|
||||
in order to resist overflow attacks. In addition, a few functions are
|
||||
provided to standardize version and error reporting across the entire
|
||||
|
@ -106,8 +106,6 @@ char *sperfdata (const char *, double, const char *, char *, char *,
|
|||
char *sperfdata_int (const char *, int, const char *, char *, char *,
|
||||
int, int, int, int);
|
||||
|
||||
int open_max (void);
|
||||
|
||||
/* The idea here is that, although not every plugin will use all of these,
|
||||
most will or should. Therefore, for consistency, these very common
|
||||
options should have only these meanings throughout the overall suite */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue