Compare commits

...

No commits in common. "c8" and "c10s" have entirely different histories.
c8 ... c10s

14 changed files with 321 additions and 448 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
SOURCES/redfish-finder-0.3.tar.gz

View File

@ -1 +0,0 @@
38c07146eeb641fb358ec353a4f7b69b4b844661 SOURCES/redfish-finder-0.3.tar.gz

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# redfish-finder
The redfish-finder package

View File

@ -1,70 +0,0 @@
commit 74c305647c892b9035332aaf179d11544104caba
Author: Adrian Huang <ahuang12@lenovo.com>
Date: Thu Jul 11 15:50:40 2019 +0800
Fix the exception if hostname is empty
Redfish Host Interface Specification [1] defines the field "Redfish
Service Hostname" as "Varies", which means it can be empty. Moreover,
this field is not mandatory for well-defined configuration (a valid
string).
The original design assumes that this field is the non-empty string
shown as follows:
-------------------------------------------------------------------
self.hostname = cursor.split()[0]
-------------------------------------------------------------------
This leads to the exception, and the "self.hostname" is not configured.
Here is the error output:
-------------------------------------------------------------------
redfish-finder: Getting dmidecode info
redfish-finder: Unexpected error parsing ServiceConfig
redfish-finder: Building NetworkManager connection info
redfish-finder: Obtaining OS config info
redfish-finder: Converting SMBIOS Host Config to NetworkManager Connection info
redfish-finder: Applying NetworkManager connection configuration changes
Error: 'enp6s0f3u2u3c2' is not an active connection.
Error: no active connection provided.
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
redfish-finder: Adding redfish host info to OS config
Traceback (most recent call last):
File "./redfish-finder", line 526, in <module>
main()
File "./redfish-finder", line 520, in main
svc.update_redfish_info()
File "./redfish-finder", line 349, in update_redfish_info
if h.find(self.sconf.hostname) != -1:
AttributeError: ServiceConfig instance has no attribute 'hostname'
-------------------------------------------------------------------
This patch fixes the above-mentioned issue accordingly.
[1] https://www.dmtf.org/sites/default/files/standards/documents/DSP0270_1.1.0.pdf
Signed-off-by: Adrian Huang <ahuang12@lenovo.com>
diff --git a/redfish-finder b/redfish-finder
index 429cc42..c2cba75 100755
--- a/redfish-finder
+++ b/redfish-finder
@@ -235,7 +235,16 @@ class ServiceConfig():
cursor = cursor_consume_next(cursor, "Redfish Service Vlan: ")
self.vlan = int(cursor.split()[0])
cursor = cursor_consume_next(cursor, "Redfish Service Hostname: ")
- self.hostname = cursor.split()[0]
+
+ #
+ # Sanity check: If it contains the consecutive spaces
+ # only, reference to the index '0' will throw an
+ # exception.
+ #
+ if len(cursor.split()) != 0:
+ self.hostname = cursor.split()[0]
+ else:
+ self.hostname = ""
except:
print("redfish-finder: Unexpected error parsing ServiceConfig")

View File

