Prat_yow
Prat_yow

Reputation: 23

python to display all the VMs and the ip address on the host

Is there a way to display the ip address of the VMs running on the particular host. how do I use qemu hooks to see all the registered vm in the host. One possible way is to sniff the packets to and from the NIC of the host . But how to filter the broadcast ip address from the source and destination ip address. Can any one suggest a possible way to achieve this. I am not using static ip address for the VMs. A script in python will be of great help. Or even a idea will be appreciated..

Upvotes: 1

Views: 3413

Answers (1)

VooDooNOFX
VooDooNOFX

Reputation: 4752

Well, there's a couple ways you can do this. However the easiest is to use the virsh command line tool

This is system specific, but on Redhat you can install the libvirt-client package to get /usr/bin/virsh.

Here's a SO article showing how to map the MAC address of a guest to their IP using a combination of arp and grep.

There are ways to get some of this information with libvirt-python as well, but it's much more code. Here's an example of using libvirt to connect to your hypervisor.

EDIT: Here's some really untested Python, which should give you a start, but will need some modification and playing around with to 100% work (probably)

import libvirt  # To connect to the hypervisor
import re
import subprocess


# Connect to your local hypervisor. See https://libvirt.org/uri.html
#    for different URI's where you'd replace `None` with your
#    connection URI (like `qemu://system`)
conn = libvirt.openReadOnly(None)  # Open the hypervisor in read-only mode
# conn = libvirt.open(None)  # Open the default hypervisor in read-write mode (require
if conn == None:
    raise Exception('Failed to open connection to the hypervisor')

try:  # getting a list of all domains (by ID) on the host
    domains = conn.listDomainsID()
except:
    raise Exception('Failed to find any domains')

for domain_id in domains:
    # Open that vm
    this_vm = conn.lookupById(domain_id)
    # Grab the MAC Address from the XML definition
    #     using a regex, which may appear multiple times in the XML
    mac_addresses = re.search(r"<mac address='([A-Z0-9:]+)'", vm.XMLDesc(0)).groups()

    for mac_address in mac_addresses:
        # Now, use subprocess to lookup that macaddress in the
        #      ARP tables of the host.
        process = subprocess.Popen(['/sbin/arp', '-a'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        process.wait()  # Wait for it to finish with the command
        for line in process.stdout:
            if mac_address in line:
                ip_address = re.search(r'(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})', line)
                print 'VM {0} with MAC Address {1} is using IP {2}'.format(
                    vm.name(), mac_address, ip_address.groups(0)[0]
                )
             else:
                # Unknown IP Address from the ARP tables! Handle this somehow...

Upvotes: 1

Related Questions