- FIND_NETDEVICE_STRING = (
- r"""find /sys/devices/pci* -type d -name net -exec sh -c '{ grep -sH ^ \
- $1/ifindex $1/address $1/operstate $1/device/vendor $1/device/device \
- $1/device/subsystem_vendor $1/device/subsystem_device ; \
- printf "%s/driver:" $1 ; basename $(readlink -s $1/device/driver); } \
- ' sh \{\}/* \;
- """)
- BASE_ADAPTER_RE = re.compile(
- '^/sys/devices/(.*)/net/([^/]*)/([^:]*):(.*)$', re.M)
-
- @classmethod
- def parse_netdev_info(cls, stdout):
- network_devices = defaultdict(dict)
- matches = cls.BASE_ADAPTER_RE.findall(stdout)
- for bus_path, interface_name, name, value in matches:
- dirname, bus_id = os.path.split(bus_path)
- if 'virtio' in bus_id:
- # for some stupid reason VMs include virtio1/
- # in PCI device path
- bus_id = os.path.basename(dirname)
- # remove extra 'device/' from 'device/vendor,
- # device/subsystem_vendor', etc.
- if 'device/' in name:
- name = name.split('/')[1]
- network_devices[interface_name][name] = value
- network_devices[interface_name][
- 'interface_name'] = interface_name
- network_devices[interface_name]['pci_bus_id'] = bus_id
- # convert back to regular dict
- return dict(network_devices)
-