@ -1,283 +0,0 @@
commit 44853a940a2b3c52395e26a3632e10cc6b5f2e5d
Author: Neil Horman <nhorman@tuxdriver.com>
Date: Thu Jun 27 11:26:48 2019 -0400
Add support for multiple type 42 blocks in SMBIOS
DMTF recently updated their host API specification to allow for multiple
type 42 blocks (in support of ipv4/ipv6 in the constrained space of a
single block). Enhance redfish-finder to parse and merge those blocks
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
diff --git a/redfish-finder b/redfish-finder
index 45c4ea8..429cc42 100755
--- a/redfish-finder
+++ b/redfish-finder
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/libexec/platform-python
import sys
import os
@@ -49,6 +49,9 @@ class NetDevice(object):
def getifcname(self):
return self.name
+ def merge(self, newdev):
+ return self
+
def __str__(self):
return "Interface: " + self.name
@@ -112,9 +115,9 @@ class USBNetDevice(NetDevice):
######################################################
class HostConfig():
def __init__(self, cursor):
- self.address = None
- self.mask = None
- self.network = None
+ self.address = []
+ self.mask = []
+ self.network = []
try:
cursor = cursor_consume_next(cursor, "Host IP Assignment Type: ")
@@ -122,26 +125,30 @@ class HostConfig():
printf("redfish-finder: Unable to parse SMBIOS Host IP Assignment Type")
return None
if cursor.split()[0] == "Static":
- self.assigntype = AssignType.STATIC
+ self.assigntype = []
+ self.assigntype.append(AssignType.STATIC)
cursor = cursor_consume_next(cursor, "Host IP Address Format: ")
if cursor.split()[0] == "IPv4":
cursor = cursor_consume_next(cursor, "IPv4 Address: ")
addr = cursor.split()[0]
- self.address = ipaddress.IPv4Address(addr)
+ self.address.append(ipaddress.IPv4Address(addr))
cursor = cursor_consume_next(cursor, "IPv4 Mask: ")
mask = cursor.split()[0]
- self.mask = ipaddress.IPv4Address(mask)
- self.network = ipaddress.IPv4Network(addr + "/" + mask, strict=False)
+ self.mask.append(ipaddress.IPv4Address(mask))
+ self.network.append(ipaddress.IPv4Network(addr + "/" + mask, strict=False))
elif cursor.split()[0] == "IPv6":
cursor = cursor_consume_next(cursor, "IPv6 Address: ")
addr = cursor.split()[0]
- self.address = ipaddress.IPv6Address(addr)
+ self.address.append(ipaddress.IPv6Address(addr))
cursor = cursor_consume_next(cursor, "IPv6 Mask: ")
mask = cursor.split()[0]
- self.mask = ipaddress.IPv4Address(mask)
- self.network = ipaddress.IPv6Network(addr + "/" + mask, strict=False)
+ self.mask.append(ipaddress.IPv4Address(mask))
+ self.network.append(ipaddress.IPv6Network(addr + "/" + mask, strict=False))
elif cursor.split()[0] == "DHCP":
- self.assigntype = AssignType.DHCP
+ self.assigntype.append(AssignType.DHCP)
+ self.address.append(0)
+ self.mask.append(0)
+ self.network.append(0)
else:
# Support the other types later
print("redfish-finder: Unable to parse SMBIOS Host configuaration")
@@ -150,6 +157,13 @@ class HostConfig():
print("redfish-finder: Unexpected error while parsing HostConfig!")
return None
+ def merge(self, newconfig):
+ self.assigntype.extend(newconfig.assigntype)
+ self.address.extend(newconfig.address)
+ self.mask.extend(newconfig.mask)
+ self.network.extend(newconfig.network)
+ return self
+
#
# Using the smbios host config info, set the appropriate
# attributes of the network manager connection object
@@ -157,20 +171,22 @@ class HostConfig():
def generate_nm_config(self, device, nmcon):
assignmap = { AssignType.STATIC: "manual", AssignType.DHCP: "auto"}
methodp = "ipv4.method"
- if self.assigntype == AssignType.STATIC:
- if self.address.version == 4:
- methodp = "ipv4.method"
- addrp = "ipv4.addresses"
- else:
- methodp = "ipv6.method"
- addrp = "ipv6.addresses"
- try:
- nmcon.update_property(methodp, assignmap[self.assigntype])
- if self.assigntype == AssignType.STATIC:
- nmcon.update_property(addrp, str(self.address) + "/" + str(self.network.prefixlen))
- except:
- print("redfish-finder: Error generating nm_config")
- return False
+ for i in range(len(self.assigntype)):
+ assigntype = self.assigntype[i]
+ if assigntype == AssignType.STATIC:
+ if self.address[i].version == 4:
+ methodp = "ipv4.method"
+ addrp = "ipv4.addresses"
+ else:
+ methodp = "ipv6.method"
+ addrp = "ipv6.addresses"
+ try:
+ nmcon.update_property(methodp, assignmap[assigntype])
+ if assigntype == AssignType.STATIC:
+ nmcon.update_property(addrp, str(self.address[i]) + "/" + str(self.network[i].prefixlen))
+ except:
+ print("redfish-finder: Error generating nm_config")
+ return False
return True
@@ -188,8 +204,8 @@ class HostConfig():
######################################################
class ServiceConfig():
def __init__(self, cursor):
- self.address = None
- self.mask = None
+ self.address = []
+ self.mask = []
try:
cursor = cursor_consume_next(cursor, "Redfish Service IP Discovery Type: ")
if cursor == None:
@@ -200,14 +216,14 @@ class ServiceConfig():
cursor = cursor_consume_next(cursor, "Redfish Service IP Address Format: ")
if cursor.split()[0] == "IPv4":
cursor = cursor_consume_next(cursor, "IPv4 Redfish Service Address: ")
- self.address = ipaddress.IPv4Address(cursor.split()[0])
+ self.address.append(ipaddress.IPv4Address(cursor.split()[0]))
cursor = cursor_consume_next(cursor, "IPv4 Redfish Service Mask: ")
- self.mask = ipaddress.IPv4Address(cursor.split()[0])
+ self.mask.append(ipaddress.IPv4Address(cursor.split()[0]))
elif cursor.split()[0] == "IPv6":
cursor = cursor_consume_next(cursor, "IPv6 Redfish Service Address: ")
- self.address = ipaddress.IPv6Address(unicode(cursor.split()[0], "utf-8"))
+ self.address.append(ipaddress.IPv6Address(unicode(cursor.split()[0], "utf-8")))
cursor = cursor_consume_next(cursor, "IPv6 Mask: ")
- self.mask = ipaddress.IPv4Address(unicode(cursor.split()[0], "utf-8"))
+ self.mask.append(ipaddress.IPv4Address(unicode(cursor.split()[0], "utf-8")))
elif cursor.split()[0] == "DHCP":
self.assigntype = AssignType.DHCP
else:
@@ -223,6 +239,11 @@ class ServiceConfig():
except:
print("redfish-finder: Unexpected error parsing ServiceConfig")
+ def merge(self, newconfig):
+ self.address.extend(newconfig.address)
+ self.mask.extend(newconfig.mask)
+ return self
+
def __str__(self):
val = "Service Config(" + AssignType.typestring[self.assigntype] + ")"
if (self.assigntype == AssignType.STATIC):
@@ -236,42 +257,63 @@ class ServiceConfig():
######################################################
class dmiobject():
def __init__(self, dmioutput):
+ self.device = None
+ self.hostconfig = None
+ self.serviceconfig = None
cursor = dmioutput
# Find the type 42 header, if not found, nothing to do here
- cursor = cursor_consume_next(cursor, "Management Controller Host Interface\n")
- if (cursor == None):
- return None
- cursor = cursor_consume_next(cursor, "Host Interface Type: Network\n")
- if (cursor == None):
- return None
+ cursor = cursor_consume_next(cursor, "Management Controller Host Interface\n")
+ while (cursor != None):
+ if (cursor == None):
+ return None
+ cursor = cursor_consume_next(cursor, "Host Interface Type: Network\n")
+ if (cursor == None):
+ return None
- # If we get here then we know this is a network interface device
- cursor = cursor_consume_next(cursor, "Device Type: ")
- # The next token should either be:
- # USB
- # PCI/PCIe
- # OEM
- # Unknown
- dtype = cursor.split()[0]
- if (dtype == "USB"):
- self.device = USBNetDevice(cursor)
-
- if self.device == None:
- return None
+ # If we get here then we know this is a network interface device
+ cursor = cursor_consume_next(cursor, "Device Type: ")
+ # The next token should either be:
+ # USB
+ # PCI/PCIe
+ # OEM
+ # Unknown
+ dtype = cursor.split()[0]
+ if (dtype == "USB"):
+ newdev = USBNetDevice(cursor)
+
+ if newdev == None:
+ return None
- # Now find the Redfish over IP section
- cursor = cursor_consume_next(cursor, "Protocol ID: 04 (Redfish over IP)\n")
- if (cursor == None):
- print("redfish-finder: Unable to find Redfish Protocol")
- return None
+ if self.device == None:
+ self.device = newdev
+ else:
+ self.device.merge(newdev)
- self.hostconfig = HostConfig(cursor)
- if self.hostconfig == None:
- return None
+ # Now find the Redfish over IP section
+ cursor = cursor_consume_next(cursor, "Protocol ID: 04 (Redfish over IP)\n")
+ if (cursor == None):
+ print("redfish-finder: Unable to find Redfish Protocol")
+ return None
- self.serviceconfig = ServiceConfig(cursor)
- if self.serviceconfig == None:
- return None
+ newhostconfig = HostConfig(cursor)
+ if newhostconfig == None:
+ return None
+
+ if self.hostconfig == None:
+ self.hostconfig = newhostconfig
+ else:
+ self.hostconfig.merge(newhostconfig)
+
+ serviceconfig = ServiceConfig(cursor)
+ if serviceconfig == None:
+ return None
+
+ if self.serviceconfig == None:
+ self.serviceconfig = serviceconfig
+ elif self.serviceconfig == None:
+ self.serviceconfig.merge(serviceconfig)
+
+ cursor = cursor_consume_next(cursor, "Management Controller Host Interface\n")
def __str__(self):
@@ -309,7 +351,10 @@ class OSServiceData():
continue
# Now add the new entries in
- newentry = str(self.sconf.address) + " " + self.constant_name
+ addresses=""
+ for i in self.sconf.address:
+ addresses = addresses + str(i) + " "
+ newentry = addresses + " " + self.constant_name
newentry = newentry + " " + self.sconf.hostname
self.host_entries.append(newentry)

