diff --git a/data/bash-completion/fwupdtool b/data/bash-completion/fwupdtool index 239dce53d..a190abede 100644 --- a/data/bash-completion/fwupdtool +++ b/data/bash-completion/fwupdtool @@ -83,7 +83,7 @@ _show_device_ids() return 0 fi local description - description="$(command fwupdmgr get-devices --json 2>/dev/null | jq '.Devices | .[] | .DeviceId')" + description="$(command jq '.Devices | .[] | .DeviceId' @localstatedir@/cache/fwupd/devices.json 2>/dev/null)" COMPREPLY+=( $(compgen -W "${description}" -- "$cur") ) } diff --git a/data/bash-completion/meson.build b/data/bash-completion/meson.build index 3148654c3..1bfc5188f 100644 --- a/data/bash-completion/meson.build +++ b/data/bash-completion/meson.build @@ -3,7 +3,14 @@ if bashcomp.found() pkgconfig_define: bashcomp.version().version_compare('>= 2.10') ? ['datadir', datadir] : ['prefix', prefix], ) - install_data(['fwupdtool'], + con = configuration_data() + con.set('localstatedir', localstatedir) + + configure_file( + input : 'fwupdtool', + output : 'fwupdtool', + configuration : con, + install : true, install_dir : completions_dir, ) diff --git a/src/fu-engine-helper.c b/src/fu-engine-helper.c index 8ca209d59..d8b0258bd 100644 --- a/src/fu-engine-helper.c +++ b/src/fu-engine-helper.c @@ -12,6 +12,8 @@ #include +#include "fwupd-device-private.h" + #include "fu-engine-helper.h" #include "fu-engine.h" @@ -135,3 +137,49 @@ fu_engine_update_motd(FuEngine *self, GError **error) g_debug("writing motd target %s", target); return g_file_set_contents(target, str->str, str->len, error); } + +gboolean +fu_engine_update_devices_file(FuEngine *self, GError **error) +{ + gsize len; + g_autoptr(JsonBuilder) builder = NULL; + g_autoptr(JsonGenerator) generator = NULL; + g_autoptr(JsonNode) root = NULL; + g_autoptr(GPtrArray) devices = NULL; + g_autofree gchar *data = NULL; + g_autofree gchar *directory = NULL; + g_autofree gchar *target = NULL; + + builder = json_builder_new(); + json_builder_begin_object(builder); + json_builder_set_member_name(builder, "Devices"); + json_builder_begin_array(builder); + devices = fu_engine_get_devices(self, NULL); + if (devices != NULL) { + for (guint i = 0; i < devices->len; i++) { + FwupdDevice *dev = g_ptr_array_index(devices, i); + json_builder_begin_object(builder); + fwupd_device_to_json(dev, builder); + json_builder_end_object(builder); + } + } + json_builder_end_array(builder); + json_builder_end_object(builder); + + root = json_builder_get_root(builder); + generator = json_generator_new(); + json_generator_set_pretty(generator, TRUE); + json_generator_set_root(generator, root); + data = json_generator_to_data(generator, &len); + if (data == NULL) { + g_set_error_literal(error, + FWUPD_ERROR, + FWUPD_ERROR_INTERNAL, + "Failed to convert to JSON string"); + return FALSE; + } + + directory = fu_path_from_kind(FU_PATH_KIND_CACHEDIR_PKG); + target = g_build_filename(directory, "devices.json", NULL); + return fu_bytes_set_contents(target, g_bytes_new_take(g_steal_pointer(&data), len), error); +} diff --git a/src/fu-engine-helper.h b/src/fu-engine-helper.h index 76108e171..ce24ca585 100644 --- a/src/fu-engine-helper.h +++ b/src/fu-engine-helper.h @@ -9,3 +9,5 @@ gboolean fu_engine_update_motd(FuEngine *self, GError **error); +gboolean +fu_engine_update_devices_file(FuEngine *self, GError **error); diff --git a/src/fu-engine.c b/src/fu-engine.c index c710ab3a6..1b9173353 100644 --- a/src/fu-engine.c +++ b/src/fu-engine.c @@ -129,6 +129,8 @@ G_DEFINE_TYPE(FuEngine, fu_engine, G_TYPE_OBJECT) static void fu_engine_emit_changed(FuEngine *self) { + g_autoptr(GError) error = NULL; + g_signal_emit(self, signals[SIGNAL_CHANGED], 0); fu_engine_idle_reset(self); @@ -138,6 +140,10 @@ fu_engine_emit_changed(FuEngine *self) if (!fu_engine_update_motd(self, &error_local)) g_debug("failed to update MOTD: %s", error_local->message); } + + /* update the list of devices */ + if (!fu_engine_update_devices_file(self, &error)) + g_debug("failed to update list of devices: %s", error->message); } static void @@ -6482,6 +6488,7 @@ fu_engine_backend_device_removed_cb(FuBackend *backend, FuDevice *device, FuEngi fu_device_get_name(device_tmp), fu_device_get_id(device_tmp)); fu_device_list_remove(self->device_list, device_tmp); + fu_engine_emit_changed(self); } } }