diff options
| -rw-r--r-- | plugins/check_disk.c | 70 |
1 files changed, 59 insertions, 11 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 512344d4..960902fc 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
| @@ -64,6 +64,7 @@ struct name_list | |||
| 64 | { | 64 | { |
| 65 | char *name; | 65 | char *name; |
| 66 | int found; | 66 | int found; |
| 67 | int found_len; | ||
| 67 | uintmax_t w_df; | 68 | uintmax_t w_df; |
| 68 | uintmax_t c_df; | 69 | uintmax_t c_df; |
| 69 | double w_dfp; | 70 | double w_dfp; |
| @@ -166,26 +167,56 @@ main (int argc, char **argv) | |||
| 166 | if (process_arguments (argc, argv) == ERROR) | 167 | if (process_arguments (argc, argv) == ERROR) |
| 167 | usage4 (_("Could not parse arguments")); | 168 | usage4 (_("Could not parse arguments")); |
| 168 | 169 | ||
| 169 | for (me = mount_list; me; me = me->me_next) { | 170 | /* if a list of paths has been selected, preseed the list with |
| 171 | * the longest matching filesystem name by iterating across | ||
| 172 | * the mountlist once ahead of time. this will allow a query on | ||
| 173 | * "/var/log" to return information about "/var" if no "/var/log" | ||
| 174 | * filesystem exists, etc. this is the default behavior already | ||
| 175 | * with df-based checks, but for systems with their own space | ||
| 176 | * checking routines, this should make them more consistent. | ||
| 177 | */ | ||
| 178 | if(path_select_list){ | ||
| 179 | for (me = mount_list; me; me = me->me_next) { | ||
| 180 | walk_name_list(path_select_list, me->me_mountdir); | ||
| 181 | walk_name_list(path_select_list, me->me_devname); | ||
| 182 | } | ||
| 183 | /* now pretend we never saw anything, but keep found_len. | ||
| 184 | * thus future searches will only match the best match */ | ||
| 185 | for (temp_list = path_select_list; temp_list; temp_list=temp_list->name_next){ | ||
| 186 | temp_list->found=0; | ||
| 187 | } | ||
| 188 | } | ||
| 170 | 189 | ||
| 190 | /* for every mount entry */ | ||
| 191 | for (me = mount_list; me; me = me->me_next) { | ||
| 192 | /* if there's a list of paths to select, the current mount | ||
| 193 | * entry matches in path or device name, get fs usage */ | ||
| 171 | if (path_select_list && | 194 | if (path_select_list && |
| 172 | (walk_name_list (path_select_list, me->me_mountdir) || | 195 | (walk_name_list (path_select_list, me->me_mountdir) || |
| 173 | walk_name_list (path_select_list, me->me_devname) ) ) | 196 | walk_name_list (path_select_list, me->me_devname) ) ) { |
| 174 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 197 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); |
| 175 | else if (dev_select_list || path_select_list) | 198 | /* else if there's a list of paths/devices to select (but |
| 199 | * we didn't match above) skip to the next mount entry */ | ||
| 200 | } else if (dev_select_list || path_select_list) { | ||
| 176 | continue; | 201 | continue; |
| 177 | else if (me->me_remote && show_local_fs) | 202 | /* skip remote filesystems if we're not interested in them */ |
| 203 | } else if (me->me_remote && show_local_fs) { | ||
| 178 | continue; | 204 | continue; |
| 179 | else if (me->me_dummy && !show_all_fs) | 205 | /* skip pseudo fs's if we haven't asked for all fs's */ |
| 206 | } else if (me->me_dummy && !show_all_fs) { | ||
| 180 | continue; | 207 | continue; |
| 181 | else if (fs_exclude_list && walk_name_list (fs_exclude_list, me->me_type)) | 208 | /* skip excluded fstypes */ |
| 209 | } else if (fs_exclude_list && walk_name_list (fs_exclude_list, me->me_type)) { | ||
| 182 | continue; | 210 | continue; |
| 183 | else if (dp_exclude_list && | 211 | /* skip excluded fs's */ |
| 212 | } else if (dp_exclude_list && | ||
| 184 | (walk_name_list (dp_exclude_list, me->me_devname) || | 213 | (walk_name_list (dp_exclude_list, me->me_devname) || |
| 185 | walk_name_list (dp_exclude_list, me->me_mountdir))) | 214 | walk_name_list (dp_exclude_list, me->me_mountdir))) { |
| 186 | continue; | 215 | continue; |
| 187 | else | 216 | /* otherwise, get fs usage */ |
| 217 | } else { | ||
| 188 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 218 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); |
| 219 | } | ||
| 189 | 220 | ||
| 190 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { | 221 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { |
| 191 | usp = (double)(fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; | 222 | usp = (double)(fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; |
| @@ -229,7 +260,7 @@ main (int argc, char **argv) | |||
| 229 | /* Override result if paths specified and not found */ | 260 | /* Override result if paths specified and not found */ |
| 230 | temp_list = path_select_list; | 261 | temp_list = path_select_list; |
| 231 | while (temp_list) { | 262 | while (temp_list) { |
| 232 | if (temp_list->found != TRUE) { | 263 | if (!temp_list->found) { |
| 233 | asprintf (&output, _("%s [%s not found]"), output, temp_list->name); | 264 | asprintf (&output, _("%s [%s not found]"), output, temp_list->name); |
| 234 | result = STATE_CRITICAL; | 265 | result = STATE_CRITICAL; |
| 235 | } | 266 | } |
| @@ -285,6 +316,8 @@ process_arguments (int argc, char **argv) | |||
| 285 | se = (struct name_list *) malloc (sizeof (struct name_list)); | 316 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
| 286 | se->name = strdup ("iso9660"); | 317 | se->name = strdup ("iso9660"); |
| 287 | se->name_next = NULL; | 318 | se->name_next = NULL; |
| 319 | se->found = 0; | ||
| 320 | se->found_len = 0; | ||
| 288 | *fstail = se; | 321 | *fstail = se; |
| 289 | fstail = &se->name_next; | 322 | fstail = &se->name_next; |
| 290 | 323 | ||
| @@ -388,6 +421,8 @@ process_arguments (int argc, char **argv) | |||
| 388 | se->c_df = c_df; | 421 | se->c_df = c_df; |
| 389 | se->w_dfp = w_dfp; | 422 | se->w_dfp = w_dfp; |
| 390 | se->c_dfp = c_dfp; | 423 | se->c_dfp = c_dfp; |
| 424 | se->found = 0; | ||
| 425 | se->found_len = 0; | ||
| 391 | *pathtail = se; | 426 | *pathtail = se; |
| 392 | pathtail = &se->name_next; | 427 | pathtail = &se->name_next; |
| 393 | break; | 428 | break; |
| @@ -399,6 +434,8 @@ process_arguments (int argc, char **argv) | |||
| 399 | se->c_df = 0; | 434 | se->c_df = 0; |
| 400 | se->w_dfp = -1.0; | 435 | se->w_dfp = -1.0; |
| 401 | se->c_dfp = -1.0; | 436 | se->c_dfp = -1.0; |
| 437 | se->found = 0; | ||
| 438 | se->found_len = 0; | ||
| 402 | *dptail = se; | 439 | *dptail = se; |
| 403 | dptail = &se->name_next; | 440 | dptail = &se->name_next; |
| 404 | break; | 441 | break; |
| @@ -410,6 +447,8 @@ process_arguments (int argc, char **argv) | |||
| 410 | se->c_df = 0; | 447 | se->c_df = 0; |
| 411 | se->w_dfp = -1.0; | 448 | se->w_dfp = -1.0; |
| 412 | se->c_dfp = -1.0; | 449 | se->c_dfp = -1.0; |
| 450 | se->found = 0; | ||
| 451 | se->found_len = 0; | ||
| 413 | *fstail = se; | 452 | *fstail = se; |
| 414 | fstail = &se->name_next; | 453 | fstail = &se->name_next; |
| 415 | break; | 454 | break; |
| @@ -458,6 +497,8 @@ process_arguments (int argc, char **argv) | |||
| 458 | se->c_df = c_df; | 497 | se->c_df = c_df; |
| 459 | se->w_dfp = w_dfp; | 498 | se->w_dfp = w_dfp; |
| 460 | se->c_dfp = c_dfp; | 499 | se->c_dfp = c_dfp; |
| 500 | se->found =0; | ||
| 501 | se->found_len = 0; | ||
| 461 | *pathtail = se; | 502 | *pathtail = se; |
| 462 | } | 503 | } |
| 463 | 504 | ||
| @@ -549,9 +590,16 @@ check_disk (double usp, double free_disk) | |||
| 549 | int | 590 | int |
| 550 | walk_name_list (struct name_list *list, const char *name) | 591 | walk_name_list (struct name_list *list, const char *name) |
| 551 | { | 592 | { |
| 593 | int name_len; | ||
| 594 | name_len = strlen(name); | ||
| 552 | while (list) { | 595 | while (list) { |
| 553 | if (! strcmp(list->name, name)) { | 596 | /* if the paths match up to the length of the mount path, |
| 597 | * AND if the mount path name is longer than the longest | ||
| 598 | * found match, we have a new winner */ | ||
| 599 | if (name_len >= list->found_len && | ||
| 600 | ! strncmp(list->name, name, name_len)) { | ||
| 554 | list->found = 1; | 601 | list->found = 1; |
| 602 | list->found_len = name_len; | ||
| 555 | /* if required for name_lists that have not saved w_df, etc (eg exclude lists) */ | 603 | /* if required for name_lists that have not saved w_df, etc (eg exclude lists) */ |
| 556 | if (list->w_df) w_df = list->w_df; | 604 | if (list->w_df) w_df = list->w_df; |
| 557 | if (list->c_df) c_df = list->c_df; | 605 | if (list->c_df) c_df = list->c_df; |