View File

@ -1,89 +0,0 @@
Name: redfish-finder
Version: 0.3
Release: 6%{?dist}
Summary: Utility for parsing SMBIOS information and configuring canonical BMC access
BuildArch: noarch
License: GPLv2
URL: https://github.com/nhorman/redfish-finder
Source0: %url/archive/V%{version}/%{name}-%{version}.tar.gz
Patch0: redfish-finder-multi-block.patch
Patch1: hostname-null-check.patch
Patch2: hostconfig-dhcp-parse.patch
%{?systemd_requires}
BuildRequires: systemd
Requires: python3 NetworkManager dmidecode
%description
Scans Smbios information for type 42 management controller information, and uses
that to configure the appropriate network interface so that the BMC is
canonically accessible via the host name redfish-localhost
%prep
%autosetup
%build
#noop here
%install
install -D -p -m 0755 redfish-finder %{buildroot}/%{_bindir}/redfish-finder
install -D -p -m 0644 redfish-finder.1 %{buildroot}/%{_mandir}/man1/redfish-finder.1
install -D -p -m 0644 ./redfish-finder.service %{buildroot}/%{_unitdir}/redfish-finder.service
%post
%systemd_post redfish-finder.service
%preun
%systemd_preun redfish-finder.service
%postun
%systemd_postun_with_restart redfish-finder.service
%files
%doc README.md
%license COPYING
%{_bindir}/redfish-finder
%{_mandir}/man1/redfish-finder.1.*
%{_unitdir}/redfish-finder.service
%changelog
* Fri Feb 12 2021 Joel Savitz <jsavitz@redhat.com> - 0.3-6
- Fix typo in spec file (bz1951216)
* Fri Feb 12 2021 Joel Savitz <jsavitz@redhat.com> - 0.3-5
- Fix parsing HostConfig for DHCP (bz1874653)
* Thu Oct 17 2019 Neil Horman <nhorman@redhat.com> - 0.3-4
- Fix null hostname check (bz1729343)
* Mon Jul 01 2019 Neil Horman <nhorman@redhat.com> - 0.3-3
- Enhance to support multiple type 42 blocks (bz1715914)
* Fri Apr 26 2019 Neil Horman <nhorman@redhat.com> - 0.3-2
- Bump release number to test CI gating
* Mon Apr 01 2019 Neil Horman <nhorman@redhat.com> - 0.3-1
- Update to latest upstream release (bz1687111)
* Fri Oct 19 2018 Neil Horman <nhorman@redhat.com> - 0.2-1
- Update to new upstream release
* Thu Oct 04 2018 Neil Horman <nhorman@tuxdriver.com> - 0.1-3
- Fixed missing BuildRequires/Requires
- Fixed missing dist tag
- Fixed Source url
* Wed Oct 03 2018 Neil Horman <nhorman@tuxdriver.com> - 0.1-2
- Updated requires for python3
- Removed unneeded BuildRequires
- Globed the inclusion of man page
- Fixed license file tagging
* Mon Oct 01 2018 Neil Horman <nhorman@tuxdriver.com> - 0.1-1
- Initial import

