mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-30 23:05:11 +00:00
Run vendor plugins as required
This allows us to run plugins from AppStream metadata values.
This commit is contained in:
parent
80a77bcfd8
commit
dad1e193cd
@ -61,6 +61,9 @@ struct _FuDeviceClass
|
|||||||
#define FU_DEVICE_KEY_CREATED "Created" /* t */
|
#define FU_DEVICE_KEY_CREATED "Created" /* t */
|
||||||
#define FU_DEVICE_KEY_MODIFIED "Modified" /* t */
|
#define FU_DEVICE_KEY_MODIFIED "Modified" /* t */
|
||||||
|
|
||||||
|
/* private */
|
||||||
|
#define FU_DEVICE_KEY_FWUPD_PLUGIN "fwupd::plugin" /* s */
|
||||||
|
|
||||||
FuDevice *fu_device_new (void);
|
FuDevice *fu_device_new (void);
|
||||||
|
|
||||||
/* accessors */
|
/* accessors */
|
||||||
|
@ -236,6 +236,21 @@ fu_main_load_plugins (GHashTable *plugins, GError **error)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fu_main_get_plugin_for_device:
|
||||||
|
**/
|
||||||
|
static FuPlugin *
|
||||||
|
fu_main_get_plugin_for_device (GHashTable *plugins, FuDevice *device)
|
||||||
|
{
|
||||||
|
const gchar *tmp;
|
||||||
|
|
||||||
|
/* does a vendor plugin exist */
|
||||||
|
tmp = fu_device_get_metadata (device, FU_DEVICE_KEY_FWUPD_PLUGIN);
|
||||||
|
if (tmp == NULL)
|
||||||
|
return NULL;
|
||||||
|
return g_hash_table_lookup (plugins, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_main_item_free:
|
* fu_main_item_free:
|
||||||
**/
|
**/
|
||||||
@ -461,6 +476,7 @@ static gboolean
|
|||||||
fu_main_provider_update_authenticated (FuMainAuthHelper *helper, GError **error)
|
fu_main_provider_update_authenticated (FuMainAuthHelper *helper, GError **error)
|
||||||
{
|
{
|
||||||
FuDeviceItem *item;
|
FuDeviceItem *item;
|
||||||
|
FuPlugin *plugin;
|
||||||
|
|
||||||
/* check the device still exists */
|
/* check the device still exists */
|
||||||
item = fu_main_get_item_by_id (helper->priv, fu_device_get_id (helper->device));
|
item = fu_main_get_item_by_id (helper->priv, fu_device_get_id (helper->device));
|
||||||
@ -486,10 +502,13 @@ fu_main_provider_update_authenticated (FuMainAuthHelper *helper, GError **error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* run the correct provider that added this */
|
/* run the correct provider that added this */
|
||||||
|
plugin = fu_main_get_plugin_for_device (helper->priv->plugins,
|
||||||
|
item->device);
|
||||||
if (!fu_provider_update (item->provider,
|
if (!fu_provider_update (item->provider,
|
||||||
item->device,
|
item->device,
|
||||||
helper->blob_cab,
|
helper->blob_cab,
|
||||||
helper->blob_fw,
|
helper->blob_fw,
|
||||||
|
plugin,
|
||||||
helper->flags,
|
helper->flags,
|
||||||
error))
|
error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -1907,6 +1926,9 @@ cd_main_provider_device_added_cb (FuProvider *provider,
|
|||||||
{
|
{
|
||||||
FuMainPrivate *priv = (FuMainPrivate *) user_data;
|
FuMainPrivate *priv = (FuMainPrivate *) user_data;
|
||||||
FuDeviceItem *item;
|
FuDeviceItem *item;
|
||||||
|
AsApp *app;
|
||||||
|
FuPlugin *plugin;
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
|
||||||
/* remove any fake device */
|
/* remove any fake device */
|
||||||
item = fu_main_get_item_by_id (priv, fu_device_get_id (device));
|
item = fu_main_get_item_by_id (priv, fu_device_get_id (device));
|
||||||
@ -1923,6 +1945,32 @@ cd_main_provider_device_added_cb (FuProvider *provider,
|
|||||||
item->device = g_object_ref (device);
|
item->device = g_object_ref (device);
|
||||||
item->provider = g_object_ref (provider);
|
item->provider = g_object_ref (provider);
|
||||||
g_ptr_array_add (priv->devices, item);
|
g_ptr_array_add (priv->devices, item);
|
||||||
|
|
||||||
|
/* does this match anything in the AppStream data */
|
||||||
|
app = as_store_get_app_by_provide (priv->store,
|
||||||
|
AS_PROVIDE_KIND_FIRMWARE_FLASHED,
|
||||||
|
fu_device_get_guid (item->device));
|
||||||
|
if (app != NULL) {
|
||||||
|
const gchar *tmp;
|
||||||
|
tmp = as_app_get_metadata_item (app, FU_DEVICE_KEY_FWUPD_PLUGIN);
|
||||||
|
if (tmp != NULL) {
|
||||||
|
g_debug ("setting plugin: %s", tmp);
|
||||||
|
fu_device_set_metadata (item->device,
|
||||||
|
FU_DEVICE_KEY_FWUPD_PLUGIN,
|
||||||
|
tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* run any plugins */
|
||||||
|
plugin = fu_main_get_plugin_for_device (priv->plugins, device);
|
||||||
|
if (plugin != NULL) {
|
||||||
|
if (!fu_plugin_run_device_probe (plugin, device, &error)) {
|
||||||
|
g_warning ("failed to probe %s: %s",
|
||||||
|
fu_device_get_id (item->device),
|
||||||
|
error->message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fu_main_emit_changed (priv);
|
fu_main_emit_changed (priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "fu-device.h"
|
#include "fu-device.h"
|
||||||
#include "fu-pending.h"
|
#include "fu-pending.h"
|
||||||
|
#include "fu-plugin.h"
|
||||||
#include "fu-provider-uefi.h"
|
#include "fu-provider-uefi.h"
|
||||||
|
|
||||||
static void fu_provider_finalize (GObject *object);
|
static void fu_provider_finalize (GObject *object);
|
||||||
@ -229,6 +230,7 @@ fu_provider_update (FuProvider *provider,
|
|||||||
FuDevice *device,
|
FuDevice *device,
|
||||||
GBytes *blob_cab,
|
GBytes *blob_cab,
|
||||||
GBytes *blob_fw,
|
GBytes *blob_fw,
|
||||||
|
FuPlugin *plugin,
|
||||||
FuProviderFlags flags,
|
FuProviderFlags flags,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
@ -251,6 +253,14 @@ fu_provider_update (FuProvider *provider,
|
|||||||
if (!fu_provider_offline_invalidate (error))
|
if (!fu_provider_offline_invalidate (error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
/* we have support using a plugin */
|
||||||
|
if (plugin != NULL) {
|
||||||
|
return fu_plugin_run_device_update (plugin,
|
||||||
|
device,
|
||||||
|
blob_fw,
|
||||||
|
error);
|
||||||
|
}
|
||||||
|
|
||||||
/* online */
|
/* online */
|
||||||
if (klass->update_online == NULL) {
|
if (klass->update_online == NULL) {
|
||||||
g_set_error_literal (error,
|
g_set_error_literal (error,
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
@ -25,6 +25,7 @@
|
|||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
|
||||||
#include "fu-device.h"
|
#include "fu-device.h"
|
||||||
|
#include "fu-plugin.h"
|
||||||
#include "fu-provider.h"
|
#include "fu-provider.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
@ -101,6 +102,7 @@ gboolean fu_provider_update (FuProvider *provider,
|
|||||||
FuDevice *device,
|
FuDevice *device,
|
||||||
GBytes *blob_cab,
|
GBytes *blob_cab,
|
||||||
GBytes *blob_fw,
|
GBytes *blob_fw,
|
||||||
|
FuPlugin *plugin,
|
||||||
FuProviderFlags flags,
|
FuProviderFlags flags,
|
||||||
GError **error);
|
GError **error);
|
||||||
gboolean fu_provider_verify (FuProvider *provider,
|
gboolean fu_provider_verify (FuProvider *provider,
|
||||||
|
@ -214,7 +214,7 @@ fu_provider_func (void)
|
|||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (mapped_file != NULL);
|
g_assert (mapped_file != NULL);
|
||||||
blob_cab = g_mapped_file_get_bytes (mapped_file);
|
blob_cab = g_mapped_file_get_bytes (mapped_file);
|
||||||
ret = fu_provider_update (provider, device, blob_cab, NULL,
|
ret = fu_provider_update (provider, device, blob_cab, NULL, NULL,
|
||||||
FU_PROVIDER_UPDATE_FLAG_OFFLINE, &error);
|
FU_PROVIDER_UPDATE_FLAG_OFFLINE, &error);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (ret);
|
g_assert (ret);
|
||||||
@ -234,7 +234,7 @@ fu_provider_func (void)
|
|||||||
g_object_unref (device_tmp);
|
g_object_unref (device_tmp);
|
||||||
|
|
||||||
/* lets do this online */
|
/* lets do this online */
|
||||||
ret = fu_provider_update (provider, device, blob_cab, NULL,
|
ret = fu_provider_update (provider, device, blob_cab, NULL, NULL,
|
||||||
FU_PROVIDER_UPDATE_FLAG_NONE, &error);
|
FU_PROVIDER_UPDATE_FLAG_NONE, &error);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (ret);
|
g_assert (ret);
|
||||||
@ -327,7 +327,7 @@ fu_provider_rpi_func (void)
|
|||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (mapped_file != NULL);
|
g_assert (mapped_file != NULL);
|
||||||
blob_fw = g_mapped_file_get_bytes (mapped_file);
|
blob_fw = g_mapped_file_get_bytes (mapped_file);
|
||||||
ret = fu_provider_update (provider, device, NULL, blob_fw,
|
ret = fu_provider_update (provider, device, NULL, blob_fw, NULL,
|
||||||
FU_PROVIDER_UPDATE_FLAG_NONE, &error);
|
FU_PROVIDER_UPDATE_FLAG_NONE, &error);
|
||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (ret);
|
g_assert (ret);
|
||||||
|
Loading…
Reference in New Issue
Block a user