98 lines
3.2 KiB
Python
Executable File
98 lines
3.2 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)
|
|
nodelist = conn.get_node_list()
|
|
|
|
parser = ArgumentParser()
|
|
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):
|
|
# TODO move to VM class
|
|
"""
|
|
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):
|
|
# TODO move to VM class
|
|
"""
|
|
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
|