125
fix-dhcp-mode.patch Normal file
View File

@ -0,0 +1,125 @@
From c624c9dfe03c0e066eea1240b4b9ca8f3ed07eb8 Mon Sep 17 00:00:00 2001
From: John Chung <john.chung@arm.com>
Date: Fri, 26 May 2023 22:03:50 +0800
Subject: [PATCH] Redfish-finder cannot work in DHCP mode
dmidecode output didn't provide Redfish Service Address in dhcp mode.
It will fail to match domain name to ip address. Move to fetch DHCP
server ip address from nmcli output.
dmidecode output :
Handle 0x0021, DMI type 42, 129 bytes
Management Controller Host Interface
Host Interface Type: Network
Device Type: USB
idVendor: 0x0b05
idProduct: 0x1976
Protocol ID: 04 (Redfish over IP)
Service UUID: 24913078-eeb7-5842-b08b-732425cc09ea
Host IP Assignment Type: DHCP
Host IP Address Format: IPv4
Redfish Service IP Discovery Type: DHCP
Redfish Service IP Address Format: IPv4
Redfish Service Hostname: bmc.host.interface
Signed-off-by: John Chung <john.chung@arm.com>
---
redfish-finder | 43 +++++++++++++++++++++++++++++++++++--------
1 file changed, 35 insertions(+), 8 deletions(-)
diff --git a/redfish-finder b/redfish-finder
index 461eff9..b869a9b 100755
--- a/redfish-finder
+++ b/redfish-finder
@@ -203,6 +203,7 @@ class ServiceConfig():
def __init__(self, cursor):
self.address = []
self.mask = []
+ self.dhcp_format = []
try:
cursor = cursor_consume_next(cursor, "Redfish Service IP Discovery Type: ")
if cursor == None:
@@ -220,16 +221,21 @@ class ServiceConfig():
self.address.append(ipaddress.IPv6Address(unicode(cursor.split()[0], "utf-8")))
cursor = cursor_consume_next(cursor, "IPv6 Mask: ")
self.mask.append(ipaddress.IPv4Address(unicode(cursor.split()[0], "utf-8")))
+ cursor = cursor_consume_next(cursor, "Redfish Service Port: ")
+ self.port = int(cursor.split()[0])
+ cursor = cursor_consume_next(cursor, "Redfish Service Vlan: ")
+ self.vlan = int(cursor.split()[0])
elif cursor.split()[0] == "DHCP":
self.assigntype = AssignType.DHCP
+ cursor = cursor_consume_next(cursor, "Redfish Service IP Address Format: ")
+ if cursor.split()[0] == "IPv4":
+ self.dhcp_format.append("DHCP4")
+ elif cursor.split()[0] == "IPv6":
+ self.dhcp_format.append("DHCP6")
else:
# Support the other types later
print("redfish-finder: Unable to parse SMBIOS Service Config info")
return None
- cursor = cursor_consume_next(cursor, "Redfish Service Port: ")
- self.port = int(cursor.split()[0])
- cursor = cursor_consume_next(cursor, "Redfish Service Vlan: ")
- self.vlan = int(cursor.split()[0])
cursor = cursor_consume_next(cursor, "Redfish Service Hostname: ")
#
@@ -338,7 +344,7 @@ class OSServiceData():
# Method to read in /etc/hosts, remove old redfish entries
# and insert new ones based on ServiceConfig
#
- def update_redfish_info(self):
+ def update_redfish_info(self, conn):
# strip any redfish localhost entry from host_entries
# as well as any entries for the smbios exported host name
for h in self.host_entries:
@@ -351,8 +357,14 @@ class OSServiceData():
# Now add the new entries in
addresses=""
- for i in self.sconf.address:
- addresses = addresses + str(i) + " "
+ if self.sconf.assigntype == AssignType.DHCP:
+ for i in self.sconf.dhcp_format:
+ dhcp_ip = conn.get_dhcp_server_identifier(i)
+ addresses = addresses + str(dhcp_ip) + " "
+ else:
+ for i in self.sconf.address:
+ addresses = addresses + str(i) + " "
+
newentry = addresses + " " + self.constant_name
newentry = newentry + " " + self.sconf.hostname
self.host_entries.append(newentry)
@@ -436,6 +448,21 @@ class nmConnection():
def get_property(self, prop):
return self.properties[prop]
+ #
+ # Get DHCP server identifier
+ #
+ def get_dhcp_server_identifier(self, dhcp_format):
+ propstr = subprocess.check_output(["nmcli", "-f", dhcp_format, "con", "show", self.ifc.getifcname()])
+ lines = propstr.splitlines()
+ for data in lines:
+ elements = data.decode("utf-8").split()
+ if len(elements) < 2:
+ continue
+ for key in elements:
+ if key == "dhcp_server_identifier":
+ return elements[3]
+ return None
+
#
# Using this object, run nmcli to update the os so that the
# interface represented here is in sync with our desired
@@ -523,7 +550,7 @@ def main():
if conn.sync_to_os() == False:
sys.exit(1)
print("redfish-finder: Adding redfish host info to OS config")
- svc.update_redfish_info()
+ svc.update_redfish_info(conn)
if svc.output_redfish_config() == False:
sys.exit(1)
print("redfish-finder: Done, BMC is now reachable via hostname redfish-localhost")

