diff --git a/src/fu-util-common.c b/src/fu-util-common.c index cf4288b48..975cdeb4e 100644 --- a/src/fu-util-common.c +++ b/src/fu-util-common.c @@ -27,6 +27,68 @@ fu_util_get_systemd_unit (void) return SYSTEMD_FWUPD_UNIT; } +static const gchar * +fu_util_get_expected_command (const gchar *target) +{ + if (g_strcmp0 (target, SYSTEMD_SNAP_FWUPD_UNIT)) + return "fwupd.fwupdmgr"; + return "fwupdmgr"; +} + +gboolean +fu_util_using_correct_daemon (GError **error) +{ + g_autoptr(GDBusConnection) connection = NULL; + g_autoptr(GVariant) default_target = NULL; + g_autoptr(GVariant) val_path = NULL; + g_autoptr(GError) error_local = NULL; + const gchar *target = fu_util_get_systemd_unit (); + + connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, error); + if (connection == NULL) + return FALSE; + + default_target = g_dbus_connection_call_sync (connection, + SYSTEMD_SERVICE, + SYSTEMD_OBJECT_PATH, + SYSTEMD_MANAGER_INTERFACE, + "GetDefaultTarget", + NULL, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error_local); + if (default_target == NULL) { + g_debug ("Systemd isn't accessible: %s\n", error_local->message); + return TRUE; + } + + val_path = g_dbus_connection_call_sync (connection, + SYSTEMD_SERVICE, + SYSTEMD_OBJECT_PATH, + SYSTEMD_MANAGER_INTERFACE, + "GetUnit", + g_variant_new ("(s)", + target), + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + NULL); + if (val_path == NULL) { + g_set_error (error, + FWUPD_ERROR, + FWUPD_ERROR_INVALID_ARGS, + /* TRANSLATORS: error message */ + _("Mismatched daemon and client, use %s instead"), + fu_util_get_expected_command (target)); + return FALSE; + } + + return TRUE; +} + gboolean fu_util_stop_daemon (GError **error) { diff --git a/src/fu-util-common.h b/src/fu-util-common.h index 8dddab046..41dd53ab6 100644 --- a/src/fu-util-common.h +++ b/src/fu-util-common.h @@ -60,6 +60,7 @@ gboolean fu_util_cmd_array_run (GPtrArray *array, GError **error); gchar *fu_util_release_get_name (FwupdRelease *release); +gboolean fu_util_using_correct_daemon (GError **error); gboolean fu_util_stop_daemon (GError **error); G_END_DECLS diff --git a/src/fu-util.c b/src/fu-util.c index 24a666f4d..420aaa075 100644 --- a/src/fu-util.c +++ b/src/fu-util.c @@ -2481,6 +2481,14 @@ main (int argc, char *argv[]) "is no longer supported by the upstream developers!\n"); } +#ifdef HAVE_SYSTEMD + /* make sure the correct daemon is in use */ + if (!fu_util_using_correct_daemon (&error)) { + g_printerr ("%s\n", error->message); + return EXIT_FAILURE; + } +#endif + /* run the specified command */ ret = fu_util_cmd_array_run (cmd_array, priv, argv[1], (gchar**) &argv[2], &error); if (!ret) {