summaryrefslogtreecommitdiff
diff options
-rwxr-xr-xbin/network_device_info.py41
-rw-r--r--units/ethernet/packaging.pxu5
2 files changed, 46 insertions, 0 deletions
diff --git a/bin/network_device_info.py b/bin/network_device_info.py
index bf9362c..10865b9 100755
--- a/bin/network_device_info.py
+++ b/bin/network_device_info.py
@@ -21,6 +21,7 @@
import argparse
import fcntl
+from natsort import natsorted
import os
import socket
import struct
@@ -37,6 +38,37 @@ class Utils():
sys_path = '/sys/class/net'
+ @staticmethod
+ def get_ethtool_info(interface, key):
+ """Return ethtool information identified by key"""
+ cmd = ['/sbin/ethtool', interface]
+ try:
+ output = check_output(cmd, stderr=STDOUT, universal_newlines=True)
+ except CalledProcessError:
+ return "ethtool returned error"
+ except FileNotFoundError:
+ return "ethtool not installed"
+ if not output:
+ return "ethtool returned no output"
+ data = []
+ output_line = False
+ for line in iter(output.splitlines()):
+ if key in line:
+ label_start = line.find(key)
+ data_start = label_start + len(key)
+ output_line = True
+ if (output_line is True and line[label_start] != ' ' and
+ key not in line):
+ output_line = False
+ if output_line:
+ data.append(line[data_start:].strip())
+ if len(data) == 0:
+ data.append("Not reported")
+ result = ("\n" + "".join(["\t" + item + "\n"
+ for item in natsorted(data)]))
+ result = result.rstrip()
+ return result
+
@classmethod
def is_iface_connected(cls, iface):
try:
@@ -128,6 +160,9 @@ class NetworkDeviceInfo():
self._ipv4 = None
self._ipv6 = None
self._speed = None
+ self._supported_modes = None
+ self._advertised_modes = None
+ self._partner_modes = None
def __str__(self):
ret = ""
@@ -221,11 +256,17 @@ class NetworkDeviceInfo():
if self.interface is None:
return
self._mac = Utils.get_mac_address(self.interface)
+ self._supported_modes = (Utils.get_ethtool_info(
+ self.interface, "Supported link modes:"))
+ self._advertised_modes = (Utils.get_ethtool_info(
+ self.interface, "Advertised link modes:"))
if Utils.is_iface_connected(self.interface):
self._carrier_status = 'Connected'
self._ipv4 = Utils.get_ipv4_address(self.interface)
self._ipv6 = Utils.get_ipv6_address(self.interface)
self._speed = Utils.get_speed(self.interface)
+ self._partner_modes = (Utils.get_ethtool_info(
+ self.interface, "Link partner advertised link modes:"))
else:
self._carrier_status = 'Disconnected'
diff --git a/units/ethernet/packaging.pxu b/units/ethernet/packaging.pxu
index 7d4a812..0064e2f 100644
--- a/units/ethernet/packaging.pxu
+++ b/units/ethernet/packaging.pxu
@@ -1,3 +1,8 @@
unit: packaging meta-data
os-id: debian
Depends: kmod
+
+# This is needed by network_device_info.py
+unit: packaging meta-data
+os-id: debian
+Depends: python3-natsort