Cache list of devices to cache directory

This commit is contained in:
Gaël PORTAY 2022-05-13 09:48:28 +02:00 committed by Gaël PORTAY
parent 2cc5449ae8
commit 97a627b54b
5 changed files with 66 additions and 2 deletions

View File

@ -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") )
}

View File

@ -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,
)

View File

@ -12,6 +12,8 @@
#include <glib/gi18n.h>
#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);
}

View File

@ -9,3 +9,5 @@
gboolean
fu_engine_update_motd(FuEngine *self, GError **error);
gboolean
fu_engine_update_devices_file(FuEngine *self, GError **error);

View File

@ -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);
}
}
}