diff options
Diffstat (limited to 'plugins/check_swap.c')
| -rw-r--r-- | plugins/check_swap.c | 163 |
1 files changed, 82 insertions, 81 deletions
diff --git a/plugins/check_swap.c b/plugins/check_swap.c index 96eacf35..5edb8061 100644 --- a/plugins/check_swap.c +++ b/plugins/check_swap.c | |||
| @@ -30,12 +30,11 @@ | |||
| 30 | #include "utils.h" | 30 | #include "utils.h" |
| 31 | 31 | ||
| 32 | const char *progname = "check_swap"; | 32 | const char *progname = "check_swap"; |
| 33 | #define REVISION "$Revision$" | 33 | const char *revision = "$Revision$"; |
| 34 | #define COPYRIGHT "2000-2002" | 34 | const char *copyright = "2000-2003"; |
| 35 | #define AUTHOR "Karl DeBisschop" | 35 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
| 36 | #define EMAIL "kdebisschop@users.sourceforge.net" | ||
| 37 | #define SUMMARY "Check swap space on local server.\n" | ||
| 38 | 36 | ||
| 37 | int check_swap (int usp, int free_swap); | ||
| 39 | int process_arguments (int argc, char **argv); | 38 | int process_arguments (int argc, char **argv); |
| 40 | int validate_arguments (void); | 39 | int validate_arguments (void); |
| 41 | void print_usage (void); | 40 | void print_usage (void); |
| @@ -52,16 +51,68 @@ int allswaps; | |||
| 52 | int sun = 0; /* defined by compiler if it is a sun solaris system */ | 51 | int sun = 0; /* defined by compiler if it is a sun solaris system */ |
| 53 | #endif | 52 | #endif |
| 54 | 53 | ||
| 54 | void | ||
| 55 | print_usage (void) | ||
| 56 | { | ||
| 57 | printf (_("Usage:\n\ | ||
| 58 | %s [-a] -w <used_percentage>%% -c <used_percentage>%%\n\ | ||
| 59 | %s [-a] -w <bytes_free> -c <bytes_free>\n\ | ||
| 60 | %s (-h | --help) for detailed help\n\ | ||
| 61 | %s (-V | --version) for version information\n"), | ||
| 62 | progname, progname, progname, progname); | ||
| 63 | } | ||
| 64 | |||
| 65 | |||
| 66 | |||
| 67 | |||
| 68 | |||
| 69 | void | ||
| 70 | print_help (void) | ||
| 71 | { | ||
| 72 | print_revision (progname, revision); | ||
| 73 | |||
| 74 | printf (_(COPYRIGHT), copyright, email); | ||
| 75 | |||
| 76 | printf (_("Check swap space on local server.\n\n")); | ||
| 77 | |||
| 78 | print_usage (); | ||
| 79 | |||
| 80 | printf (_(HELP_VRSN)); | ||
| 81 | |||
| 82 | printf (_("\n\ | ||
| 83 | -w, --warning=INTEGER\n\ | ||
| 84 | Exit with WARNING status if less than INTEGER bytes of swap space are free\n\ | ||
| 85 | -w, --warning=PERCENT%%\n\ | ||
| 86 | Exit with WARNING status if less than PERCENT of swap space has been used\n\ | ||
| 87 | -c, --critical=INTEGER\n\ | ||
| 88 | Exit with CRITICAL status if less than INTEGER bytes of swap space are free\n\ | ||
| 89 | -c, --critical=PERCENT%%\n\ | ||
| 90 | Exit with CRITCAL status if less than PERCENT of swap space has been used\n\ | ||
| 91 | -a, --allswaps\n\ | ||
| 92 | Conduct comparisons for all swap partitions, one by one\n")); | ||
| 93 | |||
| 94 | #ifdef sun | ||
| 95 | printf (_("\n\ | ||
| 96 | On Solaris, if -a specified, uses swap -l, otherwise uses swap -s.\n\ | ||
| 97 | Will be discrepencies because swap -s counts allocated swap and includes\n\ | ||
| 98 | real memory\n")); | ||
| 99 | #endif | ||
| 100 | |||
| 101 | support (); | ||
| 102 | } | ||
| 103 | |||
| 104 | |||
| 105 | |||
| 55 | int | 106 | int |
| 56 | main (int argc, char **argv) | 107 | main (int argc, char **argv) |
| 57 | { | 108 | { |
| 58 | int percent_used, percent; | 109 | int percent_used, percent; |
| 59 | long unsigned int total_swap = 0, used_swap = 0, free_swap = 0; | 110 | long unsigned int total_swap = 0, used_swap = 0, free_swap = 0; |
| 60 | long unsigned int total, used, free; | 111 | long unsigned int dsktotal, dskused, dskfree; |
| 61 | int conv_factor; /* Convert to MBs */ | ||
| 62 | int result = STATE_OK; | 112 | int result = STATE_OK; |
| 63 | char input_buffer[MAX_INPUT_BUFFER]; | 113 | char input_buffer[MAX_INPUT_BUFFER]; |
| 64 | #ifdef HAVE_SWAP | 114 | #ifdef HAVE_SWAP |
| 115 | int conv_factor; /* Convert to MBs */ | ||
| 65 | char *temp_buffer; | 116 | char *temp_buffer; |
| 66 | char *swap_command; | 117 | char *swap_command; |
| 67 | char *swap_format; | 118 | char *swap_format; |
| @@ -78,11 +129,11 @@ main (int argc, char **argv) | |||
| 78 | #ifdef HAVE_PROC_MEMINFO | 129 | #ifdef HAVE_PROC_MEMINFO |
| 79 | fp = fopen (PROC_MEMINFO, "r"); | 130 | fp = fopen (PROC_MEMINFO, "r"); |
| 80 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) { | 131 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) { |
| 81 | if (sscanf (input_buffer, " %s %lu %lu %lu", str, &total, &used, &free) == 4 && | 132 | if (sscanf (input_buffer, " %s %lu %lu %lu", str, &dsktotal, &dskused, &dskfree) == 4 && |
| 82 | strstr (str, "Swap")) { | 133 | strstr (str, "Swap")) { |
| 83 | total = total / 1048576; | 134 | dsktotal = dsktotal / 1048576; |
| 84 | used = used / 1048576; | 135 | dskused = dskused / 1048576; |
| 85 | free = free / 1048576; | 136 | dskfree = dskfree / 1048576; |
| 86 | #endif | 137 | #endif |
| 87 | #ifdef HAVE_SWAP | 138 | #ifdef HAVE_SWAP |
| 88 | if (!allswaps && sun) { | 139 | if (!allswaps && sun) { |
| @@ -118,7 +169,7 @@ main (int argc, char **argv) | |||
| 118 | while (temp_buffer) { | 169 | while (temp_buffer) { |
| 119 | if (strstr (temp_buffer, "blocks")) | 170 | if (strstr (temp_buffer, "blocks")) |
| 120 | sprintf (str, "%s %s", str, "%f"); | 171 | sprintf (str, "%s %s", str, "%f"); |
| 121 | else if (strstr (temp_buffer, "free")) | 172 | else if (strstr (temp_buffer, "dskfree")) |
| 122 | sprintf (str, "%s %s", str, "%f"); | 173 | sprintf (str, "%s %s", str, "%f"); |
| 123 | else | 174 | else |
| 124 | sprintf (str, "%s %s", str, "%*s"); | 175 | sprintf (str, "%s %s", str, "%*s"); |
| @@ -133,23 +184,23 @@ main (int argc, char **argv) | |||
| 133 | total_swap = used_swap + free_swap; | 184 | total_swap = used_swap + free_swap; |
| 134 | } else { | 185 | } else { |
| 135 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 186 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { |
| 136 | sscanf (input_buffer, swap_format, &total, &free); | 187 | sscanf (input_buffer, swap_format, &dsktotal, &dskfree); |
| 137 | 188 | ||
| 138 | total = total / conv_factor; | 189 | dsktotal = dsktotal / conv_factor; |
| 139 | free = free / conv_factor; | 190 | dskfree = dskfree / conv_factor; |
| 140 | if (verbose >= 3) | 191 | if (verbose >= 3) |
| 141 | printf ("total=%d, free=%d\n", total, free); | 192 | printf ("total=%d, free=%d\n", dsktotal, dskfree); |
| 142 | 193 | ||
| 143 | used = total - free; | 194 | dskused = dsktotal - dskfree; |
| 144 | #endif | 195 | #endif |
| 145 | total_swap += total; | 196 | total_swap += dsktotal; |
| 146 | used_swap += used; | 197 | used_swap += dskused; |
| 147 | free_swap += free; | 198 | free_swap += dskfree; |
| 148 | if (allswaps) { | 199 | if (allswaps) { |
| 149 | percent = 100 * (((double) used) / ((double) total)); | 200 | percent = 100 * (((double) dskused) / ((double) dsktotal)); |
| 150 | result = max_state (result, check_swap (percent, free)); | 201 | result = max_state (result, check_swap (percent, dskfree)); |
| 151 | if (verbose) | 202 | if (verbose) |
| 152 | asprintf (&status, "%s [%lu (%d%%)]", status, free, 100 - percent); | 203 | asprintf (&status, "%s [%lu (%d%%)]", status, dskfree, 100 - percent); |
| 153 | } | 204 | } |
| 154 | } | 205 | } |
| 155 | } | 206 | } |
| @@ -175,6 +226,7 @@ main (int argc, char **argv) | |||
| 175 | #endif | 226 | #endif |
| 176 | 227 | ||
| 177 | terminate (result, "SWAP %s:%s\n", state_text (result), status); | 228 | terminate (result, "SWAP %s:%s\n", state_text (result), status); |
| 229 | return STATE_UNKNOWN; | ||
| 178 | } | 230 | } |
| 179 | 231 | ||
| 180 | 232 | ||
| @@ -186,11 +238,11 @@ check_swap (int usp, int free_swap) | |||
| 186 | int result = STATE_UNKNOWN; | 238 | int result = STATE_UNKNOWN; |
| 187 | if (usp >= 0 && usp >= (100.0 - crit_percent)) | 239 | if (usp >= 0 && usp >= (100.0 - crit_percent)) |
| 188 | result = STATE_CRITICAL; | 240 | result = STATE_CRITICAL; |
| 189 | else if (crit_size >= 0 && free_swap <= crit_size) | 241 | else if (crit_size > 0 && (unsigned)free_swap <= crit_size) |
| 190 | result = STATE_CRITICAL; | 242 | result = STATE_CRITICAL; |
| 191 | else if (usp >= 0 && usp >= (100.0 - warn_percent)) | 243 | else if (usp >= 0 && usp >= (100.0 - warn_percent)) |
| 192 | result = STATE_WARNING; | 244 | result = STATE_WARNING; |
| 193 | else if (warn_size >= 0 && free_swap <= warn_size) | 245 | else if (warn_size > 0 && (unsigned)free_swap <= warn_size) |
| 194 | result = STATE_WARNING; | 246 | result = STATE_WARNING; |
| 195 | else if (usp >= 0.0) | 247 | else if (usp >= 0.0) |
| 196 | result = STATE_OK; | 248 | result = STATE_OK; |
| @@ -270,7 +322,7 @@ process_arguments (int argc, char **argv) | |||
| 270 | verbose++; | 322 | verbose++; |
| 271 | break; | 323 | break; |
| 272 | case 'V': /* version */ | 324 | case 'V': /* version */ |
| 273 | print_revision (progname, "$Revision$"); | 325 | print_revision (progname, revision); |
| 274 | exit (STATE_OK); | 326 | exit (STATE_OK); |
| 275 | case 'h': /* help */ | 327 | case 'h': /* help */ |
| 276 | print_help (); | 328 | print_help (); |
| @@ -293,12 +345,12 @@ process_arguments (int argc, char **argv) | |||
| 293 | 345 | ||
| 294 | if (c == argc) | 346 | if (c == argc) |
| 295 | return validate_arguments (); | 347 | return validate_arguments (); |
| 296 | if (warn_size < 0 && is_intnonneg (argv[c])) | 348 | if (warn_size == 0 && is_intnonneg (argv[c])) |
| 297 | warn_size = atoi (argv[c++]); | 349 | warn_size = atoi (argv[c++]); |
| 298 | 350 | ||
| 299 | if (c == argc) | 351 | if (c == argc) |
| 300 | return validate_arguments (); | 352 | return validate_arguments (); |
| 301 | if (crit_size < 0 && is_intnonneg (argv[c])) | 353 | if (crit_size == 0 && is_intnonneg (argv[c])) |
| 302 | crit_size = atoi (argv[c++]); | 354 | crit_size = atoi (argv[c++]); |
| 303 | 355 | ||
| 304 | return validate_arguments (); | 356 | return validate_arguments (); |
| @@ -311,8 +363,8 @@ process_arguments (int argc, char **argv) | |||
| 311 | int | 363 | int |
| 312 | validate_arguments (void) | 364 | validate_arguments (void) |
| 313 | { | 365 | { |
| 314 | if (warn_percent > 100 && crit_percent > 100 && warn_size < 0 | 366 | if (warn_percent > 100 && crit_percent > 100 && warn_size == 0 |
| 315 | && crit_size < 0) { | 367 | && crit_size == 0) { |
| 316 | return ERROR; | 368 | return ERROR; |
| 317 | } | 369 | } |
| 318 | else if (warn_percent < crit_percent) { | 370 | else if (warn_percent < crit_percent) { |
| @@ -325,54 +377,3 @@ validate_arguments (void) | |||
| 325 | } | 377 | } |
| 326 | return OK; | 378 | return OK; |
| 327 | } | 379 | } |
| 328 | |||
| 329 | |||
| 330 | |||
| 331 | |||
| 332 | |||
| 333 | void | ||
| 334 | print_usage (void) | ||
| 335 | { | ||
| 336 | printf | ||
| 337 | ("Usage:\n" | ||
| 338 | " %s [-a] -w <used_percentage>%% -c <used_percentage>%%\n" | ||
| 339 | " %s [-a] -w <bytes_free> -c <bytes_free>\n" | ||
| 340 | " %s (-h | --help) for detailed help\n" | ||
| 341 | " %s (-V | --version) for version information\n", | ||
| 342 | progname, progname, progname, progname); | ||
| 343 | } | ||
| 344 | |||
| 345 | |||
| 346 | |||
| 347 | |||
| 348 | |||
| 349 | void | ||
| 350 | print_help (void) | ||
| 351 | { | ||
| 352 | print_revision (progname, REVISION); | ||
| 353 | printf | ||
| 354 | ("Copyright (c) %s %s <%s>\n\n%s\n", COPYRIGHT, AUTHOR, EMAIL, SUMMARY); | ||
| 355 | print_usage (); | ||
| 356 | printf | ||
| 357 | ("\nOptions:\n" | ||
| 358 | " -w, --warning=INTEGER\n" | ||
| 359 | " Exit with WARNING status if less than INTEGER bytes of swap space are free\n" | ||
| 360 | " -w, --warning=PERCENT%%\n" | ||
| 361 | " Exit with WARNING status if less than PERCENT of swap space has been used\n" | ||
| 362 | " -c, --critical=INTEGER\n" | ||
| 363 | " Exit with CRITICAL status if less than INTEGER bytes of swap space are free\n" | ||
| 364 | " -c, --critical=PERCENT%%\n" | ||
| 365 | " Exit with CRITCAL status if less than PERCENT of swap space has been used\n" | ||
| 366 | " -a, --allswaps\n" | ||
| 367 | " Conduct comparisons for all swap partitions, one by one\n" | ||
| 368 | " -h, --help\n" | ||
| 369 | " Print detailed help screen\n" | ||
| 370 | " -V, --version\n" " Print version information\n" | ||
| 371 | #ifdef sun | ||
| 372 | "\nOn Solaris, if -a specified, uses swap -l, otherwise uses swap -s.\n" | ||
| 373 | "Will be discrepencies because swap -s counts allocated swap and includes real memory\n" | ||
| 374 | #endif | ||
| 375 | "\n" | ||
| 376 | ); | ||
| 377 | support (); | ||
| 378 | } | ||
