From 45bcab66a9c23a74107118d310e09a46f28494fd Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 13 Mar 2024 19:28:24 +0800 Subject: [PATCH] journal/cat: allow connecting output to specific journal namespace --- man/systemd-cat.xml | 14 ++++++++++++-- src/journal/cat.c | 17 ++++++++++++++--- test/units/testsuite-04.cat.sh | 15 +++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100755 test/units/testsuite-04.cat.sh diff --git a/man/systemd-cat.xml b/man/systemd-cat.xml index 040da7c5c23..280492dea59 100644 --- a/man/systemd-cat.xml +++ b/man/systemd-cat.xml @@ -123,6 +123,17 @@ boolean argument. + + + + Specifies the journal namespace to which the standard IO should be connected. + For details about journal namespaces, see + systemd-journald.service8. + + + + + @@ -130,8 +141,7 @@ Exit status - On success, 0 is returned, a non-zero failure code - otherwise. + On success, 0 is returned, a non-zero failure code otherwise. diff --git a/src/journal/cat.c b/src/journal/cat.c index 0325add12f4..1634f30b44e 100644 --- a/src/journal/cat.c +++ b/src/journal/cat.c @@ -24,6 +24,7 @@ #include "terminal-util.h" static const char *arg_identifier = NULL; +static const char *arg_namespace = NULL; static int arg_priority = LOG_INFO; static int arg_stderr_priority = -1; static bool arg_level_prefix = true; @@ -44,6 +45,7 @@ static int help(void) { " -p --priority=PRIORITY Set priority value (0..7)\n" " --stderr-priority=PRIORITY Set priority value (0..7) used for stderr\n" " --level-prefix=BOOL Control whether level prefix shall be parsed\n" + " --namespace=NAMESPACE Connect to specified journal namespace\n" "\nSee the %s for details.\n", program_invocation_short_name, ansi_highlight(), @@ -58,7 +60,8 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_VERSION = 0x100, ARG_STDERR_PRIORITY, - ARG_LEVEL_PREFIX + ARG_LEVEL_PREFIX, + ARG_NAMESPACE, }; static const struct option options[] = { @@ -68,6 +71,7 @@ static int parse_argv(int argc, char *argv[]) { { "priority", required_argument, NULL, 'p' }, { "stderr-priority", required_argument, NULL, ARG_STDERR_PRIORITY }, { "level-prefix", required_argument, NULL, ARG_LEVEL_PREFIX }, + { "namespace", required_argument, NULL, ARG_NAMESPACE }, {} }; @@ -117,6 +121,13 @@ static int parse_argv(int argc, char *argv[]) { return r; break; + case ARG_NAMESPACE: + if (isempty(optarg)) + arg_namespace = NULL; + else + arg_namespace = optarg; + break; + case '?': return -EINVAL; @@ -137,12 +148,12 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - outfd = sd_journal_stream_fd(arg_identifier, arg_priority, arg_level_prefix); + outfd = sd_journal_stream_fd_with_namespace(arg_namespace, arg_identifier, arg_priority, arg_level_prefix); if (outfd < 0) return log_error_errno(outfd, "Failed to create stream fd: %m"); if (arg_stderr_priority >= 0 && arg_stderr_priority != arg_priority) { - errfd = sd_journal_stream_fd(arg_identifier, arg_stderr_priority, arg_level_prefix); + errfd = sd_journal_stream_fd_with_namespace(arg_namespace, arg_identifier, arg_stderr_priority, arg_level_prefix); if (errfd < 0) return log_error_errno(errfd, "Failed to create stream fd: %m"); } diff --git a/test/units/testsuite-04.cat.sh b/test/units/testsuite-04.cat.sh new file mode 100755 index 00000000000..bef3e189a63 --- /dev/null +++ b/test/units/testsuite-04.cat.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eux +set -o pipefail + +systemctl enable --now systemd-journald@cat-test.socket + +systemd-cat --namespace cat-test env CAT_TEST_RESULT=1 + +timeout 30 bash -c "until systemctl -q is-active systemd-journald@cat-test.service; do sleep .5; done" + +journalctl --namespace cat-test --grep "JOURNAL_STREAM=" +journalctl --namespace cat-test --grep "CAT_TEST_RESULT=1" + +systemctl disable --now systemd-journald@cat-test.socket