Compare commits

...

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

7 changed files with 60 additions and 376 deletions

2
.gitignore vendored
View File

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

View File

@ -1 +1 @@
38c07146eeb641fb358ec353a4f7b69b4b844661 SOURCES/redfish-finder-0.3.tar.gz
f8fd320b6d50c06de5de6bc779a89fda3b7a1870 SOURCES/redfish-finder-0.4.tar.gz

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

@ -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

@ -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

View File

@ -1,6 +1,6 @@
Name: redfish-finder
Version: 0.3
Release: 6%{?dist}
Version: 0.4
Release: 9%{?dist}
Summary: Utility for parsing SMBIOS information and configuring canonical BMC access
BuildArch: noarch
@ -8,9 +8,8 @@ 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
Patch0: redfish-finder-python3.patch
Patch1: hostconfig-dhcp-parse.patch
%{?systemd_requires}
BuildRequires: systemd
@ -52,23 +51,42 @@ install -D -p -m 0644 ./redfish-finder.service %{buildroot}/%{_unitdir}/redfish-
%{_unitdir}/redfish-finder.service
%changelog
* Fri Feb 12 2021 Joel Savitz <jsavitz@redhat.com> - 0.3-6
- Fix typo in spec file (bz1951216)
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 0.4-9
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Fri Feb 12 2021 Joel Savitz <jsavitz@redhat.com> - 0.3-5
- Fix parsing HostConfig for DHCP (bz1874653)
* Mon Apr 19 2021 Joel Savitz <jsavitz@redhat.com> - 0.4-8
- Fix missing bz number in spec file (bz1951095)
* Thu Oct 17 2019 Neil Horman <nhorman@redhat.com> - 0.3-4
- Fix null hostname check (bz1729343)
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 0.4-7
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Mon Jul 01 2019 Neil Horman <nhorman@redhat.com> - 0.3-3
- Enhance to support multiple type 42 blocks (bz1715914)
* Fri Mar 26 2021 Joel Savitz <jsavitz@redhat.com> - 0.4-6
- Fix parsing HostConfig for DHCP (bz1944243)
* Fri Apr 26 2019 Neil Horman <nhorman@redhat.com> - 0.3-2
- Bump release number to test CI gating
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Mon Apr 01 2019 Neil Horman <nhorman@redhat.com> - 0.3-1
- Update to latest upstream release (bz1687111)
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.4-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Tue Nov 12 2019 Neil Horman <nhorman@redhat.com> - 0.4-2
-Fixup interpreter (bz 1770861)
* Thu Oct 17 2019 Neil Horman <nhorman@redhat.com> - 0.4-1
- Update to latest upstream (bz1730589)
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.3-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Wed Mar 06 2019 Neil Horman <nhorman@redhat.com> - 0.3-1
- Update to latest upstream release
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Fri Oct 19 2018 Neil Horman <nhorman@redhat.com> - 0.2-1
- Update to new upstream release