mirror of
https://github.com/systemd/systemd
synced 2024-10-06 08:11:43 +00:00
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:
parent
f70daee8f2
commit
a97476c8ac
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue