mirror of
https://git.proxmox.com/git/fwupd
synced 2025-06-06 18:35:08 +00:00
Allow 'fwupdmgr install' to install a specified firmware version
This also moves the 'local-install' action to a new verb, although we fall back for compatibility. Fixes https://github.com/fwupd/fwupd/issues/4514
This commit is contained in:
parent
55605a0d5e
commit
63f2e9ee28
@ -20,6 +20,7 @@ _fwupdmgr_cmd_list=(
|
|||||||
'get-upgrades'
|
'get-upgrades'
|
||||||
'get-plugins'
|
'get-plugins'
|
||||||
'install'
|
'install'
|
||||||
|
'local-install'
|
||||||
'modify-config'
|
'modify-config'
|
||||||
'modify-remote'
|
'modify-remote'
|
||||||
'reinstall'
|
'reinstall'
|
||||||
@ -82,6 +83,16 @@ _show_device_ids()
|
|||||||
COMPREPLY+=( $(compgen -W "${description}" -- "$cur") )
|
COMPREPLY+=( $(compgen -W "${description}" -- "$cur") )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_show_release_versions()
|
||||||
|
{
|
||||||
|
if ! command -v jq &> /dev/null; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
local description
|
||||||
|
description="$(command fwupdmgr get-releases "$1" --json 2>/dev/null | jq '.Releases[].Version')"
|
||||||
|
COMPREPLY+=( $(compgen -W "${description}" -- "$cur") )
|
||||||
|
}
|
||||||
|
|
||||||
_show_remotes()
|
_show_remotes()
|
||||||
{
|
{
|
||||||
local remotes
|
local remotes
|
||||||
@ -131,6 +142,18 @@ _fwupdmgr()
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
install)
|
install)
|
||||||
|
#device ID
|
||||||
|
if [[ "$prev" = "${COMP_WORDS[2]}" ]]; then
|
||||||
|
_show_device_ids
|
||||||
|
#version
|
||||||
|
elif [[ "$prev" = "${COMP_WORDS[3]}" ]]; then
|
||||||
|
_show_release_versions "$prev"
|
||||||
|
#modifiers
|
||||||
|
else
|
||||||
|
_show_modifiers
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
local-install)
|
||||||
#find files
|
#find files
|
||||||
if [[ "$prev" = "$command" ]]; then
|
if [[ "$prev" = "$command" ]]; then
|
||||||
_filedir
|
_filedir
|
||||||
|
@ -1079,7 +1079,7 @@ fu_util_download(FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fu_util_install(FuUtilPrivate *priv, gchar **values, GError **error)
|
fu_util_local_install(FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
{
|
{
|
||||||
const gchar *id;
|
const gchar *id;
|
||||||
g_autofree gchar *filename = NULL;
|
g_autofree gchar *filename = NULL;
|
||||||
@ -2699,6 +2699,63 @@ fu_util_reinstall(FuUtilPrivate *priv, gchar **values, GError **error)
|
|||||||
return fu_util_prompt_complete(priv->completion_flags, TRUE, error);
|
return fu_util_prompt_complete(priv->completion_flags, TRUE, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
fu_util_install(FuUtilPrivate *priv, gchar **values, GError **error)
|
||||||
|
{
|
||||||
|
g_autoptr(FwupdDevice) dev = NULL;
|
||||||
|
g_autoptr(FwupdRelease) rel = NULL;
|
||||||
|
|
||||||
|
/* fall back for CLI compatibility */
|
||||||
|
if (g_strv_length(values) >= 1) {
|
||||||
|
if (g_file_test(values[0], G_FILE_TEST_EXISTS))
|
||||||
|
return fu_util_local_install(priv, values, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* find device */
|
||||||
|
priv->filter_include |= FWUPD_DEVICE_FLAG_SUPPORTED;
|
||||||
|
dev = fu_util_get_device_or_prompt(priv, values, error);
|
||||||
|
if (dev == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* find release */
|
||||||
|
if (g_strv_length(values) >= 2) {
|
||||||
|
rel = fu_util_get_release_for_device_version(priv, dev, values[1], error);
|
||||||
|
if (rel == NULL)
|
||||||
|
return FALSE;
|
||||||
|
} else {
|
||||||
|
g_autoptr(GPtrArray) rels = NULL;
|
||||||
|
rels = fwupd_client_get_releases(priv->client,
|
||||||
|
fwupd_device_get_id(dev),
|
||||||
|
priv->cancellable,
|
||||||
|
error);
|
||||||
|
if (rels == NULL)
|
||||||
|
return FALSE;
|
||||||
|
rel = fu_util_prompt_for_release(priv, rels, error);
|
||||||
|
if (rel == NULL)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allow all actions */
|
||||||
|
priv->current_operation = FU_UTIL_OPERATION_INSTALL;
|
||||||
|
priv->flags |= FWUPD_INSTALL_FLAG_ALLOW_REINSTALL;
|
||||||
|
priv->flags |= FWUPD_INSTALL_FLAG_ALLOW_OLDER;
|
||||||
|
if (!fu_util_update_device_with_release(priv, dev, rel, error))
|
||||||
|
return FALSE;
|
||||||
|
fu_util_display_current_message(priv);
|
||||||
|
|
||||||
|
/* send report if we're supposed to */
|
||||||
|
if (!fu_util_maybe_send_reports(priv, rel, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* we don't want to ask anything */
|
||||||
|
if (priv->no_reboot_check) {
|
||||||
|
g_debug("skipping reboot check");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fu_util_prompt_complete(priv->completion_flags, TRUE, error);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_g_str_equal0(gconstpointer str1, gconstpointer str2)
|
_g_str_equal0(gconstpointer str1, gconstpointer str2)
|
||||||
{
|
{
|
||||||
@ -3994,10 +4051,17 @@ main(int argc, char *argv[])
|
|||||||
fu_util_cmd_array_add(cmd_array,
|
fu_util_cmd_array_add(cmd_array,
|
||||||
"install",
|
"install",
|
||||||
/* TRANSLATORS: command argument: uppercase, spaces->dashes */
|
/* TRANSLATORS: command argument: uppercase, spaces->dashes */
|
||||||
|
_("[DEVICE-ID|GUID] [VERSION]"),
|
||||||
|
/* TRANSLATORS: command description */
|
||||||
|
_("Install a specific firmware version on a device"),
|
||||||
|
fu_util_install);
|
||||||
|
fu_util_cmd_array_add(cmd_array,
|
||||||
|
"local-install",
|
||||||
|
/* TRANSLATORS: command argument: uppercase, spaces->dashes */
|
||||||
_("FILE [DEVICE-ID|GUID]"),
|
_("FILE [DEVICE-ID|GUID]"),
|
||||||
/* TRANSLATORS: command description */
|
/* TRANSLATORS: command description */
|
||||||
_("Install a firmware file on this hardware"),
|
_("Install a firmware file on this hardware"),
|
||||||
fu_util_install);
|
fu_util_local_install);
|
||||||
fu_util_cmd_array_add(cmd_array,
|
fu_util_cmd_array_add(cmd_array,
|
||||||
"get-details",
|
"get-details",
|
||||||
/* TRANSLATORS: command argument: uppercase, spaces->dashes */
|
/* TRANSLATORS: command argument: uppercase, spaces->dashes */
|
||||||
|
Loading…
Reference in New Issue
Block a user