diff options
-rw-r--r-- | configure.in | 13 | ||||
-rw-r--r-- | plugins/check_swap.c | 171 |
2 files changed, 101 insertions, 83 deletions
diff --git a/configure.in b/configure.in index 2c90ebf..81b019b 100644 --- a/configure.in +++ b/configure.in | |||
@@ -1305,16 +1305,19 @@ then | |||
1305 | >/dev/null] | 1305 | >/dev/null] |
1306 | then | 1306 | then |
1307 | ac_cv_swap_format=[" %*d %*s %*d,%*d %*d %*d %d %d"] | 1307 | ac_cv_swap_format=[" %*d %*s %*d,%*d %*d %*d %d %d"] |
1308 | ac_cv_swap_conv=2048 | ||
1308 | AC_MSG_RESULT([using IRIX format swap]) | 1309 | AC_MSG_RESULT([using IRIX format swap]) |
1309 | 1310 | ||
1310 | elif [$PATH_TO_SWAP -l 2>/dev/null | egrep -i "^swapfile +dev +swaplo +blocks +free" >/dev/null] | 1311 | elif [$PATH_TO_SWAP -l 2>/dev/null | egrep -i "^swapfile +dev +swaplo +blocks +free" >/dev/null] |
1311 | then | 1312 | then |
1312 | ac_cv_swap_format=["%*s %*[0-9,-] %*d %d %d"] | 1313 | ac_cv_swap_format=["%*s %*[0-9,-] %*d %d %d"] |
1314 | ac_cv_swap_conv=2048 | ||
1313 | AC_MSG_RESULT([using Solaris format swap]) | 1315 | AC_MSG_RESULT([using Solaris format swap]) |
1314 | 1316 | ||
1315 | elif [$PATH_TO_SWAP -l 2>/dev/null | egrep -i "^path +dev +swaplo +blocks +free" >/dev/null] | 1317 | elif [$PATH_TO_SWAP -l 2>/dev/null | egrep -i "^path +dev +swaplo +blocks +free" >/dev/null] |
1316 | then | 1318 | then |
1317 | ac_cv_swap_format=["%*s %*[0-9,-] %*d %d %d"] | 1319 | ac_cv_swap_format=["%*s %*[0-9,-] %*d %d %d"] |
1320 | ac_cv_swap_conv=2048 | ||
1318 | AC_MSG_RESULT([using Unixware format swap]) | 1321 | AC_MSG_RESULT([using Unixware format swap]) |
1319 | 1322 | ||
1320 | fi | 1323 | fi |
@@ -1328,6 +1331,7 @@ then | |||
1328 | if [$PATH_TO_SWAPINFO -k 2>/dev/null | egrep -i "^Device +1K-blocks +Used +Avail" >/dev/null] | 1331 | if [$PATH_TO_SWAPINFO -k 2>/dev/null | egrep -i "^Device +1K-blocks +Used +Avail" >/dev/null] |
1329 | then | 1332 | then |
1330 | ac_cv_swap_format=["%*s %d %*d %d"] | 1333 | ac_cv_swap_format=["%*s %d %*d %d"] |
1334 | ac_cv_swap_conv=1024 | ||
1331 | AC_MSG_RESULT([using FreeBSD format swapinfo]) | 1335 | AC_MSG_RESULT([using FreeBSD format swapinfo]) |
1332 | fi | 1336 | fi |
1333 | EXTRAS="$EXTRAS check_swap" | 1337 | EXTRAS="$EXTRAS check_swap" |
@@ -1337,19 +1341,22 @@ then | |||
1337 | ac_cv_have_swap=yes | 1341 | ac_cv_have_swap=yes |
1338 | ac_cv_swap_command="$PATH_TO_SWAPINFO -dfM", | 1342 | ac_cv_swap_command="$PATH_TO_SWAPINFO -dfM", |
1339 | ac_cv_swap_format=["%*s %d %*d %d"] | 1343 | ac_cv_swap_format=["%*s %d %*d %d"] |
1344 | ac_cv_swap_conv=1024 | ||
1340 | AC_MSG_RESULT([using HP-UX format swapinfo]) | 1345 | AC_MSG_RESULT([using HP-UX format swapinfo]) |
1341 | fi | 1346 | fi |
1342 | 1347 | ||
1343 | if test x$ac_cv_have_swap != x | 1348 | if test "x$ac_cv_have_swap" != "x" |
1344 | then | 1349 | then |
1345 | AC_DEFINE(HAVE_SWAP,1,[Define if swap/swapinfo command is found]) | 1350 | AC_DEFINE(HAVE_SWAP,1,[Define if swap/swapinfo command is found]) |
1346 | fi | 1351 | fi |
1347 | AC_DEFINE_UNQUOTED(SWAP_FORMAT,"$ac_cv_swap_format", | ||
1348 | [Format string for parsing swap output]) | ||
1349 | if test "x$ac_cv_swap_command" != "x" | 1352 | if test "x$ac_cv_swap_command" != "x" |
1350 | then | 1353 | then |
1351 | AC_DEFINE_UNQUOTED(SWAP_COMMAND,"$ac_cv_swap_command", | 1354 | AC_DEFINE_UNQUOTED(SWAP_COMMAND,"$ac_cv_swap_command", |
1352 | [Path to swap/swapinfo binary, with any args]) | 1355 | [Path to swap/swapinfo binary, with any args]) |
1356 | AC_DEFINE_UNQUOTED(SWAP_FORMAT,"$ac_cv_swap_format", | ||
1357 | [Format string for parsing swap output]) | ||
1358 | AC_DEFINE_UNQUOTED(SWAP_CONVERSION,$ac_cv_swap_conv, | ||
1359 | [Conversion factor to MB]) | ||
1353 | fi | 1360 | fi |
1354 | 1361 | ||
1355 | AC_PATH_PROG(PATH_TO_DIG,dig) | 1362 | AC_PATH_PROG(PATH_TO_DIG,dig) |
diff --git a/plugins/check_swap.c b/plugins/check_swap.c index ad5eb25..63af4cc 100644 --- a/plugins/check_swap.c +++ b/plugins/check_swap.c | |||
@@ -48,16 +48,23 @@ long unsigned int crit_size = 0; | |||
48 | int verbose; | 48 | int verbose; |
49 | int allswaps; | 49 | int allswaps; |
50 | 50 | ||
51 | #if !defined(sun) | ||
52 | int sun = 0; /* defined by compiler if it is a sun solaris system */ | ||
53 | #endif | ||
54 | |||
51 | int | 55 | int |
52 | main (int argc, char **argv) | 56 | main (int argc, char **argv) |
53 | { | 57 | { |
54 | int percent_used, percent; | 58 | int percent_used, percent; |
55 | long unsigned int total_swap = 0, used_swap = 0, free_swap = 0; | 59 | long unsigned int total_swap = 0, used_swap = 0, free_swap = 0; |
56 | long unsigned int total, used, free; | 60 | long unsigned int total, used, free; |
61 | int conv_factor; /* Convert to MBs */ | ||
57 | int result = STATE_OK; | 62 | int result = STATE_OK; |
58 | char input_buffer[MAX_INPUT_BUFFER]; | 63 | char input_buffer[MAX_INPUT_BUFFER]; |
59 | #ifdef HAVE_SWAP | 64 | #ifdef HAVE_SWAP |
60 | char *temp_buffer; | 65 | char *temp_buffer; |
66 | char *swap_command; | ||
67 | char *swap_format; | ||
61 | #endif | 68 | #endif |
62 | #ifdef HAVE_PROC_MEMINFO | 69 | #ifdef HAVE_PROC_MEMINFO |
63 | FILE *fp; | 70 | FILE *fp; |
@@ -70,48 +77,40 @@ main (int argc, char **argv) | |||
70 | 77 | ||
71 | #ifdef HAVE_PROC_MEMINFO | 78 | #ifdef HAVE_PROC_MEMINFO |
72 | fp = fopen (PROC_MEMINFO, "r"); | 79 | fp = fopen (PROC_MEMINFO, "r"); |
73 | asprintf (&status, "%s", "Swap used:"); | ||
74 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) { | 80 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, fp)) { |
75 | if (sscanf (input_buffer, " %s %lu %lu %lu", str, &total, &used, &free) == 4 && | 81 | if (sscanf (input_buffer, " %s %lu %lu %lu", str, &total, &used, &free) == 4 && |
76 | strstr (str, "Swap")) { | 82 | strstr (str, "Swap")) { |
77 | total_swap += total; | 83 | #endif |
78 | used_swap += used; | ||
79 | free_swap += free; | ||
80 | if (allswaps) { | ||
81 | percent = 100 * (((double) used) / ((double) total)); | ||
82 | if (percent >= crit_percent || free <= crit_size) | ||
83 | result = max_state (STATE_CRITICAL, result); | ||
84 | else if (percent >= warn_percent || free <= warn_size) | ||
85 | result = max_state (STATE_WARNING, result); | ||
86 | if (verbose) | ||
87 | asprintf (&status, "%s [%lu/%lu]", status, used, total); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | percent_used = 100 * (((double) used_swap) / ((double) total_swap)); | ||
92 | if (percent_used >= crit_percent || free_swap <= crit_size) | ||
93 | result = max_state (STATE_CRITICAL, result); | ||
94 | else if (percent_used >= warn_percent || free_swap <= warn_size) | ||
95 | result = max_state (STATE_WARNING, result); | ||
96 | asprintf (&status, "%s %2d%% (%lu out of %lu)", status, percent_used, | ||
97 | used_swap, total_swap); | ||
98 | fclose (fp); | ||
99 | #else | ||
100 | #ifdef HAVE_SWAP | 84 | #ifdef HAVE_SWAP |
101 | child_process = spopen (SWAP_COMMAND); | 85 | if (!allswaps && sun) { |
86 | asprintf(&swap_command, "%s", "/usr/sbin/swap -s"); | ||
87 | asprintf(&swap_format, "%s", "%*s %*dk %*s %*s + %*dk %*s = %dk %*s %dk %*s"); | ||
88 | conv_factor = 2048; | ||
89 | } else { | ||
90 | asprintf(&swap_command, "%s", SWAP_COMMAND); | ||
91 | asprintf(&swap_format, "%s", SWAP_FORMAT); | ||
92 | conv_factor = SWAP_CONVERSION; | ||
93 | } | ||
94 | |||
95 | if (verbose >= 2) | ||
96 | printf ("Command: %s\n", swap_command); | ||
97 | if (verbose >= 3) | ||
98 | printf ("Format: %s\n", swap_format); | ||
99 | |||
100 | child_process = spopen (swap_command); | ||
102 | if (child_process == NULL) { | 101 | if (child_process == NULL) { |
103 | printf ("Could not open pipe: %s\n", SWAP_COMMAND); | 102 | printf ("Could not open pipe: %s\n", swap_command); |
104 | return STATE_UNKNOWN; | 103 | return STATE_UNKNOWN; |
105 | } | 104 | } |
106 | 105 | ||
107 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | 106 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); |
108 | if (child_stderr == NULL) | 107 | if (child_stderr == NULL) |
109 | printf ("Could not open stderr for %s\n", SWAP_COMMAND); | 108 | printf ("Could not open stderr for %s\n", swap_command); |
110 | 109 | ||
111 | sprintf (str, "%s", ""); | 110 | sprintf (str, "%s", ""); |
112 | /* read 1st line */ | 111 | /* read 1st line */ |
113 | fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); | 112 | fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); |
114 | if (strcmp (SWAP_FORMAT, "") == 0) { | 113 | if (strcmp (swap_format, "") == 0) { |
115 | temp_buffer = strtok (input_buffer, " \n"); | 114 | temp_buffer = strtok (input_buffer, " \n"); |
116 | while (temp_buffer) { | 115 | while (temp_buffer) { |
117 | if (strstr (temp_buffer, "blocks")) | 116 | if (strstr (temp_buffer, "blocks")) |
@@ -124,31 +123,42 @@ main (int argc, char **argv) | |||
124 | } | 123 | } |
125 | } | 124 | } |
126 | 125 | ||
127 | asprintf (&status, "%s", "Swap used:"); | 126 | if (!allswaps && sun) { |
128 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 127 | sscanf (input_buffer, swap_format, &used_swap, &free_swap); |
129 | sscanf (input_buffer, SWAP_FORMAT, &total, &free); | 128 | used_swap = used_swap / 1024; |
130 | used = total - free; | 129 | free_swap = free_swap / 1024; |
131 | total_swap += total; | 130 | total_swap = used_swap + free_swap; |
132 | used_swap += used; | 131 | } else { |
133 | free_swap += free; | 132 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { |
134 | if (allswaps) { | 133 | sscanf (input_buffer, swap_format, &total, &free); |
135 | percent = 100 * (((double) used) / ((double) total)); | 134 | |
136 | if (percent >= crit_percent || free <= crit_size) | 135 | total = total / conv_factor; |
137 | result = max_state (STATE_CRITICAL, result); | 136 | free = free / conv_factor; |
138 | else if (percent >= warn_percent || free <= warn_size) | 137 | if (verbose >= 3) |
139 | result = max_state (STATE_WARNING, result); | 138 | printf ("total=%d, free=%d\n", total, free); |
140 | if (verbose) | 139 | |
141 | asprintf (&status, "%s [%lu/%lu]", status, used, total); | 140 | used = total - free; |
141 | #endif | ||
142 | total_swap += total; | ||
143 | used_swap += used; | ||
144 | free_swap += free; | ||
145 | if (allswaps) { | ||
146 | percent = 100 * (((double) used) / ((double) total)); | ||
147 | result = max_state (result, check_swap (percent, free)); | ||
148 | if (verbose) | ||
149 | asprintf (&status, "%s [%lu (%d%%)]", status, free, 100 - percent); | ||
150 | } | ||
142 | } | 151 | } |
143 | } | 152 | } |
144 | percent_used = 100 * ((double) used_swap) / ((double) total_swap); | 153 | percent_used = 100 * ((double) used_swap) / ((double) total_swap); |
145 | if (percent_used >= crit_percent || free_swap <= crit_size) | 154 | result = max_state (result, check_swap (percent_used, free_swap)); |
146 | result = max_state (STATE_CRITICAL, result); | 155 | asprintf (&status, " %d%% free (%lu MB out of %lu MB)%s", |
147 | else if (percent_used >= warn_percent || free_swap <= warn_size) | 156 | (100 - percent_used), free_swap, total_swap, status); |
148 | result = max_state (STATE_WARNING, result); | ||
149 | asprintf (&status, "%s %2d%% (%lu out of %lu)", | ||
150 | status, percent_used, used_swap, total_swap); | ||
151 | 157 | ||
158 | #ifdef HAVE_PROC_MEMINFO | ||
159 | fclose(fp); | ||
160 | #endif | ||
161 | #ifdef HAVE_SWAP | ||
152 | /* If we get anything on STDERR, at least set warning */ | 162 | /* If we get anything on STDERR, at least set warning */ |
153 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) | 163 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) |
154 | result = max_state (result, STATE_WARNING); | 164 | result = max_state (result, STATE_WARNING); |
@@ -160,34 +170,29 @@ main (int argc, char **argv) | |||
160 | if (spclose (child_process)) | 170 | if (spclose (child_process)) |
161 | result = max_state (result, STATE_WARNING); | 171 | result = max_state (result, STATE_WARNING); |
162 | #endif | 172 | #endif |
163 | #endif | ||
164 | 173 | ||
165 | #ifndef SWAP_COMMAND | 174 | terminate (result, "SWAP %s:%s\n", state_text (result), status); |
166 | #ifndef SWAP_FILE | ||
167 | #ifndef HAVE_PROC_MEMINFO | ||
168 | return STATE_UNKNOWN; | ||
169 | #endif | ||
170 | #endif | ||
171 | #endif | ||
172 | |||
173 | if (result == STATE_OK) | ||
174 | printf ("Swap ok - %s\n", status); | ||
175 | else if (result == STATE_CRITICAL) | ||
176 | printf ("CRITICAL - %s\n", status); | ||
177 | else if (result == STATE_WARNING) | ||
178 | printf ("WARNING - %s\n", status); | ||
179 | else if (result == STATE_UNKNOWN) | ||
180 | printf ("Unable to read output\n"); | ||
181 | else { | ||
182 | result = STATE_UNKNOWN; | ||
183 | printf ("UNKNOWN - %s\n", status); | ||
184 | } | ||
185 | |||
186 | return result; | ||
187 | } | 175 | } |
188 | 176 | ||
189 | 177 | ||
190 | 178 | ||
179 | |||
180 | int | ||
181 | check_swap (int usp, int free_swap) | ||
182 | { | ||
183 | int result = STATE_UNKNOWN; | ||
184 | if (usp >= 0 && usp >= (100.0 - crit_percent)) | ||
185 | result = STATE_CRITICAL; | ||
186 | else if (crit_size >= 0 && free_swap <= crit_size) | ||
187 | result = STATE_CRITICAL; | ||
188 | else if (usp >= 0 && usp >= (100.0 - warn_percent)) | ||
189 | result = STATE_WARNING; | ||
190 | else if (warn_size >= 0 && free_swap <= warn_size) | ||
191 | result = STATE_WARNING; | ||
192 | else if (usp >= 0.0) | ||
193 | result = STATE_OK; | ||
194 | return result; | ||
195 | } | ||
191 | 196 | ||
192 | 197 | ||
193 | /* process command-line arguments */ | 198 | /* process command-line arguments */ |
@@ -255,11 +260,11 @@ process_arguments (int argc, char **argv) | |||
255 | usage ("Critical threshold must be integer or percentage!\n"); | 260 | usage ("Critical threshold must be integer or percentage!\n"); |
256 | } | 261 | } |
257 | cc++; | 262 | cc++; |
258 | case 'a': /* verbose */ | 263 | case 'a': /* all swap */ |
259 | allswaps = TRUE; | 264 | allswaps = TRUE; |
260 | break; | 265 | break; |
261 | case 'v': /* verbose */ | 266 | case 'v': /* verbose */ |
262 | verbose = TRUE; | 267 | verbose++; |
263 | break; | 268 | break; |
264 | case 'V': /* version */ | 269 | case 'V': /* version */ |
265 | print_revision (progname, "$Revision$"); | 270 | print_revision (progname, "$Revision$"); |
@@ -307,13 +312,13 @@ validate_arguments (void) | |||
307 | && crit_size < 0) { | 312 | && crit_size < 0) { |
308 | return ERROR; | 313 | return ERROR; |
309 | } | 314 | } |
310 | else if (warn_percent > crit_percent) { | 315 | else if (warn_percent < crit_percent) { |
311 | usage | 316 | usage |
312 | ("Warning percentage should not be less than critical percentage\n"); | 317 | ("Warning percentage should be more than critical percentage\n"); |
313 | } | 318 | } |
314 | else if (warn_size < crit_size) { | 319 | else if (warn_size < crit_size) { |
315 | usage | 320 | usage |
316 | ("Warning free space should not be more than critical free space\n"); | 321 | ("Warning free space should be more than critical free space\n"); |
317 | } | 322 | } |
318 | return OK; | 323 | return OK; |
319 | } | 324 | } |
@@ -350,15 +355,21 @@ print_help (void) | |||
350 | " -w, --warning=INTEGER\n" | 355 | " -w, --warning=INTEGER\n" |
351 | " Exit with WARNING status if less than INTEGER bytes of swap space are free\n" | 356 | " Exit with WARNING status if less than INTEGER bytes of swap space are free\n" |
352 | " -w, --warning=PERCENT%%\n" | 357 | " -w, --warning=PERCENT%%\n" |
353 | " Exit with WARNING status if more than PERCENT of swap space has been used\n" | 358 | " Exit with WARNING status if less than PERCENT of swap space has been used\n" |
354 | " -c, --critical=INTEGER\n" | 359 | " -c, --critical=INTEGER\n" |
355 | " Exit with CRITICAL status if less than INTEGER bytes of swap space are free\n" | 360 | " Exit with CRITICAL status if less than INTEGER bytes of swap space are free\n" |
356 | " -c, --critical=PERCENT%%\n" | 361 | " -c, --critical=PERCENT%%\n" |
357 | " Exit with CRITCAL status if more than PERCENT of swap space has been used\n" | 362 | " Exit with CRITCAL status if less than PERCENT of swap space has been used\n" |
358 | " -a, --allswaps\n" | 363 | " -a, --allswaps\n" |
359 | " Conduct comparisons for all swap partitions, one by one\n" | 364 | " Conduct comparisons for all swap partitions, one by one\n" |
360 | " -h, --help\n" | 365 | " -h, --help\n" |
361 | " Print detailed help screen\n" | 366 | " Print detailed help screen\n" |
362 | " -V, --version\n" " Print version information\n\n"); | 367 | " -V, --version\n" " Print version information\n" |
368 | #ifdef sun | ||
369 | "\nOn Solaris, if -a specified, uses swap -l, otherwise uses swap -s.\n" | ||
370 | "Will be discrepencies because swap -s counts allocated swap and includes real memory\n" | ||
371 | #endif | ||
372 | "\n" | ||
373 | ); | ||
363 | support (); | 374 | support (); |
364 | } | 375 | } |