summaryrefslogtreecommitdiffstats
path: root/plugins/check_disk.c
diff options
context:
space:
mode:
authorTon Voon <tonvoon@users.sourceforge.net>2006-07-14 09:43:59 (GMT)
committerTon Voon <tonvoon@users.sourceforge.net>2006-07-14 09:43:59 (GMT)
commit54055835d24a9fabcfc7c77dab7dadd3039c9161 (patch)
tree71c3ec630328ce0cb24d010cf9b933c7103f4cf0 /plugins/check_disk.c
parent5912398b9723545ecd061650667cbb238be85743 (diff)
downloadmonitoring-plugins-54055835d24a9fabcfc7c77dab7dadd3039c9161.tar.gz
Fix inode percents using coreutils' percentage calculation technique
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1453 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'plugins/check_disk.c')
-rw-r--r--plugins/check_disk.c71
1 files changed, 40 insertions, 31 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index b966fab..e7a3b21 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -121,6 +121,7 @@ void print_path (const char *mypath);
121int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, char *); 121int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, char *);
122void print_help (void); 122void print_help (void);
123void print_usage (void); 123void print_usage (void);
124double calculate_percent(uintmax_t, uintmax_t);
124 125
125double w_dfp = -1.0; 126double w_dfp = -1.0;
126double c_dfp = -1.0; 127double c_dfp = -1.0;
@@ -152,7 +153,7 @@ main (int argc, char **argv)
152 char *output; 153 char *output;
153 char *details; 154 char *details;
154 char *perf; 155 char *perf;
155 float inode_space_pct; 156 double inode_space_pct;
156 uintmax_t total, available, available_to_root, used; 157 uintmax_t total, available, available_to_root, used;
157 double dfree_pct = -1, dused_pct = -1; 158 double dfree_pct = -1, dused_pct = -1;
158 double dused_units, dfree_units, dtotal_units; 159 double dused_units, dfree_units, dtotal_units;
@@ -239,32 +240,13 @@ main (int argc, char **argv)
239 available_to_root = fsp.fsu_bfree; 240 available_to_root = fsp.fsu_bfree;
240 used = total - available_to_root; 241 used = total - available_to_root;
241 242
242 /* I don't understand the below, but it is taken from coreutils' df */ 243 dused_pct = calculate_percent( used, used + available ); /* used + available can never be > uintmax */
243 /* Is setting dused_pct, in the best possible way */ 244
244 if (used <= TYPE_MAXIMUM(uintmax_t) / 100) {
245 uintmax_t u100 = used * 100;
246 uintmax_t nonroot_total = used + available;
247 dused_pct = u100 / nonroot_total + (u100 % nonroot_total != 0);
248 } else {
249 /* Possible rounding errors - see coreutils' df for more explanation */
250 double u = used;
251 double a = available;
252 double nonroot_total = u + a;
253 if (nonroot_total) {
254 long int lipct = dused_pct = u * 100 / nonroot_total;
255 double ipct = lipct;
256
257 /* Like 'pct = ceil (dpct);', but without ceil - from coreutils again */
258 if (ipct - 1 < dused_pct && dused_pct <= ipct + 1)
259 dused_pct = ipct + (ipct < dused_pct);
260 }
261 }
262
263 dfree_pct = 100 - dused_pct; 245 dfree_pct = 100 - dused_pct;
264 dused_units = used*fsp.fsu_blocksize/mult; 246 dused_units = used*fsp.fsu_blocksize/mult;
265 dfree_units = available*fsp.fsu_blocksize/mult; 247 dfree_units = available*fsp.fsu_blocksize/mult;
266 dtotal_units = total*fsp.fsu_blocksize/mult; 248 dtotal_units = total*fsp.fsu_blocksize/mult;
267 dused_inodes_percent = (fsp.fsu_files - fsp.fsu_ffree) * 100 / fsp.fsu_files; 249 dused_inodes_percent = calculate_percent(fsp.fsu_files - fsp.fsu_ffree, fsp.fsu_files);
268 250
269 if (verbose >= 3) { 251 if (verbose >= 3) {
270 printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g\n", 252 printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g\n",
@@ -297,9 +279,9 @@ main (int argc, char **argv)
297 279
298 280
299 281
300 /* Moved this computation up here so we can add it 282 /* Moved this computation up here so we can add it
301 * to perf */ 283 * to perf */
302 inode_space_pct = (float)fsp.fsu_ffree*100/fsp.fsu_files; 284 inode_space_pct = (1 - dused_inodes_percent) * 100;
303 285
304 286
305 asprintf (&perf, "%s %s", perf, 287 asprintf (&perf, "%s %s", perf,
@@ -307,23 +289,27 @@ main (int argc, char **argv)
307 dused_units, units, 289 dused_units, units,
308 FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*dtotal_units)), */ 290 FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*dtotal_units)), */
309 FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*dtotal_units)), */ 291 FALSE, 0, /* min ((uintmax_t)dtotal_units-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*dtotal_units)), */
310 FALSE, 0, /* inode_space_pct, */ 292 FALSE, 0, /* inode_space_pct - this is not meant to be here???, */
311 FALSE, 0));; /* dtotal_units)); */ 293 FALSE, 0));; /* dtotal_units)); */
312 294
313 if (disk_result==STATE_OK && erronly && !verbose) 295 if (disk_result==STATE_OK && erronly && !verbose)
314 continue; 296 continue;
315 297
316 if (disk_result!=STATE_OK || verbose>=0) { 298 if (disk_result!=STATE_OK || verbose>=0) {
317 asprintf (&output, ("%s %s %.0f %s (%.0f%% inode=%.0f%%);"), 299 asprintf (&output, "%s %s %.0f %s (%.0f%%",
318 output, 300 output,
319 (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, 301 (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
320 dfree_units, 302 dfree_units,
321 units, 303 units,
322 dfree_pct, 304 dfree_pct);
323 inode_space_pct); 305 if (dused_inodes_percent < 0) {
306 asprintf(&output, "%s inode=-);", output);
307 } else {
308 asprintf(&output, "%s inode=%.0f%%);", output, (1 - dused_inodes_percent) * 100);
309 }
324 } 310 }
325 311
326 /* Need to do a similar one 312 /* TODO: Need to do a similar debug line
327 asprintf (&details, _("%s\n\ 313 asprintf (&details, _("%s\n\
328%.0f of %.0f %s (%.0f%% inode=%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"), 314%.0f of %.0f %s (%.0f%% inode=%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"),
329 details, dfree_units, dtotal_units, units, dfree_pct, inode_space_pct, 315 details, dfree_units, dtotal_units, units, dfree_pct, inode_space_pct,
@@ -344,6 +330,29 @@ main (int argc, char **argv)
344} 330}
345 331
346 332
333double calculate_percent(uintmax_t value, uintmax_t total) {
334 double pct = -1;
335 /* I don't understand the below, but it is taken from coreutils' df */
336 /* Seems to be calculating pct, in the best possible way */
337 if (value <= TYPE_MAXIMUM(uintmax_t) / 100
338 && total != 0) {
339 uintmax_t u100 = value * 100;
340 pct = u100 / total + (u100 % total != 0);
341 } else {
342 /* Possible rounding errors - see coreutils' df for more explanation */
343 double u = value;
344 double t = total;
345 if (t) {
346 long int lipct = pct = u * 100 / t;
347 double ipct = lipct;
348
349 /* Like 'pct = ceil (dpct);', but without ceil - from coreutils again */
350 if (ipct - 1 < pct && pct <= ipct + 1)
351 pct = ipct + (ipct < pct);
352 }
353 }
354 return pct;
355}
347 356
348/* process command-line arguments */ 357/* process command-line arguments */
349int 358int