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
Example #2
0
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
Example #3
0
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")
Example #4
0
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"))