7
gating.yaml Normal file
View File

@ -0,0 +1,7 @@
--- !Policy
product_versions:
- rhel-*
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.hardware-redfish-finder.tier0.functional}

View File

@ -15,14 +15,13 @@ new mode 100755
index 9a185b3..461eff9
--- a/redfish-finder
+++ b/redfish-finder
@@ -124,8 +124,8 @@ class HostConfig():
@@ -123,8 +123,8 @@ class HostConfig():
cursor = cursor_consume_next(cursor, "Host IP Assignment Type: ")
if cursor == None:
printf("redfish-finder: Unable to parse SMBIOS Host IP Assignment Type")
return None
raise RuntimeError("redfish-finder: Unable to parse SMBIOS Host IP Assignment Type")
+ self.assigntype = []
if cursor.split()[0] == "Static":
- self.assigntype = []
self.assigntype.append(AssignType.STATIC)
cursor = cursor_consume_next(cursor, "Host IP Address Format: ")
if cursor.split()[0] == "IPv4":

View File

@ -0,0 +1,20 @@
commit 59fc5f964bf6971da552d059520d7798fccbd4fc
Author: Neil Horman <nhorman@hmswarspite.think-freely.org>
Date: Tue Nov 12 08:53:50 2019 -0500
fixup interpreter to be python3
This should never have been there, platform-python is an old distro-ism.
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
diff --git a/redfish-finder b/redfish-finder
index 6637d92..9a185b3 100644
--- a/redfish-finder
+++ b/redfish-finder
@@ -1,4 +1,4 @@
-#!/usr/libexec/platform-python
+#!/usr/bin/python3
import sys
import os

