Extend system check to display MAC, hostname, and link status
_parse_network_data now returns mac, hostname, and link_status extracted from the Redfish EthernetInterfaces/1 response (MACAddress, HostName, LinkStatus fields confirmed present in live IOM output). _print_results gains a second table — Interface Details (IOM | MAC | Hostname) — between the Network Settings and Firmware Versions tables. Network Settings table drops the redundant Origin column and adds Link Status instead. Both _check_via_serial and _check_via_network updated to unpack and pass the additional fields. fetch_current_config in workflow_serial.py also updated to use the same address-parsing logic and trimmed table layout. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -29,13 +29,15 @@ from ui import (
|
|||||||
|
|
||||||
def _parse_network_data(data: dict) -> tuple:
|
def _parse_network_data(data: dict) -> tuple:
|
||||||
"""
|
"""
|
||||||
Extract (dhcp_enabled, ip, gateway, netmask, origin) from a
|
Extract network details from a Redfish EthernetInterfaces/1 response dict.
|
||||||
Redfish EthernetInterfaces/1 response dict.
|
Returns (dhcp_enabled, ip, gateway, netmask, mac, hostname, link_status).
|
||||||
"""
|
"""
|
||||||
dhcp_enabled = (
|
dhcp_enabled = (
|
||||||
data.get("DHCPv4", {}).get("DHCPEnabled", False) or
|
data.get("DHCPv4", {}).get("DHCPEnabled", False) or
|
||||||
data.get("DHCPv6", {}).get("DHCPEnabled", False)
|
data.get("DHCPv6", {}).get("DHCPEnabled", False)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Prefer IPv4StaticAddresses; fall back to IPv4Addresses
|
||||||
addrs = data.get("IPv4StaticAddresses") or data.get("IPv4Addresses", [])
|
addrs = data.get("IPv4StaticAddresses") or data.get("IPv4Addresses", [])
|
||||||
if addrs:
|
if addrs:
|
||||||
addr = addrs[0]
|
addr = addrs[0]
|
||||||
@@ -45,20 +47,34 @@ def _parse_network_data(data: dict) -> tuple:
|
|||||||
else:
|
else:
|
||||||
ip = gateway = netmask = "--"
|
ip = gateway = netmask = "--"
|
||||||
|
|
||||||
origin = (
|
mac = data.get("MACAddress", "--")
|
||||||
data.get("IPv4Addresses", [{}])[0].get("AddressOrigin", "Unknown")
|
hostname = data.get("HostName", "--")
|
||||||
if data.get("IPv4Addresses")
|
link_status = data.get("LinkStatus", "--")
|
||||||
else ("DHCP" if dhcp_enabled else "Static")
|
|
||||||
)
|
return dhcp_enabled, ip, gateway, netmask, mac, hostname, link_status
|
||||||
return dhcp_enabled, ip, gateway, netmask, origin
|
|
||||||
|
|
||||||
|
|
||||||
def _print_results(net_rows: list, fw_rows: list):
|
def _print_results(net_rows: list, iface_rows: list, fw_rows: list):
|
||||||
|
"""
|
||||||
|
Display network settings, interface identity, and firmware versions.
|
||||||
|
|
||||||
|
net_rows: [IOM, Mode, IP Address, Gateway, Subnet Mask, Link Status]
|
||||||
|
iface_rows: [IOM, MAC Address, Hostname]
|
||||||
|
fw_rows: [IOM, IOM Firmware, Fabric Firmware]
|
||||||
|
"""
|
||||||
rule("Network Settings")
|
rule("Network Settings")
|
||||||
draw_table(
|
draw_table(
|
||||||
["IOM", "Mode", "Origin", "IP Address", "Gateway", "Subnet Mask"],
|
["IOM", "Mode", "IP Address", "Gateway", "Subnet Mask", "Link"],
|
||||||
net_rows,
|
net_rows,
|
||||||
[5, 10, 8, 16, 16, 16],
|
[5, 8, 15, 15, 15, 8],
|
||||||
|
)
|
||||||
|
print()
|
||||||
|
|
||||||
|
rule("Interface Details")
|
||||||
|
draw_table(
|
||||||
|
["IOM", "MAC Address", "Hostname"],
|
||||||
|
iface_rows,
|
||||||
|
[5, 19, 42],
|
||||||
)
|
)
|
||||||
print()
|
print()
|
||||||
|
|
||||||
@@ -108,11 +124,13 @@ def _check_via_serial():
|
|||||||
"/redfish/v1/Managers/IOM1/EthernetInterfaces/1",
|
"/redfish/v1/Managers/IOM1/EthernetInterfaces/1",
|
||||||
)
|
)
|
||||||
if net_ok and isinstance(net_data, dict):
|
if net_ok and isinstance(net_data, dict):
|
||||||
dhcp, ip, gw, nm, origin = _parse_network_data(net_data)
|
dhcp, ip, gw, nm, mac, hostname, link = _parse_network_data(net_data)
|
||||||
mode = _c(C.CYN, "DHCP") if dhcp else _c(C.GRN, "Static")
|
mode = _c(C.CYN, "DHCP") if dhcp else _c(C.GRN, "Static")
|
||||||
net_rows = [["IOM1", mode, origin, ip, gw, nm]]
|
net_rows = [["IOM1", mode, ip, gw, nm, link]]
|
||||||
|
iface_rows = [["IOM1", mac, hostname]]
|
||||||
else:
|
else:
|
||||||
net_rows = [["IOM1", _c(C.RED, "No response"), "--", "--", "--", "--"]]
|
net_rows = [["IOM1", _c(C.RED, "No response"), "--", "--", "--", "--"]]
|
||||||
|
iface_rows = [["IOM1", "--", "--"]]
|
||||||
error(f"IOM1 network query failed: {net_data}")
|
error(f"IOM1 network query failed: {net_data}")
|
||||||
|
|
||||||
# ── IOM firmware version ───────────────────────────────────────────────────
|
# ── IOM firmware version ───────────────────────────────────────────────────
|
||||||
@@ -139,7 +157,7 @@ def _check_via_serial():
|
|||||||
else _c(C.RED, "Unreachable")
|
else _c(C.RED, "Unreachable")
|
||||||
)
|
)
|
||||||
|
|
||||||
_print_results(net_rows, [["IOM1", iom_ver, fab_ver]])
|
_print_results(net_rows, iface_rows, [["IOM1", iom_ver, fab_ver]])
|
||||||
close_serial_connection(ser, device)
|
close_serial_connection(ser, device)
|
||||||
|
|
||||||
|
|
||||||
@@ -161,29 +179,32 @@ def _check_via_network():
|
|||||||
print()
|
print()
|
||||||
|
|
||||||
net_rows = []
|
net_rows = []
|
||||||
|
iface_rows = []
|
||||||
fw_rows = []
|
fw_rows = []
|
||||||
|
|
||||||
for iom, ip in iom_list:
|
for iom, host in iom_list:
|
||||||
# ── Network settings ───────────────────────────────────────────────────
|
# ── Network settings ───────────────────────────────────────────────────
|
||||||
net_ok, net_data = _redfish_request(
|
net_ok, net_data = _redfish_request(
|
||||||
password, "GET",
|
password, "GET",
|
||||||
f"/redfish/v1/Managers/{iom}/EthernetInterfaces/1",
|
f"/redfish/v1/Managers/{iom}/EthernetInterfaces/1",
|
||||||
host=ip,
|
host=host,
|
||||||
)
|
)
|
||||||
if net_ok and isinstance(net_data, dict):
|
if net_ok and isinstance(net_data, dict):
|
||||||
dhcp, ip_addr, gw, nm, origin = _parse_network_data(net_data)
|
dhcp, ip_addr, gw, nm, mac, hostname, link = _parse_network_data(net_data)
|
||||||
mode = _c(C.CYN, "DHCP") if dhcp else _c(C.GRN, "Static")
|
mode = _c(C.CYN, "DHCP") if dhcp else _c(C.GRN, "Static")
|
||||||
net_rows.append([iom, mode, origin, ip_addr, gw, nm])
|
net_rows.append([iom, mode, ip_addr, gw, nm, link])
|
||||||
|
iface_rows.append([iom, mac, hostname])
|
||||||
else:
|
else:
|
||||||
net_rows.append([iom, _c(C.RED, "No response"), "--", "--", "--", "--"])
|
net_rows.append([iom, _c(C.RED, "No response"), "--", "--", "--", "--"])
|
||||||
|
iface_rows.append([iom, "--", "--"])
|
||||||
error(f"{iom} network query failed: {net_data}")
|
error(f"{iom} network query failed: {net_data}")
|
||||||
|
|
||||||
# ── Firmware versions (reuse shared redfish helpers) ───────────────────
|
# ── Firmware versions (reuse shared redfish helpers) ───────────────────
|
||||||
iom_ver = _get_iom_fw_version(password, ip, iom)
|
iom_ver = _get_iom_fw_version(password, host, iom)
|
||||||
fab_ver = _get_fabric_fw_version(password, ip, iom)
|
fab_ver = _get_fabric_fw_version(password, host, iom)
|
||||||
fw_rows.append([iom, iom_ver, fab_ver])
|
fw_rows.append([iom, iom_ver, fab_ver])
|
||||||
|
|
||||||
_print_results(net_rows, fw_rows)
|
_print_results(net_rows, iface_rows, fw_rows)
|
||||||
|
|
||||||
|
|
||||||
# ── Top-level entry point ──────────────────────────────────────────────────────
|
# ── Top-level entry point ──────────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -354,13 +354,12 @@ def fetch_current_config(cfg: ShelfConfig, ser: SerialPort) -> bool:
|
|||||||
ok_flag, data = _serial_redfish_request(ser, cfg.password, "GET", path)
|
ok_flag, data = _serial_redfish_request(ser, cfg.password, "GET", path)
|
||||||
|
|
||||||
if ok_flag and isinstance(data, dict):
|
if ok_flag and isinstance(data, dict):
|
||||||
# Determine mode
|
|
||||||
dhcp_enabled = (
|
dhcp_enabled = (
|
||||||
data.get("DHCPv4", {}).get("DHCPEnabled", False) or
|
data.get("DHCPv4", {}).get("DHCPEnabled", False) or
|
||||||
data.get("DHCPv6", {}).get("DHCPEnabled", False)
|
data.get("DHCPv6", {}).get("DHCPEnabled", False)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Pull address info — prefer StaticAddresses, fall back to IPv4Addresses
|
# Prefer IPv4StaticAddresses; fall back to IPv4Addresses
|
||||||
addrs = data.get("IPv4StaticAddresses") or data.get("IPv4Addresses", [])
|
addrs = data.get("IPv4StaticAddresses") or data.get("IPv4Addresses", [])
|
||||||
if addrs:
|
if addrs:
|
||||||
addr_rec = addrs[0]
|
addr_rec = addrs[0]
|
||||||
@@ -370,9 +369,6 @@ def fetch_current_config(cfg: ShelfConfig, ser: SerialPort) -> bool:
|
|||||||
else:
|
else:
|
||||||
ip = gateway = netmask = "--"
|
ip = gateway = netmask = "--"
|
||||||
|
|
||||||
origin = data.get("IPv4Addresses", [{}])[0].get("AddressOrigin", "Unknown") \
|
|
||||||
if data.get("IPv4Addresses") else ("DHCP" if dhcp_enabled else "Static")
|
|
||||||
|
|
||||||
cfg.iom1 = IOMConfig(
|
cfg.iom1 = IOMConfig(
|
||||||
iom = "IOM1",
|
iom = "IOM1",
|
||||||
dhcp = dhcp_enabled,
|
dhcp = dhcp_enabled,
|
||||||
@@ -381,11 +377,11 @@ def fetch_current_config(cfg: ShelfConfig, ser: SerialPort) -> bool:
|
|||||||
netmask = netmask if netmask != "--" else "",
|
netmask = netmask if netmask != "--" else "",
|
||||||
)
|
)
|
||||||
|
|
||||||
mode_str = f"{_c(C.CYN, 'DHCP')}" if dhcp_enabled else f"{_c(C.GRN, 'Static')}"
|
mode_str = _c(C.CYN, "DHCP") if dhcp_enabled else _c(C.GRN, "Static")
|
||||||
draw_table(
|
draw_table(
|
||||||
["IOM", "Mode", "Origin", "IP Address", "Gateway", "Subnet Mask"],
|
["IOM", "Mode", "IP Address", "Gateway", "Subnet Mask"],
|
||||||
[["IOM1", mode_str, origin, ip, gateway, netmask]],
|
[["IOM1", mode_str, ip, gateway, netmask]],
|
||||||
[5, 10, 8, 16, 16, 16],
|
[5, 8, 15, 15, 15],
|
||||||
)
|
)
|
||||||
print()
|
print()
|
||||||
return True
|
return True
|
||||||
|
|||||||
Reference in New Issue
Block a user