diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/check_disk.c | 92 |
1 files changed, 72 insertions, 20 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 7bd044a..1009564 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -150,6 +150,7 @@ char *crit_usedinodes_percent = NULL; | |||
150 | char *warn_freeinodes_percent = NULL; | 150 | char *warn_freeinodes_percent = NULL; |
151 | char *crit_freeinodes_percent = NULL; | 151 | char *crit_freeinodes_percent = NULL; |
152 | bool path_selected = false; | 152 | bool path_selected = false; |
153 | char *group = NULL; | ||
153 | 154 | ||
154 | 155 | ||
155 | int | 156 | int |
@@ -171,7 +172,7 @@ main (int argc, char **argv) | |||
171 | int temp_result; | 172 | int temp_result; |
172 | 173 | ||
173 | struct mount_entry *me; | 174 | struct mount_entry *me; |
174 | struct fs_usage fsp; | 175 | struct fs_usage fsp, tmpfsp; |
175 | struct parameter_list *temp_list, *path; | 176 | struct parameter_list *temp_list, *path; |
176 | struct name_list *seen = NULL; | 177 | struct name_list *seen = NULL; |
177 | 178 | ||
@@ -198,6 +199,7 @@ main (int argc, char **argv) | |||
198 | path = np_add_parameter(&path_select_list, me->me_mountdir); | 199 | path = np_add_parameter(&path_select_list, me->me_mountdir); |
199 | } | 200 | } |
200 | path->best_match = me; | 201 | path->best_match = me; |
202 | path->group = group; | ||
201 | set_all_thresholds(path); | 203 | set_all_thresholds(path); |
202 | } | 204 | } |
203 | } | 205 | } |
@@ -220,6 +222,9 @@ main (int argc, char **argv) | |||
220 | printf("Thresholds(pct) for %s warn: %f crit %f\n",path->name, path->freespace_percent->warning->end, | 222 | printf("Thresholds(pct) for %s warn: %f crit %f\n",path->name, path->freespace_percent->warning->end, |
221 | path->freespace_percent->critical->end); | 223 | path->freespace_percent->critical->end); |
222 | 224 | ||
225 | if (verbose > 3 && path->group != NULL) | ||
226 | printf("Group of %s: %s\n",path->name,path->group); | ||
227 | |||
223 | /* reset disk result */ | 228 | /* reset disk result */ |
224 | disk_result = STATE_UNKNOWN; | 229 | disk_result = STATE_UNKNOWN; |
225 | 230 | ||
@@ -231,25 +236,62 @@ main (int argc, char **argv) | |||
231 | if (np_seen_name(seen, me->me_mountdir)) { | 236 | if (np_seen_name(seen, me->me_mountdir)) { |
232 | continue; | 237 | continue; |
233 | } else { | 238 | } else { |
234 | np_add_name(&seen, me->me_mountdir); | 239 | if (path->group != NULL) { |
235 | } | 240 | /* find all group members */ |
236 | /* Skip remote filesystems if we're not interested in them */ | 241 | fsp.fsu_blocksize = 0; |
237 | if (me->me_remote && show_local_fs) { | 242 | fsp.fsu_blocks = 0; |
238 | continue; | 243 | fsp.fsu_bfree = 0; |
239 | /* Skip pseudo fs's if we haven't asked for all fs's */ | 244 | fsp.fsu_bavail = 0; |
240 | } else if (me->me_dummy && !show_all_fs) { | 245 | fsp.fsu_files = 0; |
241 | continue; | 246 | fsp.fsu_ffree = 0; |
242 | /* Skip excluded fstypes */ | 247 | |
243 | } else if (fs_exclude_list && np_find_name (fs_exclude_list, me->me_type)) { | 248 | |
244 | continue; | 249 | for (temp_list = path_select_list; temp_list; temp_list=temp_list->name_next) { |
245 | /* Skip excluded fs's */ | 250 | if (temp_list->group && ! (strcmp(temp_list->group, path->group))) { |
246 | } else if (dp_exclude_list && | 251 | |
247 | (np_find_name (dp_exclude_list, me->me_devname) || | 252 | get_fs_usage (temp_list->best_match->me_mountdir, temp_list->best_match->me_devname, &tmpfsp); |
248 | np_find_name (dp_exclude_list, me->me_mountdir))) { | 253 | |
249 | continue; | 254 | /* possibly differing blocksizes if disks are grouped. Calculating average */ |
255 | fsp.fsu_blocksize = (fsp.fsu_blocksize * fsp.fsu_blocks + tmpfsp.fsu_blocksize * tmpfsp.fsu_blocks) / \ | ||
256 | (fsp.fsu_blocks + tmpfsp.fsu_blocks); /* Size of a block. */ | ||
257 | fsp.fsu_blocks += tmpfsp.fsu_blocks; /* Total blocks. */ | ||
258 | fsp.fsu_bfree += tmpfsp.fsu_bfree; /* Free blocks available to superuser. */ | ||
259 | fsp.fsu_bavail += tmpfsp.fsu_bavail; /* Free blocks available to non-superuser. */ | ||
260 | fsp.fsu_files += tmpfsp.fsu_files; /* Total file nodes. */ | ||
261 | fsp.fsu_ffree += tmpfsp.fsu_ffree; /* Free file nodes. */ | ||
262 | |||
263 | if (verbose > 3) | ||
264 | printf("Group %s: add %llu blocks (%s) \n", path->group, tmpfsp.fsu_bavail, temp_list->name); | ||
265 | // printf("Group %s: add %u blocks (%s)\n", temp_list->name); // path->group, tmpfsp.fsu_bavail, temp_list->name); | ||
266 | |||
267 | np_add_name(&seen, temp_list->best_match->me_mountdir); | ||
268 | } | ||
269 | } | ||
270 | /* modify devname and mountdir for output */ | ||
271 | me->me_mountdir = me->me_devname = path->group; | ||
272 | } else | ||
273 | np_add_name(&seen, me->me_mountdir); | ||
250 | } | 274 | } |
251 | 275 | ||
252 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 276 | if (path->group == NULL) { |
277 | /* Skip remote filesystems if we're not interested in them */ | ||
278 | if (me->me_remote && show_local_fs) { | ||
279 | continue; | ||
280 | /* Skip pseudo fs's if we haven't asked for all fs's */ | ||
281 | } else if (me->me_dummy && !show_all_fs) { | ||
282 | continue; | ||
283 | /* Skip excluded fstypes */ | ||
284 | } else if (fs_exclude_list && np_find_name (fs_exclude_list, me->me_type)) { | ||
285 | continue; | ||
286 | /* Skip excluded fs's */ | ||
287 | } else if (dp_exclude_list && | ||
288 | (np_find_name (dp_exclude_list, me->me_devname) || | ||
289 | np_find_name (dp_exclude_list, me->me_mountdir))) { | ||
290 | continue; | ||
291 | } | ||
292 | |||
293 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | ||
294 | } | ||
253 | 295 | ||
254 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { | 296 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { |
255 | total = fsp.fsu_blocks; | 297 | total = fsp.fsu_blocks; |
@@ -417,6 +459,7 @@ process_arguments (int argc, char **argv) | |||
417 | {"partition", required_argument, 0, 'p'}, | 459 | {"partition", required_argument, 0, 'p'}, |
418 | {"exclude_device", required_argument, 0, 'x'}, | 460 | {"exclude_device", required_argument, 0, 'x'}, |
419 | {"exclude-type", required_argument, 0, 'X'}, | 461 | {"exclude-type", required_argument, 0, 'X'}, |
462 | {"group", required_argument, 0, 'g'}, | ||
420 | {"mountpoint", no_argument, 0, 'M'}, | 463 | {"mountpoint", no_argument, 0, 'M'}, |
421 | {"errors-only", no_argument, 0, 'e'}, | 464 | {"errors-only", no_argument, 0, 'e'}, |
422 | {"exact-match", no_argument, 0, 'E'}, | 465 | {"exact-match", no_argument, 0, 'E'}, |
@@ -438,7 +481,7 @@ process_arguments (int argc, char **argv) | |||
438 | strcpy (argv[c], "-t"); | 481 | strcpy (argv[c], "-t"); |
439 | 482 | ||
440 | while (1) { | 483 | while (1) { |
441 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklME", longopts, &option); | 484 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklg:ME", longopts, &option); |
442 | 485 | ||
443 | if (c == -1 || c == EOF) | 486 | if (c == -1 || c == EOF) |
444 | break; | 487 | break; |
@@ -556,7 +599,7 @@ process_arguments (int argc, char **argv) | |||
556 | if (! (se = np_find_parameter(path_select_list, optarg))) { | 599 | if (! (se = np_find_parameter(path_select_list, optarg))) { |
557 | se = np_add_parameter(&path_select_list, optarg); | 600 | se = np_add_parameter(&path_select_list, optarg); |
558 | } | 601 | } |
559 | 602 | se->group = group; | |
560 | set_all_thresholds(se); | 603 | set_all_thresholds(se); |
561 | path_selected = true; | 604 | path_selected = true; |
562 | break; | 605 | break; |
@@ -578,6 +621,11 @@ process_arguments (int argc, char **argv) | |||
578 | case 'E': | 621 | case 'E': |
579 | exact_match = TRUE; | 622 | exact_match = TRUE; |
580 | break; | 623 | break; |
624 | case 'g': | ||
625 | if (path_selected) | ||
626 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before using -p\n")); | ||
627 | group = optarg; | ||
628 | break; | ||
581 | case 'M': /* display mountpoint */ | 629 | case 'M': /* display mountpoint */ |
582 | display_mntp = TRUE; | 630 | display_mntp = TRUE; |
583 | break; | 631 | break; |
@@ -590,6 +638,7 @@ process_arguments (int argc, char **argv) | |||
590 | if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) | 638 | if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) |
591 | path = np_add_parameter(&path_select_list, me->me_mountdir); | 639 | path = np_add_parameter(&path_select_list, me->me_mountdir); |
592 | path->best_match = me; | 640 | path->best_match = me; |
641 | path->group = group; | ||
593 | set_all_thresholds(path); | 642 | set_all_thresholds(path); |
594 | } | 643 | } |
595 | } | 644 | } |
@@ -607,6 +656,7 @@ process_arguments (int argc, char **argv) | |||
607 | crit_freeinodes_percent = NULL; | 656 | crit_freeinodes_percent = NULL; |
608 | 657 | ||
609 | path_selected = false; | 658 | path_selected = false; |
659 | group = NULL; | ||
610 | break; | 660 | break; |
611 | case 'V': /* version */ | 661 | case 'V': /* version */ |
612 | print_revision (progname, revision); | 662 | print_revision (progname, revision); |
@@ -774,6 +824,8 @@ print_help (void) | |||
774 | printf (" %s\n", _("Only check local filesystems")); | 824 | printf (" %s\n", _("Only check local filesystems")); |
775 | printf (" %s\n", "-p, --path=PATH, --partition=PARTITION"); | 825 | printf (" %s\n", "-p, --path=PATH, --partition=PARTITION"); |
776 | printf (" %s\n", _("Path or partition (may be repeated)")); | 826 | printf (" %s\n", _("Path or partition (may be repeated)")); |
827 | printf (" %s\n", "-g, --group=NAME"); | ||
828 | printf (" %s\n", _("Group pathes. Thresholds apply to (free-)space of all partitions together")); | ||
777 | printf (" %s\n", "-x, --exclude_device=PATH <STRING>"); | 829 | printf (" %s\n", "-x, --exclude_device=PATH <STRING>"); |
778 | printf (" %s\n", _("Ignore device (only works if -p unspecified)")); | 830 | printf (" %s\n", _("Ignore device (only works if -p unspecified)")); |
779 | printf (" %s\n", "-X, --exclude-type=TYPE <STRING>"); | 831 | printf (" %s\n", "-X, --exclude-type=TYPE <STRING>"); |