Reputation: 23
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
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