hostname-setup: read hostname from system.hostname credential

`system.hostname` credential is treated similarly to the pre-existing
`system.machine_id` credential. It is considered after /etc/hostname,
but prior to the kernel defaults or os-release defaults.

Fixes #30667.

Signed-off-by: Ivan Shapovalov <intelfx@intelfx.name>
This commit is contained in:
Ivan Shapovalov
2024-01-23 22:03:06 +00:00
committed by Luca Boccassi
parent f70daee8f2
commit a97476c8ac
2 changed files with 41 additions and 0 deletions
+29
View File
@@ -7,6 +7,7 @@
#include <unistd.h>
#include "alloc-util.h"
#include "creds-util.h"
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
@@ -71,6 +72,26 @@ int shorten_overlong(const char *s, char **ret) {
return 1;
}
static int acquire_hostname_from_credential(char **ret) {
_cleanup_free_ char *cred = NULL;
int r;
assert(ret);
r = read_credential_with_decryption("system.hostname", (void **) &cred, /* ret_size= */ NULL);
if (r < 0)
return log_warning_errno(r, "Failed to read system.hostname credential, ignoring: %m");
if (r == 0) /* not found */
return -ENXIO;
if (!hostname_is_valid(cred, VALID_HOSTNAME_TRAILING_DOT)) /* check that the hostname we return is valid */
return log_warning_errno(SYNTHETIC_ERRNO(EBADMSG), "Hostname specified in system.hostname credential is invalid, ignoring: %s", cred);
log_info("Initializing hostname from credential.");
*ret = TAKE_PTR(cred);
return 0;
}
int read_etc_hostname_stream(FILE *f, char **ret) {
int r;
@@ -164,6 +185,14 @@ int hostname_setup(bool really) {
}
}
if (!hn) {
r = acquire_hostname_from_credential(&b);
if (r >= 0) {
hn = b;
source = HOSTNAME_TRANSIENT;
}
}
if (!hn) {
_cleanup_free_ char *buf = NULL;