mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-08 14:36:33 +00:00
Use FwupdClient from libfwupd in fwupdmgr
This commit is contained in:
parent
0f41340740
commit
cb07a3eb3f
732
src/fu-util.c
732
src/fu-util.c
@ -1,6 +1,6 @@
|
|||||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015 Richard Hughes <richard@hughsie.com>
|
* Copyright (C) 2015-2016 Richard Hughes <richard@hughsie.com>
|
||||||
*
|
*
|
||||||
* Licensed under the GNU General Public License Version 2
|
* Licensed under the GNU General Public License Version 2
|
||||||
*
|
*
|
||||||
@ -47,12 +47,8 @@ typedef struct {
|
|||||||
GMainLoop *loop;
|
GMainLoop *loop;
|
||||||
GOptionContext *context;
|
GOptionContext *context;
|
||||||
GPtrArray *cmd_array;
|
GPtrArray *cmd_array;
|
||||||
GVariant *val; /* for async */
|
|
||||||
GDBusMessage *message; /* for async */
|
|
||||||
GError *error; /* for async */
|
|
||||||
FwupdUpdateFlags flags;
|
FwupdUpdateFlags flags;
|
||||||
GDBusConnection *conn;
|
FwupdClient *client;
|
||||||
GDBusProxy *proxy;
|
|
||||||
} FuUtilPrivate;
|
} FuUtilPrivate;
|
||||||
|
|
||||||
typedef gboolean (*FuUtilPrivateCb) (FuUtilPrivate *util,
|
typedef gboolean (*FuUtilPrivateCb) (FuUtilPrivate *util,
|
||||||
@ -198,16 +194,11 @@ fu_util_run (FuUtilPrivate *priv, const gchar *command, gchar **values, GError *
|
|||||||
* fu_util_status_changed_cb:
|
* fu_util_status_changed_cb:
|
||||||
**/
|
**/
|
||||||
static void
|
static void
|
||||||
fu_util_status_changed_cb (GDBusProxy *proxy, GVariant *changed_properties,
|
fu_util_status_changed_cb (FwupdClient *client,
|
||||||
GStrv invalidated_properties, gpointer user_data)
|
FwupdStatus status,
|
||||||
|
FuUtilPrivate *priv)
|
||||||
{
|
{
|
||||||
g_autoptr(GVariant) val = NULL;
|
switch (status) {
|
||||||
|
|
||||||
/* print to the console */
|
|
||||||
val = g_dbus_proxy_get_cached_property (proxy, "Status");
|
|
||||||
if (val == NULL)
|
|
||||||
return;
|
|
||||||
switch (g_variant_get_uint32 (val)) {
|
|
||||||
case FWUPD_STATUS_IDLE:
|
case FWUPD_STATUS_IDLE:
|
||||||
/* TRANSLATORS: daemon is inactive */
|
/* TRANSLATORS: daemon is inactive */
|
||||||
g_print (" * %s\n", _("Idle"));
|
g_print (" * %s\n", _("Idle"));
|
||||||
@ -241,307 +232,38 @@ fu_util_status_changed_cb (GDBusProxy *proxy, GVariant *changed_properties,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_get_devices_cb:
|
|
||||||
**/
|
|
||||||
static void
|
|
||||||
fu_util_get_devices_cb (GObject *source, GAsyncResult *res, gpointer user_data)
|
|
||||||
{
|
|
||||||
FuUtilPrivate *priv = (FuUtilPrivate *) user_data;
|
|
||||||
priv->val = g_dbus_proxy_call_finish (G_DBUS_PROXY (source),
|
|
||||||
res, &priv->error);
|
|
||||||
g_main_loop_quit (priv->loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_get_devices_internal:
|
|
||||||
**/
|
|
||||||
static GPtrArray *
|
|
||||||
fu_util_get_devices_internal (FuUtilPrivate *priv, GError **error)
|
|
||||||
{
|
|
||||||
GVariantIter *iter_device;
|
|
||||||
GPtrArray *devices = NULL;
|
|
||||||
FuDevice *dev;
|
|
||||||
gchar *id;
|
|
||||||
g_autoptr(GVariantIter) iter = NULL;
|
|
||||||
|
|
||||||
g_dbus_proxy_call (priv->proxy,
|
|
||||||
"GetDevices",
|
|
||||||
NULL,
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
fu_util_get_devices_cb, priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->val == NULL) {
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse */
|
|
||||||
g_variant_get (priv->val, "(a{sa{sv}})", &iter);
|
|
||||||
devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
|
||||||
while (g_variant_iter_next (iter, "{&sa{sv}}", &id, &iter_device)) {
|
|
||||||
dev = fu_device_new ();
|
|
||||||
fu_device_set_id (dev, id);
|
|
||||||
fu_device_set_metadata_from_iter (dev, iter_device);
|
|
||||||
g_ptr_array_add (devices, dev);
|
|
||||||
g_variant_iter_free (iter_device);
|
|
||||||
}
|
|
||||||
return devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_get_updates_internal:
|
|
||||||
**/
|
|
||||||
static GPtrArray *
|
|
||||||
fu_util_get_updates_internal (FuUtilPrivate *priv, GError **error)
|
|
||||||
{
|
|
||||||
GVariantIter *iter_device;
|
|
||||||
GPtrArray *devices = NULL;
|
|
||||||
FuDevice *dev;
|
|
||||||
gchar *id;
|
|
||||||
g_autoptr(GVariantIter) iter = NULL;
|
|
||||||
|
|
||||||
g_dbus_proxy_call (priv->proxy,
|
|
||||||
"GetUpdates",
|
|
||||||
NULL,
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
fu_util_get_devices_cb, priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->val == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse */
|
|
||||||
g_variant_get (priv->val, "(a{sa{sv}})", &iter);
|
|
||||||
devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
|
|
||||||
while (g_variant_iter_next (iter, "{&sa{sv}}", &id, &iter_device)) {
|
|
||||||
dev = fu_device_new ();
|
|
||||||
fu_device_set_id (dev, id);
|
|
||||||
fu_device_set_metadata_from_iter (dev, iter_device);
|
|
||||||
g_ptr_array_add (devices, dev);
|
|
||||||
g_variant_iter_free (iter_device);
|
|
||||||
}
|
|
||||||
return devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pad_print:
|
|
||||||
**/
|
|
||||||
static void
|
|
||||||
pad_print (const gchar *key, const gchar *value)
|
|
||||||
{
|
|
||||||
guint k;
|
|
||||||
g_print (" %s:", key);
|
|
||||||
for (k = strlen (key); k < 15; k++)
|
|
||||||
g_print (" ");
|
|
||||||
g_print (" %s\n", value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_device_flags_to_string:
|
|
||||||
**/
|
|
||||||
static gchar *
|
|
||||||
fu_util_device_flags_to_string (FwupdDeviceFlags device_flags)
|
|
||||||
{
|
|
||||||
GString *str;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
str = g_string_new ("");
|
|
||||||
for (i = 1; i < FU_DEVICE_FLAG_LAST; i *= 2) {
|
|
||||||
if ((device_flags & i) == 0)
|
|
||||||
continue;
|
|
||||||
g_string_append_printf (str, "%s|",
|
|
||||||
fwupd_device_flag_to_string (i));
|
|
||||||
}
|
|
||||||
if (str->len == 0) {
|
|
||||||
g_string_append (str, fwupd_device_flag_to_string (0));
|
|
||||||
} else {
|
|
||||||
g_string_truncate (str, str->len - 1);
|
|
||||||
}
|
|
||||||
return g_string_free (str, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_util_get_devices:
|
* fu_util_get_devices:
|
||||||
**/
|
**/
|
||||||
static gboolean
|
static gboolean
|
||||||
fu_util_get_devices (FuUtilPrivate *priv, gchar **values, GError **error)
|
fu_util_get_devices (FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
{
|
{
|
||||||
FuDevice *dev;
|
FwupdResult *res;
|
||||||
g_autoptr(GPtrArray) devices = NULL;
|
|
||||||
guint i;
|
guint i;
|
||||||
guint j;
|
g_autoptr(GPtrArray) results = NULL;
|
||||||
guint64 flags;
|
|
||||||
const gchar *value;
|
|
||||||
const gchar *keys[] = {
|
|
||||||
FU_DEVICE_KEY_DISPLAY_NAME,
|
|
||||||
FU_DEVICE_KEY_PROVIDER,
|
|
||||||
FU_DEVICE_KEY_CREATED,
|
|
||||||
FU_DEVICE_KEY_MODIFIED,
|
|
||||||
FU_DEVICE_KEY_APPSTREAM_ID,
|
|
||||||
FU_DEVICE_KEY_GUID,
|
|
||||||
FU_DEVICE_KEY_VERSION,
|
|
||||||
FU_DEVICE_KEY_URL_HOMEPAGE,
|
|
||||||
FU_DEVICE_KEY_NAME,
|
|
||||||
FU_DEVICE_KEY_SUMMARY,
|
|
||||||
FU_DEVICE_KEY_DESCRIPTION,
|
|
||||||
FU_DEVICE_KEY_LICENSE,
|
|
||||||
FU_DEVICE_KEY_FLAGS,
|
|
||||||
FU_DEVICE_KEY_TRUSTED,
|
|
||||||
FU_DEVICE_KEY_SIZE,
|
|
||||||
FU_DEVICE_KEY_FIRMWARE_HASH,
|
|
||||||
NULL };
|
|
||||||
|
|
||||||
/* get devices from daemon */
|
/* get results from daemon */
|
||||||
devices = fu_util_get_devices_internal (priv, error);
|
results = fwupd_client_get_devices (priv->client, NULL, error);
|
||||||
if (devices == NULL)
|
if (results == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* print */
|
/* print */
|
||||||
if (devices->len == 0) {
|
if (results->len == 0) {
|
||||||
/* TRANSLATORS: nothing attached that can be upgraded */
|
/* TRANSLATORS: nothing attached that can be upgraded */
|
||||||
g_print ("%s\n", _("No hardware detected with firmware update capability"));
|
g_print ("%s\n", _("No hardware detected with firmware update capability"));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < devices->len; i++) {
|
for (i = 0; i < results->len; i++) {
|
||||||
dev = g_ptr_array_index (devices, i);
|
g_autofree gchar *tmp = NULL;
|
||||||
g_print ("Device: %s\n", fu_device_get_id (dev));
|
res = g_ptr_array_index (results, i);
|
||||||
for (j = 0; keys[j] != NULL; j++) {
|
tmp = fwupd_result_to_string (res);
|
||||||
if (g_strcmp0 (keys[j], FU_DEVICE_KEY_FLAGS) == 0) {
|
g_print ("%s\n", tmp);
|
||||||
g_autofree gchar *tmp = NULL;
|
|
||||||
flags = fu_device_get_flags (dev);
|
|
||||||
tmp = fu_util_device_flags_to_string (flags);
|
|
||||||
pad_print (keys[j], tmp);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (g_strcmp0 (keys[j], FU_DEVICE_KEY_CREATED) == 0) {
|
|
||||||
g_autoptr(GDateTime) date = NULL;
|
|
||||||
g_autofree gchar *date_str = NULL;
|
|
||||||
date = g_date_time_new_from_unix_utc (fu_device_get_created (dev));
|
|
||||||
date_str = g_date_time_format (date, "%F");
|
|
||||||
pad_print (keys[j], date_str);
|
|
||||||
}
|
|
||||||
if (g_strcmp0 (keys[j], FU_DEVICE_KEY_MODIFIED) == 0) {
|
|
||||||
g_autoptr(GDateTime) date = NULL;
|
|
||||||
g_autofree gchar *date_str = NULL;
|
|
||||||
if (fu_device_get_modified (dev) > 0) {
|
|
||||||
date = g_date_time_new_from_unix_utc (fu_device_get_modified (dev));
|
|
||||||
date_str = g_date_time_format (date, "%F");
|
|
||||||
pad_print (keys[j], date_str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
value = fu_device_get_metadata (dev, keys[j]);
|
|
||||||
if (value != NULL)
|
|
||||||
pad_print (keys[j], value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_update_cb:
|
|
||||||
**/
|
|
||||||
static void
|
|
||||||
fu_util_update_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
|
|
||||||
{
|
|
||||||
FuUtilPrivate *priv = (FuUtilPrivate *) user_data;
|
|
||||||
GDBusConnection *con = G_DBUS_CONNECTION (source_object);
|
|
||||||
priv->message = g_dbus_connection_send_message_with_reply_finish (con, res,
|
|
||||||
&priv->error);
|
|
||||||
g_main_loop_quit (priv->loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_install_internal:
|
|
||||||
**/
|
|
||||||
static gboolean
|
|
||||||
fu_util_install_internal (FuUtilPrivate *priv, const gchar *id,
|
|
||||||
const gchar *filename, GError **error)
|
|
||||||
{
|
|
||||||
GVariant *body;
|
|
||||||
GVariantBuilder builder;
|
|
||||||
gint retval;
|
|
||||||
gint fd;
|
|
||||||
g_autoptr(GDBusMessage) request = NULL;
|
|
||||||
g_autoptr(GUnixFDList) fd_list = NULL;
|
|
||||||
|
|
||||||
/* set options */
|
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
|
|
||||||
g_variant_builder_add (&builder, "{sv}",
|
|
||||||
"reason", g_variant_new_string ("user-action"));
|
|
||||||
g_variant_builder_add (&builder, "{sv}",
|
|
||||||
"filename", g_variant_new_string (filename));
|
|
||||||
if (priv->flags & FWUPD_UPDATE_FLAG_OFFLINE) {
|
|
||||||
g_variant_builder_add (&builder, "{sv}",
|
|
||||||
"offline", g_variant_new_boolean (TRUE));
|
|
||||||
}
|
|
||||||
if (priv->flags & FWUPD_UPDATE_FLAG_ALLOW_OLDER) {
|
|
||||||
g_variant_builder_add (&builder, "{sv}",
|
|
||||||
"allow-older", g_variant_new_boolean (TRUE));
|
|
||||||
}
|
|
||||||
if (priv->flags & FWUPD_UPDATE_FLAG_ALLOW_REINSTALL) {
|
|
||||||
g_variant_builder_add (&builder, "{sv}",
|
|
||||||
"allow-reinstall", g_variant_new_boolean (TRUE));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open file */
|
|
||||||
fd = open (filename, O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
g_set_error (error,
|
|
||||||
FWUPD_ERROR,
|
|
||||||
FWUPD_ERROR_INVALID_FILE,
|
|
||||||
"failed to open %s",
|
|
||||||
filename);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set out of band file descriptor */
|
|
||||||
fd_list = g_unix_fd_list_new ();
|
|
||||||
retval = g_unix_fd_list_append (fd_list, fd, NULL);
|
|
||||||
g_assert (retval != -1);
|
|
||||||
request = g_dbus_message_new_method_call (FWUPD_DBUS_SERVICE,
|
|
||||||
FWUPD_DBUS_PATH,
|
|
||||||
FWUPD_DBUS_INTERFACE,
|
|
||||||
"Install");
|
|
||||||
g_dbus_message_set_unix_fd_list (request, fd_list);
|
|
||||||
|
|
||||||
/* g_unix_fd_list_append did a dup() already */
|
|
||||||
close (fd);
|
|
||||||
|
|
||||||
/* send message */
|
|
||||||
body = g_variant_new ("(sha{sv})", id, fd > -1 ? 0 : -1, &builder);
|
|
||||||
g_dbus_message_set_body (request, body);
|
|
||||||
g_dbus_connection_send_message_with_reply (priv->conn,
|
|
||||||
request,
|
|
||||||
G_DBUS_SEND_MESSAGE_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
fu_util_update_cb,
|
|
||||||
priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->message == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (g_dbus_message_to_gerror (priv->message, error)) {
|
|
||||||
g_dbus_error_strip_remote_error (*error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* TRANSLATORS: update completed, no errors */
|
|
||||||
g_print ("%s\n", _("Done!"));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_util_install_with_fallback:
|
* fu_util_install_with_fallback:
|
||||||
**/
|
**/
|
||||||
@ -552,7 +274,8 @@ fu_util_install_with_fallback (FuUtilPrivate *priv, const gchar *id,
|
|||||||
g_autoptr(GError) error_local = NULL;
|
g_autoptr(GError) error_local = NULL;
|
||||||
|
|
||||||
/* install with flags chosen by the user */
|
/* install with flags chosen by the user */
|
||||||
if (fu_util_install_internal (priv, id, filename, &error_local))
|
if (fwupd_client_install (priv->client, id, filename, priv->flags,
|
||||||
|
NULL, &error_local))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* some other failure */
|
/* some other failure */
|
||||||
@ -566,7 +289,8 @@ fu_util_install_with_fallback (FuUtilPrivate *priv, const gchar *id,
|
|||||||
/* TRANSLATOR: the provider only supports offline */
|
/* TRANSLATOR: the provider only supports offline */
|
||||||
g_print ("%s...\n", _("Retrying as an offline update"));
|
g_print ("%s...\n", _("Retrying as an offline update"));
|
||||||
priv->flags |= FWUPD_UPDATE_FLAG_OFFLINE;
|
priv->flags |= FWUPD_UPDATE_FLAG_OFFLINE;
|
||||||
return fu_util_install_internal (priv, id, filename, error);
|
return fwupd_client_install (priv->client, id, filename, priv->flags,
|
||||||
|
NULL, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -594,57 +318,14 @@ fu_util_install (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
return fu_util_install_with_fallback (priv, id, values[0], error);
|
return fu_util_install_with_fallback (priv, id, values[0], error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_print_metadata:
|
|
||||||
**/
|
|
||||||
static void
|
|
||||||
fu_util_print_metadata (GVariant *val)
|
|
||||||
{
|
|
||||||
GVariant *variant;
|
|
||||||
const gchar *key;
|
|
||||||
const gchar *type;
|
|
||||||
guint i;
|
|
||||||
g_autoptr(GVariantIter) iter = NULL;
|
|
||||||
|
|
||||||
g_variant_get (val, "(a{sv})", &iter);
|
|
||||||
while (g_variant_iter_next (iter, "{&sv}", &key, &variant)) {
|
|
||||||
g_print ("%s", key);
|
|
||||||
for (i = strlen (key); i < 15; i++)
|
|
||||||
g_print (" ");
|
|
||||||
if (g_strcmp0 (key, FU_DEVICE_KEY_FLAGS) == 0) {
|
|
||||||
g_autofree gchar *tmp = NULL;
|
|
||||||
guint64 flags = g_variant_get_uint64 (variant);
|
|
||||||
tmp = fu_util_device_flags_to_string (flags);
|
|
||||||
g_print ("%s\n", tmp);
|
|
||||||
} else {
|
|
||||||
type = g_variant_get_type_string (variant);
|
|
||||||
if (g_strcmp0 (type, "s") == 0) {
|
|
||||||
g_print ("%s\n", g_variant_get_string (variant, NULL));
|
|
||||||
} else if (g_strcmp0 (type, "b") == 0) {
|
|
||||||
g_print ("%s\n", g_variant_get_boolean (variant) ? "True" : "False");
|
|
||||||
} else if (g_strcmp0 (type, "t") == 0) {
|
|
||||||
g_print ("%" G_GUINT64_FORMAT "\n", g_variant_get_uint64 (variant));
|
|
||||||
} else {
|
|
||||||
g_print ("???? [%s]\n", type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_variant_unref (variant);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_util_get_details:
|
* fu_util_get_details:
|
||||||
**/
|
**/
|
||||||
static gboolean
|
static gboolean
|
||||||
fu_util_get_details (FuUtilPrivate *priv, gchar **values, GError **error)
|
fu_util_get_details (FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
{
|
{
|
||||||
GVariant *body;
|
g_autofree gchar *tmp = NULL;
|
||||||
GVariant *val;
|
g_autoptr(FwupdResult) res = NULL;
|
||||||
gint fd;
|
|
||||||
gint retval;
|
|
||||||
g_autoptr(GDBusMessage) message = NULL;
|
|
||||||
g_autoptr(GDBusMessage) request = NULL;
|
|
||||||
g_autoptr(GUnixFDList) fd_list = NULL;
|
|
||||||
|
|
||||||
/* check args */
|
/* check args */
|
||||||
if (g_strv_length (values) != 1) {
|
if (g_strv_length (values) != 1) {
|
||||||
@ -654,53 +335,11 @@ fu_util_get_details (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
"Invalid arguments: expected 'filename'");
|
"Invalid arguments: expected 'filename'");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
res = fwupd_client_get_details (priv->client, values[0], NULL, error);
|
||||||
/* open file */
|
if (res == NULL)
|
||||||
fd = open (values[0], O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
g_set_error (error,
|
|
||||||
FWUPD_ERROR,
|
|
||||||
FWUPD_ERROR_INVALID_FILE,
|
|
||||||
"failed to open %s",
|
|
||||||
values[0]);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
tmp = fwupd_result_to_string (res);
|
||||||
|
g_print ("%s", tmp);
|
||||||
/* set out of band file descriptor */
|
|
||||||
fd_list = g_unix_fd_list_new ();
|
|
||||||
retval = g_unix_fd_list_append (fd_list, fd, NULL);
|
|
||||||
g_assert (retval != -1);
|
|
||||||
request = g_dbus_message_new_method_call (FWUPD_DBUS_SERVICE,
|
|
||||||
FWUPD_DBUS_PATH,
|
|
||||||
FWUPD_DBUS_INTERFACE,
|
|
||||||
"GetDetails");
|
|
||||||
g_dbus_message_set_unix_fd_list (request, fd_list);
|
|
||||||
|
|
||||||
/* g_unix_fd_list_append did a dup() already */
|
|
||||||
close (fd);
|
|
||||||
|
|
||||||
/* send message */
|
|
||||||
body = g_variant_new ("(h)", fd > -1 ? 0 : -1);
|
|
||||||
g_dbus_message_set_body (request, body);
|
|
||||||
message = g_dbus_connection_send_message_with_reply_sync (priv->conn,
|
|
||||||
request,
|
|
||||||
G_DBUS_SEND_MESSAGE_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
error);
|
|
||||||
if (message == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (*error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (g_dbus_message_to_gerror (message, error)) {
|
|
||||||
g_dbus_error_strip_remote_error (*error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* print results */
|
|
||||||
val = g_dbus_message_get_body (message);
|
|
||||||
fu_util_print_metadata (val);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,9 +381,8 @@ fu_util_install_prepared (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
gint vercmp;
|
gint vercmp;
|
||||||
guint cnt = 0;
|
guint cnt = 0;
|
||||||
guint i;
|
guint i;
|
||||||
const gchar *tmp;
|
|
||||||
g_autofree gchar *link = NULL;
|
g_autofree gchar *link = NULL;
|
||||||
g_autoptr(GPtrArray) devices = NULL;
|
g_autoptr(GPtrArray) results = NULL;
|
||||||
g_autoptr(FuPending) pending = NULL;
|
g_autoptr(FuPending) pending = NULL;
|
||||||
|
|
||||||
/* verify this is pointing to our cache */
|
/* verify this is pointing to our cache */
|
||||||
@ -780,51 +418,52 @@ fu_util_install_prepared (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
|
|
||||||
/* get prepared updates */
|
/* get prepared updates */
|
||||||
pending = fu_pending_new ();
|
pending = fu_pending_new ();
|
||||||
devices = fu_pending_get_devices (pending, error);
|
results = fu_pending_get_devices (pending, error);
|
||||||
if (devices == NULL)
|
if (results == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* apply each update */
|
/* apply each update */
|
||||||
for (i = 0; i < devices->len; i++) {
|
for (i = 0; i < results->len; i++) {
|
||||||
FuDevice *device;
|
FwupdResult *res;
|
||||||
device = g_ptr_array_index (devices, i);
|
res = g_ptr_array_index (results, i);
|
||||||
|
|
||||||
/* check not already done */
|
/* check not already done */
|
||||||
tmp = fu_device_get_metadata (device, FU_DEVICE_KEY_PENDING_STATE);
|
if (fwupd_result_get_update_state (res) != FWUPD_UPDATE_STATE_PENDING)
|
||||||
if (g_strcmp0 (tmp, "pending") != 0)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* tell the user what's going to happen */
|
/* tell the user what's going to happen */
|
||||||
vercmp = as_utils_vercmp (fu_device_get_metadata (device, FU_DEVICE_KEY_VERSION),
|
vercmp = as_utils_vercmp (fwupd_result_get_device_version (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_UPDATE_VERSION));
|
fwupd_result_get_update_version (res));
|
||||||
if (vercmp == 0) {
|
if (vercmp == 0) {
|
||||||
/* TRANSLATORS: the first replacement is a display name
|
/* TRANSLATORS: the first replacement is a display name
|
||||||
* e.g. "ColorHugALS" and the second is a version number
|
* e.g. "ColorHugALS" and the second is a version number
|
||||||
* e.g. "1.2.3" */
|
* e.g. "1.2.3" */
|
||||||
g_print (_("Reinstalling %s with %s... "),
|
g_print (_("Reinstalling %s with %s... "),
|
||||||
fu_device_get_display_name (device),
|
fwupd_result_get_device_name (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_UPDATE_VERSION));
|
fwupd_result_get_update_version (res));
|
||||||
} else if (vercmp > 0) {
|
} else if (vercmp > 0) {
|
||||||
/* TRANSLATORS: the first replacement is a display name
|
/* TRANSLATORS: the first replacement is a display name
|
||||||
* e.g. "ColorHugALS" and the second and third are
|
* e.g. "ColorHugALS" and the second and third are
|
||||||
* version numbers e.g. "1.2.3" */
|
* version numbers e.g. "1.2.3" */
|
||||||
g_print (_("Downgrading %s from %s to %s... "),
|
g_print (_("Downgrading %s from %s to %s... "),
|
||||||
fu_device_get_display_name (device),
|
fwupd_result_get_device_name (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_VERSION),
|
fwupd_result_get_device_version (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_UPDATE_VERSION));
|
fwupd_result_get_update_version (res));
|
||||||
} else if (vercmp < 0) {
|
} else if (vercmp < 0) {
|
||||||
/* TRANSLATORS: the first replacement is a display name
|
/* TRANSLATORS: the first replacement is a display name
|
||||||
* e.g. "ColorHugALS" and the second and third are
|
* e.g. "ColorHugALS" and the second and third are
|
||||||
* version numbers e.g. "1.2.3" */
|
* version numbers e.g. "1.2.3" */
|
||||||
g_print (_("Updating %s from %s to %s... "),
|
g_print (_("Updating %s from %s to %s... "),
|
||||||
fu_device_get_display_name (device),
|
fwupd_result_get_device_name (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_VERSION),
|
fwupd_result_get_device_version (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_UPDATE_VERSION));
|
fwupd_result_get_update_version (res));
|
||||||
}
|
}
|
||||||
if (!fu_util_install_internal (priv,
|
if (!fwupd_client_install (priv->client,
|
||||||
fu_device_get_id (device),
|
fwupd_result_get_device_id (res),
|
||||||
fu_device_get_metadata (device, FU_DEVICE_KEY_FILENAME_CAB),
|
fwupd_result_get_update_filename (res),
|
||||||
error))
|
priv->flags,
|
||||||
|
NULL,
|
||||||
|
error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
@ -858,22 +497,7 @@ fu_util_clear_results (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
"Invalid arguments: expected 'id'");
|
"Invalid arguments: expected 'id'");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
return fwupd_client_clear_results (priv->client, values[0], NULL, error);
|
||||||
/* clear results, and wait for reply */
|
|
||||||
g_dbus_proxy_call (priv->proxy,
|
|
||||||
"ClearResults",
|
|
||||||
g_variant_new ("(s)", values[0]),
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
fu_util_get_devices_cb, priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->val == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1051,79 +675,6 @@ fu_util_verify_update (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
error);
|
error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_refresh_internal:
|
|
||||||
**/
|
|
||||||
static gboolean
|
|
||||||
fu_util_refresh_internal (FuUtilPrivate *priv,
|
|
||||||
const gchar *data_fn,
|
|
||||||
const gchar *sig_fn,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
GVariant *body;
|
|
||||||
gint fd;
|
|
||||||
gint fd_sig;
|
|
||||||
g_autoptr(GDBusMessage) request = NULL;
|
|
||||||
g_autoptr(GUnixFDList) fd_list = NULL;
|
|
||||||
|
|
||||||
/* open file */
|
|
||||||
fd = open (data_fn, O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
g_set_error (error,
|
|
||||||
FWUPD_ERROR,
|
|
||||||
FWUPD_ERROR_INVALID_FILE,
|
|
||||||
"failed to open %s",
|
|
||||||
data_fn);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
fd_sig = open (sig_fn, O_RDONLY);
|
|
||||||
if (fd_sig < 0) {
|
|
||||||
g_set_error (error,
|
|
||||||
FWUPD_ERROR,
|
|
||||||
FWUPD_ERROR_INVALID_FILE,
|
|
||||||
"failed to open %s",
|
|
||||||
sig_fn);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set out of band file descriptor */
|
|
||||||
fd_list = g_unix_fd_list_new ();
|
|
||||||
g_unix_fd_list_append (fd_list, fd, NULL);
|
|
||||||
g_unix_fd_list_append (fd_list, fd_sig, NULL);
|
|
||||||
request = g_dbus_message_new_method_call (FWUPD_DBUS_SERVICE,
|
|
||||||
FWUPD_DBUS_PATH,
|
|
||||||
FWUPD_DBUS_INTERFACE,
|
|
||||||
"UpdateMetadata");
|
|
||||||
g_dbus_message_set_unix_fd_list (request, fd_list);
|
|
||||||
|
|
||||||
/* g_unix_fd_list_append did a dup() already */
|
|
||||||
close (fd);
|
|
||||||
close (fd_sig);
|
|
||||||
|
|
||||||
/* send message */
|
|
||||||
body = g_variant_new ("(hh)", fd, fd_sig);
|
|
||||||
g_dbus_message_set_body (request, body);
|
|
||||||
g_dbus_connection_send_message_with_reply (priv->conn,
|
|
||||||
request,
|
|
||||||
G_DBUS_SEND_MESSAGE_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
fu_util_update_cb,
|
|
||||||
priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->message == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (g_dbus_message_to_gerror (priv->message, error)) {
|
|
||||||
g_dbus_error_strip_remote_error (*error);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_util_download_file:
|
* fu_util_download_file:
|
||||||
**/
|
**/
|
||||||
@ -1234,7 +785,7 @@ fu_util_download_metadata (FuUtilPrivate *priv, GError **error)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* send all this to fwupd */
|
/* send all this to fwupd */
|
||||||
return fu_util_refresh_internal (priv, data_fn, sig_fn, error);
|
return fwupd_client_refresh (priv->client, data_fn, sig_fn, NULL, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1254,7 +805,7 @@ fu_util_refresh (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* open file */
|
/* open file */
|
||||||
return fu_util_refresh_internal (priv, values[0], values[1], error);
|
return fwupd_client_refresh (priv->client, values[0], values[1], NULL, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1263,6 +814,9 @@ fu_util_refresh (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
static gboolean
|
static gboolean
|
||||||
fu_util_get_results (FuUtilPrivate *priv, gchar **values, GError **error)
|
fu_util_get_results (FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
{
|
{
|
||||||
|
g_autofree gchar *tmp = NULL;
|
||||||
|
g_autoptr(FwupdResult) res = NULL;
|
||||||
|
|
||||||
if (g_strv_length (values) != 1) {
|
if (g_strv_length (values) != 1) {
|
||||||
g_set_error_literal (error,
|
g_set_error_literal (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
@ -1270,77 +824,44 @@ fu_util_get_results (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
"Invalid arguments: expected 'id'");
|
"Invalid arguments: expected 'id'");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
res = fwupd_client_get_results (priv->client, values[0], NULL, error);
|
||||||
/* clear results, and wait for reply */
|
if (res == NULL)
|
||||||
g_dbus_proxy_call (priv->proxy,
|
|
||||||
"GetResults",
|
|
||||||
g_variant_new ("(s)", values[0]),
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
fu_util_get_devices_cb, priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->val == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
tmp = fwupd_result_to_string (res);
|
||||||
fu_util_print_metadata (priv->val);
|
g_print ("%s", tmp);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fu_util_verify_internal:
|
|
||||||
**/
|
|
||||||
static gboolean
|
|
||||||
fu_util_verify_internal (FuUtilPrivate *priv, const gchar *id, GError **error)
|
|
||||||
{
|
|
||||||
g_dbus_proxy_call (priv->proxy,
|
|
||||||
"Verify",
|
|
||||||
g_variant_new ("(s)", id),
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
fu_util_get_devices_cb, priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->val == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
priv->error = NULL;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_util_verify_all:
|
* fu_util_verify_all:
|
||||||
**/
|
**/
|
||||||
static gboolean
|
static gboolean
|
||||||
fu_util_verify_all (FuUtilPrivate *priv, GError **error)
|
fu_util_verify_all (FuUtilPrivate *priv, GError **error)
|
||||||
{
|
{
|
||||||
FuDevice *dev;
|
FwupdResult *res;
|
||||||
guint i;
|
guint i;
|
||||||
g_autoptr(GPtrArray) devices = NULL;
|
g_autoptr(GPtrArray) results = NULL;
|
||||||
|
|
||||||
/* get devices from daemon */
|
/* get devices from daemon */
|
||||||
devices = fu_util_get_devices_internal (priv, error);
|
results = fwupd_client_get_devices (priv->client, NULL, error);
|
||||||
if (devices == NULL)
|
if (results == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* get results */
|
/* get results */
|
||||||
for (i = 0; i < devices->len; i++) {
|
for (i = 0; i < results->len; i++) {
|
||||||
g_autoptr(GError) error_local = NULL;
|
g_autoptr(GError) error_local = NULL;
|
||||||
dev = g_ptr_array_index (devices, i);
|
res = g_ptr_array_index (results, i);
|
||||||
if (!fu_util_verify_internal (priv, fu_device_get_id (dev), &error_local)) {
|
if (!fwupd_client_verify (priv->client,
|
||||||
|
fwupd_result_get_device_id (res),
|
||||||
|
NULL,
|
||||||
|
&error_local)) {
|
||||||
g_print ("%s\tFAILED: %s\n",
|
g_print ("%s\tFAILED: %s\n",
|
||||||
fu_device_get_guid (dev),
|
fwupd_result_get_guid (res),
|
||||||
error_local->message);
|
error_local->message);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
g_print ("%s\t%s\n",
|
g_print ("%s\t%s\n",
|
||||||
fu_device_get_guid (dev),
|
fwupd_result_get_guid (res),
|
||||||
_("OK"));
|
_("OK"));
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1361,7 +882,7 @@ fu_util_verify (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
"Invalid arguments: expected 'id'");
|
"Invalid arguments: expected 'id'");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return fu_util_verify_internal (priv, values[0], error);
|
return fwupd_client_verify (priv->client, values[0], NULL, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1377,21 +898,7 @@ fu_util_unlock (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
"Invalid arguments: expected 'id'");
|
"Invalid arguments: expected 'id'");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
g_dbus_proxy_call (priv->proxy,
|
return fwupd_client_unlock (priv->client, values[0], NULL, error);
|
||||||
"Unlock",
|
|
||||||
g_variant_new ("(s)", values[0]),
|
|
||||||
G_DBUS_CALL_FLAGS_NONE,
|
|
||||||
-1,
|
|
||||||
NULL,
|
|
||||||
fu_util_get_devices_cb, priv);
|
|
||||||
g_main_loop_run (priv->loop);
|
|
||||||
if (priv->val == NULL) {
|
|
||||||
g_dbus_error_strip_remote_error (priv->error);
|
|
||||||
g_propagate_error (error, priv->error);
|
|
||||||
priv->error = NULL;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1426,44 +933,39 @@ fu_util_print_data (const gchar *title, const gchar *msg)
|
|||||||
static gboolean
|
static gboolean
|
||||||
fu_util_get_updates (FuUtilPrivate *priv, gchar **values, GError **error)
|
fu_util_get_updates (FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
{
|
{
|
||||||
FuDevice *dev;
|
FwupdResult *res;
|
||||||
GPtrArray *devices = NULL;
|
GPtrArray *results = NULL;
|
||||||
const gchar *tmp;
|
const gchar *tmp;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
/* print any updates */
|
/* print any updates */
|
||||||
devices = fu_util_get_updates_internal (priv, error);
|
results = fwupd_client_get_updates (priv->client, NULL, error);
|
||||||
if (devices == NULL)
|
if (results == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
for (i = 0; i < devices->len; i++) {
|
for (i = 0; i < results->len; i++) {
|
||||||
dev = g_ptr_array_index (devices, i);
|
res = g_ptr_array_index (results, i);
|
||||||
|
|
||||||
/* TRANSLATORS: first replacement is device name */
|
/* TRANSLATORS: first replacement is device name */
|
||||||
g_print (_("%s has firmware updates:"), fu_device_get_display_name (dev));
|
g_print (_("%s has firmware updates:"), fwupd_result_get_device_name (res));
|
||||||
g_print ("\n");
|
g_print ("\n");
|
||||||
|
|
||||||
/* TRANSLATORS: Appstream ID for the hardware type */
|
/* TRANSLATORS: Appstream ID for the hardware type */
|
||||||
fu_util_print_data (_("ID"),
|
fu_util_print_data (_("ID"), fwupd_result_get_update_id (res));
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_APPSTREAM_ID));
|
|
||||||
|
|
||||||
/* TRANSLATORS: a GUID for the hardware */
|
/* TRANSLATORS: a GUID for the hardware */
|
||||||
fu_util_print_data (_("GUID"),
|
fu_util_print_data (_("GUID"), fwupd_result_get_guid (res));
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_GUID));
|
|
||||||
|
|
||||||
/* TRANSLATORS: section header for firmware version */
|
/* TRANSLATORS: section header for firmware version */
|
||||||
fu_util_print_data (_("Version"),
|
fu_util_print_data (_("Version"), fwupd_result_get_update_version (res));
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_VERSION));
|
|
||||||
|
|
||||||
/* TRANSLATORS: section header for firmware SHA1 */
|
/* TRANSLATORS: section header for firmware SHA1 */
|
||||||
fu_util_print_data (_("Checksum"),
|
fu_util_print_data (_("Checksum"), fwupd_result_get_update_checksum (res));
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_HASH));
|
|
||||||
|
|
||||||
/* TRANSLATORS: section header for firmware remote http:// */
|
/* TRANSLATORS: section header for firmware remote http:// */
|
||||||
fu_util_print_data (_("Location"),
|
fu_util_print_data (_("Location"), fwupd_result_get_update_uri (res));
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_URI));
|
|
||||||
|
|
||||||
/* convert XML -> text */
|
/* convert XML -> text */
|
||||||
tmp = fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_DESCRIPTION);
|
tmp = fwupd_result_get_update_description (res);
|
||||||
if (tmp != NULL) {
|
if (tmp != NULL) {
|
||||||
g_autofree gchar *md = NULL;
|
g_autofree gchar *md = NULL;
|
||||||
md = as_markup_convert (tmp,
|
md = as_markup_convert (tmp,
|
||||||
@ -1485,40 +987,40 @@ fu_util_get_updates (FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
static gboolean
|
static gboolean
|
||||||
fu_util_update (FuUtilPrivate *priv, gchar **values, GError **error)
|
fu_util_update (FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
{
|
{
|
||||||
FuDevice *dev;
|
FwupdResult *res;
|
||||||
GPtrArray *devices = NULL;
|
GPtrArray *results = NULL;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
/* apply any updates */
|
/* apply any updates */
|
||||||
devices = fu_util_get_updates_internal (priv, error);
|
results = fwupd_client_get_updates (priv->client, NULL, error);
|
||||||
if (devices == NULL)
|
if (results == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
for (i = 0; i < devices->len; i++) {
|
for (i = 0; i < results->len; i++) {
|
||||||
const gchar *checksum;
|
const gchar *checksum;
|
||||||
const gchar *uri;
|
const gchar *uri;
|
||||||
g_autofree gchar *basename = NULL;
|
g_autofree gchar *basename = NULL;
|
||||||
g_autofree gchar *fn = NULL;
|
g_autofree gchar *fn = NULL;
|
||||||
|
|
||||||
dev = g_ptr_array_index (devices, i);
|
res = g_ptr_array_index (results, i);
|
||||||
|
|
||||||
/* download file */
|
/* download file */
|
||||||
checksum = fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_HASH);
|
checksum = fwupd_result_get_update_checksum (res);
|
||||||
if (checksum == NULL)
|
if (checksum == NULL)
|
||||||
continue;
|
continue;
|
||||||
uri = fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_URI);
|
uri = fwupd_result_get_update_uri (res);
|
||||||
if (uri == NULL)
|
if (uri == NULL)
|
||||||
continue;
|
continue;
|
||||||
g_print ("Downloading %s for %s...\n",
|
g_print ("Downloading %s for %s...\n",
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_VERSION),
|
fwupd_result_get_update_version (res),
|
||||||
fu_device_get_display_name (dev));
|
fwupd_result_get_device_name (res));
|
||||||
basename = g_path_get_basename (uri);
|
basename = g_path_get_basename (uri);
|
||||||
fn = g_build_filename (g_get_tmp_dir (), basename, NULL);
|
fn = g_build_filename (g_get_tmp_dir (), basename, NULL);
|
||||||
if (!fu_util_download_file (priv, uri, fn, checksum, error))
|
if (!fu_util_download_file (priv, uri, fn, checksum, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
g_print ("Updating %s on %s...\n",
|
g_print ("Updating %s on %s...\n",
|
||||||
fu_device_get_metadata (dev, FU_DEVICE_KEY_UPDATE_VERSION),
|
fwupd_result_get_update_version (res),
|
||||||
fu_device_get_display_name (dev));
|
fwupd_result_get_device_name (res));
|
||||||
if (!fu_util_install_with_fallback (priv, fu_device_get_id (dev), fn, error))
|
if (!fu_util_install_with_fallback (priv, fwupd_result_get_device_id (res), fn, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1696,28 +1198,8 @@ main (int argc, char *argv[])
|
|||||||
priv->flags |= FWUPD_UPDATE_FLAG_ALLOW_OLDER;
|
priv->flags |= FWUPD_UPDATE_FLAG_ALLOW_OLDER;
|
||||||
|
|
||||||
/* connect to the daemon */
|
/* connect to the daemon */
|
||||||
priv->conn = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
|
priv->client = fwupd_client_new ();
|
||||||
if (priv->conn == NULL) {
|
g_signal_connect (priv->client, "status-changed",
|
||||||
/* TRANSLATORS: the user is in a bad place */
|
|
||||||
g_print ("%s: %s\n", _("Failed to connect to D-Bus"),
|
|
||||||
error->message);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
priv->proxy = g_dbus_proxy_new_sync (priv->conn,
|
|
||||||
G_DBUS_PROXY_FLAGS_NONE,
|
|
||||||
NULL,
|
|
||||||
FWUPD_DBUS_SERVICE,
|
|
||||||
FWUPD_DBUS_PATH,
|
|
||||||
FWUPD_DBUS_INTERFACE,
|
|
||||||
NULL,
|
|
||||||
&error);
|
|
||||||
if (priv->proxy == NULL) {
|
|
||||||
/* TRANSLATORS: we can't connect to the daemon */
|
|
||||||
g_print ("%s: %s\n", _("Failed to connect to fwupd"),
|
|
||||||
error->message);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
g_signal_connect (priv->proxy, "g-properties-changed",
|
|
||||||
G_CALLBACK (fu_util_status_changed_cb), priv);
|
G_CALLBACK (fu_util_status_changed_cb), priv);
|
||||||
|
|
||||||
/* run the specified command */
|
/* run the specified command */
|
||||||
@ -1739,14 +1221,8 @@ out:
|
|||||||
if (priv != NULL) {
|
if (priv != NULL) {
|
||||||
if (priv->cmd_array != NULL)
|
if (priv->cmd_array != NULL)
|
||||||
g_ptr_array_unref (priv->cmd_array);
|
g_ptr_array_unref (priv->cmd_array);
|
||||||
if (priv->val != NULL)
|
if (priv->client != NULL)
|
||||||
g_variant_unref (priv->val);
|
g_object_unref (priv->client);
|
||||||
if (priv->message != NULL)
|
|
||||||
g_object_unref (priv->message);
|
|
||||||
if (priv->conn != NULL)
|
|
||||||
g_object_unref (priv->conn);
|
|
||||||
if (priv->proxy != NULL)
|
|
||||||
g_object_unref (priv->proxy);
|
|
||||||
g_main_loop_unref (priv->loop);
|
g_main_loop_unref (priv->loop);
|
||||||
g_option_context_free (priv->context);
|
g_option_context_free (priv->context);
|
||||||
g_free (priv);
|
g_free (priv);
|
||||||
|
Loading…
Reference in New Issue
Block a user