From 46560c91e29812f1fd8753cdb5bfdd8e7db00dee Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 20 Jul 2016 10:04:50 +0100 Subject: [PATCH 05/11] dbus-daemon: add --syslog, --nosyslog, --syslog-only Like --fork and --nofork, these override what the configuration says. Use --syslog-only to force the systemd services to log to the Journal (via syslog, which means we see the severity metadata) instead of testing sd_booted() in the configuration implementation. Signed-off-by: Simon McVittie --- bus/bus.c | 33 ++++++++++++++++----------------- bus/bus.h | 5 ++++- bus/dbus.service.in | 2 +- bus/main.c | 18 ++++++++++++++++++ bus/systemd-user/dbus.service.in | 2 +- doc/dbus-daemon.1.xml.in | 37 ++++++++++++++++++++++++++++++++++++- 6 files changed, 76 insertions(+), 21 deletions(-) diff --git a/bus/bus.c b/bus/bus.c index a134dc6..8856dab 100644 --- a/bus/bus.c +++ b/bus/bus.c @@ -47,10 +47,6 @@ #include #endif -#ifdef HAVE_SYSTEMD -#include -#endif - struct BusContext { int refcount; @@ -285,6 +281,7 @@ process_config_first_time_only (BusContext *context, DBusList **auth_mechanisms_list; int len; dbus_bool_t retval; + DBusLogFlags log_flags = DBUS_LOG_FLAGS_STDERR; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -292,26 +289,28 @@ process_config_first_time_only (BusContext *context, auth_mechanisms = NULL; pidfile = NULL; - context->syslog = bus_config_parser_get_syslog (parser); + if (flags & BUS_CONTEXT_FLAG_SYSLOG_ALWAYS) + { + context->syslog = TRUE; + log_flags |= DBUS_LOG_FLAGS_SYSTEM_LOG; - if (context->syslog) + if (flags & BUS_CONTEXT_FLAG_SYSLOG_ONLY) + log_flags &= ~DBUS_LOG_FLAGS_STDERR; + } + else if (flags & BUS_CONTEXT_FLAG_SYSLOG_NEVER) { -#ifdef HAVE_SYSTEMD - /* If running under systemd, we don't want to log to both stderr and - * syslog, because our stderr is probably connected to journald too, - * so we'd duplicate all our messages. */ - if (sd_booted () > 0) - _dbus_init_system_log ("dbus-daemon", DBUS_LOG_FLAGS_SYSTEM_LOG); - else -#endif - _dbus_init_system_log ("dbus-daemon", - DBUS_LOG_FLAGS_SYSTEM_LOG | DBUS_LOG_FLAGS_STDERR); + context->syslog = FALSE; } else { - _dbus_init_system_log ("dbus-daemon", DBUS_LOG_FLAGS_STDERR); + context->syslog = bus_config_parser_get_syslog (parser); + + if (context->syslog) + log_flags |= DBUS_LOG_FLAGS_SYSTEM_LOG; } + _dbus_init_system_log ("dbus-daemon", log_flags); + if (flags & BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION) context->systemd_activation = TRUE; else diff --git a/bus/bus.h b/bus/bus.h index 3fab59f..b7869b2 100644 --- a/bus/bus.h +++ b/bus/bus.h @@ -72,7 +72,10 @@ typedef enum BUS_CONTEXT_FLAG_FORK_ALWAYS = (1 << 1), BUS_CONTEXT_FLAG_FORK_NEVER = (1 << 2), BUS_CONTEXT_FLAG_WRITE_PID_FILE = (1 << 3), - BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION = (1 << 4) + BUS_CONTEXT_FLAG_SYSTEMD_ACTIVATION = (1 << 4), + BUS_CONTEXT_FLAG_SYSLOG_ALWAYS = (1 << 5), + BUS_CONTEXT_FLAG_SYSLOG_NEVER = (1 << 6), + BUS_CONTEXT_FLAG_SYSLOG_ONLY = (1 << 7) } BusContextFlags; BusContext* bus_context_new (const DBusString *config_file, diff --git a/bus/dbus.service.in b/bus/dbus.service.in index 3bc4726..ca0b7e9 100644 --- a/bus/dbus.service.in +++ b/bus/dbus.service.in @@ -4,6 +4,6 @@ Documentation=man:dbus-daemon(1) Requires=dbus.socket [Service] -ExecStart=@EXPANDED_BINDIR@/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation +ExecStart=@EXPANDED_BINDIR@/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only ExecReload=@EXPANDED_BINDIR@/dbus-send --print-reply --system --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig OOMScoreAdjust=-900 diff --git a/bus/main.c b/bus/main.c index 0331daf..1d36c51 100644 --- a/bus/main.c +++ b/bus/main.c @@ -146,6 +146,9 @@ usage (void) " [--introspect]" " [--address=ADDRESS]" " [--nopidfile]" + " [--nosyslog]" + " [--syslog]" + " [--syslog-only]" " [--nofork]" #ifdef DBUS_UNIX " [--fork]" @@ -441,6 +444,21 @@ main (int argc, char **argv) { introspect (); } + else if (strcmp (arg, "--nosyslog") == 0) + { + flags &= ~BUS_CONTEXT_FLAG_SYSLOG_ALWAYS; + flags |= BUS_CONTEXT_FLAG_SYSLOG_NEVER; + } + else if (strcmp (arg, "--syslog") == 0) + { + flags &= ~BUS_CONTEXT_FLAG_SYSLOG_NEVER; + flags |= BUS_CONTEXT_FLAG_SYSLOG_ALWAYS; + } + else if (strcmp (arg, "--syslog-only") == 0) + { + flags &= ~BUS_CONTEXT_FLAG_SYSLOG_NEVER; + flags |= (BUS_CONTEXT_FLAG_SYSLOG_ALWAYS|BUS_CONTEXT_FLAG_SYSLOG_ONLY); + } else if (strcmp (arg, "--nofork") == 0) { flags &= ~BUS_CONTEXT_FLAG_FORK_ALWAYS; diff --git a/bus/systemd-user/dbus.service.in b/bus/systemd-user/dbus.service.in index 4355d72..7ceffbe 100644 --- a/bus/systemd-user/dbus.service.in +++ b/bus/systemd-user/dbus.service.in @@ -4,5 +4,5 @@ Documentation=man:dbus-daemon(1) Requires=dbus.socket [Service] -ExecStart=@EXPANDED_BINDIR@/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation +ExecStart=@EXPANDED_BINDIR@/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only ExecReload=@EXPANDED_BINDIR@/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig diff --git a/doc/dbus-daemon.1.xml.in b/doc/dbus-daemon.1.xml.in index df67a90..f217037 100644 --- a/doc/dbus-daemon.1.xml.in +++ b/doc/dbus-daemon.1.xml.in @@ -29,6 +29,9 @@ --print-address =DESCRIPTOR --print-pid =DESCRIPTOR --fork + --nosyslog + --syslog + --syslog-only @@ -164,6 +167,36 @@ files. + + + + + Force the message bus to use the system log for messages, + in addition to writing to standard error, even if the configuration + file does not specify that it should. On Unix, this uses + the syslog; on Windows, this uses OutputDebugString(). + + + + + + + Force the message bus to use the system log for messages, + and not duplicate them to standard error. + On Unix, this uses the syslog; on Windows, this uses + OutputDebugString(). + + + + + + + Force the message bus to use only standard error for messages, + even if the configuration file specifies that it should use + the system log. + + + @@ -325,7 +358,9 @@ This may be useful to avoid affecting the behavior of child processes. -If present, the bus daemon will log to syslog. +If present, the bus daemon will log to syslog. The + --syslog, --syslog-only and --nosyslog command-line options take precedence + over this setting. -- 2.8.1