Add a get-plugins command to fwupdtool

This returns the list of currently enabled plugins.
This commit is contained in:
Richard Hughes 2018-05-22 19:19:52 +01:00 committed by Mario Limonciello
parent d82e3b565a
commit 8c71a3f2e9
6 changed files with 114 additions and 10 deletions

View File

@ -1218,6 +1218,23 @@ fu_engine_install (FuEngine *self,
version, flags, error);
}
/**
* fu_engine_get_plugins:
* @self: A #FuPluginList
*
* Gets all the plugins that have been added.
*
* Returns: (transfer none) (element-type FuPlugin): the plugins
*
* Since: 1.0.8
**/
GPtrArray *
fu_engine_get_plugins (FuEngine *self)
{
g_return_val_if_fail (FU_IS_ENGINE (self), NULL);
return fu_plugin_list_get_all (self->plugin_list);
}
gboolean
fu_engine_install_blob (FuEngine *self,
FuDevice *device,
@ -2879,7 +2896,7 @@ fu_engine_is_plugin_name_blacklisted (FuEngine *self, const gchar *name)
return FALSE;
}
static gboolean
gboolean
fu_engine_load_plugins (FuEngine *self, GError **error)
{
const gchar *fn;
@ -2925,10 +2942,14 @@ fu_engine_load_plugins (FuEngine *self, GError **error)
fu_plugin_set_runtime_versions (plugin, self->runtime_versions);
fu_plugin_set_compile_versions (plugin, self->compile_versions);
g_debug ("adding plugin %s", filename);
if (!fu_plugin_open (plugin, filename, &error_local)) {
g_warning ("failed to open plugin %s: %s",
filename, error_local->message);
continue;
/* if loaded from fu_engine_load() open the plugin */
if (self->usb_ctx != NULL) {
if (!fu_plugin_open (plugin, filename, &error_local)) {
g_warning ("failed to open plugin %s: %s",
filename, error_local->message);
continue;
}
}
/* self disabled */

View File

@ -40,6 +40,8 @@ G_DECLARE_FINAL_TYPE (FuEngine, fu_engine, FU, ENGINE, GObject)
FuEngine *fu_engine_new (FuAppFlags app_flags);
gboolean fu_engine_load (FuEngine *self,
GError **error);
gboolean fu_engine_load_plugins (FuEngine *self,
GError **error);
FwupdStatus fu_engine_get_status (FuEngine *self);
void fu_engine_profile_dump (FuEngine *self);
gboolean fu_engine_check_plugins_pending (FuEngine *self,
@ -48,6 +50,7 @@ AsStore *fu_engine_get_store_from_blob (FuEngine *self,
GBytes *blob_cab,
GError **error);
guint64 fu_engine_get_archive_size_max (FuEngine *self);
GPtrArray *fu_engine_get_plugins (FuEngine *self);
GPtrArray *fu_engine_get_devices (FuEngine *self,
GError **error);
FuDevice *fu_engine_get_device (FuEngine *self,

View File

@ -124,11 +124,7 @@ fu_plugin_list_sort_cb (gconstpointer a, gconstpointer b)
{
FuPlugin **pa = (FuPlugin **) a;
FuPlugin **pb = (FuPlugin **) b;
if (fu_plugin_get_order (*pa) < fu_plugin_get_order (*pb))
return -1;
if (fu_plugin_get_order (*pa) > fu_plugin_get_order (*pb))
return 1;
return 0;
return fu_plugin_order_compare (*pa, *pb);
}
/**

View File

@ -106,6 +106,10 @@ gboolean fu_plugin_runner_clear_results (FuPlugin *plugin,
gboolean fu_plugin_runner_get_results (FuPlugin *plugin,
FuDevice *device,
GError **error);
gint fu_plugin_name_compare (FuPlugin *plugin1,
FuPlugin *plugin2);
gint fu_plugin_order_compare (FuPlugin *plugin1,
FuPlugin *plugin2);
/* utils */
gchar *fu_plugin_guess_name_from_fn (const gchar *filename);

View File

@ -1538,6 +1538,44 @@ fu_plugin_get_config_value (FuPlugin *plugin, const gchar *key)
return g_key_file_get_string (keyfile, plugin_name, key, NULL);
}
/**
* fu_plugin_name_compare:
* @plugin1: first #FuPlugin to compare.
* @plugin2: second #FuPlugin to compare.
*
* Compares two plugins by their names.
*
* Returns: 1, 0 or -1 if @plugin1 is greater, equal, or less than @plugin2.
**/
gint
fu_plugin_name_compare (FuPlugin *plugin1, FuPlugin *plugin2)
{
FuPluginPrivate *priv1 = fu_plugin_get_instance_private (plugin1);
FuPluginPrivate *priv2 = fu_plugin_get_instance_private (plugin2);
return g_strcmp0 (priv1->name, priv2->name);
}
/**
* fu_plugin_order_compare:
* @plugin1: first #FuPlugin to compare.
* @plugin2: second #FuPlugin to compare.
*
* Compares two plugins by their depsolved order.
*
* Returns: 1, 0 or -1 if @plugin1 is greater, equal, or less than @plugin2.
**/
gint
fu_plugin_order_compare (FuPlugin *plugin1, FuPlugin *plugin2)
{
FuPluginPrivate *priv1 = fu_plugin_get_instance_private (plugin1);
FuPluginPrivate *priv2 = fu_plugin_get_instance_private (plugin2);
if (priv1->order < priv2->order)
return -1;
if (priv1->order > priv2->order)
return 1;
return 0;
}
static void
fu_plugin_class_init (FuPluginClass *klass)
{

View File

@ -29,6 +29,7 @@
#include <unistd.h>
#include "fu-engine.h"
#include "fu-plugin-private.h"
#include "fu-progressbar.h"
#include "fu-smbios.h"
#include "fu-util-common.h"
@ -286,6 +287,41 @@ fu_util_watch (FuUtilPrivate *priv, gchar **values, GError **error)
return TRUE;
}
static gint
fu_util_plugin_name_sort_cb (FuPlugin **item1, FuPlugin **item2)
{
return fu_plugin_name_compare (*item1, *item2);
}
static gboolean
fu_util_get_plugins (FuUtilPrivate *priv, gchar **values, GError **error)
{
GPtrArray *plugins;
guint cnt = 0;
/* load engine */
if (!fu_engine_load_plugins (priv->engine, error))
return FALSE;
/* print */
plugins = fu_engine_get_plugins (priv->engine);
g_ptr_array_sort (plugins, (GCompareFunc) fu_util_plugin_name_sort_cb);
for (guint i = 0; i < plugins->len; i++) {
FuPlugin *plugin = g_ptr_array_index (plugins, i);
if (!fu_plugin_get_enabled (plugin))
continue;
g_print ("%s\n", fu_plugin_get_name (plugin));
cnt++;
}
if (cnt == 0) {
/* TRANSLATORS: nothing found */
g_print ("%s\n", _("No plugins found"));
return TRUE;
}
return TRUE;
}
static gboolean
fu_util_get_devices (FuUtilPrivate *priv, gchar **values, GError **error)
{
@ -664,6 +700,12 @@ main (int argc, char *argv[])
/* TRANSLATORS: command description */
_("Dump SMBIOS data from a file"),
fu_util_smbios_dump);
fu_util_add (priv->cmd_array,
"get-plugins",
NULL,
/* TRANSLATORS: command description */
_("Get all enabled plugins registered with the system"),
fu_util_get_plugins);
fu_util_add (priv->cmd_array,
"get-devices",
NULL,