diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index 2558f6d3897d765d2bcb3f99c65e4313b73056d8..a7dd5cce02e331e27c82c61f5c1e29f1dabdcb0e 100644 (file)
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
#include "utils.h"
#include <stdarg.h>
#include "../lib/fsusage.h"
+#include "../lib/mountlist.h"
/* If nonzero, show inode information. */
static int inode_format;
/* A filesystem type to display. */
-struct fs_type_list
+struct name_list
{
- char *fs_name;
- struct fs_type_list *fs_next;
+ char *name;
+ struct name_list *name_next;
};
/* Linked list of filesystem types to display.
Some filesystem types:
4.2 4.3 ufs nfs swap ignore io vm efs dbg */
-static struct fs_type_list *fs_select_list;
+static struct name_list *fs_select_list;
/* Linked list of filesystem types to omit.
If the list is empty, don't exclude any types. */
-static struct fs_type_list *fs_exclude_list;
+static struct name_list *fs_exclude_list;
+
+static struct name_list *dp_exclude_list;
+
+static struct name_list *path_select_list;
+
+static struct name_list *dev_select_list;
/* Linked list of mounted filesystems. */
static struct mount_entry *mount_list;
int process_arguments (int, char **);
int validate_arguments (void);
int check_disk (int usp, int free_disk);
+int walk_name_list (struct name_list *list, const char *name);
void print_help (void);
void print_usage (void);
int erronly = FALSE;
int display_mntp = FALSE;
+/* Linked list of mounted filesystems. */
+static struct mount_entry *mount_list;
int
main (int argc, char **argv)
char file_system[MAX_INPUT_BUFFER];
char mntp[MAX_INPUT_BUFFER];
char *output = "";
+ char *details = "";
+ struct mount_entry *me;
struct fs_usage fsp;
char *disk;
+ mount_list = read_filesystem_list (0);
+
if (process_arguments (argc, argv) != OK)
usage ("Could not parse arguments\n");
- get_fs_usage (path, disk, &fsp);
+ for (me = mount_list; me; me = me->me_next) {
+
+ if ((dev_select_list &&
+ walk_name_list (dev_select_list, me->me_devname)) ||
+ (path_select_list &&
+ walk_name_list (path_select_list, me->me_mountdir)))
+ get_fs_usage (me->me_mountdir, me->me_devname, &fsp);
+ else if (dev_select_list || path_select_list)
+ continue;
+ else if (fs_exclude_list && walk_name_list (fs_exclude_list, me->me_type))
+ continue;
+ else if (dp_exclude_list &&
+ walk_name_list (dp_exclude_list, me->me_devname) ||
+ walk_name_list (dp_exclude_list, me->me_mountdir))
+ continue;
+ else
+ get_fs_usage (me->me_mountdir, me->me_devname, &fsp);
+
+ if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) {
+ usp = (fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks;
+ disk_result = check_disk (usp, fsp.fsu_bavail);
+ result = max_state (disk_result, result);
+ if (disk_result==STATE_OK && erronly && !verbose)
+ continue;
+
+ if (disk_result!=STATE_OK || verbose>=0)
+ asprintf (&output, "%s [%llu MB (%2.0f%%) free on %s]",
+ output,
+ fsp.fsu_bavail*fsp.fsu_blocksize/1024/1024,
+ (double)fsp.fsu_bavail*100/fsp.fsu_blocks,
+ (!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir);
+ asprintf (&details, "%s\n%llu of %llu MB (%2.0f%%) free on %s (type %s mounted on %s)",
+ details,
+ fsp.fsu_bavail*fsp.fsu_blocksize/1024/1024,
+ fsp.fsu_blocks*fsp.fsu_blocksize/1024/1024,
+ (double)fsp.fsu_bavail*100/fsp.fsu_blocks,
+ me->me_devname,
+ me->me_type,
+ me->me_mountdir);
+ }
+
+ }
- usp = (fsp.fsu_blocks - fsp.fsu_bavail) / fsp.fsu_blocks;
- disk_result = check_disk (usp, fsp.fsu_bavail);
- result = disk_result;
- asprintf (&output, "%llu of %llu kB (%2.0f%%) free (%d-byte blocks)",
- fsp.fsu_bavail*fsp.fsu_blocksize/1024,
- fsp.fsu_blocks*fsp.fsu_blocksize/1024,
- (double)fsp.fsu_bavail*100/fsp.fsu_blocks,
- fsp.fsu_blocksize);
+ if (verbose > 2)
+ asprintf (&output, "%s%s", output, details);
- terminate (result, "DISK %s %s\n", state_text (result), output);
+ terminate (result, "DISK %s%s\n", state_text (result), output, details);
}
+
+
+\f
/* process command-line arguments */
int
process_arguments (int argc, char **argv)
{
int c;
+ struct name_list *se;
+ struct name_list **pathtail = &path_select_list;
+ struct name_list **devtail = &dev_select_list;
+ struct name_list **fstail = &fs_exclude_list;
+ struct name_list **dptail = &dp_exclude_list;
int option_index = 0;
static struct option long_options[] = {
{"errors-only", no_argument, 0, 'e'},
{"help", no_argument, 0, 'h'},
{"mountpoint", no_argument, 0, 'm'},
+ {"device", no_argument, 0, 'd'},
{"exclude_device", required_argument, 0, 'x'},
{"quiet", no_argument, 0, 'q'},
strcpy (argv[c], "-t");
while (1) {
- c = getopt_long (argc, argv, "+?Vqhvet:c:w:p:x:m", long_options, &option_index);
+ c = getopt_long (argc, argv, "+?Vqhvet:c:w:p:d:x:X:m", long_options, &option_index);
if (c == -1 || c == EOF)
break;
else {
usage ("Timeout Interval must be an integer!\n");
}
- case 'p': /* path or partition */
- path = optarg;
+ case 'p': /* selec path */
+ se = (struct name_list *) malloc (sizeof (struct name_list));
+ se->name = strdup (optarg);
+ se->name_next = NULL;
+ *pathtail = se;
+ pathtail = &se->name_next;
+ break;
+ case 'd': /* select partition/device */
+ se = (struct name_list *) malloc (sizeof (struct name_list));
+ se->name = strdup (optarg);
+ se->name_next = NULL;
+ *devtail = se;
+ devtail = &se->name_next;
+ break;
+ case 'x': /* exclude path or partition */
+ se = (struct name_list *) malloc (sizeof (struct name_list));
+ se->name = strdup (optarg);
+ se->name_next = NULL;
+ *dptail = se;
+ dptail = &se->name_next;
+ break;
+ break;
+ case 'X': /* exclude file system type */
+ se = (struct name_list *) malloc (sizeof (struct name_list));
+ se->name = strdup (optarg);
+ se->name_next = NULL;
+ *fstail = se;
+ fstail = &se->name_next;
break;
case 'v': /* verbose */
verbose++;
case 'm': /* display mountpoint */
display_mntp = TRUE;
break;
- case 'x': /* exclude path or partition */
- exclude_device = optarg;
- break;
case 'V': /* version */
print_revision (progname, revision);
exit (STATE_OK);
return validate_arguments ();
}
+
+
int
validate_arguments ()
{
}
}
+
+
+\f
int
-check_disk (usp, free_disk)
+check_disk (int usp, int free_disk)
{
int result = STATE_UNKNOWN;
/* check the percent used space against thresholds */
return result;
}
+
+
+int
+walk_name_list (struct name_list *list, const char *name)
+{
+ while (list) {
+ if (! strcmp(list->name, name))
+ return TRUE;
+ list = list->name_next;
+ }
+ return FALSE;
+}
+
+
+
+\f
void
print_help (void)
{