diff options
| author | terminaldweller <thabogre@gmail.com> | 2022-12-27 07:42:34 +0000 | 
|---|---|---|
| committer | terminaldweller <thabogre@gmail.com> | 2022-12-27 07:42:34 +0000 | 
| commit | 1d1a3a93d51875ebace26d844479a812af2f8462 (patch) | |
| tree | 6473deebaa4d82f7975c4ce085424e9e5ff19008 /bin/virttop | |
| parent | update (diff) | |
| download | scripts-1d1a3a93d51875ebace26d844479a812af2f8462.tar.gz scripts-1d1a3a93d51875ebace26d844479a812af2f8462.zip | |
now just reading /proc/net/arp instead of using subprocess.
Diffstat (limited to '')
| -rwxr-xr-x | bin/virttop | 62 | 
1 files changed, 31 insertions, 31 deletions
| diff --git a/bin/virttop b/bin/virttop index a3402a4..34c93ba 100755 --- a/bin/virttop +++ b/bin/virttop @@ -6,9 +6,9 @@  # import defusedxml  # type:ignore  # defusedxml.defuse_stdlib()  import argparse +import csv  import dataclasses  import enum -import subprocess  import sys  import typing @@ -98,34 +98,23 @@ def get_network_info(      return result_dict -def get_ip_by_arp(mac: str) -> str: -    """Get ip adress using the arp table.""" -    # arp -n | grep xx:xx:xx:xx:xx:xx | gawk '{print $1}' +def get_arp_table() -> typing.Dict[str, str]: +    """Get the ARP table. return a dict with MAC/IP as key/value pair.""" +    result: typing.Dict[str, str] = {} +    with open("/proc/net/arp", encoding="utf-8") as arp_table: +        reader = csv.reader(arp_table, skipinitialspace=True, delimiter=" ") +        for arp_entry in reader: +            result[arp_entry[3]] = arp_entry[0] + +    return result + + +def get_ip_from_arp_table(arp_table: typing.Dict[str, str], mac: str) -> str: +    """get IP from MAC address using the arp table"""      try: -        proc1 = subprocess.run( -            ["/usr/bin/arp", "-n"], -            capture_output=True, -            check=True, -            shell=False, -        ) -        proc2 = subprocess.run( -            ["/usr/bin/grep", mac], -            input=proc1.stdout, -            capture_output=True, -            check=True, -            shell=False, -        ) -        proc3 = subprocess.run( -            ["/usr/bin/awk", "{print $1}"], -            input=proc2.stdout, -            capture_output=True, -            check=True, -            shell=False, -        ) -        ip_address = proc3.stdout.decode("utf-8").strip("\n") -    except subprocess.CalledProcessError: -        ip_address = "N/A" -    return ip_address +        return arp_table[mac] +    except KeyError: +        return "N/A"  def get_disk_info( @@ -212,7 +201,13 @@ def size_abr(num: float, shift_by: float) -> str:      return "N/A" -def fill_virt_data_uri(conn, active_hosts, virt_data: VirtData) -> None: +# pylint: disable=too-many-locals +def fill_virt_data_uri( +    conn: libvirt.virConnect, +    active_hosts: typing.List[int], +    virt_data: VirtData, +    arp_table: typing.Dict[str, str], +) -> None:      """fill VirtData for one URI."""      for host_id in active_hosts:          virt_data.uri.append(conn.getURI()) @@ -250,13 +245,18 @@ def fill_virt_data_uri(conn, active_hosts, virt_data: VirtData) -> None:          network_info = get_network_info(xml_doc)          virt_data.macs.append(network_info["address"]) -        virt_data.ips.append(get_ip_by_arp(network_info["address"])) +        # virt_data.ips.append(get_ip_by_arp(network_info["address"])) +        # TODO-this is obviously not going to work for remote URIs +        virt_data.ips.append( +            get_ip_from_arp_table(arp_table, network_info["address"]) +        )  def main() -> None:      """entrypoint"""      argparser = Argparser()      virt_data = VirtData() +    arp_table = get_arp_table()      for hv_host in argparser.args.uri:          conn = libvirt.openReadOnly(hv_host)          active_hosts = conn.listDomainsID() @@ -266,7 +266,7 @@ def main() -> None:              # print([pool.name() for pool in conn.listAllStoragePools()])              # print([net.name() for net in conn.listAllNetworks()])              virt_data.vm_id = [repr(vm_id) for vm_id in conn.listDomainsID()] -            fill_virt_data_uri(conn, active_hosts, virt_data) +            fill_virt_data_uri(conn, active_hosts, virt_data, arp_table)              # for conn_id in conn.listAllDomains():              #     print(conn_id.name())              #     print(conn_id.state()) | 
