summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rwxr-xr-xplugins/check_disk_and_inode.py126
1 files changed, 104 insertions, 22 deletions
diff --git a/plugins/check_disk_and_inode.py b/plugins/check_disk_and_inode.py
index 393bd94..813fbc5 100755
--- a/plugins/check_disk_and_inode.py
+++ b/plugins/check_disk_and_inode.py
@@ -37,6 +37,34 @@ def getVal(val):
return 0
+def getLVdetails(filename, lvs):
+ dev_name = os.path.realpath(filename)
+
+ pool = ""
+ disk = {}
+ for a in lvs:
+ dev = os.path.realpath(a['LVM2_LV_PATH'])
+ if dev_name == dev:
+ if a['LVM2_LV_ATTR'][0] == 'V':
+ pool = a['LVM2_POOL_LV']
+ disk['thinLv'] = True
+ break
+ else:
+ disk['thinLv'] = False
+ return disk
+ else:
+ return None
+ for b in lvs:
+ if b['LVM2_LV_NAME'] == pool:
+ disk['actualUsedPercent'] = float(b['LVM2_DATA_PERCENT'])
+ disk['actualTotalSize'] = float(b['LVM2_LV_SIZE'])
+ disk['actualUsed'] = disk['actualTotalSize'] * disk[
+ 'actualUsedPercent'] / 100
+ return disk
+ else:
+ return None
+
+
def getUsageAndFree(command, path, crit, warn, lvm):
disk = {'path': None, 'usePcent': 0, 'avail': 0,
'used': 0, 'size': 0, 'fs': None,
@@ -78,6 +106,7 @@ def getUsageAndFree(command, path, crit, warn, lvm):
disk['size'] = getVal(status[-5])
disk['fs'] = status[-6]
disk['usePcent'] = getVal(status[-2])
+
if disk['usePcent'] >= crit:
disk['statusCode'] = utils.PluginStatusCode.CRITICAL
elif disk['usePcent'] >= warn:
@@ -85,7 +114,6 @@ def getUsageAndFree(command, path, crit, warn, lvm):
elif disk['usePcent'] < warn:
disk['statusCode'] = utils.PluginStatusCode.OK
disk['availPcent'] = 100 - disk['usePcent']
-
return disk
@@ -150,6 +178,10 @@ def parse_input():
parser.add_option('-s', action="store_true", default=False,
dest='showErrorDisk',
help='Show critical or warning disks in the status')
+ parser.add_option('-t', '--thinPool', action="store_true",
+ dest='thinPool',
+ help='Lists detail of underlying thin pool',
+ default=False)
return parser.parse_args()
@@ -182,7 +214,8 @@ def _getUnitAndType(val):
def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False,
- isLvm=False, ignoreError=False, showErrorDisk=True):
+ isLvm=False, ignoreError=False, showErrorDisk=True,
+ thinPool=False):
diskPerf = []
warnList = []
critList = []
@@ -194,9 +227,42 @@ def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False,
noOfMounts = len(mountPaths)
maxPercentUsed = 0
+ if thinPool:
+ rc, out, err = utils.execCmd(["lvm"] +
+ ("vgs --unquoted --noheading " +
+ "--nameprefixes --separator : " +
+ "--nosuffix --units g -o " +
+ "lv_path,data_percent,pool_lv,lv_attr,"
+ "lv_size,lv_name").split())
+ if rc == 0:
+ res = []
+ for i in out:
+ tem = i.split(":")
+ dct = {}
+ for j in tem:
+ tp = j.split("=")
+ dct[tp[0].replace(" ", "")] = tp[1]
+ res.append(dct)
+ else:
+ thinPool = False
+
for path in mountPaths:
disk = getDisk(path, crit, warn, usage, isLvm)
inode = getInode(path, crit, warn, isLvm)
+ if thinPool:
+ thinLv = getLVdetails(disk['fs'], res)
+ if thinLv and thinLv['thinLv']:
+ if disk['usePcent'] >= crit or thinLv[
+ 'actualUsedPercent'] >= crit:
+ disk['statusCode'] = utils.PluginStatusCode.CRITICAL
+ elif disk['usePcent'] >= warn or thinLv[
+ 'actualUsedPercent'] >= warn:
+ disk['statusCode'] = utils.PluginStatusCode.WARNING
+ elif disk['usePcent'] < warn or thinLv[
+ 'actualUsedPercent'] < warn:
+ disk['statusCode'] = utils.PluginStatusCode.OK
+ else:
+ thinPool = False
if disk['path'] in mounts:
continue
@@ -223,13 +289,24 @@ def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False,
crit * inode['used'] / 100,
inode['size'])
elif disk['path']:
- data = "%s=%.2f%%;%s;%s;0;%s" % (
- disk['path'],
- disk['usePcent'],
- warn,
- crit,
- disk['size'])
-
+ if thinPool and thinLv['thinLv']:
+ data = "Virtual=%.2f%%;%s;%s;0;%s" % (
+ disk['usePcent'],
+ warn,
+ crit,
+ disk['size'])
+ data += " Thin-pool=%.2f%%;%s;%s;0;%.1f" % (
+ thinLv['actualUsedPercent'],
+ warn,
+ crit,
+ thinLv['actualTotalSize'])
+ else:
+ data = "%s=%.2f%%;%s;%s;0;%s" % (
+ disk['path'],
+ disk['usePcent'],
+ warn,
+ crit,
+ disk['size'])
if toListInode:
data += " %s=%.2f%%;%s;%s;0;%s" % (
inode['path'],
@@ -299,22 +376,26 @@ def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False,
if not usage:
totUsedSz, totUsedSzUnit = _getUnitAndType(totalUsed)
totSpaceSz, totSpaceSzUnit = _getUnitAndType(totalSize)
- usageMsg = "%.1f%% used (%s%s out of %s%s)\n" % (totUsagePercent,
- totUsedSz,
- totUsedSzUnit,
- totSpaceSz,
- totSpaceSzUnit)
+ usageMsg = "%.1f%% used (%s%s out of %s%s)" % (totUsagePercent,
+ totUsedSz,
+ totUsedSzUnit,
+ totSpaceSz,
+ totSpaceSzUnit)
+ if thinPool and thinLv['thinLv']:
+ usageMsg += " [Thin-pool: %.1f%% (%.1fG out of %.1fG)]" % (
+ thinLv['actualUsedPercent'],
+ thinLv['actualUsed'],
+ thinLv['actualTotalSize'])
else:
- usageMsg = "%.1f%% used (%s%s out of %s%s)\n" % (totUsagePercent,
- totalUsed,
- usage,
- totalSize,
- usage)
-
+ usageMsg = "%.1f%% used (%s%s out of %s%s)" % (totUsagePercent,
+ totalUsed,
+ usage,
+ totalSize,
+ usage)
if showErrorDisk:
msg = "%s\n:mount(s): (%s)" % (errorDiskMsg, msg)
else:
- msg = "%s:mount(s): (%s)" % (usageMsg, msg)
+ msg = "%s\n:mount(s): (%s)" % (usageMsg, msg)
return statusCode, msg, diskPerf
@@ -337,7 +418,8 @@ if __name__ == '__main__':
options.usage,
options.lvm,
options.ignore,
- options.showErrorDisk)
+ options.showErrorDisk,
+ options.thinPool)
if utils.PluginStatusCode.CRITICAL == statusCode:
sys.stdout.write("%s : %s | %s\n" % (