From 25e0c67b0972b9bef426ebf6ca11ee191df74cff Mon Sep 17 00:00:00 2001
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
Date: Thu, 31 Oct 2024 03:24:02 +0100
Subject: check_disk: clang-format
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index b3dd301..fc4039f 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -1,43 +1,42 @@
/*****************************************************************************
-*
-* Monitoring check_disk plugin
-*
-* License: GPL
-* Copyright (c) 1999-2008 Monitoring Plugins Development Team
-*
-* Description:
-*
-* This file contains the check_disk plugin
-*
-*
-* 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 .
-*
-*
-*****************************************************************************/
+ *
+ * Monitoring check_disk plugin
+ *
+ * License: GPL
+ * Copyright (c) 1999-2008 Monitoring Plugins Development Team
+ *
+ * Description:
+ *
+ * This file contains the check_disk plugin
+ *
+ *
+ * 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 .
+ *
+ *
+ *****************************************************************************/
const char *progname = "check_disk";
-const char *program_name = "check_disk"; /* Required for coreutils libs */
+const char *program_name = "check_disk"; /* Required for coreutils libs */
const char *copyright = "1999-2008";
const char *email = "devel@monitoring-plugins.org";
-
#include "common.h"
#ifdef HAVE_SYS_STAT_H
-# include
+# include
#endif
#if HAVE_INTTYPES_H
-# include
+# include
#endif
#include
#include "popen.h"
@@ -48,14 +47,14 @@ const char *email = "devel@monitoring-plugins.org";
#include "mountlist.h"
#include
#if HAVE_LIMITS_H
-# include
+# include
#endif
#include "regex.h"
#ifdef __CYGWIN__
-# include
-# undef ERROR
-# define ERROR -1
+# include
+# undef ERROR
+# define ERROR -1
#endif
/* If nonzero, show even filesystems with zero size or
@@ -108,25 +107,24 @@ static struct mount_entry *mount_list;
/* For long options that have no equivalent short option, use a
non-character as a pseudo short option, starting with CHAR_MAX + 1. */
-enum
-{
- SYNC_OPTION = CHAR_MAX + 1,
- NO_SYNC_OPTION,
- BLOCK_SIZE_OPTION
+enum {
+ SYNC_OPTION = CHAR_MAX + 1,
+ NO_SYNC_OPTION,
+ BLOCK_SIZE_OPTION
};
#ifdef _AIX
-#pragma alloca
+# pragma alloca
#endif
-static int process_arguments (int, char **);
-static void set_all_thresholds (struct parameter_list *path);
-static void print_help (void);
-void print_usage (void);
+static int process_arguments(int, char **);
+static void set_all_thresholds(struct parameter_list *path);
+static void print_help(void);
+void print_usage(void);
static double calculate_percent(uintmax_t, uintmax_t);
-static bool stat_path (struct parameter_list *p);
-static void get_stats (struct parameter_list *p, struct fs_usage *fsp);
-static void get_path_stats (struct parameter_list *p, struct fs_usage *fsp);
+static bool stat_path(struct parameter_list *p);
+static void get_stats(struct parameter_list *p, struct fs_usage *fsp);
+static void get_path_stats(struct parameter_list *p, struct fs_usage *fsp);
static char *units;
static uintmax_t mult = 1024 * 1024;
@@ -155,992 +153,955 @@ static char *group = NULL;
static struct stat *stat_buf;
static struct name_list *seen = NULL;
-
-int
-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 = " - free space:";
- char *ignored_preamble = " - ignored paths:";
- char *flag_header;
- int temp_result;
-
- struct mount_entry *me;
- struct fs_usage fsp;
- struct parameter_list *temp_list, *path;
+int 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 = " - free space:";
+ char *ignored_preamble = " - ignored paths:";
+ char *flag_header;
+ int temp_result;
+
+ struct mount_entry *me;
+ struct fs_usage fsp;
+ struct parameter_list *temp_list, *path;
#ifdef __CYGWIN__
- char mountdir[32];
+ char mountdir[32];
#endif
- output = strdup ("");
- ignored = strdup ("");
- details = strdup ("");
- perf = strdup ("");
- perf_ilabel = strdup ("");
- stat_buf = malloc(sizeof *stat_buf);
-
- setlocale (LC_ALL, "");
- bindtextdomain (PACKAGE, LOCALEDIR);
- textdomain (PACKAGE);
-
- mount_list = read_file_system_list (0);
-
- /* Parse extra opts if any */
- argv = np_extra_opts (&argc, argv, progname);
-
- if (process_arguments (argc, argv) == ERROR)
- usage4 (_("Could not parse arguments"));
-
- /* If a list of paths has not been selected, find entire
- mount list and create list of paths
- */
- 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);
- }
- path->best_match = me;
- path->group = group;
- set_all_thresholds(path);
- }
- }
-
- 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 (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;
- }
- }
-
- 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 */
- for (path = path_select_list; path; path=path->name_next) {
- if (verbose >= 3 && path->freespace_percent->warning != NULL && path->freespace_percent->critical != NULL)
- printf("Thresholds(pct) for %s warn: %f crit %f\n",
- path->name,
- path->freespace_percent->warning->end,
- path->freespace_percent->critical->end);
-
- if (verbose >= 3 && path->group != NULL)
- printf("Group of %s: %s\n",path->name,path->group);
-
- /* reset disk result */
- disk_result = STATE_UNKNOWN;
-
- me = path->best_match;
-
- if (!me) {
- continue;
- }
+ output = strdup("");
+ ignored = strdup("");
+ details = strdup("");
+ perf = strdup("");
+ perf_ilabel = strdup("");
+ stat_buf = malloc(sizeof *stat_buf);
+
+ setlocale(LC_ALL, "");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+
+ mount_list = read_file_system_list(0);
+
+ /* Parse extra opts if any */
+ argv = np_extra_opts(&argc, argv, progname);
+
+ if (process_arguments(argc, argv) == ERROR)
+ usage4(_("Could not parse arguments"));
+
+ /* If a list of paths has not been selected, find entire
+ mount list and create list of paths
+ */
+ 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);
+ }
+ path->best_match = me;
+ path->group = group;
+ set_all_thresholds(path);
+ }
+ }
+
+ 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 (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;
+ }
+ }
+
+ 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 */
+ for (path = path_select_list; path; path = path->name_next) {
+ if (verbose >= 3 && path->freespace_percent->warning != NULL && path->freespace_percent->critical != NULL)
+ printf("Thresholds(pct) for %s warn: %f crit %f\n", path->name, path->freespace_percent->warning->end,
+ path->freespace_percent->critical->end);
+
+ if (verbose >= 3 && path->group != NULL)
+ printf("Group of %s: %s\n", path->name, path->group);
+
+ /* reset disk result */
+ disk_result = STATE_UNKNOWN;
+
+ me = path->best_match;
+
+ if (!me) {
+ continue;
+ }
#ifdef __CYGWIN__
- if (strncmp(path->name, "/cygdrive/", 10) != 0 || strlen(path->name) > 11)
- continue;
- snprintf(mountdir, sizeof(mountdir), "%s:\\", me->me_mountdir + 10);
- if (GetDriveType(mountdir) != DRIVE_FIXED)
- me->me_remote = 1;
+ if (strncmp(path->name, "/cygdrive/", 10) != 0 || strlen(path->name) > 11)
+ continue;
+ snprintf(mountdir, sizeof(mountdir), "%s:\\", me->me_mountdir + 10);
+ if (GetDriveType(mountdir) != DRIVE_FIXED)
+ me->me_remote = 1;
#endif
- /* Filters */
-
- /* Remove filesystems already seen */
- if (np_seen_name(seen, me->me_mountdir)) {
- continue;
- }
- np_add_name(&seen, me->me_mountdir);
-
- 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) {
- 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_regmatch (fs_exclude_list, me->me_type)) {
- continue;
- /* Skip excluded fs's */
- } else if (dp_exclude_list &&
- (np_find_name (dp_exclude_list, me->me_devname) ||
- np_find_name (dp_exclude_list, me->me_mountdir))) {
- continue;
- /* Skip not included fstypes */
- } else if (fs_include_list && !np_find_regmatch(fs_include_list, me->me_type)) {
- continue;
- }
- }
-
- 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)) {
- get_stats (path, &fsp);
-
- if (verbose >= 3) {
- printf ("For %s, used_pct=%f free_pct=%f used_units=%lu free_units=%lu total_units=%lu used_inodes_pct=%f free_inodes_pct=%f fsp.fsu_blocksize=%lu mult=%lu\n",
- me->me_mountdir,
- path->dused_pct,
- path->dfree_pct,
- path->dused_units,
- path->dfree_units,
- path->dtotal_units,
- path->dused_inodes_percent,
- path->dfree_inodes_percent,
- fsp.fsu_blocksize,
- mult);
- }
-
- /* Threshold comparisons */
-
- temp_result = get_status(path->dfree_units, path->freespace_units);
- if (verbose >=3) printf("Freespace_units result=%d\n", temp_result);
- disk_result = max_state( disk_result, temp_result );
-
- temp_result = get_status(path->dfree_pct, path->freespace_percent);
- if (verbose >=3) printf("Freespace%% result=%d\n", temp_result);
- disk_result = max_state( disk_result, temp_result );
-
- temp_result = get_status(path->dused_units, path->usedspace_units);
- if (verbose >=3) printf("Usedspace_units result=%d\n", temp_result);
- disk_result = max_state( disk_result, temp_result );
-
- temp_result = get_status(path->dused_pct, path->usedspace_percent);
- if (verbose >=3) printf("Usedspace_percent result=%d\n", temp_result);
- disk_result = max_state( disk_result, temp_result );
-
- temp_result = get_status(path->dused_inodes_percent, path->usedinodes_percent);
- if (verbose >=3) printf("Usedinodes_percent result=%d\n", temp_result);
- disk_result = max_state( disk_result, temp_result );
-
- temp_result = get_status(path->dfree_inodes_percent, path->freeinodes_percent);
- if (verbose >=3) printf("Freeinodes_percent result=%d\n", temp_result);
- disk_result = max_state( disk_result, temp_result );
-
- result = max_state(result, disk_result);
-
- /* What a mess of units. The output shows free space, the perf data shows used space. Yikes!
- Hack here. Trying to get warn/crit levels from freespace_(units|percent) for perf
- data. Assumption that start=0. Roll on new syntax...
- */
-
- /* *_high_tide must be reinitialized at each run */
- uint64_t warning_high_tide = UINT64_MAX;
-
- if (path->freespace_units->warning != NULL) {
- warning_high_tide = (path->dtotal_units - path->freespace_units->warning->end) * mult;
- }
- if (path->freespace_percent->warning != NULL) {
- warning_high_tide = min( warning_high_tide, (uint64_t)((1.0 - path->freespace_percent->warning->end/100) * (path->dtotal_units * mult)) );
- }
-
- uint64_t critical_high_tide = UINT64_MAX;
-
- if (path->freespace_units->critical != NULL) {
- critical_high_tide = (path->dtotal_units - path->freespace_units->critical->end) * mult;
- }
- if (path->freespace_percent->critical != NULL) {
- critical_high_tide = min( critical_high_tide, (uint64_t)((1.0 - path->freespace_percent->critical->end/100) * (path->dtotal_units * mult)) );
- }
-
- /* Nb: *_high_tide are unset when == UINT64_MAX */
- xasprintf (&perf, "%s %s", perf,
- perfdata_uint64 (
- (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
- path->dused_units * mult, "B",
- (warning_high_tide == UINT64_MAX ? false : true), warning_high_tide,
- (critical_high_tide == UINT64_MAX ? false : true), critical_high_tide,
- true, 0,
- true, path->dtotal_units * mult));
-
- if (display_inodes_perfdata) {
- /* *_high_tide must be reinitialized at each run */
- warning_high_tide = UINT64_MAX;
- critical_high_tide = UINT64_MAX;
-
- if (path->freeinodes_percent->warning != NULL) {
- warning_high_tide = (uint64_t) fabs( min( (double) warning_high_tide, (double) (1.0 - path->freeinodes_percent->warning->end/100)*path->inodes_total ));
- }
- if (path->freeinodes_percent->critical != NULL) {
- critical_high_tide = (uint64_t) fabs( min( (double) critical_high_tide, (double) (1.0 - path->freeinodes_percent->critical->end/100)*path->inodes_total ));
- }
-
- xasprintf (&perf_ilabel, "%s (inodes)", (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir);
- /* Nb: *_high_tide are unset when == UINT64_MAX */
- xasprintf (&perf, "%s %s", perf,
- perfdata_uint64 (perf_ilabel,
- path->inodes_used, "",
- (warning_high_tide != UINT64_MAX ? true : false), warning_high_tide,
- (critical_high_tide != UINT64_MAX ? true : false), critical_high_tide,
- true, 0,
- true, path->inodes_total));
- }
-
- if (disk_result==STATE_OK && erronly && !verbose)
- continue;
-
- if(disk_result && verbose >= 1) {
- xasprintf(&flag_header, " %s [", state_text (disk_result));
- } else {
- xasprintf(&flag_header, "");
- }
- xasprintf (&output, "%s%s %s %llu%s (%.1f%%",
- output, flag_header,
- (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
- path->dfree_units,
- units,
- path->dfree_pct);
- if (path->dused_inodes_percent < 0) {
- xasprintf(&output, "%s inode=-)%s;", output, (disk_result ? "]" : ""));
- } else {
- xasprintf(&output, "%s inode=%.0f%%)%s;", output, path->dfree_inodes_percent, ((disk_result && verbose >= 1) ? "]" : ""));
- }
- free(flag_header);
- }
- }
-
- 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%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
- return result;
-}
+ /* Filters */
+
+ /* Remove filesystems already seen */
+ if (np_seen_name(seen, me->me_mountdir)) {
+ continue;
+ }
+ np_add_name(&seen, me->me_mountdir);
+
+ 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) {
+ 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_regmatch(fs_exclude_list, me->me_type)) {
+ continue;
+ /* Skip excluded fs's */
+ } else if (dp_exclude_list &&
+ (np_find_name(dp_exclude_list, me->me_devname) || np_find_name(dp_exclude_list, me->me_mountdir))) {
+ continue;
+ /* Skip not included fstypes */
+ } else if (fs_include_list && !np_find_regmatch(fs_include_list, me->me_type)) {
+ continue;
+ }
+ }
+
+ 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)) {
+ get_stats(path, &fsp);
+
+ if (verbose >= 3) {
+ printf("For %s, used_pct=%f free_pct=%f used_units=%lu free_units=%lu total_units=%lu used_inodes_pct=%f "
+ "free_inodes_pct=%f fsp.fsu_blocksize=%lu mult=%lu\n",
+ me->me_mountdir, path->dused_pct, path->dfree_pct, path->dused_units, path->dfree_units, path->dtotal_units,
+ path->dused_inodes_percent, path->dfree_inodes_percent, fsp.fsu_blocksize, mult);
+ }
+
+ /* Threshold comparisons */
+
+ temp_result = get_status(path->dfree_units, path->freespace_units);
+ if (verbose >= 3)
+ printf("Freespace_units result=%d\n", temp_result);
+ disk_result = max_state(disk_result, temp_result);
+
+ temp_result = get_status(path->dfree_pct, path->freespace_percent);
+ if (verbose >= 3)
+ printf("Freespace%% result=%d\n", temp_result);
+ disk_result = max_state(disk_result, temp_result);
+
+ temp_result = get_status(path->dused_units, path->usedspace_units);
+ if (verbose >= 3)
+ printf("Usedspace_units result=%d\n", temp_result);
+ disk_result = max_state(disk_result, temp_result);
+
+ temp_result = get_status(path->dused_pct, path->usedspace_percent);
+ if (verbose >= 3)
+ printf("Usedspace_percent result=%d\n", temp_result);
+ disk_result = max_state(disk_result, temp_result);
+
+ temp_result = get_status(path->dused_inodes_percent, path->usedinodes_percent);
+ if (verbose >= 3)
+ printf("Usedinodes_percent result=%d\n", temp_result);
+ disk_result = max_state(disk_result, temp_result);
+
+ temp_result = get_status(path->dfree_inodes_percent, path->freeinodes_percent);
+ if (verbose >= 3)
+ printf("Freeinodes_percent result=%d\n", temp_result);
+ disk_result = max_state(disk_result, temp_result);
+
+ result = max_state(result, disk_result);
+
+ /* What a mess of units. The output shows free space, the perf data shows used space. Yikes!
+ Hack here. Trying to get warn/crit levels from freespace_(units|percent) for perf
+ data. Assumption that start=0. Roll on new syntax...
+ */
+
+ /* *_high_tide must be reinitialized at each run */
+ uint64_t warning_high_tide = UINT64_MAX;
+
+ if (path->freespace_units->warning != NULL) {
+ warning_high_tide = (path->dtotal_units - path->freespace_units->warning->end) * mult;
+ }
+ if (path->freespace_percent->warning != NULL) {
+ warning_high_tide =
+ min(warning_high_tide, (uint64_t)((1.0 - path->freespace_percent->warning->end / 100) * (path->dtotal_units * mult)));
+ }
+
+ uint64_t critical_high_tide = UINT64_MAX;
+
+ if (path->freespace_units->critical != NULL) {
+ critical_high_tide = (path->dtotal_units - path->freespace_units->critical->end) * mult;
+ }
+ if (path->freespace_percent->critical != NULL) {
+ critical_high_tide =
+ min(critical_high_tide, (uint64_t)((1.0 - path->freespace_percent->critical->end / 100) * (path->dtotal_units * mult)));
+ }
+
+ /* Nb: *_high_tide are unset when == UINT64_MAX */
+ xasprintf(&perf, "%s %s", perf,
+ perfdata_uint64((!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
+ path->dused_units * mult, "B", (warning_high_tide == UINT64_MAX ? false : true), warning_high_tide,
+ (critical_high_tide == UINT64_MAX ? false : true), critical_high_tide, true, 0, true,
+ path->dtotal_units * mult));
+
+ if (display_inodes_perfdata) {
+ /* *_high_tide must be reinitialized at each run */
+ warning_high_tide = UINT64_MAX;
+ critical_high_tide = UINT64_MAX;
+
+ if (path->freeinodes_percent->warning != NULL) {
+ warning_high_tide = (uint64_t)fabs(
+ min((double)warning_high_tide, (double)(1.0 - path->freeinodes_percent->warning->end / 100) * path->inodes_total));
+ }
+ if (path->freeinodes_percent->critical != NULL) {
+ critical_high_tide = (uint64_t)fabs(min(
+ (double)critical_high_tide, (double)(1.0 - path->freeinodes_percent->critical->end / 100) * path->inodes_total));
+ }
+
+ xasprintf(&perf_ilabel, "%s (inodes)",
+ (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir);
+ /* Nb: *_high_tide are unset when == UINT64_MAX */
+ xasprintf(&perf, "%s %s", perf,
+ perfdata_uint64(perf_ilabel, path->inodes_used, "", (warning_high_tide != UINT64_MAX ? true : false),
+ warning_high_tide, (critical_high_tide != UINT64_MAX ? true : false), critical_high_tide, true, 0,
+ true, path->inodes_total));
+ }
+
+ if (disk_result == STATE_OK && erronly && !verbose)
+ continue;
+
+ if (disk_result && verbose >= 1) {
+ xasprintf(&flag_header, " %s [", state_text(disk_result));
+ } else {
+ xasprintf(&flag_header, "");
+ }
+ xasprintf(&output, "%s%s %s %llu%s (%.1f%%", output, flag_header,
+ (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, path->dfree_units, units,
+ path->dfree_pct);
+ if (path->dused_inodes_percent < 0) {
+ xasprintf(&output, "%s inode=-)%s;", output, (disk_result ? "]" : ""));
+ } else {
+ xasprintf(&output, "%s inode=%.0f%%)%s;", output, path->dfree_inodes_percent, ((disk_result && verbose >= 1) ? "]" : ""));
+ }
+ free(flag_header);
+ }
+ }
+
+ 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%s|%s\n", state_text(result), ((erronly && result == STATE_OK)) ? "" : preamble, output,
+ (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
+ return result;
+}
double calculate_percent(uintmax_t value, uintmax_t total) {
- double pct = -1;
- if(value <= DBL_MAX && total != 0) {
- pct = (double)value / total * 100.0;
- }
- return pct;
+ double pct = -1;
+ if (value <= DBL_MAX && total != 0) {
+ pct = (double)value / total * 100.0;
+ }
+ return pct;
}
/* process command-line arguments */
-int
-process_arguments (int argc, char **argv)
-{
- int c, err;
- struct parameter_list *se;
- struct parameter_list *temp_list = NULL, *previous = NULL;
- struct mount_entry *me;
- regex_t re;
- int cflags = REG_NOSUB | REG_EXTENDED;
- int default_cflags = cflags;
- char errbuf[MAX_INPUT_BUFFER];
- int fnd = 0;
-
- int option = 0;
- static struct option longopts[] = {
- {"timeout", required_argument, 0, 't'},
- {"warning", required_argument, 0, 'w'},
- {"critical", required_argument, 0, 'c'},
- {"iwarning", required_argument, 0, 'W'},
- /* Dang, -C is taken. We might want to reshuffle this. */
- {"icritical", required_argument, 0, 'K'},
- {"kilobytes", no_argument, 0, 'k'},
- {"megabytes", no_argument, 0, 'm'},
- {"units", required_argument, 0, 'u'},
- {"path", required_argument, 0, 'p'},
- {"partition", required_argument, 0, 'p'},
- {"exclude_device", required_argument, 0, 'x'},
- {"exclude-type", required_argument, 0, 'X'},
- {"include-type", required_argument, 0, 'N'},
- {"group", required_argument, 0, 'g'},
- {"eregi-path", required_argument, 0, 'R'},
- {"eregi-partition", required_argument, 0, 'R'},
- {"ereg-path", required_argument, 0, 'r'},
- {"ereg-partition", required_argument, 0, 'r'},
- {"freespace-ignore-reserved", no_argument, 0, 'f'},
- {"ignore-ereg-path", required_argument, 0, 'i'},
- {"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, 'n'},
- {"local", no_argument, 0, 'l'},
- {"stat-remote-fs", no_argument, 0, 'L'},
- {"iperfdata", no_argument, 0, 'P'},
- {"mountpoint", no_argument, 0, 'M'},
- {"errors-only", no_argument, 0, 'e'},
- {"exact-match", no_argument, 0, 'E'},
- {"all", no_argument, 0, 'A'},
- {"verbose", no_argument, 0, 'v'},
- {"quiet", no_argument, 0, 'q'},
- {"clear", no_argument, 0, 'C'},
- {"version", no_argument, 0, 'V'},
- {"help", no_argument, 0, 'h'},
- {0, 0, 0, 0}
- };
-
- if (argc < 2)
- return ERROR;
-
- np_add_regex(&fs_exclude_list, "iso9660", REG_EXTENDED);
-
- for (c = 1; c < argc; c++)
- if (strcmp ("-to", argv[c]) == 0)
- strcpy (argv[c], "-t");
-
- while (1) {
- c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLPg:R:r:i:I:MEAn", longopts, &option);
-
- if (c == -1 || c == EOF)
- break;
-
- switch (c) {
- case 't': /* timeout period */
- if (is_integer (optarg)) {
- timeout_interval = atoi (optarg);
- break;
- }
- else {
- usage2 (_("Timeout interval must be a positive integer"), optarg);
- }
-
- /* See comments for 'c' */
- case 'w': /* warning threshold */
+int process_arguments(int argc, char **argv) {
+ int c, err;
+ struct parameter_list *se;
+ struct parameter_list *temp_list = NULL, *previous = NULL;
+ struct mount_entry *me;
+ regex_t re;
+ int cflags = REG_NOSUB | REG_EXTENDED;
+ int default_cflags = cflags;
+ char errbuf[MAX_INPUT_BUFFER];
+ int fnd = 0;
+
+ int option = 0;
+ static struct option longopts[] = {{"timeout", required_argument, 0, 't'},
+ {"warning", required_argument, 0, 'w'},
+ {"critical", required_argument, 0, 'c'},
+ {"iwarning", required_argument, 0, 'W'},
+ /* Dang, -C is taken. We might want to reshuffle this. */
+ {"icritical", required_argument, 0, 'K'},
+ {"kilobytes", no_argument, 0, 'k'},
+ {"megabytes", no_argument, 0, 'm'},
+ {"units", required_argument, 0, 'u'},
+ {"path", required_argument, 0, 'p'},
+ {"partition", required_argument, 0, 'p'},
+ {"exclude_device", required_argument, 0, 'x'},
+ {"exclude-type", required_argument, 0, 'X'},
+ {"include-type", required_argument, 0, 'N'},
+ {"group", required_argument, 0, 'g'},
+ {"eregi-path", required_argument, 0, 'R'},
+ {"eregi-partition", required_argument, 0, 'R'},
+ {"ereg-path", required_argument, 0, 'r'},
+ {"ereg-partition", required_argument, 0, 'r'},
+ {"freespace-ignore-reserved", no_argument, 0, 'f'},
+ {"ignore-ereg-path", required_argument, 0, 'i'},
+ {"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, 'n'},
+ {"local", no_argument, 0, 'l'},
+ {"stat-remote-fs", no_argument, 0, 'L'},
+ {"iperfdata", no_argument, 0, 'P'},
+ {"mountpoint", no_argument, 0, 'M'},
+ {"errors-only", no_argument, 0, 'e'},
+ {"exact-match", no_argument, 0, 'E'},
+ {"all", no_argument, 0, 'A'},
+ {"verbose", no_argument, 0, 'v'},
+ {"quiet", no_argument, 0, 'q'},
+ {"clear", no_argument, 0, 'C'},
+ {"version", no_argument, 0, 'V'},
+ {"help", no_argument, 0, 'h'},
+ {0, 0, 0, 0}};
+
+ if (argc < 2)
+ return ERROR;
+
+ np_add_regex(&fs_exclude_list, "iso9660", REG_EXTENDED);
+
+ for (c = 1; c < argc; c++)
+ if (strcmp("-to", argv[c]) == 0)
+ strcpy(argv[c], "-t");
+
+ while (1) {
+ c = getopt_long(argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLPg:R:r:i:I:MEAn", longopts, &option);
+
+ if (c == -1 || c == EOF)
+ break;
+
+ switch (c) {
+ case 't': /* timeout period */
+ if (is_integer(optarg)) {
+ timeout_interval = atoi(optarg);
+ break;
+ } else {
+ usage2(_("Timeout interval must be a positive integer"), optarg);
+ }
+
+ /* See comments for 'c' */
+ case 'w': /* warning threshold */
if (!is_percentage_expression(optarg) && !is_numeric(optarg)) {
- die(STATE_UNKNOWN, "Argument for --warning invalid or missing: %s\n", optarg);
+ die(STATE_UNKNOWN, "Argument for --warning invalid or missing: %s\n", optarg);
}
- if (strstr(optarg, "%")) {
- if (*optarg == '@') {
- warn_freespace_percent = optarg;
- } else {
- xasprintf(&warn_freespace_percent, "@%s", optarg);
- }
- } else {
- if (*optarg == '@') {
- warn_freespace_units = optarg;
- } else {
- xasprintf(&warn_freespace_units, "@%s", optarg);
- }
- }
- break;
-
- /* 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 artificially
- force @ at the beginning of the range, so that it is backwards compatible
- */
- case 'c': /* critical threshold */
+ if (strstr(optarg, "%")) {
+ if (*optarg == '@') {
+ warn_freespace_percent = optarg;
+ } else {
+ xasprintf(&warn_freespace_percent, "@%s", optarg);
+ }
+ } else {
+ if (*optarg == '@') {
+ warn_freespace_units = optarg;
+ } else {
+ xasprintf(&warn_freespace_units, "@%s", optarg);
+ }
+ }
+ break;
+
+ /* 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 artificially
+ force @ at the beginning of the range, so that it is backwards compatible
+ */
+ case 'c': /* critical threshold */
if (!is_percentage_expression(optarg) && !is_numeric(optarg)) {
- die(STATE_UNKNOWN, "Argument for --critical invalid or missing: %s\n", optarg);
+ die(STATE_UNKNOWN, "Argument for --critical invalid or missing: %s\n", optarg);
}
- if (strstr(optarg, "%")) {
- if (*optarg == '@') {
- crit_freespace_percent = optarg;
- } else {
- xasprintf(&crit_freespace_percent, "@%s", optarg);
- }
- } else {
- if (*optarg == '@') {
- crit_freespace_units = optarg;
- } else {
- xasprintf(&crit_freespace_units, "@%s", optarg);
- }
- }
- break;
-
- case 'W': /* warning inode threshold */
- if (*optarg == '@') {
- warn_freeinodes_percent = optarg;
- } else {
- xasprintf(&warn_freeinodes_percent, "@%s", optarg);
- }
- break;
- case 'K': /* critical inode threshold */
- if (*optarg == '@') {
- crit_freeinodes_percent = optarg;
- } else {
- xasprintf(&crit_freeinodes_percent, "@%s", optarg);
- }
- break;
- case 'u':
- if (units)
- free(units);
- if (! strcasecmp (optarg, "bytes")) {
- mult = (uintmax_t)1;
- units = strdup ("B");
- } else if (!strcmp(optarg, "KiB")) {
- mult = (uintmax_t)1024;
- 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, "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, "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, "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);
- }
- if (units == NULL)
- die (STATE_UNKNOWN, _("failed allocating storage for '%s'\n"), "units");
- break;
- case 'k': /* display mountpoint */
- mult = 1024;
- if (units)
- free(units);
- units = strdup ("kiB");
- break;
- case 'm': /* display mountpoint */
- mult = 1024 * 1024;
- if (units)
- free(units);
- units = strdup ("MiB");
- break;
- case 'L':
- stat_remote_fs = 1;
- /* fallthrough */
- case 'l':
- show_local_fs = 1;
- break;
- case 'P':
- display_inodes_perfdata = 1;
- break;
- case 'p': /* select path */
- if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent ||
- 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 -p\n"));
- }
-
- /* 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 */
- 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 */
- mount_list = read_file_system_list (0);
- np_set_best_match(se, mount_list, exact_match);
-
- path_selected = true;
- break;
- case 'x': /* exclude path or partition */
- np_add_name(&dp_exclude_list, optarg);
- break;
- case 'X': /* exclude file system type */
- 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 */
- 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++;
- break;
- case 'q': /* TODO: this function should eventually go away (removed 2007-09-20) */
- /* verbose--; **replaced by line below**. -q was only a broken way of implementing -e */
- erronly = true;
- break;
- case 'e':
- erronly = true;
- break;
- case 'E':
- if (path_selected)
- die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n"));
- exact_match = true;
- break;
- case 'f':
- freespace_ignore_reserved = true;
- break;
- case 'g':
- if (path_selected)
- die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting paths\n"));
- group = optarg;
- break;
- case 'I':
- cflags |= REG_ICASE;
- // Intentional fallthrough
- case 'i':
- if (!path_selected)
- die (STATE_UNKNOWN, "DISK %s: %s\n", _("UNKNOWN"), _("Paths need to be selected before using -i/-I. Use -A to select all paths explicitly"));
- err = regcomp(&re, optarg, cflags);
- if (err != 0) {
- regerror (err, &re, errbuf, MAX_INPUT_BUFFER);
- die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
- }
-
- temp_list = path_select_list;
-
- previous = NULL;
- while (temp_list) {
- if (temp_list->best_match) {
- if (np_regex_match_mount_entry(temp_list->best_match, &re)) {
-
- if (verbose >=3)
- printf("ignoring %s matching regex\n", temp_list->name);
-
- temp_list = np_del_parameter(temp_list, previous);
- /* pointer to first element needs to be updated if first item gets deleted */
- if (previous == NULL)
- path_select_list = temp_list;
- } else {
- previous = temp_list;
- temp_list = temp_list->name_next;
- }
- } else {
- previous = temp_list;
- temp_list = temp_list->name_next;
- }
- }
-
-
- cflags = default_cflags;
- break;
-
- case 'n':
- ignore_missing = true;
- break;
- case 'A':
- optarg = strdup(".*");
- // Intentional fallthrough
- case 'R':
- cflags |= REG_ICASE;
- // Intentional fallthrough
- case 'r':
- if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent ||
- 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/-A (--ereg-path/--eregi-path/--all)\n"));
- }
-
- err = regcomp(&re, optarg, cflags);
- if (err != 0) {
- regerror (err, &re, errbuf, MAX_INPUT_BUFFER);
- die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
- }
-
- for (me = mount_list; me; me = me->me_next) {
- if (np_regex_match_mount_entry(me, &re)) {
- fnd = true;
- if (verbose >= 3)
- printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg);
-
- /* add parameter if not found. overwrite thresholds if path has already been added */
- if (! (se = np_find_parameter(path_select_list, me->me_mountdir))) {
- se = np_add_parameter(&path_select_list, me->me_mountdir);
- }
- se->group = group;
- set_all_thresholds(se);
- }
- }
-
- 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);
-
- fnd = false;
- path_selected = true;
- np_set_best_match(path_select_list, mount_list, exact_match);
- cflags = default_cflags;
-
- break;
- case 'M': /* display mountpoint */
- display_mntp = true;
- break;
- case 'C':
- /* add all mount entries to path_select list if no partitions have been explicitly defined using -p */
- if (path_selected == false) {
- struct parameter_list *path;
- 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);
- path->best_match = me;
- path->group = group;
- set_all_thresholds(path);
- }
- }
- warn_freespace_units = NULL;
- crit_freespace_units = NULL;
- warn_usedspace_units = NULL;
- crit_usedspace_units = NULL;
- warn_freespace_percent = NULL;
- crit_freespace_percent = NULL;
- warn_usedspace_percent = NULL;
- crit_usedspace_percent = NULL;
- warn_usedinodes_percent = NULL;
- crit_usedinodes_percent = NULL;
- warn_freeinodes_percent = NULL;
- crit_freeinodes_percent = NULL;
-
- path_selected = false;
- group = NULL;
- break;
- case 'V': /* version */
- print_revision (progname, NP_VERSION);
- exit (STATE_UNKNOWN);
- case 'h': /* help */
- print_help ();
- exit (STATE_UNKNOWN);
- case '?': /* help */
- usage (_("Unknown argument"));
- }
- }
-
- /* Support for "check_disk warn crit [fs]" with thresholds at used% level */
- c = optind;
- if (warn_usedspace_percent == NULL && argc > c && is_intnonneg (argv[c]))
- warn_usedspace_percent = argv[c++];
-
- if (crit_usedspace_percent == NULL && argc > c && is_intnonneg (argv[c]))
- crit_usedspace_percent = argv[c++];
-
- if (argc > c) {
- se = np_add_parameter(&path_select_list, strdup(argv[c++]));
- path_selected = true;
- set_all_thresholds(se);
- }
-
- if (units == NULL) {
- units = strdup ("MiB");
- mult = (uintmax_t)1024 * 1024;
- }
-
- return true;
-}
+ if (strstr(optarg, "%")) {
+ if (*optarg == '@') {
+ crit_freespace_percent = optarg;
+ } else {
+ xasprintf(&crit_freespace_percent, "@%s", optarg);
+ }
+ } else {
+ if (*optarg == '@') {
+ crit_freespace_units = optarg;
+ } else {
+ xasprintf(&crit_freespace_units, "@%s", optarg);
+ }
+ }
+ break;
-void
-set_all_thresholds (struct parameter_list *path)
-{
- if (path->freespace_units != NULL) free(path->freespace_units);
- set_thresholds(&path->freespace_units, warn_freespace_units, crit_freespace_units);
- if (path->freespace_percent != NULL) free (path->freespace_percent);
- set_thresholds(&path->freespace_percent, warn_freespace_percent, crit_freespace_percent);
- if (path->usedspace_units != NULL) free (path->usedspace_units);
- set_thresholds(&path->usedspace_units, warn_usedspace_units, crit_usedspace_units);
- if (path->usedspace_percent != NULL) free (path->usedspace_percent);
- set_thresholds(&path->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent);
- if (path->usedinodes_percent != NULL) free (path->usedinodes_percent);
- set_thresholds(&path->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent);
- if (path->freeinodes_percent != NULL) free (path->freeinodes_percent);
- set_thresholds(&path->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent);
-}
+ case 'W': /* warning inode threshold */
+ if (*optarg == '@') {
+ warn_freeinodes_percent = optarg;
+ } else {
+ xasprintf(&warn_freeinodes_percent, "@%s", optarg);
+ }
+ break;
+ case 'K': /* critical inode threshold */
+ if (*optarg == '@') {
+ crit_freeinodes_percent = optarg;
+ } else {
+ xasprintf(&crit_freeinodes_percent, "@%s", optarg);
+ }
+ break;
+ case 'u':
+ if (units)
+ free(units);
+ if (!strcasecmp(optarg, "bytes")) {
+ mult = (uintmax_t)1;
+ units = strdup("B");
+ } else if (!strcmp(optarg, "KiB")) {
+ mult = (uintmax_t)1024;
+ 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, "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, "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, "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);
+ }
+ if (units == NULL)
+ die(STATE_UNKNOWN, _("failed allocating storage for '%s'\n"), "units");
+ break;
+ case 'k': /* display mountpoint */
+ mult = 1024;
+ if (units)
+ free(units);
+ units = strdup("kiB");
+ break;
+ case 'm': /* display mountpoint */
+ mult = 1024 * 1024;
+ if (units)
+ free(units);
+ units = strdup("MiB");
+ break;
+ case 'L':
+ stat_remote_fs = 1;
+ /* fallthrough */
+ case 'l':
+ show_local_fs = 1;
+ break;
+ case 'P':
+ display_inodes_perfdata = 1;
+ break;
+ case 'p': /* select path */
+ if (!(warn_freespace_units || crit_freespace_units || warn_freespace_percent || 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 -p\n"));
+ }
-void
-print_help (void)
-{
- print_revision (progname, NP_VERSION);
-
- printf ("Copyright (c) 1999 Ethan Galstad \n");
- printf (COPYRIGHT, copyright, email);
-
- printf ("%s\n", _("This plugin checks the amount of used disk space on a mounted file system"));
- printf ("%s\n", _("and generates an alert if free space is less than one of the threshold values"));
-
- printf ("\n\n");
-
- print_usage ();
-
- printf (UT_HELP_VRSN);
- printf (UT_EXTRA_OPTS);
-
- printf (" %s\n", "-w, --warning=INTEGER");
- printf (" %s\n", _("Exit with WARNING status if less than INTEGER units of disk are free"));
- printf (" %s\n", "-w, --warning=PERCENT%");
- printf (" %s\n", _("Exit with WARNING status if less than PERCENT of disk space is free"));
- printf (" %s\n", "-c, --critical=INTEGER");
- printf (" %s\n", _("Exit with CRITICAL status if less than INTEGER units of disk are free"));
- printf (" %s\n", "-c, --critical=PERCENT%");
- printf (" %s\n", _("Exit with CRITICAL status if less than PERCENT of disk space is free"));
- printf (" %s\n", "-W, --iwarning=PERCENT%");
- printf (" %s\n", _("Exit with WARNING status if less than PERCENT of inode space is free"));
- printf (" %s\n", "-K, --icritical=PERCENT%");
- printf (" %s\n", _("Exit with CRITICAL status if less than PERCENT of inode space is free"));
- printf (" %s\n", "-p, --path=PATH, --partition=PARTITION");
- printf (" %s\n", _("Mount point or block device as emitted by the mount(8) command (may be repeated)"));
- printf (" %s\n", "-x, --exclude_device=PATH ");
- printf (" %s\n", _("Ignore device (only works if -p unspecified)"));
- printf (" %s\n", "-C, --clear");
- printf (" %s\n", _("Clear thresholds"));
- printf (" %s\n", "-E, --exact-match");
- printf (" %s\n", _("For paths or partitions specified with -p, only check for exact paths"));
- printf (" %s\n", "-e, --errors-only");
- printf (" %s\n", _("Display only devices/mountpoints with errors"));
- printf (" %s\n", "-f, --freespace-ignore-reserved");
- printf (" %s\n", _("Don't account root-reserved blocks into freespace in perfdata"));
- printf (" %s\n", "-P, --iperfdata");
- printf (" %s\n", _("Display inode usage in perfdata"));
- printf (" %s\n", "-g, --group=NAME");
- printf (" %s\n", _("Group paths. Thresholds apply to (free-)space of all partitions together"));
- printf (" %s\n", "-k, --kilobytes");
- printf (" %s\n", _("Same as '--units kB'"));
- printf (" %s\n", "-l, --local");
- printf (" %s\n", _("Only check local filesystems"));
- printf (" %s\n", "-L, --stat-remote-fs");
- printf (" %s\n", _("Only check local filesystems against thresholds. Yet call stat on remote filesystems"));
- printf (" %s\n", _("to test if they are accessible (e.g. to detect Stale NFS Handles)"));
- printf (" %s\n", "-M, --mountpoint");
- printf (" %s\n", _("Display the (block) device instead of the mount point"));
- printf (" %s\n", "-m, --megabytes");
- printf (" %s\n", _("Same as '--units MB'"));
- printf (" %s\n", "-A, --all");
- printf (" %s\n", _("Explicitly select all paths. This is equivalent to -R '.*'"));
- printf (" %s\n", "-R, --eregi-path=PATH, --eregi-partition=PARTITION");
- printf (" %s\n", _("Case insensitive regular expression for path/partition (may be repeated)"));
- printf (" %s\n", "-r, --ereg-path=PATH, --ereg-partition=PARTITION");
- printf (" %s\n", _("Regular expression for path or partition (may be repeated)"));
- printf (" %s\n", "-I, --ignore-eregi-path=PATH, --ignore-eregi-partition=PARTITION");
- 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", "-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_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\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\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"));
-
- printf (UT_SUPPORT);
-}
+ /* 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 */
+ 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 */
+ mount_list = read_file_system_list(0);
+ np_set_best_match(se, mount_list, exact_match);
+
+ path_selected = true;
+ break;
+ case 'x': /* exclude path or partition */
+ np_add_name(&dp_exclude_list, optarg);
+ break;
+ case 'X': /* exclude file system type */
+ 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 */
+ 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++;
+ break;
+ case 'q': /* TODO: this function should eventually go away (removed 2007-09-20) */
+ /* verbose--; **replaced by line below**. -q was only a broken way of implementing -e */
+ erronly = true;
+ break;
+ case 'e':
+ erronly = true;
+ break;
+ case 'E':
+ if (path_selected)
+ die(STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n"));
+ exact_match = true;
+ break;
+ case 'f':
+ freespace_ignore_reserved = true;
+ break;
+ case 'g':
+ if (path_selected)
+ die(STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting paths\n"));
+ group = optarg;
+ break;
+ case 'I':
+ cflags |= REG_ICASE;
+ // Intentional fallthrough
+ case 'i':
+ if (!path_selected)
+ die(STATE_UNKNOWN, "DISK %s: %s\n", _("UNKNOWN"),
+ _("Paths need to be selected before using -i/-I. Use -A to select all paths explicitly"));
+ err = regcomp(&re, optarg, cflags);
+ if (err != 0) {
+ regerror(err, &re, errbuf, MAX_INPUT_BUFFER);
+ die(STATE_UNKNOWN, "DISK %s: %s - %s\n", _("UNKNOWN"), _("Could not compile regular expression"), errbuf);
+ }
+
+ temp_list = path_select_list;
+
+ previous = NULL;
+ while (temp_list) {
+ if (temp_list->best_match) {
+ if (np_regex_match_mount_entry(temp_list->best_match, &re)) {
+
+ if (verbose >= 3)
+ printf("ignoring %s matching regex\n", temp_list->name);
+
+ temp_list = np_del_parameter(temp_list, previous);
+ /* pointer to first element needs to be updated if first item gets deleted */
+ if (previous == NULL)
+ path_select_list = temp_list;
+ } else {
+ previous = temp_list;
+ temp_list = temp_list->name_next;
+ }
+ } else {
+ previous = temp_list;
+ temp_list = temp_list->name_next;
+ }
+ }
+
+ cflags = default_cflags;
+ break;
+
+ case 'n':
+ ignore_missing = true;
+ break;
+ case 'A':
+ optarg = strdup(".*");
+ // Intentional fallthrough
+ case 'R':
+ cflags |= REG_ICASE;
+ // Intentional fallthrough
+ case 'r':
+ if (!(warn_freespace_units || crit_freespace_units || warn_freespace_percent || 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/-A (--ereg-path/--eregi-path/--all)\n"));
+ }
+
+ err = regcomp(&re, optarg, cflags);
+ if (err != 0) {
+ regerror(err, &re, errbuf, MAX_INPUT_BUFFER);
+ die(STATE_UNKNOWN, "DISK %s: %s - %s\n", _("UNKNOWN"), _("Could not compile regular expression"), errbuf);
+ }
+ for (me = mount_list; me; me = me->me_next) {
+ if (np_regex_match_mount_entry(me, &re)) {
+ fnd = true;
+ if (verbose >= 3)
+ printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg);
+
+ /* add parameter if not found. overwrite thresholds if path has already been added */
+ if (!(se = np_find_parameter(path_select_list, me->me_mountdir))) {
+ se = np_add_parameter(&path_select_list, me->me_mountdir);
+ }
+ se->group = group;
+ set_all_thresholds(se);
+ }
+ }
+ 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);
+
+ fnd = false;
+ path_selected = true;
+ np_set_best_match(path_select_list, mount_list, exact_match);
+ cflags = default_cflags;
+
+ break;
+ case 'M': /* display mountpoint */
+ display_mntp = true;
+ break;
+ case 'C':
+ /* add all mount entries to path_select list if no partitions have been explicitly defined using -p */
+ if (path_selected == false) {
+ struct parameter_list *path;
+ 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);
+ path->best_match = me;
+ path->group = group;
+ set_all_thresholds(path);
+ }
+ }
+ warn_freespace_units = NULL;
+ crit_freespace_units = NULL;
+ warn_usedspace_units = NULL;
+ crit_usedspace_units = NULL;
+ warn_freespace_percent = NULL;
+ crit_freespace_percent = NULL;
+ warn_usedspace_percent = NULL;
+ crit_usedspace_percent = NULL;
+ warn_usedinodes_percent = NULL;
+ crit_usedinodes_percent = NULL;
+ warn_freeinodes_percent = NULL;
+ crit_freeinodes_percent = NULL;
+
+ path_selected = false;
+ group = NULL;
+ break;
+ case 'V': /* version */
+ print_revision(progname, NP_VERSION);
+ exit(STATE_UNKNOWN);
+ case 'h': /* help */
+ print_help();
+ exit(STATE_UNKNOWN);
+ case '?': /* help */
+ usage(_("Unknown argument"));
+ }
+ }
+
+ /* Support for "check_disk warn crit [fs]" with thresholds at used% level */
+ c = optind;
+ if (warn_usedspace_percent == NULL && argc > c && is_intnonneg(argv[c]))
+ warn_usedspace_percent = argv[c++];
+
+ if (crit_usedspace_percent == NULL && argc > c && is_intnonneg(argv[c]))
+ crit_usedspace_percent = argv[c++];
+
+ if (argc > c) {
+ se = np_add_parameter(&path_select_list, strdup(argv[c++]));
+ path_selected = true;
+ set_all_thresholds(se);
+ }
+
+ if (units == NULL) {
+ units = strdup("MiB");
+ mult = (uintmax_t)1024 * 1024;
+ }
+
+ return true;
+}
-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 ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
- printf ("[-t timeout] [-u unit] [-v] [-X type_regex] [-N type]\n");
+void set_all_thresholds(struct parameter_list *path) {
+ if (path->freespace_units != NULL)
+ free(path->freespace_units);
+ set_thresholds(&path->freespace_units, warn_freespace_units, crit_freespace_units);
+ if (path->freespace_percent != NULL)
+ free(path->freespace_percent);
+ set_thresholds(&path->freespace_percent, warn_freespace_percent, crit_freespace_percent);
+ if (path->usedspace_units != NULL)
+ free(path->usedspace_units);
+ set_thresholds(&path->usedspace_units, warn_usedspace_units, crit_usedspace_units);
+ if (path->usedspace_percent != NULL)
+ free(path->usedspace_percent);
+ set_thresholds(&path->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent);
+ if (path->usedinodes_percent != NULL)
+ free(path->usedinodes_percent);
+ set_thresholds(&path->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent);
+ if (path->freeinodes_percent != NULL)
+ free(path->freeinodes_percent);
+ set_thresholds(&path->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent);
}
-bool
-stat_path (struct parameter_list *p)
-{
- /* Stat entry to check that dir exists and is accessible */
- if (verbose >= 3)
- printf("calling stat on %s\n", p->name);
- if (stat (p->name, &stat_buf[0])) {
- if (verbose >= 3)
- printf("stat failed on %s\n", p->name);
- 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;
+void print_help(void) {
+ print_revision(progname, NP_VERSION);
+
+ printf("Copyright (c) 1999 Ethan Galstad \n");
+ printf(COPYRIGHT, copyright, email);
+
+ printf("%s\n", _("This plugin checks the amount of used disk space on a mounted file system"));
+ printf("%s\n", _("and generates an alert if free space is less than one of the threshold values"));
+
+ printf("\n\n");
+
+ print_usage();
+
+ printf(UT_HELP_VRSN);
+ printf(UT_EXTRA_OPTS);
+
+ printf(" %s\n", "-w, --warning=INTEGER");
+ printf(" %s\n", _("Exit with WARNING status if less than INTEGER units of disk are free"));
+ printf(" %s\n", "-w, --warning=PERCENT%");
+ printf(" %s\n", _("Exit with WARNING status if less than PERCENT of disk space is free"));
+ printf(" %s\n", "-c, --critical=INTEGER");
+ printf(" %s\n", _("Exit with CRITICAL status if less than INTEGER units of disk are free"));
+ printf(" %s\n", "-c, --critical=PERCENT%");
+ printf(" %s\n", _("Exit with CRITICAL status if less than PERCENT of disk space is free"));
+ printf(" %s\n", "-W, --iwarning=PERCENT%");
+ printf(" %s\n", _("Exit with WARNING status if less than PERCENT of inode space is free"));
+ printf(" %s\n", "-K, --icritical=PERCENT%");
+ printf(" %s\n", _("Exit with CRITICAL status if less than PERCENT of inode space is free"));
+ printf(" %s\n", "-p, --path=PATH, --partition=PARTITION");
+ printf(" %s\n", _("Mount point or block device as emitted by the mount(8) command (may be repeated)"));
+ printf(" %s\n", "-x, --exclude_device=PATH ");
+ printf(" %s\n", _("Ignore device (only works if -p unspecified)"));
+ printf(" %s\n", "-C, --clear");
+ printf(" %s\n", _("Clear thresholds"));
+ printf(" %s\n", "-E, --exact-match");
+ printf(" %s\n", _("For paths or partitions specified with -p, only check for exact paths"));
+ printf(" %s\n", "-e, --errors-only");
+ printf(" %s\n", _("Display only devices/mountpoints with errors"));
+ printf(" %s\n", "-f, --freespace-ignore-reserved");
+ printf(" %s\n", _("Don't account root-reserved blocks into freespace in perfdata"));
+ printf(" %s\n", "-P, --iperfdata");
+ printf(" %s\n", _("Display inode usage in perfdata"));
+ printf(" %s\n", "-g, --group=NAME");
+ printf(" %s\n", _("Group paths. Thresholds apply to (free-)space of all partitions together"));
+ printf(" %s\n", "-k, --kilobytes");
+ printf(" %s\n", _("Same as '--units kB'"));
+ printf(" %s\n", "-l, --local");
+ printf(" %s\n", _("Only check local filesystems"));
+ printf(" %s\n", "-L, --stat-remote-fs");
+ printf(" %s\n", _("Only check local filesystems against thresholds. Yet call stat on remote filesystems"));
+ printf(" %s\n", _("to test if they are accessible (e.g. to detect Stale NFS Handles)"));
+ printf(" %s\n", "-M, --mountpoint");
+ printf(" %s\n", _("Display the (block) device instead of the mount point"));
+ printf(" %s\n", "-m, --megabytes");
+ printf(" %s\n", _("Same as '--units MB'"));
+ printf(" %s\n", "-A, --all");
+ printf(" %s\n", _("Explicitly select all paths. This is equivalent to -R '.*'"));
+ printf(" %s\n", "-R, --eregi-path=PATH, --eregi-partition=PARTITION");
+ printf(" %s\n", _("Case insensitive regular expression for path/partition (may be repeated)"));
+ printf(" %s\n", "-r, --ereg-path=PATH, --ereg-partition=PARTITION");
+ printf(" %s\n", _("Regular expression for path or partition (may be repeated)"));
+ printf(" %s\n", "-I, --ignore-eregi-path=PATH, --ignore-eregi-partition=PARTITION");
+ 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", "-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_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\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\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"));
+
+ printf(UT_SUPPORT);
}
+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("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
+ printf("[-t timeout] [-u unit] [-v] [-X type_regex] [-N type]\n");
+}
-void
-get_stats (struct parameter_list *p, struct fs_usage *fsp) {
- struct parameter_list *p_list;
- struct fs_usage tmpfsp;
- int first = 1;
+bool stat_path(struct parameter_list *p) {
+ /* Stat entry to check that dir exists and is accessible */
+ if (verbose >= 3)
+ printf("calling stat on %s\n", p->name);
+ if (stat(p->name, &stat_buf[0])) {
+ if (verbose >= 3)
+ printf("stat failed on %s\n", p->name);
+ 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;
+}
+
+void get_stats(struct parameter_list *p, struct fs_usage *fsp) {
+ struct parameter_list *p_list;
+ struct fs_usage tmpfsp;
+ int first = 1;
- if (p->group == NULL) {
- get_path_stats(p,fsp);
- } else {
- /* find all group members */
- for (p_list = path_select_list; p_list; p_list=p_list->name_next) {
+ if (p->group == NULL) {
+ get_path_stats(p, fsp);
+ } else {
+ /* find all group members */
+ for (p_list = path_select_list; p_list; p_list = p_list->name_next) {
#ifdef __CYGWIN__
- if (strncmp(p_list->name, "/cygdrive/", 10) != 0)
- continue;
+ if (strncmp(p_list->name, "/cygdrive/", 10) != 0)
+ continue;
#endif
- if (p_list->group && ! (strcmp(p_list->group, p->group))) {
- 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)
- printf("Group %s: adding %lu blocks sized %lu, (%s) used_units=%lu free_units=%lu total_units=%lu mult=%lu\n",
- p_list->group,
- tmpfsp.fsu_blocks,
- tmpfsp.fsu_blocksize,
- p_list->best_match->me_mountdir,
- p_list->dused_units,
- p_list->dfree_units,
- p_list->dtotal_units,
- mult);
-
- /* prevent counting the first FS of a group twice since its parameter_list entry
- * is used to carry the information of all file systems of the entire group */
- if (! first) {
- p->total += p_list->total;
- p->available += p_list->available;
- p->available_to_root += p_list->available_to_root;
- p->used += p_list->used;
-
- p->dused_units += p_list->dused_units;
- p->dfree_units += p_list->dfree_units;
- p->dtotal_units += p_list->dtotal_units;
- p->inodes_total += p_list->inodes_total;
- p->inodes_free += p_list->inodes_free;
- p->inodes_free_to_root += p_list->inodes_free_to_root;
- p->inodes_used += p_list->inodes_used;
- }
- first = 0;
- }
- if (verbose >= 3)
- printf("Group %s now has: used_units=%lu free_units=%lu total_units=%lu fsu_blocksize=%lu mult=%lu\n",
- p->group,
- p->dused_units,
- p->dfree_units,
- p->dtotal_units,
- tmpfsp.fsu_blocksize,
- mult);
- }
- /* modify devname and mountdir for output */
- p->best_match->me_mountdir = p->best_match->me_devname = p->group;
- }
- /* finally calculate percentages for either plain FS or summed up group */
- p->dused_pct = calculate_percent( p->used, p->used + p->available ); /* used + available can never be > uintmax */
- p->dfree_pct = 100.0 - p->dused_pct;
- p->dused_inodes_percent = calculate_percent(p->inodes_total - p->inodes_free, p->inodes_total);
- p->dfree_inodes_percent = 100 - p->dused_inodes_percent;
-
+ if (p_list->group && !(strcmp(p_list->group, p->group))) {
+ 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)
+ printf("Group %s: adding %lu blocks sized %lu, (%s) used_units=%lu free_units=%lu total_units=%lu mult=%lu\n",
+ p_list->group, tmpfsp.fsu_blocks, tmpfsp.fsu_blocksize, p_list->best_match->me_mountdir, p_list->dused_units,
+ p_list->dfree_units, p_list->dtotal_units, mult);
+
+ /* prevent counting the first FS of a group twice since its parameter_list entry
+ * is used to carry the information of all file systems of the entire group */
+ if (!first) {
+ p->total += p_list->total;
+ p->available += p_list->available;
+ p->available_to_root += p_list->available_to_root;
+ p->used += p_list->used;
+
+ p->dused_units += p_list->dused_units;
+ p->dfree_units += p_list->dfree_units;
+ p->dtotal_units += p_list->dtotal_units;
+ p->inodes_total += p_list->inodes_total;
+ p->inodes_free += p_list->inodes_free;
+ p->inodes_free_to_root += p_list->inodes_free_to_root;
+ p->inodes_used += p_list->inodes_used;
+ }
+ first = 0;
+ }
+ if (verbose >= 3)
+ printf("Group %s now has: used_units=%lu free_units=%lu total_units=%lu fsu_blocksize=%lu mult=%lu\n", p->group,
+ p->dused_units, p->dfree_units, p->dtotal_units, tmpfsp.fsu_blocksize, mult);
+ }
+ /* modify devname and mountdir for output */
+ p->best_match->me_mountdir = p->best_match->me_devname = p->group;
+ }
+ /* finally calculate percentages for either plain FS or summed up group */
+ p->dused_pct = calculate_percent(p->used, p->used + p->available); /* used + available can never be > uintmax */
+ p->dfree_pct = 100.0 - p->dused_pct;
+ p->dused_inodes_percent = calculate_percent(p->inodes_total - p->inodes_free, p->inodes_total);
+ p->dfree_inodes_percent = 100 - p->dused_inodes_percent;
}
-void
-get_path_stats (struct parameter_list *p, struct fs_usage *fsp) {
- p->available = fsp->fsu_bavail;
- p->available_to_root = fsp->fsu_bfree;
- p->used = fsp->fsu_blocks - fsp->fsu_bfree;
- if (freespace_ignore_reserved) {
- /* 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 */
- p->total = fsp->fsu_blocks;
- }
-
- p->dused_units = p->used*fsp->fsu_blocksize/mult;
- 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_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 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;
- } else {
- /* default behaviour : take all the inodes into account */
- p->inodes_total = fsp->fsu_files;
- }
- np_add_name(&seen, p->best_match->me_mountdir);
+void get_path_stats(struct parameter_list *p, struct fs_usage *fsp) {
+ p->available = fsp->fsu_bavail;
+ p->available_to_root = fsp->fsu_bfree;
+ p->used = fsp->fsu_blocks - fsp->fsu_bfree;
+ if (freespace_ignore_reserved) {
+ /* 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 */
+ p->total = fsp->fsu_blocks;
+ }
+
+ p->dused_units = p->used * fsp->fsu_blocksize / mult;
+ 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_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 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;
+ } else {
+ /* default behaviour : take all the inodes into account */
+ p->inodes_total = fsp->fsu_files;
+ }
+ np_add_name(&seen, p->best_match->me_mountdir);
}
--
cgit v0.10-9-g596f