trivial: Make BIOS setting parsing errors less verbose by default

The `--verbose` output for getting BIOS setting info is very noisy
on Lenovo systems due to a mismatch for the driver behavior and
kernel API.

Hide most of it behind an optional environment variable
`FWUPD_BIOS_SETTING_VERBOSE`.
This commit is contained in:
Mario Limonciello 2022-08-17 15:23:26 -05:00 committed by Mario Limonciello
parent 6aec72d58a
commit 01d120efda
2 changed files with 48 additions and 31 deletions

View File

@ -41,6 +41,7 @@ with a non-standard filesystem layout.
* `FU_USB_DEVICE_DEBUG` shows more information about USB devices * `FU_USB_DEVICE_DEBUG` shows more information about USB devices
* `FWUPD_DEVICE_LIST_VERBOSE` display devices being added and removed from the list * `FWUPD_DEVICE_LIST_VERBOSE` display devices being added and removed from the list
* `FWUPD_PROBE_VERBOSE` dump the detected devices to the console, even if not supported by fwupd * `FWUPD_PROBE_VERBOSE` dump the detected devices to the console, even if not supported by fwupd
* `FWUPD_BIOS_SETTING_VERBOSE` be verbose while parsing BIOS settings
## Plugins ## Plugins

View File

@ -17,7 +17,6 @@
struct _FuBiosAttrs { struct _FuBiosAttrs {
GObject parent_instance; GObject parent_instance;
gboolean kernel_bug_shown;
GPtrArray *attrs; GPtrArray *attrs;
}; };
@ -97,6 +96,8 @@ fu_bios_attr_set_enumeration_attrs(FwupdBiosAttr *attr, GError **error)
if (g_strrstr(str, delimiters[j]) == NULL) if (g_strrstr(str, delimiters[j]) == NULL)
continue; continue;
vals = fu_strsplit(str, strlen(str), delimiters[j], -1); vals = fu_strsplit(str, strlen(str), delimiters[j], -1);
if (vals[0] != NULL)
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_ENUMERATION);
for (guint i = 0; vals[i] != NULL && vals[i][0] != '\0'; i++) for (guint i = 0; vals[i] != NULL && vals[i][0] != '\0'; i++)
fwupd_bios_attr_add_possible_value(attr, vals[i]); fwupd_bios_attr_add_possible_value(attr, vals[i]);
} }
@ -116,6 +117,7 @@ fu_bios_attr_set_string_attrs(FwupdBiosAttr *attr, GError **error)
if (tmp == G_MAXUINT64) if (tmp == G_MAXUINT64)
return FALSE; return FALSE;
fwupd_bios_attr_set_upper_bound(attr, tmp); fwupd_bios_attr_set_upper_bound(attr, tmp);
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_STRING);
return TRUE; return TRUE;
} }
@ -136,7 +138,7 @@ fu_bios_attr_set_integer_attrs(FwupdBiosAttr *attr, GError **error)
if (tmp == G_MAXUINT64) if (tmp == G_MAXUINT64)
return FALSE; return FALSE;
fwupd_bios_attr_set_scalar_increment(attr, tmp); fwupd_bios_attr_set_scalar_increment(attr, tmp);
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_INTEGER);
return TRUE; return TRUE;
} }
@ -189,7 +191,11 @@ fu_bios_attr_fixup_lenovo_thinklmi_bug(FwupdBiosAttr *attr, GError **error)
g_autoptr(GString) right_str = NULL; g_autoptr(GString) right_str = NULL;
g_auto(GStrv) vals = NULL; g_auto(GStrv) vals = NULL;
g_debug("Processing %s", fwupd_bios_attr_get_current_value(attr)); if (g_getenv("FWUPD_BIOS_SETTING_VERBOSE") != NULL) {
g_debug("Processing %s: (%s)",
fwupd_bios_attr_get_name(attr),
fwupd_bios_attr_get_current_value(attr));
}
/* We have read only */ /* We have read only */
tmp = g_strrstr(current_value, LENOVO_READ_ONLY_NEEDLE); tmp = g_strrstr(current_value, LENOVO_READ_ONLY_NEEDLE);
@ -226,6 +232,8 @@ fu_bios_attr_fixup_lenovo_thinklmi_bug(FwupdBiosAttr *attr, GError **error)
g_auto(GStrv) possible_vals = NULL; g_auto(GStrv) possible_vals = NULL;
g_string_erase(right_str, 0, strlen(LENOVO_POSSIBLE_NEEDLE)); g_string_erase(right_str, 0, strlen(LENOVO_POSSIBLE_NEEDLE));
possible_vals = fu_strsplit(right_str->str, right_str->len, ",", -1); possible_vals = fu_strsplit(right_str->str, right_str->len, ",", -1);
if (possible_vals[0] != NULL)
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_ENUMERATION);
for (guint i = 0; possible_vals[i] != NULL && possible_vals[i][0] != '\0'; i++) { for (guint i = 0; possible_vals[i] != NULL && possible_vals[i][0] != '\0'; i++) {
/* last string */ /* last string */
if (possible_vals[i + 1] == NULL && if (possible_vals[i + 1] == NULL &&
@ -244,38 +252,51 @@ fu_bios_attr_fixup_lenovo_thinklmi_bug(FwupdBiosAttr *attr, GError **error)
} }
static gboolean static gboolean
fu_bios_attr_set_type(FuBiosAttrs *self, FwupdBiosAttr *attr, const gchar *driver, GError **error) fu_bios_attrs_run_folder_fixups(FwupdBiosAttr *attr, GError **error)
{ {
if (fwupd_bios_attr_get_kind(attr) == FWUPD_BIOS_ATTR_KIND_UNKNOWN)
return fu_bios_attr_fixup_lenovo_thinklmi_bug(attr, error);
return TRUE;
}
static gboolean
fu_bios_attr_set_type(FuBiosAttrs *self, FwupdBiosAttr *attr, GError **error)
{
gboolean kernel_bug = FALSE;
g_autofree gchar *data = NULL; g_autofree gchar *data = NULL;
g_autoptr(GError) error_key = NULL; g_autoptr(GError) error_key = NULL;
g_autoptr(GError) error_local = NULL; g_autoptr(GError) error_local = NULL;
g_return_val_if_fail(FU_IS_BIOS_ATTRS(self), FALSE); g_return_val_if_fail(FU_IS_BIOS_ATTRS(self), FALSE);
g_return_val_if_fail(FWUPD_IS_BIOS_ATTR(attr), FALSE); g_return_val_if_fail(FWUPD_IS_BIOS_ATTR(attr), FALSE);
g_return_val_if_fail(driver != NULL, FALSE);
/* lenovo thinklmi seems to be missing it even though it's mandatory :/ */ /* lenovo thinklmi seems to be missing it even though it's mandatory :/ */
if (!fu_bios_attr_get_key(attr, "type", &data, &error_key)) { if (!fu_bios_attr_get_key(attr, "type", &data, &error_key)) {
g_debug("%s", error_key->message); #if GLIB_CHECK_VERSION(2, 64, 0)
if (!self->kernel_bug_shown) { g_warning_once("KERNEL BUG: 'type' attribute not exported: (%s)",
g_warning("KERNEL BUG: %s doesn't export a 'type' attribute", driver); error_key->message);
self->kernel_bug_shown = TRUE; #else
} g_debug("KERNEL BUG: 'type' attribute not exported: (%s)", error_key->message);
data = g_strdup("enumeration"); #endif
kernel_bug = TRUE;
} }
if (g_strcmp0(data, "enumeration") == 0) { if (g_strcmp0(data, "enumeration") == 0 || kernel_bug) {
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_ENUMERATION); if (!fu_bios_attr_set_enumeration_attrs(attr, &error_local)) {
if (!fu_bios_attr_set_enumeration_attrs(attr, &error_local)) if (g_getenv("FWUPD_BIOS_SETTING_VERBOSE") != NULL)
g_debug("failed to add enumeration attrs: %s", error_local->message); g_debug("failed to add enumeration attrs: %s",
error_local->message);
}
} else if (g_strcmp0(data, "integer") == 0) { } else if (g_strcmp0(data, "integer") == 0) {
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_INTEGER); if (!fu_bios_attr_set_integer_attrs(attr, &error_local)) {
if (!fu_bios_attr_set_integer_attrs(attr, &error_local)) if (g_getenv("FWUPD_BIOS_SETTING_VERBOSE") != NULL)
g_debug("failed to add integer attrs: %s", error_local->message); g_debug("failed to add integer attrs: %s", error_local->message);
}
} else if (g_strcmp0(data, "string") == 0) { } else if (g_strcmp0(data, "string") == 0) {
fwupd_bios_attr_set_kind(attr, FWUPD_BIOS_ATTR_KIND_STRING); if (!fu_bios_attr_set_string_attrs(attr, &error_local)) {
if (!fu_bios_attr_set_string_attrs(attr, &error_local)) if (g_getenv("FWUPD_BIOS_SETTING_VERBOSE") != NULL)
g_debug("failed to add string attrs: %s", error_local->message); g_debug("failed to add string attrs: %s", error_local->message);
}
} }
return TRUE; return TRUE;
} }
@ -305,23 +326,18 @@ fu_bios_attr_set_file_attributes(FwupdBiosAttr *attr, GError **error)
} }
static gboolean static gboolean
fu_bios_attrs_set_folder_attributes(FuBiosAttrs *self, fu_bios_attrs_set_folder_attributes(FuBiosAttrs *self, FwupdBiosAttr *attr, GError **error)
FwupdBiosAttr *attr,
const gchar *driver,
GError **error)
{ {
g_autoptr(GError) error_local = NULL; g_autoptr(GError) error_local = NULL;
if (!fu_bios_attr_set_type(self, attr, driver, error)) if (!fu_bios_attr_set_type(self, attr, error))
return FALSE; return FALSE;
if (!fu_bios_attr_set_current_value(attr, error)) if (!fu_bios_attr_set_current_value(attr, error))
return FALSE; return FALSE;
if (!fu_bios_attr_set_description(attr, &error_local)) if (!fu_bios_attr_set_description(attr, &error_local))
g_debug("%s", error_local->message); g_debug("%s", error_local->message);
if (self->kernel_bug_shown) { if (!fu_bios_attrs_run_folder_fixups(attr, error))
if (!fu_bios_attr_fixup_lenovo_thinklmi_bug(attr, error)) return FALSE;
return FALSE;
}
return TRUE; return TRUE;
} }
@ -343,7 +359,7 @@ fu_bios_attrs_populate_attribute(FuBiosAttrs *self,
attr = fwupd_bios_attr_new(name, path); attr = fwupd_bios_attr_new(name, path);
if (g_file_test(path, G_FILE_TEST_IS_DIR)) { if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
if (!fu_bios_attrs_set_folder_attributes(self, attr, driver, error)) if (!fu_bios_attrs_set_folder_attributes(self, attr, error))
return FALSE; return FALSE;
} else { } else {
if (!fu_bios_attr_set_file_attributes(attr, error)) if (!fu_bios_attr_set_file_attributes(attr, error))