]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bootctl: honor $KERNEL_INSTALL_CONF_ROOT
authorLudwig Nussel <ludwig.nussel@suse.de>
Tue, 27 Dec 2022 14:28:27 +0000 (15:28 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 10 Jan 2023 14:17:07 +0000 (15:17 +0100)
Honor $KERNEL_INSTALL_CONF_ROOT for reading config files, as
kernel-install does.

docs/ENVIRONMENT.md
src/basic/path-util.h
src/boot/bootctl-install.c
src/boot/bootctl-util.c
src/boot/bootctl-util.h

index fb353004190fe6f004146bb47ee00a5f38a97a87..2b751d9d533d0cdbc44db60704e45ecfd18ec266 100644 (file)
@@ -256,6 +256,9 @@ All tools:
   `--path=` switch only very superficial validation of the specified path is
   done when this environment variable is used.
 
+* `$KERNEL_INSTALL_CONF_ROOT=…` — override the built in default configuration
+  directory /etc/kernel/ to read files like entry-token and install.conf from.
+
 `systemd` itself:
 
 * `$SYSTEMD_ACTIVATION_UNIT` — set for all NSS and PAM module invocations that
index 22d3632e6ef2c4f24959bd6ab0bd1e23f6e5a87c..e40899284c772cf5ab0c7bdb4ed10a971fcaad00 100644 (file)
@@ -130,6 +130,7 @@ int fsck_exists_for_fstype(const char *fstype);
 
 /* Similar to path_join(), but only works for two components, and only the first one may be NULL and returns
  * an alloca() buffer, or possibly a const pointer into the path parameter. */
+/* DEPRECATED: use path_join() instead */
 #define prefix_roota(root, path)                                        \
         ({                                                              \
                 const char* _path = (path), *_root = (root), *_ret;     \
index 31c2050a4af59e0d46440a923dd800b632fff80a..1dee592d77f1b67832eb94e9c1c1980732eb8287 100644 (file)
@@ -77,15 +77,18 @@ static int load_etc_machine_info(void) {
 }
 
 static int load_etc_kernel_install_conf(void) {
-        _cleanup_free_ char *layout = NULL;
+        _cleanup_free_ char *layout = NULL, *p = NULL;
         int r;
 
-        r = parse_env_file(NULL, "/etc/kernel/install.conf",
-                           "layout", &layout);
+        p = path_join(etc_kernel(), "install.conf");
+        if (!p)
+                return log_oom();
+
+        r = parse_env_file(NULL, p, "layout", &layout);
         if (r == -ENOENT)
                 return 0;
         if (r < 0)
-                return log_error_errno(r, "Failed to parse /etc/kernel/install.conf: %m");
+                return log_error_errno(r, "Failed to parse %s: %m", p);
 
         if (!isempty(layout)) {
                 log_debug("layout=%s is specified in /etc/machine-info.", layout);
@@ -488,6 +491,7 @@ static int install_entry_directory(const char *root) {
 }
 
 static int install_entry_token(void) {
+        _cleanup_free_ char* p = NULL;
         int r;
 
         assert(arg_make_entry_directory >= 0);
@@ -499,9 +503,13 @@ static int install_entry_token(void) {
         if (!arg_make_entry_directory && arg_entry_token_type == ARG_ENTRY_TOKEN_MACHINE_ID)
                 return 0;
 
-        r = write_string_file("/etc/kernel/entry-token", arg_entry_token, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_MKDIR_0755);
+        p = path_join(etc_kernel(), "entry-token");
+        if (!p)
+                return log_oom();
+
+        r = write_string_file(p, arg_entry_token, WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_MKDIR_0755);
         if (r < 0)
-                return log_error_errno(r, "Failed to write entry token '%s' to /etc/kernel/entry-token", arg_entry_token);
+                return log_error_errno(r, "Failed to write entry token '%s' to %s", arg_entry_token, p);
 
         return 0;
 }
index b11742a7aef9c36a5541e88ca66d5973f6bd5e2a..859742a1261003e8934402fd19e51fd2bf51ab98 100644 (file)
@@ -6,6 +6,7 @@
 #include "bootctl-util.h"
 #include "fileio.h"
 #include "os-util.h"
+#include "path-util.h"
 #include "stat-util.h"
 #include "sync-util.h"
 #include "utf8.h"
@@ -118,10 +119,13 @@ int settle_entry_token(void) {
         switch (arg_entry_token_type) {
 
         case ARG_ENTRY_TOKEN_AUTO: {
-                _cleanup_free_ char *buf = NULL;
-                r = read_one_line_file("/etc/kernel/entry-token", &buf);
+                _cleanup_free_ char *buf = NULL, *p = NULL;
+                p = path_join(etc_kernel(), "entry-token");
+                if (!p)
+                        return log_oom();
+                r = read_one_line_file(p, &buf);
                 if (r < 0 && r != -ENOENT)
-                        return log_error_errno(r, "Failed to read /etc/kernel/entry-token: %m");
+                        return log_error_errno(r, "Failed to read %s: %m", p);
 
                 if (!isempty(buf)) {
                         free_and_replace(arg_entry_token, buf);
index 6f2c1630de2f9e7619b27ce40ffcd83f46652dc7..147455e2411acbc1c7198186a6c3cee3c8325d87 100644 (file)
@@ -8,3 +8,7 @@ const char *get_efi_arch(void);
 int get_file_version(int fd, char **ret);
 
 int settle_entry_token(void);
+
+static inline const char* etc_kernel(void) {
+        return getenv("KERNEL_INSTALL_CONF_ROOT") ?: "/etc/kernel/";
+}