From 784cf7f7facf85699c0673958834284410a19abc Mon Sep 17 00:00:00 2001 From: Kasper Koho Date: Mon, 12 Dec 2016 20:59:32 +0200 Subject: [PATCH] Implement NAT IP address fetching Users have often requested showing the IP address of a guest, see retspen/webvirtmgr#221, retspen/webvirtmgr#223, retspen/webvirtmgr#544 This patch attempts to implement that feature using libvirt's domifaddr feature. There is some uncertainty about whether to use domifaddr or net-dhcp-leases, but so far domifaddr seems to work fine. --- vrtManager/instance.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/vrtManager/instance.py b/vrtManager/instance.py index a6fba212..12d01439 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -5,9 +5,11 @@ import os.path try: from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE, \ - VIR_MIGRATE_UNSAFE, VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA + VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE, VIR_MIGRATE_UNSAFE, \ + VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA except: - from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE + from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE, \ + VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE from vrtManager import util from xml.etree import ElementTree from datetime import datetime @@ -182,6 +184,7 @@ def fixed(ctx): def networks(ctx): result = [] + ifaddrs = self.instance.interfaceAddresses(VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) for net in ctx.xpathEval('/domain/devices/interface'): mac_host = net.xpathEval('mac/@address')[0].content nic_host = net.xpathEval('source/@network|source/@bridge|source/@dev')[0].content @@ -190,6 +193,14 @@ def networks(ctx): ip = get_mac_ipaddr(net, mac_host) except: ip = None + + if not ip: + # Try to get the IP address from domifaddrs + for iface in ifaddrs.values(): + if iface.get('hwaddr') == mac_host: + ip = ', '.join(['%s/%d' % (a['addr'], a['prefix']) for a in iface.get('addrs', [])]) + break + result.append({'mac': mac_host, 'nic': nic_host, 'ip': ip}) return result