blob: 2a8f5135656dfae8ea9fe0e3148216d540ab856f [file] [log] [blame]
/*
* Copyright (C) 2020 Mario Limonciello <mario.limonciello@dell.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#define G_LOG_DOMAIN "FuEngine"
#include "config.h"
#include <glib/gi18n.h>
#include "fu-engine.h"
#include "fu-engine-helper.h"
gboolean
fu_engine_update_motd (FuEngine *self, GError **error)
{
guint upgrade_count = 0;
g_autoptr(FuEngineRequest) request = fu_engine_request_new ();
g_autoptr(GPtrArray) devices = NULL;
g_autoptr(GString) str = NULL;
g_autofree gchar *target = NULL;
/* a subset of what fwupdmgr can do */
fu_engine_request_set_feature_flags (request,
FWUPD_FEATURE_FLAG_DETACH_ACTION |
FWUPD_FEATURE_FLAG_UPDATE_ACTION);
/* get devices from daemon, we even want to know if it's nothing */
devices = fu_engine_get_devices (self, NULL);
if (devices != NULL) {
for (guint i = 0; i < devices->len; i++) {
FwupdDevice *dev = g_ptr_array_index (devices, i);
g_autoptr(GPtrArray) rels = NULL;
/* get the releases for this device */
rels = fu_engine_get_upgrades (self,
request,
fwupd_device_get_id (dev),
NULL);
if (rels == NULL)
continue;
upgrade_count++;
}
}
/* If running under systemd unit, use the directory as a base */
if (g_getenv ("RUNTIME_DIRECTORY") != NULL) {
target = g_build_filename (g_getenv ("RUNTIME_DIRECTORY"),
PACKAGE_NAME,
MOTD_FILE,
NULL);
/* otherwise use the cache directory */
} else {
g_autofree gchar *directory = fu_common_get_path (FU_PATH_KIND_CACHEDIR_PKG);
target = g_build_filename (directory, MOTD_DIR, MOTD_FILE, NULL);
}
/* create the directory and file, even if zero devices; we want an empty file then */
if (!fu_common_mkdir_parent (target, error))
return FALSE;
if (upgrade_count == 0) {
g_autoptr(GFile) file = g_file_new_for_path (target);
g_autoptr(GFileOutputStream) output = NULL;
output = g_file_replace (file, NULL, FALSE,
G_FILE_CREATE_NONE,
NULL, error);
return output != NULL;
}
str = g_string_new ("\n");
g_string_append_printf (str, ngettext ("%u device has a firmware upgrade available.",
"%u devices have a firmware upgrade available.",
upgrade_count),
upgrade_count);
g_string_append_printf (str,
"\n%s\n\n",
_("Run `fwupdmgr get-upgrades` for more information."));
return g_file_set_contents (target, str->str, str->len, error);
}