5
redfish-finder.rpmlintrc Normal file
View File

@ -0,0 +1,5 @@
# .rpmlintrc
# Ignore spelling errors
addFilter("spelling-error.*")

66
redfish-finder.spec Normal file
View File

@ -0,0 +1,66 @@
Name: redfish-finder
Version: 0.4
Release: %autorelease -b 9
Summary: Utility for parsing SMBIOS information and configuring canonical BMC access
ExclusiveArch: x86_64 aarch64
%define debug_package %{nil}
License: GPL-2.0-or-later
URL: https://github.com/nhorman/redfish-finder
Source: %url/archive/V%{version}/%{name}-%{version}.tar.gz
# Fix shabang python interpreter: https://github.com/nhorman/redfish-finder/commit/59fc5f964bf6971da552d059520d7798fccbd4fc
Patch0: redfish-finder-python3.patch
# Fix parsing HostConfig for DHCP: https://github.com/nhorman/redfish-finder/commit/581327fd45351dd53c06a26517bb7f92e19d8f31
Patch1: hostconfig-dhcp-parse.patch
# Fix DHCP mode: https://github.com/nhorman/redfish-finder/commit/c624c9dfe03c0e066eea1240b4b9ca8f3ed07eb8
Patch2: fix-dhcp-mode.patch
# Support AutoConfig mode: https://github.com/nhorman/redfish-finder/commit/f6248933605e051992e5a0c29b2c9753e0dc4e76
Patch3: support-autoconf-mode.patch
BuildRequires: systemd-rpm-macros
Requires: python3
Requires: NetworkManager
Requires: dmidecode
%description
Scans Smbios information for type 42 management controller information, and uses
that to configure the appropriate network interface so that the BMC is
canonically accessible via the host name redfish-localhost
%prep
%autosetup
%build
#noop here
%install
install -D -p -m 0755 redfish-finder %{buildroot}/%{_bindir}/redfish-finder
install -D -p -m 0644 redfish-finder.1 %{buildroot}/%{_mandir}/man1/redfish-finder.1
install -D -p -m 0644 ./redfish-finder.service %{buildroot}/%{_unitdir}/redfish-finder.service
%post
%systemd_post redfish-finder.service
%preun
%systemd_preun redfish-finder.service
%postun
%systemd_postun_with_restart redfish-finder.service
%files
%doc README.md
%license COPYING
%{_bindir}/redfish-finder
%{_mandir}/man1/redfish-finder.1.*
%{_unitdir}/redfish-finder.service
%changelog
%autochangelog

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (redfish-finder-0.4.tar.gz) = 5a38e2f2888cd9cdedd877a09ffd954dd7631f546c4e58fbcb523835b4c0905dd6d4288e6fca2e545740467e177b38895646f746a49f070b9f450a5390a0429d

