From fbf27eecd06bcc7c006dfbd0553473be6e94bf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Stocki?= Date: Mon, 21 Jan 2019 13:30:13 +0100 Subject: [PATCH] added detailed data for VMs --- PVE-Zabbix.py | 12 ++++++++++-- PVEApi.py | 25 +++++++++++++++++++++++-- README.md | 2 +- VM.py | 8 +++++++- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/PVE-Zabbix.py b/PVE-Zabbix.py index d5fa84a..9a51396 100755 --- a/PVE-Zabbix.py +++ b/PVE-Zabbix.py @@ -5,6 +5,7 @@ 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" @@ -16,13 +17,17 @@ parser.add_argument("node", help="Enter node name") parser.add_argument("type", choices=['vm', 'storage'], 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') args = parser.parse_args() NODE = next((n for n in nodelist if n.name == args.node), None) + if NODE is None: raise ValueError("No such Node found", "Valid nodes:", nodelist) + + def exec_vm(**kwargs): """ Handles vm positional parameter @@ -30,7 +35,10 @@ def exec_vm(**kwargs): :return: """ # Initiate instances - vms = conn.get_cluster_vmlist(nodelist) + 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: try: @@ -64,7 +72,7 @@ def exec_storage(**kwargs): if args.type == "vm": - exec_vm(listing=args.listing, name=args.name, param=args.param) + 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) else: diff --git a/PVEApi.py b/PVEApi.py index 7e70d18..d0e4123 100755 --- a/PVEApi.py +++ b/PVEApi.py @@ -65,7 +65,7 @@ class PVEApi(object): nodes.append(nodeobj) return nodes - def get_cluster_vmlist(self, nodelist): + def get_cluster_vmlist(self, nodelist, detailed=False): """ Creates Virtual Machine List :return: list of VM class objects @@ -93,10 +93,31 @@ class PVEApi(object): maxdisk = machine[u'maxdisk'] maxmem = machine[u'maxmem'] vm = VM(node, name, status, uptime, diskread, diskwrite, memusage, pid, vmid, netin, netout, cpus, - template, disk, cpuusage, maxdisk, maxmem) + template, disk, cpuusage, maxdisk, maxmem, url) + + if detailed is True: + vm_dattr = self.get_details(url, vmid) + for k,v in vm_dattr.items(): + vm.__setattr__('det_'+k, v) + vmlist.append(vm) return vmlist + def get_details(self, url, vmid): + """ + Gets vm detailed data from PVE API (its slower than just basic data) + :param url: url used in vm data get + :param vmid: vmid to create new url for detailed data + :return: dict of detailed data params + """ + url = url + '/' + vmid + '/status/current' + response = json.load(urllib2.urlopen(self.get_request(url), context=ssl._create_unverified_context())) + resources = response['data'] + attributedict = dict() + for param, paramvalue in resources.items(): + attributedict.update({param: paramvalue}) + return attributedict + def get_cluster_storagelist(self, nodelist): """ Creates Virtual Machine List diff --git a/README.md b/README.md index ee5646f..026e690 100644 --- a/README.md +++ b/README.md @@ -9,5 +9,5 @@ HOST = "localhost:8006" ```

Zabbix Config User Parameter:

``` -UserParameter=pve-zabbix[*],/usr/bin/python /home/zabbix/PVE-Zabbix/PVE-Zabbix.py $1 $2 $3 $4 $5 $6 +UserParameter=pve-zabbix[*],/usr/bin/python /home/zabbix/PVE-Zabbix/PVE-Zabbix.py $1 $2 $3 $4 $5 $6 $7 ``` diff --git a/VM.py b/VM.py index 6e4b34d..fdb20fc 100755 --- a/VM.py +++ b/VM.py @@ -8,7 +8,7 @@ class VM(object): instances = list() def __init__(self, node, name, status, uptime, diskread, diskwrite, memusage, pid, vmid, netin, netout, cpus, - template, disk, cpuusage, maxdisk, maxmem): + template, disk, cpuusage, maxdisk, maxmem, url, **kwargs): self.__class__.instances.append(self) self.name = name self.node = node.name @@ -28,6 +28,8 @@ class VM(object): self.cpuusage = cpuusage 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) @@ -68,3 +70,7 @@ class VM(object): if not param.startswith('__'): vm_params.append({'#' + param.upper(): self.__getattribute__(param)}) return listofdicts_to_zabbix_json(vm_params) + + + def get_detailedvminfo(self): + print self.__dic \ No newline at end of file