Compare commits
No commits in common. "c10s" and "c8" have entirely different histories.
1
.gitignore
vendored
1
.gitignore
vendored
@ -0,0 +1 @@
|
|||||||
|
SOURCES/redfish-finder-0.3.tar.gz
|
1
.redfish-finder.metadata
Normal file
1
.redfish-finder.metadata
Normal file
@ -0,0 +1 @@
|
|||||||
|
38c07146eeb641fb358ec353a4f7b69b4b844661 SOURCES/redfish-finder-0.3.tar.gz
|
@ -15,13 +15,14 @@ new mode 100755
|
|||||||
index 9a185b3..461eff9
|
index 9a185b3..461eff9
|
||||||
--- a/redfish-finder
|
--- a/redfish-finder
|
||||||
+++ b/redfish-finder
|
+++ b/redfish-finder
|
||||||
@@ -123,8 +123,8 @@ class HostConfig():
|
@@ -124,8 +124,8 @@ class HostConfig():
|
||||||
cursor = cursor_consume_next(cursor, "Host IP Assignment Type: ")
|
|
||||||
if cursor == None:
|
if cursor == None:
|
||||||
raise RuntimeError("redfish-finder: Unable to parse SMBIOS Host IP Assignment Type")
|
printf("redfish-finder: Unable to parse SMBIOS Host IP Assignment Type")
|
||||||
|
return None
|
||||||
+ self.assigntype = []
|
+ self.assigntype = []
|
||||||
if cursor.split()[0] == "Static":
|
if cursor.split()[0] == "Static":
|
||||||
- self.assigntype = []
|
- self.assigntype = []
|
||||||
self.assigntype.append(AssignType.STATIC)
|
self.assigntype.append(AssignType.STATIC)
|
||||||
cursor = cursor_consume_next(cursor, "Host IP Address Format: ")
|
cursor = cursor_consume_next(cursor, "Host IP Address Format: ")
|
||||||
if cursor.split()[0] == "IPv4":
|
if cursor.split()[0] == "IPv4":
|
||||||
|
|
70
SOURCES/hostname-null-check.patch
Normal file
70
SOURCES/hostname-null-check.patch
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
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")
|
||||||
|
|
283
SOURCES/redfish-finder-multi-block.patch
Normal file
283
SOURCES/redfish-finder-multi-block.patch
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
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)
|
||||||
|
|
89
SPECS/redfish-finder.spec
Normal file
89
SPECS/redfish-finder.spec
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
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
|
||||||
|
|
@ -1,125 +0,0 @@
|
|||||||
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")
|
|
@ -1,7 +0,0 @@
|
|||||||
--- !Policy
|
|
||||||
product_versions:
|
|
||||||
- rhel-*
|
|
||||||
decision_context: osci_compose_gate
|
|
||||||
rules:
|
|
||||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.hardware-redfish-finder.tier0.functional}
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
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
|
|
@ -1,5 +0,0 @@
|
|||||||
# .rpmlintrc
|
|
||||||
|
|
||||||
# Ignore spelling errors
|
|
||||||
addFilter("spelling-error.*")
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
|||||||
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
1
sources
@ -1 +0,0 @@
|
|||||||
SHA512 (redfish-finder-0.4.tar.gz) = 5a38e2f2888cd9cdedd877a09ffd954dd7631f546c4e58fbcb523835b4c0905dd6d4288e6fca2e545740467e177b38895646f746a49f070b9f450a5390a0429d
|
|
@ -1,91 +0,0 @@
|
|||||||
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: ")
|
|
Loading…
Reference in New Issue
Block a user