Compare commits

..

4 Commits

Author SHA1 Message Date
Lennart Poettering 1cb342447d
Merge pull request #14329 from anitazha/user_invocation_id
export user units' InvocationID and use as _SYSTEMD_INVOCATION_ID
2019-12-20 10:20:21 +01:00
Yu Watanabe 7c6d95ea5a network: fix typo 2019-12-20 18:00:49 +09:00
Anita Zhang 2f8c48b605 core,journal: export user units' InvocationID and use as _SYSTEMD_INVOCATION_ID
Write a user unit's invocation ID to /run/user/<uid>/systemd/units/ similar
to how a system unit's invocation ID is written to /run/systemd/units/.

This lets the journal read and add a user unit's invocation ID to the
_SYSTEMD_INVOCATION_ID field of logs instead of the user manager's
invocation ID.

Fixes #12474
2019-12-19 17:42:17 -08:00
Anita Zhang ef88639028 man: document INVOCATION_ID and USER_INVOCATION_ID journal fields 2019-12-11 20:50:10 -08:00
5 changed files with 77 additions and 19 deletions

View File

@ -91,6 +91,16 @@
</listitem>
</varlistentry>
<varlistentry>
<term><varname>INVOCATION_ID=</varname></term>
<term><varname>USER_INVOCATION_ID=</varname></term>
<listitem>
<para>A randomized, unique 128-bit ID identifying each runtime cycle of the unit. This is different from
<varname>_SYSTEMD_INVOCATION_ID</varname> in that it is only used for messages coming from systemd code
(e.g. logs from the system/user manager or from forked processes performing systemd-related setup).</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>SYSLOG_FACILITY=</varname></term>
<term><varname>SYSLOG_IDENTIFIER=</varname></term>

View File

@ -881,8 +881,17 @@ int manager_new(UnitFileScope scope, ManagerTestRunFlags test_run_flags, Manager
return r;
}
if (MANAGER_IS_SYSTEM(m) && test_run_flags == 0) {
if (test_run_flags == 0) {
if (MANAGER_IS_SYSTEM(m))
r = mkdir_label("/run/systemd/units", 0755);
else {
_cleanup_free_ char *units_path = NULL;
r = xdg_user_runtime_dir(&units_path, "/systemd/units");
if (r < 0)
return r;
r = mkdir_p_label(units_path, 0755);
}
if (r < 0 && r != -EEXIST)
return r;
}

View File

@ -5373,8 +5373,32 @@ void unit_remove_dependencies(Unit *u, UnitDependencyMask mask) {
}
}
static int unit_get_invocation_path(Unit *u, char **ret) {
char *p;
int r;
assert(u);
assert(ret);
if (MANAGER_IS_SYSTEM(u->manager))
p = strjoin("/run/systemd/units/invocation:", u->id);
else {
_cleanup_free_ char *user_path = NULL;
r = xdg_user_runtime_dir(&user_path, "/systemd/units/invocation:");
if (r < 0)
return r;
p = strjoin(user_path, u->id);
}
if (!p)
return -ENOMEM;
*ret = p;
return 0;
}
static int unit_export_invocation_id(Unit *u) {
const char *p;
_cleanup_free_ char *p = NULL;
int r;
assert(u);
@ -5385,7 +5409,10 @@ static int unit_export_invocation_id(Unit *u) {
if (sd_id128_is_null(u->invocation_id))
return 0;
p = strjoina("/run/systemd/units/invocation:", u->id);
r = unit_get_invocation_path(u, &p);
if (r < 0)
return log_unit_debug_errno(u, r, "Failed to get invocation path: %m");
r = symlink_atomic(u->invocation_id_string, p);
if (r < 0)
return log_unit_debug_errno(u, r, "Failed to create invocation ID symlink %s: %m", p);
@ -5538,9 +5565,6 @@ void unit_export_state_files(Unit *u) {
if (!u->id)
return;
if (!MANAGER_IS_SYSTEM(u->manager))
return;
if (MANAGER_IS_TEST_RUN(u->manager))
return;
@ -5559,6 +5583,9 @@ void unit_export_state_files(Unit *u) {
(void) unit_export_invocation_id(u);
if (!MANAGER_IS_SYSTEM(u->manager))
return;
c = unit_get_exec_context(u);
if (c) {
(void) unit_export_log_level_max(u, c);
@ -5576,17 +5603,19 @@ void unit_unlink_state_files(Unit *u) {
if (!u->id)
return;
if (!MANAGER_IS_SYSTEM(u->manager))
return;
/* Undoes the effect of unit_export_state() */
if (u->exported_invocation_id) {
p = strjoina("/run/systemd/units/invocation:", u->id);
(void) unlink(p);
_cleanup_free_ char *invocation_path = NULL;
int r = unit_get_invocation_path(u, &invocation_path);
if (r >= 0) {
(void) unlink(invocation_path);
u->exported_invocation_id = false;
}
}
if (!MANAGER_IS_SYSTEM(u->manager))
return;
if (u->exported_log_level_max) {
p = strjoina("/run/systemd/units/log-level-max:", u->id);

View File

@ -325,19 +325,29 @@ static int client_context_read_invocation_id(
Server *s,
ClientContext *c) {
_cleanup_free_ char *value = NULL;
const char *p;
_cleanup_free_ char *p = NULL, *value = NULL;
int r;
assert(s);
assert(c);
/* Read the invocation ID of a unit off a unit. PID 1 stores it in a per-unit symlink in /run/systemd/units/ */
/* Read the invocation ID of a unit off a unit.
* PID 1 stores it in a per-unit symlink in /run/systemd/units/
* User managers store it in a per-unit symlink under /run/user/<uid>/systemd/units/ */
if (!c->unit)
return 0;
p = strjoina("/run/systemd/units/invocation:", c->unit);
if (c->user_unit) {
r = asprintf(&p, "/run/user/" UID_FMT "/systemd/units/invocation:%s", c->owner_uid, c->user_unit);
if (r < 0)
return r;
} else {
p = strjoin("/run/systemd/units/invocation:", c->unit);
if (!p)
return -ENOMEM;
}
r = readlink_malloc(p, &value);
if (r < 0)
return r;

View File

@ -629,7 +629,7 @@ int manager_rtnl_process_neighbor(sd_netlink *rtnl, sd_netlink_message *message,
r = sd_rtnl_message_neigh_get_family(message, &family);
if (r < 0) {
log_link_warning(link, "rtnl: received neighbor message withot family, ignoring.");
log_link_warning(link, "rtnl: received neighbor message without family, ignoring.");
return 0;
} else if (!IN_SET(family, AF_INET, AF_INET6)) {
log_link_debug(link, "rtnl: received neighbor message with invalid family '%i', ignoring.", family);