From 6bc704a19a75b45743f98c0bb0b84de03bc3b95d Mon Sep 17 00:00:00 2001 From: Igor Borodikhin Date: Tue, 10 Apr 2012 12:40:37 +0600 Subject: [PATCH] New plugin for KVM network stats. It works without root privileges and applicable to ProxmoxVE KVM. --- plugins/kvm/kvm_net | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/plugins/kvm/kvm_net b/plugins/kvm/kvm_net index 81c99073..ed2b7caf 100755 --- a/plugins/kvm/kvm_net +++ b/plugins/kvm/kvm_net @@ -4,12 +4,10 @@ # # Munin plugin to show the network I/O per vm # -# Copyright Maxence Dunnewind, Rodolphe QuiƩdeville +# Copyright Igor Borodikhin # # License : GPLv3 # -# need to be run with root privilege to execute brctl -# # # parsed environment variables: # vmsuffix: part of vm name to be removed @@ -58,22 +56,18 @@ def fetch(vms): ''' Fetch values for a list of pids @param dictionnary {kvm_pid: cleaned vm name} ''' - macs = find_vms_tap() res = {} for pid in vms: - mac = get_vm_mac(pid) + tap = get_vm_mac(pid) try: - tap = "tap%s" % macs[mac] - f = open("/proc/net/dev", "r") - for line in f.readlines(): - if tap in line: - line = line.split(':')[1] - print "%s_in.value %s" % (vms[pid], line.split()[0]) - print "%s_out.value %s" % (vms[pid], line.split()[8]) - break - else: - f.close() - except: + f = open("/proc/net/dev", "r") + for line in f.readlines(): + if tap in line: + print "%s_in.value %s" % (vms[pid], re.sub(r"%s:"%tap, "", line.split()[0])) + print "%s_out.value %s" % (vms[pid], line.split()[8]) + break + except Exception as inst: + print inst continue def detect_kvm(): @@ -98,7 +92,8 @@ def get_vm_mac(pid): @return the mac address for a specified pid ''' cmdline = open("/proc/%s/cmdline" % pid, "r") - mac = re.sub(r"^.*macaddr=(..:..:..:..:..:..).*$",r"\1", cmdline.readline()) + line = cmdline.readline() + mac = re.sub(r"^.*ifname=(tap[^,]+),.*$",r"\1", line) return mac def list_pids(): @@ -112,16 +107,21 @@ def find_vms_tap(): ''' Check if kvm is installed @return a list of pids from running kvm ''' - result = {} - kvm = Popen("brctl showmacs br0 | grep no", shell=True, stdout=PIPE) + result = [] + tap = "" + mac = "" + kvm = Popen("ip a | grep -A 1 tap | awk '{print $2}' | grep -v '^$'", shell=True, stdout=PIPE) res = kvm.communicate()[0].split('\n') for line in res: try: - tap = str(int(line.split()[0]) - 1) - mac = line.split()[1] - result[mac] = tap - except: + if len(line) > 0: + if re.match(r"^tap.*", line): + tap = re.sub(r"(tap[^:]+):", r"\1", line) + else: + result.append(tap) + except Exception as inst: continue + return result if __name__ == "__main__":