def _get_domain_ips_and_macs( domain: libvirt.virDomain) -> Tuple[List[str], List[str]]: interfaces_sources = [ # getting all DHCP leases IPs libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE, # getting static IPs via ARP libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP, ] interfaces = {} for addresses_source in interfaces_sources: try: interfaces.update( **domain.interfaceAddresses(addresses_source)) except libvirt.libvirtError: log.exception( "Got an error while updating domain's network addresses") ips = [] macs = [] log.debug(f"Host {domain.name()} interfaces are {interfaces}") if interfaces: for (_, val) in interfaces.items(): if val["addrs"]: for addr in val["addrs"]: ips.append(addr["addr"]) macs.append(val["hwaddr"]) if ips: log.info("Host %s ips are %s", domain.name(), ips) if macs: log.info("Host %s macs are %s", domain.name(), macs) return ips, macs
def ip_addresses(domain: libvirt.virDomain): ips = [] ifaces = domain.interfaceAddresses( libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) for (_, val) in ifaces.items(): if val["addrs"]: for ipaddr in val["addrs"]: if (ipaddr["type"] == libvirt.VIR_IP_ADDR_TYPE_IPV4 or ipaddr["type"] == libvirt.VIR_IP_ADDR_TYPE_IPV6): ips.append(ipaddr["addr"]) return ips
def domain_address(domain: libvirt.virDomain) -> str: interfaces = domain.interfaceAddresses( libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) for iface in interfaces.values(): if isinstance(iface, dict) and 'addrs' in iface: for address in iface['addrs']: if 'addr' in address: return address['addr'] raise RuntimeError("No IP address found for the given domain")
def hostname(domain: libvirt.virDomain): try: with suppress_stderr(): hostname = domain.hostname() return hostname except libvirt.libvirtError: macs = [] ifaces = domain.interfaceAddresses( libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) for (_, val) in ifaces.items(): if val["hwaddr"]: macs.append(val["hwaddr"]) conn = domain.connect() for network in conn.listAllNetworks( libvirt.VIR_CONNECT_LIST_NETWORKS_ACTIVE): for lease in network.DHCPLeases(): for mac in macs: if lease["mac"] == mac: return lease["hostname"]
def print_dom_ifaces(dom: libvirt.virDomain) -> None: ifaces = dom.interfaceAddresses( libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE) if ifaces is None: print("Failed to get domain interfaces") exit(0) print(" {0:10} {1:20} {2:12} {3}".format("Interface", "MAC address", "Protocol", "Address")) for (name, val) in ifaces.items(): if val['addrs']: for addr in val['addrs']: print(" {0:10} {1:19} {2:12} {3}/{4}".format( name, val['hwaddr'], IPTYPE[addr['type']], addr['addr'], addr['prefix'])) else: print(" {0:10} {1:19} {2:12} {3}".format(name, val['hwaddr'], "N/A", "N/A"))