from PVEApi import PVEApi from argparse import ArgumentParser import json USERNAME = "zabbix@pve" PASSWORD = "zabbix" HOST = "172.16.3.11:8006" conn = PVEApi(HOST, USERNAME, PASSWORD) nodelist = conn.get_node_list() parser = ArgumentParser() # FIXME choose object from list of objects by name parser.add_argument("node", help="Enter node name") parser.add_argument("type", choices=['vm', 'cluster', 'node'], help='categories') parser.add_argument("-l", "--list", dest='listing', action='store_true') parser.add_argument("-n", "--name", dest='name') 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 get_vmnames(vmlist, vmnode, **kwargs): """ Get Virtual Machine Names for discovery :param vmlist: list of VM class objects :param vmnode: node name with to filter VMs by :param kwargs: used to accept command line parameters :return: list of dicts in [{'#VMNAME': "$name"}] format """ name_vmlist = list() for vm in vmlist: if kwargs['name'] is None: if vm.node == vmnode.name: name_vmlist.append({'#VMNAME': vm.name}) elif kwargs['name'] is not None and kwargs['listing'] is True: if vm.node == vmnode.name and vm.name == kwargs['name']: name_vmlist.append({'#VMNAME': vm.name}) return name_vmlist def get_vminfo(vmname, parameter=None): """ Get Virtual Machine data :param vmname: Virtual machine name :param parameter: Specific VM stat e.g.: CPU Usage, use if you want to get one parameter for Zabbix :return: list od dicts with vm params """ vm = next(v for v in conn.get_cluster_vmlist(nodelist) if v.name == vmname) if parameter is not None: vm_params = vm.__getattribute__(parameter) return vm_params else: vm_params = list() for param in dir(vm): if not param.startswith('__'): vm_params.append({'#' + param.upper(): vm.__getattribute__(param)}) return listofdicts_to_zabbix_json(vm_params) def listofdicts_to_zabbix_json(dlist): """ Converts list of dicts to JSON an wraps around 'data' :param dlist: list of dicts you want to convert :return: JSON string for zabbix-get """ newdlist = list() for d in dlist: for k, v in d.iteritems(): k = '{' + k + '}' newdict = {k: v} newdlist.append(newdict) newdlist = {"data": newdlist} zabbixjson = json.dumps(newdlist, separators=(',', ':')) return zabbixjson def exec_vm(**kwargs): """ Handles vm positional parameter :param kwargs: handle cmd parametres :return: """ if kwargs['name'] is not None and kwargs['listing'] is False: print get_vminfo(kwargs['name'], kwargs['param']) else: print listofdicts_to_zabbix_json( get_vmnames(conn.get_cluster_vmlist(nodelist), NODE, name=kwargs['name'], listing=kwargs['listing'])) if args.type == "vm": exec_vm(listing=args.listing, name=args.name, param=args.param) else: print args