mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 16:37:19 +09:00
Merge pull request #19792 from keszybz/more-logging-stuff
More logging tweaks
This commit is contained in:
4
TODO
4
TODO
@@ -9,6 +9,10 @@ Bugfixes:
|
||||
|
||||
* Get rid of nftw(). We should refuse to use such useless APIs on principle.
|
||||
|
||||
* Jun 01 09:43:02 krowka systemd[1]: Unit user@1000.service has alias user@.service.
|
||||
Jun 01 09:43:02 krowka systemd[1]: Unit user@6.service has alias user@.service.
|
||||
Jun 01 09:43:02 krowka systemd[1]: Unit user-runtime-dir@6.service has alias user-runtime-dir@.service.
|
||||
|
||||
External:
|
||||
|
||||
* Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
|
||||
|
||||
@@ -713,7 +713,7 @@ int find_executable_full(const char *name, bool use_path_envvar, char **ret_file
|
||||
}
|
||||
|
||||
bool paths_check_timestamp(const char* const* paths, usec_t *timestamp, bool update) {
|
||||
bool changed = false;
|
||||
bool changed = false, originally_unset;
|
||||
const char* const* i;
|
||||
|
||||
assert(timestamp);
|
||||
@@ -721,6 +721,8 @@ bool paths_check_timestamp(const char* const* paths, usec_t *timestamp, bool upd
|
||||
if (!paths)
|
||||
return false;
|
||||
|
||||
originally_unset = *timestamp == 0;
|
||||
|
||||
STRV_FOREACH(i, paths) {
|
||||
struct stat stats;
|
||||
usec_t u;
|
||||
@@ -730,11 +732,11 @@ bool paths_check_timestamp(const char* const* paths, usec_t *timestamp, bool upd
|
||||
|
||||
u = timespec_load(&stats.st_mtim);
|
||||
|
||||
/* first check */
|
||||
/* check first */
|
||||
if (*timestamp >= u)
|
||||
continue;
|
||||
|
||||
log_debug("timestamp of '%s' changed", *i);
|
||||
log_debug(originally_unset ? "Loaded timestamp for '%s'." : "Timestamp of '%s' changed.", *i);
|
||||
|
||||
/* update timestamp */
|
||||
if (update) {
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "fs-util.h"
|
||||
#include "install.h"
|
||||
#include "log.h"
|
||||
#include "manager-dump.h"
|
||||
#include "os-util.h"
|
||||
#include "parse-util.h"
|
||||
#include "path-util.h"
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
#include "log.h"
|
||||
#include "macro.h"
|
||||
#include "manager.h"
|
||||
#include "manager-dump.h"
|
||||
#include "memory-util.h"
|
||||
#include "missing_fs.h"
|
||||
#include "mkdir.h"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "fuzz.h"
|
||||
#include "install.h"
|
||||
#include "load-fragment.h"
|
||||
#include "manager-dump.h"
|
||||
#include "string-util.h"
|
||||
#include "unit-serialize.h"
|
||||
#include "utf8.h"
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#include "loopback-setup.h"
|
||||
#include "machine-id-setup.h"
|
||||
#include "manager.h"
|
||||
#include "manager-dump.h"
|
||||
#include "mkdir.h"
|
||||
#include "mount-setup.h"
|
||||
#include "os-util.h"
|
||||
@@ -2500,16 +2501,6 @@ static int initialize_security(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void test_summary(Manager *m) {
|
||||
assert(m);
|
||||
|
||||
printf("-> By units:\n");
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("-> By jobs:\n");
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
}
|
||||
|
||||
static int collect_fds(FDSet **ret_fds, const char **ret_error_message) {
|
||||
int r;
|
||||
|
||||
@@ -2882,7 +2873,7 @@ int main(int argc, char *argv[]) {
|
||||
format_timespan(timespan, sizeof(timespan), after_startup - before_startup, 100 * USEC_PER_MSEC));
|
||||
|
||||
if (arg_action == ACTION_TEST) {
|
||||
test_summary(m);
|
||||
manager_test_summary(m);
|
||||
retval = EXIT_SUCCESS;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
89
src/core/manager-dump.c
Normal file
89
src/core/manager-dump.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "build.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "hashmap.h"
|
||||
#include "manager-dump.h"
|
||||
#include "unit-serialize.h"
|
||||
|
||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
|
||||
Job *j;
|
||||
|
||||
assert(s);
|
||||
assert(f);
|
||||
|
||||
HASHMAP_FOREACH(j, s->jobs)
|
||||
job_dump(j, f, prefix);
|
||||
}
|
||||
|
||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
|
||||
Unit *u;
|
||||
const char *t;
|
||||
|
||||
assert(s);
|
||||
assert(f);
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, t, s->units)
|
||||
if (u->id == t)
|
||||
unit_dump(u, f, prefix);
|
||||
}
|
||||
|
||||
void manager_dump(Manager *m, FILE *f, const char *prefix) {
|
||||
assert(m);
|
||||
assert(f);
|
||||
|
||||
fprintf(f, "%sManager: systemd " STRINGIFY(PROJECT_VERSION) " (" GIT_VERSION ")\n", strempty(prefix));
|
||||
fprintf(f, "%sFeatures: %s\n", strempty(prefix), systemd_features);
|
||||
|
||||
for (ManagerTimestamp q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
|
||||
const dual_timestamp *t = m->timestamps + q;
|
||||
char buf[CONST_MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)];
|
||||
|
||||
if (dual_timestamp_is_set(t))
|
||||
fprintf(f, "%sTimestamp %s: %s\n",
|
||||
strempty(prefix),
|
||||
manager_timestamp_to_string(q),
|
||||
timestamp_is_set(t->realtime) ? format_timestamp(buf, sizeof buf, t->realtime) :
|
||||
format_timespan(buf, sizeof buf, t->monotonic, 1));
|
||||
}
|
||||
|
||||
manager_dump_units(m, f, prefix);
|
||||
manager_dump_jobs(m, f, prefix);
|
||||
}
|
||||
|
||||
int manager_get_dump_string(Manager *m, char **ret) {
|
||||
_cleanup_free_ char *dump = NULL;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
size_t size;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(ret);
|
||||
|
||||
f = open_memstream_unlocked(&dump, &size);
|
||||
if (!f)
|
||||
return -errno;
|
||||
|
||||
manager_dump(m, f, NULL);
|
||||
|
||||
r = fflush_and_check(f);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
f = safe_fclose(f);
|
||||
|
||||
*ret = TAKE_PTR(dump);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void manager_test_summary(Manager *m) {
|
||||
assert(m);
|
||||
|
||||
printf("-> By units:\n");
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
|
||||
printf("-> By jobs:\n");
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
}
|
||||
12
src/core/manager-dump.h
Normal file
12
src/core/manager-dump.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "manager.h"
|
||||
|
||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
|
||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
|
||||
void manager_dump(Manager *s, FILE *f, const char *prefix);
|
||||
int manager_get_dump_string(Manager *m, char **ret);
|
||||
void manager_test_summary(Manager *m);
|
||||
@@ -55,6 +55,7 @@
|
||||
#include "log.h"
|
||||
#include "macro.h"
|
||||
#include "manager.h"
|
||||
#include "manager-dump.h"
|
||||
#include "memory-util.h"
|
||||
#include "mkdir.h"
|
||||
#include "parse-util.h"
|
||||
@@ -2154,74 +2155,6 @@ int manager_load_startable_unit_or_warn(
|
||||
return 0;
|
||||
}
|
||||
|
||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix) {
|
||||
Job *j;
|
||||
|
||||
assert(s);
|
||||
assert(f);
|
||||
|
||||
HASHMAP_FOREACH(j, s->jobs)
|
||||
job_dump(j, f, prefix);
|
||||
}
|
||||
|
||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix) {
|
||||
Unit *u;
|
||||
const char *t;
|
||||
|
||||
assert(s);
|
||||
assert(f);
|
||||
|
||||
HASHMAP_FOREACH_KEY(u, t, s->units)
|
||||
if (u->id == t)
|
||||
unit_dump(u, f, prefix);
|
||||
}
|
||||
|
||||
void manager_dump(Manager *m, FILE *f, const char *prefix) {
|
||||
assert(m);
|
||||
assert(f);
|
||||
|
||||
for (ManagerTimestamp q = 0; q < _MANAGER_TIMESTAMP_MAX; q++) {
|
||||
const dual_timestamp *t = m->timestamps + q;
|
||||
char buf[CONST_MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)];
|
||||
|
||||
if (dual_timestamp_is_set(t))
|
||||
fprintf(f, "%sTimestamp %s: %s\n",
|
||||
strempty(prefix),
|
||||
manager_timestamp_to_string(q),
|
||||
timestamp_is_set(t->realtime) ? format_timestamp(buf, sizeof buf, t->realtime) :
|
||||
format_timespan(buf, sizeof buf, t->monotonic, 1));
|
||||
}
|
||||
|
||||
manager_dump_units(m, f, prefix);
|
||||
manager_dump_jobs(m, f, prefix);
|
||||
}
|
||||
|
||||
int manager_get_dump_string(Manager *m, char **ret) {
|
||||
_cleanup_free_ char *dump = NULL;
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
size_t size;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(ret);
|
||||
|
||||
f = open_memstream_unlocked(&dump, &size);
|
||||
if (!f)
|
||||
return -errno;
|
||||
|
||||
manager_dump(m, f, NULL);
|
||||
|
||||
r = fflush_and_check(f);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
f = safe_fclose(f);
|
||||
|
||||
*ret = TAKE_PTR(dump);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void manager_clear_jobs(Manager *m) {
|
||||
Job *j;
|
||||
|
||||
|
||||
@@ -485,11 +485,6 @@ int manager_add_job_by_name(Manager *m, JobType type, const char *name, JobMode
|
||||
int manager_add_job_by_name_and_warn(Manager *m, JobType type, const char *name, JobMode mode, Set *affected_jobs, Job **ret);
|
||||
int manager_propagate_reload(Manager *m, Unit *unit, JobMode mode, sd_bus_error *e);
|
||||
|
||||
void manager_dump_units(Manager *s, FILE *f, const char *prefix);
|
||||
void manager_dump_jobs(Manager *s, FILE *f, const char *prefix);
|
||||
void manager_dump(Manager *s, FILE *f, const char *prefix);
|
||||
int manager_get_dump_string(Manager *m, char **ret);
|
||||
|
||||
void manager_clear_jobs(Manager *m);
|
||||
|
||||
void manager_unwatch_pid(Manager *m, pid_t pid);
|
||||
|
||||
@@ -85,6 +85,8 @@ libcore_sources = '''
|
||||
locale-setup.h
|
||||
manager.c
|
||||
manager.h
|
||||
manager-dump.c
|
||||
manager-dump.h
|
||||
mount.c
|
||||
mount.h
|
||||
namespace.c
|
||||
|
||||
@@ -221,11 +221,11 @@ DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(varlink_state, VarlinkState);
|
||||
log_debug("%s: " fmt, varlink_server_description(s), ##__VA_ARGS__)
|
||||
|
||||
static inline const char *varlink_description(Varlink *v) {
|
||||
return strna(v ? v->description : NULL);
|
||||
return (v ? v->description : NULL) ?: "varlink";
|
||||
}
|
||||
|
||||
static inline const char *varlink_server_description(VarlinkServer *s) {
|
||||
return strna(s ? s->description : NULL);
|
||||
return (s ? s->description : NULL) ?: "varlink";
|
||||
}
|
||||
|
||||
static void varlink_set_state(Varlink *v, VarlinkState state) {
|
||||
@@ -233,10 +233,10 @@ static void varlink_set_state(Varlink *v, VarlinkState state) {
|
||||
assert(state >= 0 && state < _VARLINK_STATE_MAX);
|
||||
|
||||
if (v->state < 0)
|
||||
varlink_log(v, "varlink: setting state %s",
|
||||
varlink_log(v, "Setting state %s",
|
||||
varlink_state_to_string(state));
|
||||
else
|
||||
varlink_log(v, "varlink: changing state %s → %s",
|
||||
varlink_log(v, "Changing state %s → %s",
|
||||
varlink_state_to_string(v->state),
|
||||
varlink_state_to_string(state));
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "bus-util.h"
|
||||
#include "manager.h"
|
||||
#include "manager-dump.h"
|
||||
#include "rm-rf.h"
|
||||
#include "service.h"
|
||||
#include "special.h"
|
||||
|
||||
Reference in New Issue
Block a user