feat: read-only IPMI driver; report a missing Redfish license (0.2.0)

A Supermicro X10DRL-i refuses Redfish without a license (SUM, DCMS or
OOB), even the service root. IPMI answers without one.

- New entry point `ipmi` (napalm_redfish.ipmi.IpmiDriver) on
  ManagementControllerDriver, over pyghmi: facts and inventory from the
  FRU (serial number, system UUID), the BMC's LAN interface, sensors
  (temperatures, fans, power supplies), the power state, the event log
  and the BMC firmware. Read-only: no power control, no BMC reset.
  Tested against recordings of the X10 with serials, the UUID, MACs and
  IPs replaced.
- RedfishDriver.open() no longer fails on a license refusal: get_facts
  returns what is known without Redfish, get_device_warnings reports
  bmc_license_required with the licenses the BMC names, every other
  getter raises. netOrk then shows the reason instead of an offline BMC.
- IpmiDriver is not exported from the package: NAPALM's own
  get_network_driver("redfish") takes the first driver class of
  napalm_redfish.
This commit is contained in:
christianmanivong committed 2026-10-13 10:53:51 +02:00
1 parent bfbeb19255
commit 332e6090a7
17 files changed
+1194 -19

No files matched your search

+6
View File
@@ -4,3 +4,9 @@ without a Supermicro license. Requests were made without credentials.
service_root_403.json GET /redfish/v1/ -> HTTP 403, Content-Type application/json
landing_page.html GET / -> HTTP 200, the BMC web login page (trimmed to
the head and the login form action)
ipmi/ Read over IPMI 2.0 (pyghmi 1.6, lanplus) with a BMC account, 2026-10-13. One file per
pyghmi call: power (get_power), net_configuration (get_net_configuration),
firmware (get_firmware), inventory (get_inventory), sensors (get_sensor_data,
each SensorReading's attributes), health (get_health), event_log (get_event_log).
Serial numbers, the system UUID, MAC addresses and IPs are replaced by placeholders.
@@ -0,0 +1,16 @@
[
{
"record_id": 1,
"timecode": 1790788051,
"component_id": "32.201.0",
"component": "PS2 Status",
"deassertion": true,
"component_type_id": 8,
"event_id": "111.1",
"component_type": "Power Supply",
"event": "Recovered",
"severity": 0,
"oem_handler": null,
"timestamp": "2026-09-30T15:07:31"
}
]
@@ -0,0 +1,8 @@
[
[
"BMC Version",
{
"version": "3.91"
}
]
]
@@ -0,0 +1,4 @@
{
"badreadings": [],
"health": 0
}
@@ -0,0 +1,50 @@
[
[
"System",
{
"Board manufacture date": null,
"Board manufacturer": "Supermicro",
"Board product name": "X10DRL-i",
"Board serial number": "ZM000S000001",
"Board model": "X10DRL-i",
"Board FRU Id": null,
"board_extra": [],
"Manufacturer": "Supermicro",
"Product name": "X10DRL-i",
"Model": "X10DRL-i",
"Hardware Version": null,
"Serial Number": "ZM000S000001",
"Asset Number": null,
"FRU ID": null,
"product_extra": [],
"firmware_version": "3.91",
"Device ID": 32,
"Device Revision": 1,
"Manufacturer ID": 10876,
"Product ID": 2097,
"oem_parser": null,
"UUID": "00000000-534D-C40C-0000-000000000001"
}
],
[
"BMC FRU",
{
"Board manufacture date": null,
"Board manufacturer": "Supermicro",
"Board product name": "X10DRL-i",
"Board serial number": "ZM000S000001",
"Board model": "X10DRL-i",
"Board FRU Id": null,
"board_extra": [],
"Manufacturer": "Supermicro",
"Product name": "X10DRL-i",
"Model": "X10DRL-i",
"Hardware Version": null,
"Serial Number": "ZM000S000001",
"Asset Number": null,
"FRU ID": null,
"product_extra": [],
"oem_parser": null
}
]
]
@@ -0,0 +1,10 @@
{
"ipv4_address": "192.0.2.150/24",
"ipv4_configuration": "DHCP",
"mac_address": "0c:c4:7a:00:00:01",
"ipv4_gateway": "192.0.2.1",
"ipv4_backup_gateway": null,
"ipv4_gateway_mac": "02:00:00:00:00:01",
"ipv4_backup_gateway_mac": null,
"vlan_id": "off"
}
@@ -0,0 +1,3 @@
{
"powerstate": "on"
}
@@ -0,0 +1,498 @@
[
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 34.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "CPU1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 37.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "CPU2 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 28.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "PCH Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 18.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "System Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 38.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "Peripheral Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 29.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "Vcpu1VRM Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 33.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "Vcpu2VRM Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 24.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "VmemABVRM Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 22.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "VmemCDVRM Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 35.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "VmemEFVRM Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 30.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "VmemGHVRM Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 25.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P1-DIMMA1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 24.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P1-DIMMB1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 25.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P1-DIMMC1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 22.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P1-DIMMD1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 26.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P2-DIMME1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 26.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P2-DIMMF1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 27.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P2-DIMMG1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Temperature",
"value": 27.0,
"imprecision": 0.5,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "°C",
"name": "P2-DIMMH1 Temp"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Fan",
"value": 6300.0,
"imprecision": 50.0,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "RPM",
"name": "FAN2"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Fan",
"value": 6900.0,
"imprecision": 50.0,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "RPM",
"name": "FAN3"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Fan",
"value": 6400.0,
"imprecision": 50.0,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "RPM",
"name": "FAN4"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Fan",
"value": 5100.0,
"imprecision": 50.0,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "RPM",
"name": "FANB"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 12.0,
"imprecision": 0.03149999999999942,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "12V"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 4.922000000000001,
"imprecision": 0.013000000000000789,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "5VCC"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 3.35,
"imprecision": 0.008500000000000174,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "3.3VCC"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 2.69,
"imprecision": 0.0129999999999999,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "VBAT"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.818,
"imprecision": 0.0044999999999999485,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "Vcpu1"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.818,
"imprecision": 0.0044999999999999485,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "Vcpu2"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.2000000000000002,
"imprecision": 0.0045000000000001705,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "VDIMMAB"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.2000000000000002,
"imprecision": 0.0045000000000001705,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "VDIMMCD"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.2000000000000002,
"imprecision": 0.0045000000000001705,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "VDIMMEF"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.2000000000000002,
"imprecision": 0.0045000000000001705,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "VDIMMGH"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 4.896,
"imprecision": 0.0129999999999999,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "5VSB"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 3.197,
"imprecision": 0.008500000000000174,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "3.3VSB"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.5,
"imprecision": 0.0044999999999999485,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "1.5V PCH"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.209,
"imprecision": 0.0044999999999999485,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "1.2V BMC"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Voltage",
"value": 1.05,
"imprecision": 0.0044999999999999485,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "V",
"name": "1.05V PCH"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Physical Security",
"value": null,
"imprecision": null,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "",
"name": "Chassis Intru"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Power Supply",
"value": null,
"imprecision": null,
"states": [
"Present"
],
"state_ids": [
552704
],
"unavailable": 0,
"units": "",
"name": "PS1 Status"
},
{
"broken_sensor_ids": {},
"health": 0,
"type": "Power Supply",
"value": null,
"imprecision": null,
"states": [],
"state_ids": [],
"unavailable": 0,
"units": "",
"name": "PS2 Status"
}
]