PVE-Zabbix/PVE-Zabbix.py

92 lines
2.9 KiB
Python
Executable File

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)
parser = ArgumentParser()
parser.add_argument("node", choices=conn.get_node_list(), help="Choose node")
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 = args.node
def get_vmnames(vmlist, node, **kwargs):
"""
Get Virtual Machine Names for discovery
:param vmlist: list of VM class objects
:param node: 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 == node:
name_vmlist.append({'#VMNAME': vm.name})
elif kwargs['name'] is not None and kwargs['listing'] is True:
if vm.node == node 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 kwargs: handle vm params
:return: list od dicts with vm params
"""
vm = next(v for v in conn.get_cluster_vmlist() 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(), 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