From 9f49d1b5bf1918e73794d4492ea5b7f2e7ac4e45 Mon Sep 17 00:00:00 2001 From: Nishanth Thomas Date: Fri, 20 Jun 2014 18:44:27 +0530 Subject: gluster-nagios-addons: Volume utilization returns negative values when size in TB data overflow error in volcap.c. statvfs returns unsigned long which is boxed into int causing the error Change-Id: I85a1e0d584bf4d9e73b2bfebebea83cd9fbddf68 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1111558 Signed-off-by: Nishanth Thomas Reviewed-on: http://review.gluster.org/8136 Tested-by: Nishanth Thomas Reviewed-by: Shubhendu Tripathi Reviewed-by: Bala FA Reviewed-by: Sahina Bose --- plugins/check_vol_utilization.py | 32 +++++++++++++------------------- plugins/volcap/volCap.c | 2 +- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/plugins/check_vol_utilization.py b/plugins/check_vol_utilization.py index ab58e58..8500df0 100755 --- a/plugins/check_vol_utilization.py +++ b/plugins/check_vol_utilization.py @@ -32,8 +32,6 @@ def showVolumeUtilization(vname, warnLevel, critLevel): sys.stdout.write("UNKNOWN: Failed to get the " "Volume Utilization Data\n") sys.exit(utils.PluginStatusCode.UNKNOWN) -# print buf - #################################################################### #statvfs.frsize * statvfs.f_blocks# Size of filesystem in bytes # #statvfs.frsize * statvfs.f_bfree # Actual number of free bytes # @@ -41,35 +39,31 @@ def showVolumeUtilization(vname, warnLevel, critLevel): #ordinary users are allowed to use (excl. reserved space # #################################################################### #total size in KB - total_size = (buf['f_bsize'] * buf['f_blocks']) * 0.000976563 + total_size = (buf['f_bsize'] * buf['f_blocks']) / 1024.0 #Available free size in KB - free_size = (buf['f_bsize'] * buf['f_bavail']) * 0.000976563 + free_size = (buf['f_bsize'] * buf['f_bavail']) / 1024.0 #used size in KB - used_size = total_size - ((buf['f_bsize'] * buf['f_bfree']) * 0.000976563) + used_size = total_size - ((buf['f_bsize'] * buf['f_bfree']) / 1024.0) vol_utilization = (used_size / total_size) * 100 perfLines = [] - perfLines.append(("utilization=%s%%;%s;%s total=%s " - "used=%s free=%s" % (str(int(vol_utilization)), - str(warnLevel), str(critLevel), - str(int(total_size)), - str(int(used_size)), - str(int(free_size))))) -# print perfLines - + perfLines.append(("utilization=%.2f%%;%d;%d total=%0.2f " + "used=%0.2f free=%0.2f" % (vol_utilization, warnLevel, + critLevel, total_size, + used_size, free_size))) if int(vol_utilization) > critLevel: sys.stdout.write( - ("CRITICAL: Utilization:%s%%" - "| %s\n" % (str(int(vol_utilization)), " ".join(perfLines)))) + ("CRITICAL: Utilization:%0.2f%%" + "| %s\n" % (vol_utilization, " ".join(perfLines)))) sys.exit(utils.PluginStatusCode.CRITICAL) elif int(vol_utilization) > warnLevel: sys.stdout.write( - ("WARNING: Utilization:%s%%" - "| %s\n" % (str(int(vol_utilization)), " ".join(perfLines)))) + ("WARNING: Utilization:%0.2f%%" + "| %s\n" % (vol_utilization, " ".join(perfLines)))) sys.exit(utils.PluginStatusCode.WARNING) else: sys.stdout.write( - ("OK: Utilization:%s%%" - "| %s\n" % (str(int(vol_utilization)), " ".join(perfLines)))) + ("OK: Utilization:%0.2f%%" + "| %s\n" % (vol_utilization, " ".join(perfLines)))) sys.exit(utils.PluginStatusCode.OK) diff --git a/plugins/volcap/volCap.c b/plugins/volcap/volCap.c index 5eb61db..8c0c4e4 100644 --- a/plugins/volcap/volCap.c +++ b/plugins/volcap/volCap.c @@ -115,7 +115,7 @@ static PyObject *glfspy_statvfs (PyObject *self, PyObject *args) closelog (); //return Py_BuildValue("i", rv); if(rv == 0) - return Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i}","f_bsize",buf.f_bsize,"f_frsize",buf.f_frsize,"f_blocks",buf.f_blocks,"f_bfree",buf.f_bfree,"f_bavail",buf.f_bavail,"f_files",buf.f_files,"f_ffree",buf.f_ffree,"f_favail",buf.f_favail,"f_fsid",buf.f_fsid,"f_flag",buf.f_flag,"f_namemax",buf.f_namemax); + return Py_BuildValue("{s:l,s:l,s:l,s:l,s:l,s:l,s:l,s:l,s:l,s:l,s:l}","f_bsize",buf.f_bsize,"f_frsize",buf.f_frsize,"f_blocks",buf.f_blocks,"f_bfree",buf.f_bfree,"f_bavail",buf.f_bavail,"f_files",buf.f_files,"f_ffree",buf.f_ffree,"f_favail",buf.f_favail,"f_fsid",buf.f_fsid,"f_flag",buf.f_flag,"f_namemax",buf.f_namemax); else { if(rv == USAGE_ERROR) PyErr_SetString(StatvfsError, "Usage error"); -- cgit