diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_disk.c | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index f9a9a847..97465113 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
| @@ -91,10 +91,10 @@ static int require_sync = 0; | |||
| 91 | 91 | ||
| 92 | /* A filesystem type to display. */ | 92 | /* A filesystem type to display. */ |
| 93 | 93 | ||
| 94 | struct fs_type_list | 94 | struct name_list |
| 95 | { | 95 | { |
| 96 | char *fs_name; | 96 | char *name; |
| 97 | struct fs_type_list *fs_next; | 97 | struct name_list *name_next; |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | /* Linked list of filesystem types to display. | 100 | /* Linked list of filesystem types to display. |
| @@ -108,12 +108,16 @@ struct fs_type_list | |||
| 108 | Some filesystem types: | 108 | Some filesystem types: |
| 109 | 4.2 4.3 ufs nfs swap ignore io vm efs dbg */ | 109 | 4.2 4.3 ufs nfs swap ignore io vm efs dbg */ |
| 110 | 110 | ||
| 111 | static struct fs_type_list *fs_select_list; | 111 | static struct name_list *fs_select_list; |
| 112 | 112 | ||
| 113 | /* Linked list of filesystem types to omit. | 113 | /* Linked list of filesystem types to omit. |
| 114 | If the list is empty, don't exclude any types. */ | 114 | If the list is empty, don't exclude any types. */ |
| 115 | 115 | ||
| 116 | static struct fs_type_list *fs_exclude_list; | 116 | static struct name_list *fs_exclude_list; |
| 117 | |||
| 118 | static struct name_list *path_select_list; | ||
| 119 | |||
| 120 | static struct name_list *dev_select_list; | ||
| 117 | 121 | ||
| 118 | /* Linked list of mounted filesystems. */ | 122 | /* Linked list of mounted filesystems. */ |
| 119 | static struct mount_entry *mount_list; | 123 | static struct mount_entry *mount_list; |
| @@ -169,28 +173,36 @@ main (int argc, char **argv) | |||
| 169 | struct fs_usage fsp; | 173 | struct fs_usage fsp; |
| 170 | char *disk; | 174 | char *disk; |
| 171 | 175 | ||
| 176 | mount_list = read_filesystem_list (0); | ||
| 177 | |||
| 172 | if (process_arguments (argc, argv) != OK) | 178 | if (process_arguments (argc, argv) != OK) |
| 173 | usage ("Could not parse arguments\n"); | 179 | usage ("Could not parse arguments\n"); |
| 174 | 180 | ||
| 175 | mount_list = read_filesystem_list (0); | ||
| 176 | |||
| 177 | for (me = mount_list; me; me = me->me_next) { | 181 | for (me = mount_list; me; me = me->me_next) { |
| 178 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 182 | |
| 183 | if ((dev_select_list && | ||
| 184 | ! strcmp (dev_select_list->name, me->me_devname)) || | ||
| 185 | (path_select_list && | ||
| 186 | ! strcmp (path_select_list->name, me->me_mountdir))) | ||
| 187 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | ||
| 188 | else if (dev_select_list || path_select_list) | ||
| 189 | continue; | ||
| 190 | else | ||
| 191 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | ||
| 192 | |||
| 179 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { | 193 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { |
| 180 | usp = (fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; | 194 | usp = (fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; |
| 181 | disk_result = check_disk (usp, fsp.fsu_bavail); | 195 | disk_result = check_disk (usp, fsp.fsu_bavail); |
| 182 | result = max_state (disk_result, result); | 196 | result = max_state (disk_result, result); |
| 183 | asprintf (&output, "%s %llu of %llu kB (%2.0f%%) free (%d-byte blocks) on %s (%s) %d\n", | 197 | asprintf (&output, "%s %llu of %llu MB (%2.0f%%) free on %s\n", |
| 184 | output, | 198 | output, |
| 185 | fsp.fsu_bavail*fsp.fsu_blocksize/1024, | 199 | fsp.fsu_bavail*fsp.fsu_blocksize/1024/1024, |
| 186 | fsp.fsu_blocks*fsp.fsu_blocksize/1024, | 200 | fsp.fsu_blocks*fsp.fsu_blocksize/1024/1024, |
| 187 | (double)fsp.fsu_bavail*100/fsp.fsu_blocks, | 201 | (double)fsp.fsu_bavail*100/fsp.fsu_blocks, |
| 188 | fsp.fsu_blocksize, | 202 | display_mntp ? me->me_devname : me->me_mountdir); |
| 189 | me->me_mountdir, | ||
| 190 | me->me_type, usp); | ||
| 191 | } | 203 | } |
| 192 | } | ||
| 193 | 204 | ||
| 205 | } | ||
| 194 | 206 | ||
| 195 | terminate (result, "DISK %s %s\n", state_text (result), output); | 207 | terminate (result, "DISK %s %s\n", state_text (result), output); |
| 196 | } | 208 | } |
| @@ -200,6 +212,9 @@ int | |||
| 200 | process_arguments (int argc, char **argv) | 212 | process_arguments (int argc, char **argv) |
| 201 | { | 213 | { |
| 202 | int c; | 214 | int c; |
| 215 | struct name_list *se; | ||
| 216 | struct name_list **pathtail = &path_select_list; | ||
| 217 | struct name_list **devtail = &dev_select_list; | ||
| 203 | 218 | ||
| 204 | int option_index = 0; | 219 | int option_index = 0; |
| 205 | static struct option long_options[] = { | 220 | static struct option long_options[] = { |
| @@ -213,6 +228,7 @@ process_arguments (int argc, char **argv) | |||
| 213 | {"errors-only", no_argument, 0, 'e'}, | 228 | {"errors-only", no_argument, 0, 'e'}, |
| 214 | {"help", no_argument, 0, 'h'}, | 229 | {"help", no_argument, 0, 'h'}, |
| 215 | {"mountpoint", no_argument, 0, 'm'}, | 230 | {"mountpoint", no_argument, 0, 'm'}, |
| 231 | {"device", no_argument, 0, 'd'}, | ||
| 216 | {"exclude_device", required_argument, 0, 'x'}, | 232 | {"exclude_device", required_argument, 0, 'x'}, |
| 217 | {"quiet", no_argument, 0, 'q'}, | 233 | {"quiet", no_argument, 0, 'q'}, |
| 218 | 234 | ||
| @@ -227,7 +243,7 @@ process_arguments (int argc, char **argv) | |||
| 227 | strcpy (argv[c], "-t"); | 243 | strcpy (argv[c], "-t"); |
| 228 | 244 | ||
| 229 | while (1) { | 245 | while (1) { |
| 230 | c = getopt_long (argc, argv, "+?Vqhvet:c:w:p:x:m", long_options, &option_index); | 246 | c = getopt_long (argc, argv, "+?Vqhvet:c:w:p:d:x:m", long_options, &option_index); |
| 231 | 247 | ||
| 232 | if (c == -1 || c == EOF) | 248 | if (c == -1 || c == EOF) |
| 233 | break; | 249 | break; |
| @@ -274,7 +290,16 @@ process_arguments (int argc, char **argv) | |||
| 274 | usage ("Timeout Interval must be an integer!\n"); | 290 | usage ("Timeout Interval must be an integer!\n"); |
| 275 | } | 291 | } |
| 276 | case 'p': /* path or partition */ | 292 | case 'p': /* path or partition */ |
| 277 | path = optarg; | 293 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
| 294 | se->name = strdup (optarg); | ||
| 295 | *pathtail = se; | ||
| 296 | pathtail = &se->name_next; | ||
| 297 | break; | ||
| 298 | case 'd': /* path or partition */ | ||
| 299 | se = (struct name_list *) malloc (sizeof (struct name_list)); | ||
| 300 | se->name = strdup (optarg); | ||
| 301 | *devtail = se; | ||
| 302 | devtail = &se->name_next; | ||
| 278 | break; | 303 | break; |
| 279 | case 'v': /* verbose */ | 304 | case 'v': /* verbose */ |
| 280 | verbose++; | 305 | verbose++; |
