mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-07 17:11:46 +00:00
redfish: Autoconnect the Redfish network device when rebooting the BMC
This commit is contained in:
parent
99f310e11a
commit
09f9ea7d06
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
struct FuPluginData {
|
struct FuPluginData {
|
||||||
FuRedfishBackend *backend;
|
FuRedfishBackend *backend;
|
||||||
|
FuRedfishSmbios *smbios; /* nullable */
|
||||||
};
|
};
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
@ -171,9 +172,7 @@ fu_redfish_plugin_discover_smbios_table(FuPlugin *plugin, GError **error)
|
|||||||
FuPluginData *data = fu_plugin_get_data(plugin);
|
FuPluginData *data = fu_plugin_get_data(plugin);
|
||||||
FuContext *ctx = fu_plugin_get_context(plugin);
|
FuContext *ctx = fu_plugin_get_context(plugin);
|
||||||
const gchar *smbios_data_fn;
|
const gchar *smbios_data_fn;
|
||||||
g_autofree gchar *hostname = NULL;
|
g_autoptr(FuRedfishSmbios) smbios = fu_redfish_smbios_new();
|
||||||
g_autoptr(FuRedfishNetworkDevice) device = NULL;
|
|
||||||
g_autoptr(FuRedfishSmbios) redfish_smbios = fu_redfish_smbios_new();
|
|
||||||
g_autoptr(GBytes) smbios_data = NULL;
|
g_autoptr(GBytes) smbios_data = NULL;
|
||||||
|
|
||||||
/* is optional if not in self tests */
|
/* is optional if not in self tests */
|
||||||
@ -187,20 +186,33 @@ fu_redfish_plugin_discover_smbios_table(FuPlugin *plugin, GError **error)
|
|||||||
if (smbios_data == NULL)
|
if (smbios_data == NULL)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (!fu_firmware_parse(FU_FIRMWARE(redfish_smbios),
|
if (!fu_firmware_parse(FU_FIRMWARE(smbios), smbios_data, FWUPD_INSTALL_FLAG_NONE, error)) {
|
||||||
smbios_data,
|
|
||||||
FWUPD_INSTALL_FLAG_NONE,
|
|
||||||
error)) {
|
|
||||||
g_prefix_error(error, "failed to parse SMBIOS table entry type 42: ");
|
g_prefix_error(error, "failed to parse SMBIOS table entry type 42: ");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* success */
|
||||||
|
g_set_object(&data->smbios, smbios);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
fu_redfish_plugin_autoconnect_network_device(FuPlugin *plugin, GError **error)
|
||||||
|
{
|
||||||
|
FuPluginData *data = fu_plugin_get_data(plugin);
|
||||||
|
g_autofree gchar *hostname = NULL;
|
||||||
|
g_autoptr(FuRedfishNetworkDevice) device = NULL;
|
||||||
|
|
||||||
|
/* we have no data */
|
||||||
|
if (data->smbios == NULL)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
/* get IP, falling back to hostname, then MAC, then VID:PID */
|
/* get IP, falling back to hostname, then MAC, then VID:PID */
|
||||||
hostname = g_strdup(fu_redfish_smbios_get_ip_addr(redfish_smbios));
|
hostname = g_strdup(fu_redfish_smbios_get_ip_addr(data->smbios));
|
||||||
if (hostname == NULL)
|
if (hostname == NULL)
|
||||||
hostname = g_strdup(fu_redfish_smbios_get_hostname(redfish_smbios));
|
hostname = g_strdup(fu_redfish_smbios_get_hostname(data->smbios));
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
const gchar *mac_addr = fu_redfish_smbios_get_mac_addr(redfish_smbios);
|
const gchar *mac_addr = fu_redfish_smbios_get_mac_addr(data->smbios);
|
||||||
if (mac_addr != NULL) {
|
if (mac_addr != NULL) {
|
||||||
g_autoptr(GError) error_network = NULL;
|
g_autoptr(GError) error_network = NULL;
|
||||||
device = fu_redfish_network_device_for_mac_addr(mac_addr, &error_network);
|
device = fu_redfish_network_device_for_mac_addr(mac_addr, &error_network);
|
||||||
@ -209,8 +221,8 @@ fu_redfish_plugin_discover_smbios_table(FuPlugin *plugin, GError **error)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
guint16 vid = fu_redfish_smbios_get_vid(redfish_smbios);
|
guint16 vid = fu_redfish_smbios_get_vid(data->smbios);
|
||||||
guint16 pid = fu_redfish_smbios_get_pid(redfish_smbios);
|
guint16 pid = fu_redfish_smbios_get_pid(data->smbios);
|
||||||
if (vid != 0x0 && pid != 0x0) {
|
if (vid != 0x0 && pid != 0x0) {
|
||||||
g_autoptr(GError) error_network = NULL;
|
g_autoptr(GError) error_network = NULL;
|
||||||
device = fu_redfish_network_device_for_vid_pid(vid, pid, &error_network);
|
device = fu_redfish_network_device_for_vid_pid(vid, pid, &error_network);
|
||||||
@ -242,7 +254,7 @@ fu_redfish_plugin_discover_smbios_table(FuPlugin *plugin, GError **error)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
fu_redfish_backend_set_hostname(data->backend, hostname);
|
fu_redfish_backend_set_hostname(data->backend, hostname);
|
||||||
fu_redfish_backend_set_port(data->backend, fu_redfish_smbios_get_port(redfish_smbios));
|
fu_redfish_backend_set_port(data->backend, fu_redfish_smbios_get_port(data->smbios));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,6 +360,8 @@ fu_plugin_redfish_startup(FuPlugin *plugin, FuProgress *progress, GError **error
|
|||||||
/* optional */
|
/* optional */
|
||||||
if (!fu_redfish_plugin_discover_smbios_table(plugin, error))
|
if (!fu_redfish_plugin_discover_smbios_table(plugin, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (!fu_redfish_plugin_autoconnect_network_device(plugin, error))
|
||||||
|
return FALSE;
|
||||||
if (!fu_redfish_plugin_discover_uefi_credentials(plugin, &error_uefi)) {
|
if (!fu_redfish_plugin_discover_uefi_credentials(plugin, &error_uefi)) {
|
||||||
g_debug("failed to get username and password automatically: %s",
|
g_debug("failed to get username and password automatically: %s",
|
||||||
error_uefi->message);
|
error_uefi->message);
|
||||||
@ -423,6 +437,10 @@ fu_plugin_redfish_cleanup_setup_cb(FuDevice *device, gpointer user_data, GError
|
|||||||
FuPlugin *self = FU_PLUGIN(user_data);
|
FuPlugin *self = FU_PLUGIN(user_data);
|
||||||
FuPluginData *data = fu_plugin_get_data(self);
|
FuPluginData *data = fu_plugin_get_data(self);
|
||||||
FuProgress *progress = fu_progress_new(G_STRLOC);
|
FuProgress *progress = fu_progress_new(G_STRLOC);
|
||||||
|
|
||||||
|
/* the network adaptor might not autoconnect when coming back */
|
||||||
|
if (!fu_redfish_plugin_autoconnect_network_device(self, error))
|
||||||
|
return FALSE;
|
||||||
return fu_backend_setup(FU_BACKEND(data->backend), progress, error);
|
return fu_backend_setup(FU_BACKEND(data->backend), progress, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -556,6 +574,8 @@ static void
|
|||||||
fu_plugin_redfish_destroy(FuPlugin *plugin)
|
fu_plugin_redfish_destroy(FuPlugin *plugin)
|
||||||
{
|
{
|
||||||
FuPluginData *data = fu_plugin_get_data(plugin);
|
FuPluginData *data = fu_plugin_get_data(plugin);
|
||||||
|
if (data->smbios != NULL)
|
||||||
|
g_object_unref(data->smbios);
|
||||||
g_object_unref(data->backend);
|
g_object_unref(data->backend);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user