diff --git a/libfwupd/fwupd-client.c b/libfwupd/fwupd-client.c index bfa0403e0..92b051826 100644 --- a/libfwupd/fwupd-client.c +++ b/libfwupd/fwupd-client.c @@ -404,6 +404,71 @@ fwupd_client_get_host_security_attrs (FwupdClient *client, GCancellable *cancell return fwupd_security_attr_array_from_variant (val); } +static GHashTable * +fwupd_report_metadata_hash_from_variant (GVariant *value) +{ + GHashTable *hash; + gsize sz; + g_autoptr(GVariant) untuple = NULL; + + hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + untuple = g_variant_get_child_value (value, 0); + sz = g_variant_n_children (untuple); + for (guint i = 0; i < sz; i++) { + g_autoptr(GVariant) data = NULL; + const gchar *key = NULL; + const gchar *val = NULL; + data = g_variant_get_child_value (untuple, i); + g_variant_get (data, "{&s&s}", &key, &val); + g_hash_table_insert (hash, g_strdup (key), g_strdup (val)); + } + return hash; +} + +/** + * fwupd_client_get_report_metadata: + * @client: A #FwupdClient + * @cancellable: the #GCancellable, or %NULL + * @error: the #GError, or %NULL + * + * Gets all the report metadata from the daemon. + * + * Returns: (transfer container): attributes + * + * Since: 1.5.0 + **/ +GHashTable * +fwupd_client_get_report_metadata (FwupdClient *client, + GCancellable *cancellable, + GError **error) +{ + FwupdClientPrivate *priv = GET_PRIVATE (client); + g_autoptr(GVariant) val = NULL; + + g_return_val_if_fail (FWUPD_IS_CLIENT (client), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + /* connect */ + if (!fwupd_client_connect (client, cancellable, error)) + return NULL; + + /* call into daemon */ + val = g_dbus_proxy_call_sync (priv->proxy, + "GetReportMetadata", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (val == NULL) { + if (error != NULL) + fwupd_client_fixup_dbus_error (*error); + return NULL; + } + return fwupd_report_metadata_hash_from_variant (val); +} + /** * fwupd_client_get_devices: * @client: A #FwupdClient diff --git a/libfwupd/fwupd-client.h b/libfwupd/fwupd-client.h index 077e22092..80e84818d 100644 --- a/libfwupd/fwupd-client.h +++ b/libfwupd/fwupd-client.h @@ -130,6 +130,9 @@ gboolean fwupd_client_modify_device (FwupdClient *client, const gchar *value, GCancellable *cancellable, GError **error); +GHashTable *fwupd_client_get_report_metadata (FwupdClient *client, + GCancellable *cancellable, + GError **error); FwupdStatus fwupd_client_get_status (FwupdClient *client); gboolean fwupd_client_get_tainted (FwupdClient *client); gboolean fwupd_client_get_daemon_interactive (FwupdClient *client); diff --git a/libfwupd/fwupd.map b/libfwupd/fwupd.map index 3a3bf6402..7e2aca08a 100644 --- a/libfwupd/fwupd.map +++ b/libfwupd/fwupd.map @@ -451,6 +451,7 @@ LIBFWUPD_1.5.0 { global: fwupd_client_get_host_security_attrs; fwupd_client_get_host_security_id; + fwupd_client_get_report_metadata; fwupd_security_attr_add_flag; fwupd_security_attr_add_obsolete; fwupd_security_attr_array_from_variant; diff --git a/src/fu-engine.c b/src/fu-engine.c index 01ec50b12..e80e0b103 100644 --- a/src/fu-engine.c +++ b/src/fu-engine.c @@ -1342,14 +1342,43 @@ fu_engine_get_boot_time (void) return NULL; } -static GHashTable * -fu_engine_get_report_metadata (FuEngine *self) +static gboolean +fu_engine_get_report_metadata_os_release (GHashTable *hash, GError **error) +{ + g_autoptr(GHashTable) os_release = NULL; + struct { + const gchar *key; + const gchar *val; + } distro_kv[] = { + { "ID", "DistroId" }, + { "VERSION_ID", "DistroVersion" }, + { "VARIANT_ID", "DistroVariant" }, + { NULL, NULL } + }; + + /* get all required os-release keys */ + os_release = fwupd_get_os_release (error); + if (os_release == NULL) + return FALSE; + for (guint i = 0; distro_kv[i].key != NULL; i++) { + const gchar *tmp = g_hash_table_lookup (os_release, distro_kv[i].key); + if (tmp != NULL) { + g_hash_table_insert (hash, + g_strdup (distro_kv[i].val), + g_strdup (tmp)); + } + } + return TRUE; +} + +GHashTable * +fu_engine_get_report_metadata (FuEngine *self, GError **error) { - GHashTable *hash; gchar *btime; #ifdef HAVE_UTSNAME_H struct utsname name_tmp; #endif + g_autoptr(GHashTable) hash = NULL; g_autoptr(GList) compile_keys = g_hash_table_get_keys (self->compile_versions); g_autoptr(GList) runtime_keys = g_hash_table_get_keys (self->runtime_versions); @@ -1369,6 +1398,8 @@ fu_engine_get_report_metadata (FuEngine *self) g_strdup_printf ("RuntimeVersion(%s)", id), g_strdup (version)); } + if (!fu_engine_get_report_metadata_os_release (hash, error)) + return NULL; /* kernel version is often important for debugging failures */ #ifdef HAVE_UTSNAME_H @@ -1385,7 +1416,7 @@ fu_engine_get_report_metadata (FuEngine *self) if (btime != NULL) g_hash_table_insert (hash, g_strdup ("BootTime"), btime); - return hash; + return g_steal_pointer (&hash); } /** @@ -1530,18 +1561,13 @@ static FwupdRelease * fu_engine_create_release_metadata (FuEngine *self, FuPlugin *plugin, GError **error) { GPtrArray *metadata_sources; - const gchar *tmp; g_autoptr(FwupdRelease) release = fwupd_release_new (); g_autoptr(GHashTable) metadata_hash = NULL; - g_autoptr(GHashTable) os_release = NULL; - - /* add release data from os-release */ - os_release = fwupd_get_os_release (error); - if (os_release == NULL) - return NULL; /* build the version metadata */ - metadata_hash = fu_engine_get_report_metadata (self); + metadata_hash = fu_engine_get_report_metadata (self, error); + if (metadata_hash == NULL) + return NULL; fwupd_release_add_metadata (release, metadata_hash); fwupd_release_add_metadata (release, fu_plugin_get_report_metadata (plugin)); @@ -1564,17 +1590,6 @@ fu_engine_create_release_metadata (FuEngine *self, FuPlugin *plugin, GError **er fwupd_release_add_metadata (release, fu_plugin_get_report_metadata (plugin_tmp)); } - - /* add details from os-release as metadata */ - tmp = g_hash_table_lookup (os_release, "ID"); - if (tmp != NULL) - fwupd_release_add_metadata_item (release, "DistroId", tmp); - tmp = g_hash_table_lookup (os_release, "VERSION_ID"); - if (tmp != NULL) - fwupd_release_add_metadata_item (release, "DistroVersion", tmp); - tmp = g_hash_table_lookup (os_release, "VARIANT_ID"); - if (tmp != NULL) - fwupd_release_add_metadata_item (release, "DistroVariant", tmp); return g_steal_pointer (&release); } diff --git a/src/fu-engine.h b/src/fu-engine.h index 5f9a376fc..a1bd5df97 100644 --- a/src/fu-engine.h +++ b/src/fu-engine.h @@ -85,6 +85,8 @@ FwupdDevice *fu_engine_get_results (FuEngine *self, const gchar *device_id, GError **error); FuSecurityAttrs *fu_engine_get_host_security_attrs (FuEngine *self); +GHashTable *fu_engine_get_report_metadata (FuEngine *self, + GError **error); gboolean fu_engine_clear_results (FuEngine *self, const gchar *device_id, GError **error); diff --git a/src/fu-main.c b/src/fu-main.c index 97636f93b..bc7e8cf7e 100644 --- a/src/fu-main.c +++ b/src/fu-main.c @@ -858,6 +858,31 @@ fu_main_daemon_method_call (GDBusConnection *connection, const gchar *sender, g_variant_new_tuple (&val, 1)); return; } + if (g_strcmp0 (method_name, "GetReportMetadata") == 0) { + GHashTableIter iter; + GVariantBuilder builder; + const gchar *key; + const gchar *value; + g_autoptr(GHashTable) metadata = NULL; + + metadata = fu_engine_get_report_metadata (priv->engine, &error); + if (metadata == NULL) { + g_dbus_method_invocation_return_gerror (invocation, error); + return; + } + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}")); + g_hash_table_iter_init (&iter, metadata); + while (g_hash_table_iter_next (&iter, + (gpointer *) &key, + (gpointer *) &value)) { + g_variant_builder_add_value (&builder, + g_variant_new ("{ss}", key, value)); + } + val = g_variant_builder_end (&builder); + g_dbus_method_invocation_return_value (invocation, + g_variant_new_tuple (&val, 1)); + return; + } if (g_strcmp0 (method_name, "SetApprovedFirmware") == 0) { g_autofree gchar *checksums_str = NULL; g_auto(GStrv) checksums = NULL; diff --git a/src/org.freedesktop.fwupd.xml b/src/org.freedesktop.fwupd.xml index ea33f626f..5f85bafdd 100644 --- a/src/org.freedesktop.fwupd.xml +++ b/src/org.freedesktop.fwupd.xml @@ -271,6 +271,24 @@ + + + + + + Gets metadata to include with the firmware and security reports. + + + + + + + An array of string key values. + + + + +