/usr/local/lib/python3.9/site-packages/agent360/plugins
NameSizeModeActions
__pycache__/-0755rm
apt-updates.py12600644editdlrm
asterisk.py10120644editdlrm
bind.py7320644editdlrm
bird.py8410644editdlrm
bitninja.py13020644editdlrm
cloudlinux-dbgov.py10660644editdlrm
cloudlinux.py10200644editdlrm
cpanel.py14410644editdlrm
cpu.py20200644editdlrm
cpu_freq.py5830644editdlrm
dirsize.py6170644editdlrm
diskinodes.py6520644editdlrm
diskstatus-nvme.py16180644editdlrm
diskstatus.py20050644editdlrm
diskusage.py41400644editdlrm
docker.py34420644editdlrm
dovecot.py13040644editdlrm
elasticsearch.py43420644editdlrm
exim.py4840644editdlrm
fail2ban.py8310644editdlrm
gpu.py9590644editdlrm
haproxy.py42740644editdlrm
httpd.py28000644editdlrm
iostat.py52270644editdlrm
janus.py7050644editdlrm
kamailio.py5560644editdlrm
litespeed.py31140644editdlrm
loadavg.py3320644editdlrm
loggedin.py4000644editdlrm
mailq.py5280644editdlrm
mdstat.py13880644editdlrm
megacli.py27870644editdlrm
memcached.py31650644editdlrm
memory.py9320644editdlrm
minecraft.py24100644editdlrm
mongodb.py57660644editdlrm
mysql.py52560644editdlrm
network.py27860644editdlrm
nginx.py32750644editdlrm
openvpn.py22230644editdlrm
phpfpm.py27810644editdlrm
ping.py31650644editdlrm
plesk-cgroups.py63300644editdlrm
plugins.py25380644editdlrm
postfix.py17740644editdlrm
powerdns.py46690644editdlrm
process.py43650644editdlrm
proftpd.py11300644editdlrm
rabbitmq.py35690644editdlrm
redis_stat.py56150644editdlrm
sleeper.py2440644editdlrm
swap.py3640644editdlrm
system.py58110644editdlrm
tcpports.py11100644editdlrm
temp.py14800644editdlrm
unbound.py33160644editdlrm
vms.py63520644editdlrm
wp-toolkit.py18450644editdlrm
yum-updates.py8100644editdlrm
__init__.py00644editdlrm
Edit: /usr/local/lib/python3.9/site-packages/agent360/plugins/vms.py (6352B)
from __future__ import print_function import re, sys, os import libvirt import libxml2 import time import plugins import psutil class Plugin(plugins.BasePlugin): __name__ = 'vms' def run(self, config): ''' Using the libvirt API to fetch statistics from guests running KVM, QEMU, Xen, Virtuozzo, VMWare ESX, LXC, BHyve and more ''' results = {} last_value = {} prev_cache = self.get_agent_cache() # Get absolute values from previous check uri = os.getenv("uri", "qemu:///system") values = self.fetch_values(uri) deltas = {} for key, value in values.items(): deltas[key] = {} for subkey, subvalue in value.items(): if subkey == 'mem_bytes' or subkey == 'soft_limit_bytes' or subkey == 'min_guarantee_bytes' or subkey == 'hard_limit_bytes': deltas[key][subkey] = value[subkey] else: deltas[key][subkey] = self.absolute_to_per_second('%s_%s' % (key, subkey), float(subvalue), prev_cache) last_value['%s_%s' % (key, subkey)] = float(value[subkey]) last_value['ts'] = time.time() self.set_agent_cache(last_value) return deltas def canon(self, name): return re.sub(r"[^a-zA-Z0-9_]", "_", name) def get_ifaces(self, dom): xml = dom.XMLDesc(0) doc = None try: doc = libxml2.parseDoc(xml) except: return [] ctx = doc.xpathNewContext() ifaces = [] try: ret = ctx.xpathEval("/domain/devices/interface") for node in ret: devdst = None for child in node.children: if child.name == "target": devdst = child.prop("dev") if devdst == None: continue ifaces.append(devdst) finally: if ctx != None: ctx.xpathFreeContext() if doc != None: doc.freeDoc() return ifaces def get_memtune(self, dom): memtune = { 'min_guarantee': 0, 'soft_limit': 0, 'hard_limit': 0 } xml = dom.XMLDesc(0) try: doc = libxml2.parseDoc(xml) except: return [] ctx = doc.xpathNewContext() try: for key in memtune: ret = ctx.xpathEval("/domain/memtune/%s" % key) try: for child in ret[0].children: memtune[key] = int(child.content) break except IndexError: # key not found in xml pass finally: if ctx != None: ctx.xpathFreeContext() if doc != None: doc.freeDoc() return memtune def fetch_values(self, uri): conn = libvirt.openReadOnly(uri) ids = conn.listDomainsID() results = {} for id in ids: data = {} data['net_rx_bytes'] = 0 data['net_tx_bytes'] = 0 try: dom = conn.lookupByID(id) name = dom.name() except libvirt.libvirtError as err: print("Id: %s: %s" % (id, err), file=sys.stderr) continue if name == "Domain-0": continue ifaces = self.get_ifaces(dom) for iface in ifaces: try: stats = dom.interfaceStats(iface) data['net_rx_bytes'] += stats[0] data['net_tx_bytes'] += stats[4] except: print >>sys.stderr, "Cannot get ifstats for '%s' on '%s'" % (iface, name) cputime = float(dom.info()[4]) cputime_percentage = 1.0e-7 * cputime data['cpu'] = cputime_percentage try: data['cpu_percentage'] = cputime_percentage / psutil.cpu_count() except Exception as e: pass maxmem, mem = dom.info()[1:3] mem *= 1024 maxmem *= 1024 data['mem_bytes'] = mem memtune = self.get_memtune(dom) data['min_guarantee_bytes'] = memtune['min_guarantee'] * 1024 data['hard_limit_bytes'] = memtune['hard_limit'] * 1024 data['soft_limit_bytes'] = memtune['soft_limit'] * 1024 data['disk_rd_bytes'] = 0 data['disk_wr_bytes'] = 0 data['disk_wr_req'] = 0 data['disk_rd_req'] = 0 try: dom = conn.lookupByID(id) name = dom.name() except libvirt.libvirtError as err: print("Id: %s: %s" % (id, err), file=sys.stderr) continue if name == "Domain-0": continue disks = self.get_disks(dom) for disk in disks: try: rd_req, rd_bytes, wr_req, wr_bytes, errs = dom.blockStats(disk) data['disk_rd_bytes'] += rd_bytes data['disk_wr_bytes'] += wr_bytes data['disk_rd_req'] += rd_req data['disk_wr_req'] += wr_req except TypeError: print >>sys.stderr, "Cannot get blockstats for '%s' on '%s'" % (disk, name) results[self.canon(name)] = data return results def get_disks(self, dom): xml = dom.XMLDesc(0) doc = None try: doc = libxml2.parseDoc(xml) except: return [] ctx = doc.xpathNewContext() disks = [] try: ret = ctx.xpathEval("/domain/devices/disk") for node in ret: devdst = None for child in node.children: if child.name == "target": devdst = child.prop("dev") if devdst == None: continue disks.append(devdst) finally: if ctx != None: ctx.xpathFreeContext() if doc != None: doc.freeDoc() return disks if __name__ == '__main__': Plugin().execute()