diff options
author | Franck Bui <fbui@suse.com> | 2022-09-13 16:13:16 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-10-13 07:47:42 +0900 |
commit | d1d8786c5b4493cc0f9836b1976f2cd41bfb461c (patch) | |
tree | df19253c23a7db5a219e03d6abf5cc0501632fbb /src/analyze | |
parent | 17f6406bf2f3e3bdaf51fd567871876da237ce20 (diff) | |
download | systemd-d1d8786c5b4493cc0f9836b1976f2cd41bfb461c.tar.gz |
analyze: extend the dump command to accept patterns
The new function DumpPatterns() can be used to limit (drastically) the size of
the data returned by PID1. Hence the optimization of serializing data into a
file descriptor should be less relevant than having the possibility to limit
the data when communicating with the service manager remotely.
NB: when passing patterns, the dump command omits the version of the manager as
well as the features and the timestamps.
Diffstat (limited to 'src/analyze')
-rw-r--r-- | src/analyze/analyze-dump.c | 43 | ||||
-rw-r--r-- | src/analyze/analyze.c | 4 |
2 files changed, 45 insertions, 2 deletions
diff --git a/src/analyze/analyze-dump.c b/src/analyze/analyze-dump.c index 448ce09bd7..220218e2fe 100644 --- a/src/analyze/analyze-dump.c +++ b/src/analyze/analyze-dump.c @@ -29,6 +29,46 @@ static int dump_fallback(sd_bus *bus) { return 0; } +static int dump_patterns(sd_bus *bus, char **patterns) { + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL, *m = NULL; + _cleanup_strv_free_ char **mangled = NULL; + const char *text; + int r; + + r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, "DumpPatterns"); + if (r < 0) + return bus_log_create_error(r); + + STRV_FOREACH(pattern, patterns) { + char *t; + + r = unit_name_mangle_with_suffix(*pattern, NULL, UNIT_NAME_MANGLE_GLOB, ".service", &t); + if (r < 0) + return log_error_errno(r, "Failed to mangle name: %m"); + + r = strv_consume(&mangled, t); + if (r < 0) + return log_oom(); + } + + r = sd_bus_message_append_strv(m, mangled); + if (r < 0) + return bus_log_create_error(r); + + r = sd_bus_call(bus, m, 0, &error, &reply); + if (r < 0) + return log_error_errno(r, "Failed to issue method call DumpPatterns: %s", + bus_error_message(&error, r)); + + r = sd_bus_message_read(reply, "s", &text); + if (r < 0) + return bus_log_parse_error(r); + + fputs(text, stdout); + return r; +} + int verb_dump(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; @@ -42,6 +82,9 @@ int verb_dump(int argc, char *argv[], void *userdata) { pager_open(arg_pager_flags); + if (argc > 1) + return dump_patterns(bus, strv_skip(argv, 1)); + if (!sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD)) return dump_fallback(bus); diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 6215f50fac..4a276f66ba 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -190,7 +190,7 @@ static int help(int argc, char *argv[], void *userdata) { " plot Output SVG graphic showing service\n" " initialization\n" " dot [UNIT...] Output dependency graph in %s format\n" - " dump Output state serialization of service\n" + " dump [PATTERN...] Output state serialization of service\n" " manager\n" " cat-config Show configuration file and drop-ins\n" " unit-files List files and symlinks for units\n" @@ -557,7 +557,7 @@ static int run(int argc, char *argv[]) { { "get-log-target", VERB_ANY, 1, 0, verb_log_control }, { "service-watchdogs", VERB_ANY, 2, 0, verb_service_watchdogs }, /* ↑ … until here ↑ */ - { "dump", VERB_ANY, 1, 0, verb_dump }, + { "dump", VERB_ANY, VERB_ANY, 0, verb_dump }, { "cat-config", 2, VERB_ANY, 0, verb_cat_config }, { "unit-files", VERB_ANY, VERB_ANY, 0, verb_unit_files }, { "unit-paths", 1, 1, 0, verb_unit_paths }, |