#!/usr/bin/env python3 from pyVmomi import vim import pyVim.connect import atexit import argparse import re import siteconf site_conf = siteconf.read() def get_args(): parser = argparse.ArgumentParser( description='Set VM network') parser.add_argument('-s', '--site', required=True, action='store', help='name of the site to connect to') parser.add_argument('-d', '--datastore', required=True, action='store', help='datastore name') parser.add_argument('-W', '--warning', required=False, action='store', default='20%', help='warning if less free space (nnn%, or nnn[GT]B, default: TB)') parser.add_argument('-C', '--critical', required=False, action='store', default='10%', help='critical if less free space') args = parser.parse_args() return args def get_datastore(content, name): obj_view = content.viewManager.CreateContainerView( content.rootFolder, [vim.Datastore], True) ds_list = obj_view.view obj_view.Destroy() for ds in ds_list: if not ds.summary.accessible: continue if ds.summary.name == name: return ds return None def less_free(ds, minimum): cap = ds.summary.capacity free = ds.summary.freeSpace ratio = free / cap if m := re.match("([0-9.]+)%$", minimum): min_ratio = float(m[1]) / 100 #print(f"min_ratio: {min_ratio}") if ratio < min_ratio: return True else: return False elif m := re.match("([0-9.]+)([GT]B?)$", minimum): min_n, unit = float(m[1]), m[2] if unit[0] == 'G': min_n *= 1024**3 if unit[0] == 'T': min_n *= 1024**4 else: min_n = float(min_n) * 1024**4 # TB #print(f"min_n: {min_n}") if ds.summary.freeSpace < min_n: return True else: return False def main(): args = get_args() if not args.site in site_conf: print(f"site not found: {args.site}") exit(1) host = site_conf[args.site]['vcenter'] user = site_conf[args.site]['vcenter_user'] passwd = site_conf[args.site]['vcenter_passwd'] si = pyVim.connect.SmartConnect( host = host, user = user, pwd = passwd, disableSslCertValidation = True ) atexit.register(pyVim.connect.Disconnect, si) content = si.RetrieveContent() ds = get_datastore(content, args.datastore) if ds == None: print(f"UNKNOWN: datastore {args.site} | {args.datastore} not found.") exit(3) cap = ds.summary.capacity / 1024**4 free = ds.summary.freeSpace / 1024**4 ratio = free / cap text = f"{ds.summary.name} {ratio:.0%} free: {free:.3f} TB / {cap:.3f} TB" if less_free(ds, args.critical): print(f"CRITICAL: {text}") exit(2) elif less_free(ds, args.warning): print(f"WARNING: {text}") exit(1) else: print(f"OK: {text}") if __name__ == "__main__": main() # vim: set tabstop=4 shiftwidth=4 expandtab smarttab: