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-07 03:01:28 +01:00 committed by Luca Boccassi
parent f70daee8f2
commit a97476c8ac
2 changed files with 41 additions and 0 deletions

View file

@ -320,6 +320,18 @@
</listitem>
</varlistentry>
<varlistentry>
<term><varname>system.hostname</varname></term>
<listitem>
<para>Accepts a (transient) hostname to configure during early boot. The static hostname specified
in <filename>/etc/hostname</filename>, if configured, takes precedence over this setting.
Interpreted by the service manager (PID 1). For details see
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para>
<xi:include href="version-info.xml" xpointer="v254"/>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>home.create.*</varname></term>
<listitem>

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;