View File

@ -0,0 +1,91 @@
From f6248933605e051992e5a0c29b2c9753e0dc4e76 Mon Sep 17 00:00:00 2001
From: John Chung <john.chung@arm.com>
Date: Sun, 28 May 2023 16:32:05 +0800
Subject: [PATCH] Support to configure AutoConf mode
Get IP address by DHCP server. If fails, fallback to use IP address
from smbios type 42. And redfish service ip address is based on type
42 records.
dmidecode output :
Handle 0x0075, DMI type 42, 130 bytes
Management Controller Host Interface
Host Interface Type: Network
Device Type: USB
idVendor: 0x0b05
idProduct: 0x1976
Protocol ID: 04 (Redfish over IP)
Service UUID: c95cab2a-6de0-45f4-8b3b-726c3794b26b
Host IP Assignment Type: AutoConf
Host IP Address Format: IPv4
IPv4 Address: 169.254.11.12
IPv4 Mask: 255.255.0.0
Redfish Service IP Discovery Type: AutoConf
Redfish Service IP Address Format: IPv4
IPv4 Redfish Service Address: 169.254.201.45
IPv4 Redfish Service Mask: 255.255.0.0
Redfish Service Port: 443
Redfish Service Vlan: 0
Redfish Service Hostname: bmc.host.interface
Signed-off-by: John Chung <john.chung@arm.com>
---
redfish-finder | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/redfish-finder b/redfish-finder
index b869a9b..31045dd 100755
--- a/redfish-finder
+++ b/redfish-finder
@@ -124,8 +124,12 @@ class HostConfig():
if cursor == None:
raise RuntimeError("redfish-finder: Unable to parse SMBIOS Host IP Assignment Type")
self.assigntype = []
- if cursor.split()[0] == "Static":
- self.assigntype.append(AssignType.STATIC)
+ if cursor.split()[0] == "Static" or cursor.split()[0] == "AutoConf":
+ assigntype = AssignType.STATIC
+ if cursor.split()[0] == "AutoConf":
+ assigntype = AssignType.AUTOCONF
+ self.assigntype.append(assigntype)
+
cursor = cursor_consume_next(cursor, "Host IP Address Format: ")
if cursor.split()[0] == "IPv4":
cursor = cursor_consume_next(cursor, "IPv4 Address: ")
@@ -166,11 +170,11 @@ class HostConfig():
# attributes of the network manager connection object
#
def generate_nm_config(self, device, nmcon):
- assignmap = { AssignType.STATIC: "manual", AssignType.DHCP: "auto"}
+ assignmap = { AssignType.STATIC: "manual", AssignType.DHCP: "auto", AssignType.AUTOCONF: "auto"}
methodp = "ipv4.method"
for i in range(len(self.assigntype)):
assigntype = self.assigntype[i]
- if assigntype == AssignType.STATIC:
+ if assigntype == AssignType.STATIC or assigntype == AssignType.AUTOCONF:
if self.address[i].version == 4:
methodp = "ipv4.method"
addrp = "ipv4.addresses"
@@ -179,7 +183,7 @@ class HostConfig():
addrp = "ipv6.addresses"
try:
nmcon.update_property(methodp, assignmap[assigntype])
- if assigntype == AssignType.STATIC:
+ if assigntype == AssignType.STATIC or assigntype == AssignType.AUTOCONF:
nmcon.update_property(addrp, str(self.address[i]) + "/" + str(self.network[i].prefixlen))
except:
print("redfish-finder: Error generating nm_config")
@@ -208,8 +212,11 @@ class ServiceConfig():
cursor = cursor_consume_next(cursor, "Redfish Service IP Discovery Type: ")
if cursor == None:
raise RuntimeError("redfish-finder: Unable to find Redfish Service Info")
- if cursor.split()[0] == "Static":
+ if cursor.split()[0] == "Static" or cursor.split()[0] == "AutoConf":
self.assigntype = AssignType.STATIC
+ if cursor.split()[0] == "AutoConf":
+ self.assigntype = AssignType.AUTOCONF
+
cursor = cursor_consume_next(cursor, "Redfish Service IP Address Format: ")
if cursor.split()[0] == "IPv4":
cursor = cursor_consume_next(cursor, "IPv4 Redfish Service Address: ")