diff --git a/PVE-Zabbix.py b/PVE-Zabbix.py index 9a51396..0168026 100755 --- a/PVE-Zabbix.py +++ b/PVE-Zabbix.py @@ -5,7 +5,6 @@ from VM import VM from Storage import Storage USERNAME = "zabbix@pve" -# TODO change password to example zabbix PASSWORD = "zabbix" HOST = "172.16.3.11:8006" @@ -14,11 +13,12 @@ nodelist = conn.get_node_list() parser = ArgumentParser() parser.add_argument("node", help="Enter node name") -parser.add_argument("type", choices=['vm', 'storage'], help='categories') +parser.add_argument("type", choices=['vm', 'storage', 'disk'], help='categories') parser.add_argument("-l", "--list", dest='listing', action='store_true') parser.add_argument("-n", "--name", dest='name') parser.add_argument("-d", "--details", dest='details', action='store_true') parser.add_argument("-p", "--param", dest='param') +parser.add_argument("-b", "--disk", dest='disk') args = parser.parse_args() NODE = next((n for n in nodelist if n.name == args.node), None) @@ -26,8 +26,6 @@ if NODE is None: raise ValueError("No such Node found", "Valid nodes:", nodelist) - - def exec_vm(**kwargs): """ Handles vm positional parameter @@ -71,9 +69,37 @@ def exec_storage(**kwargs): Storage.get_storagenames(NODE, name=kwargs['name'], listing=kwargs['listing'])) +def exec_disk(**kwargs): + """ + Handles vm positional parameter + :param kwargs: handle cmd parametres + :return: + """ + # Initiate instances + if kwargs['details'] is True: + vms = conn.get_cluster_vmlist(nodelist, detailed=True) + else: + vms = conn.get_cluster_vmlist(nodelist) + + if kwargs['name'] is not None and kwargs['listing'] is False and kwargs['disk'] is not None: + try: + vm = next(v for v in vms if v.name == kwargs['name']) + print vm.get_diskvminfo(kwargs['disk'], kwargs['param']) + except StopIteration: + print "No such VM found. Possible VMs: " + str(VM.get_vmnames(NODE)) + else: + try: + vm = next(v for v in vms if v.name == kwargs['name']) + print listofdicts_to_zabbix_json(vm.get_diskvmlist()) + except StopIteration: + print "No such VM found. Possible VMs: " + str(VM.get_vmnames(NODE)) + + if args.type == "vm": exec_vm(listing=args.listing, name=args.name, param=args.param, details=args.details) elif args.type == "storage": exec_storage(listing=args.listing, name=args.name, param=args.param) +elif args.type == "disk": + exec_disk(listing=args.listing, name=args.name, param=args.param, details=True, disk=args.disk) else: print args diff --git a/PVEApi.py b/PVEApi.py index d0e4123..8575ea2 100755 --- a/PVEApi.py +++ b/PVEApi.py @@ -97,8 +97,8 @@ class PVEApi(object): if detailed is True: vm_dattr = self.get_details(url, vmid) - for k,v in vm_dattr.items(): - vm.__setattr__('det_'+k, v) + for k, v in vm_dattr.items(): + vm.__setattr__('det_' + k, v) vmlist.append(vm) return vmlist @@ -113,7 +113,7 @@ class PVEApi(object): url = url + '/' + vmid + '/status/current' response = json.load(urllib2.urlopen(self.get_request(url), context=ssl._create_unverified_context())) resources = response['data'] - attributedict = dict() + attributedict = dict() for param, paramvalue in resources.items(): attributedict.update({param: paramvalue}) return attributedict diff --git a/VM.py b/VM.py index fdb20fc..de917f9 100755 --- a/VM.py +++ b/VM.py @@ -29,7 +29,6 @@ class VM(object): self.maxdisk = maxdisk self.maxmem = maxmem self.__url = url - self.__dic = kwargs def __repr__(self): return "<%s-%s:%s>" % (self.node, self.vmid, self.name) @@ -71,6 +70,35 @@ class VM(object): vm_params.append({'#' + param.upper(): self.__getattribute__(param)}) return listofdicts_to_zabbix_json(vm_params) + def get_diskvmlist(self): + """ + Gets list of dicts blockdevices configured in VM for use in Zabbix Discovery + :return: list of dicts blockdevices + """ + blockdevices = list() + try: + for disk in self.det_blockstat.keys(): + blockdevices.append({'#DISKNAME': disk}) + except AttributeError: + print "Could not find disks for machine " + return blockdevices - def get_detailedvminfo(self): - print self.__dic \ No newline at end of file + def get_diskvminfo(self, disk, parameter=None): + """ + Gets VM blockdevice stats + :param disk: disk name in vm + :param parameter: if specified get specific param + :return: list of dicts with params or just param value for specific element + """ + if parameter is not None: + for diskname, param in self.det_blockstat.items(): + if diskname == disk: + for p, v in param.iteritems(): + if p == parameter: + return v + else: + disk_params = list() + for diskname, param in self.det_blockstat.items(): + if diskname == disk: + disk_params.append(param) + return listofdicts_to_zabbix_json(disk_params)