dispatcher: support enabling debug logging via environment variable
The advantage of environment variables is that the user can use `systemctl edit NetworkManager-dispatcher.service` for setting them, without need to change the ExecStart= line. Also, enabling debugging from the start is useful, despite that debug logging can be enabled per-request. Also, there is a difference whether we want verbose logging or whether we want to log to stdout. There should be a flag, that only increases the logging verbosity, but does not change the logging backend.
This commit is contained in:
@@ -7,6 +7,12 @@ BusName=org.freedesktop.nm_dispatcher
|
|||||||
ExecStart=@libexecdir@/nm-dispatcher
|
ExecStart=@libexecdir@/nm-dispatcher
|
||||||
NotifyAccess=main
|
NotifyAccess=main
|
||||||
|
|
||||||
|
# Enable debug logging in dispatcher service. Note that dispatcher
|
||||||
|
# also honors debug logging requests from NetworkManager, so you
|
||||||
|
# can also control logging requests with
|
||||||
|
# `nmcli general logging domain DISPATCHER level TRACE`.
|
||||||
|
#Environment=NM_DISPATCHER_DEBUG_LOG=1
|
||||||
|
|
||||||
# We want to allow scripts to spawn long-running daemons, so tell
|
# We want to allow scripts to spawn long-running daemons, so tell
|
||||||
# systemd to not clean up when nm-dispatcher exits
|
# systemd to not clean up when nm-dispatcher exits
|
||||||
KillMode=process
|
KillMode=process
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
contrib/fedora/rpm/
|
contrib/fedora/rpm/
|
||||||
|
data/NetworkManager-dispatcher.service.in
|
||||||
data/NetworkManager-wait-online.service.in
|
data/NetworkManager-wait-online.service.in
|
||||||
data/NetworkManager.service.in
|
data/NetworkManager.service.in
|
||||||
data/nm-sudo.service.in
|
data/nm-sudo.service.in
|
||||||
|
@@ -24,12 +24,19 @@
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* Serves only the purpose to mark environment variables that are honored by
|
||||||
|
* the application. You can search for this macro, and find what options are supported. */
|
||||||
|
#define _ENV(var) ("" var "")
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
typedef struct Request Request;
|
typedef struct Request Request;
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
GDBusConnection *dbus_connection;
|
GDBusConnection *dbus_connection;
|
||||||
GCancellable * quit_cancellable;
|
GCancellable * quit_cancellable;
|
||||||
gboolean debug;
|
bool log_verbose;
|
||||||
|
bool log_stdout;
|
||||||
gboolean persist;
|
gboolean persist;
|
||||||
GSource * quit_source;
|
GSource * quit_source;
|
||||||
guint request_id_counter;
|
guint request_id_counter;
|
||||||
@@ -145,7 +152,7 @@ struct Request {
|
|||||||
} \
|
} \
|
||||||
G_STMT_END
|
G_STMT_END
|
||||||
|
|
||||||
#define _LOG_X_D_enabled() (gl.debug)
|
#define _LOG_X_D_enabled() (gl.log_verbose)
|
||||||
#define _LOG_X_T_enabled() _LOG_X_D_enabled()
|
#define _LOG_X_T_enabled() _LOG_X_D_enabled()
|
||||||
|
|
||||||
#define _LOG_R_D_enabled(request) (_NM_ENSURE_TYPE_CONST(Request *, request)->debug)
|
#define _LOG_R_D_enabled(request) (_NM_ENSURE_TYPE_CONST(Request *, request)->debug)
|
||||||
@@ -743,7 +750,7 @@ _method_call_action(GDBusMethodInvocation *invocation, GVariant *parameters)
|
|||||||
|
|
||||||
request = g_slice_new0(Request);
|
request = g_slice_new0(Request);
|
||||||
request->request_id = ++gl.request_id_counter;
|
request->request_id = ++gl.request_id_counter;
|
||||||
request->debug = debug || gl.debug;
|
request->debug = debug || gl.log_verbose;
|
||||||
request->context = invocation;
|
request->context = invocation;
|
||||||
request->action = g_strdup(action);
|
request->action = g_strdup(action);
|
||||||
|
|
||||||
@@ -1034,12 +1041,33 @@ static gboolean
|
|||||||
parse_command_line(int *p_argc, char ***p_argv, GError **error)
|
parse_command_line(int *p_argc, char ***p_argv, GError **error)
|
||||||
{
|
{
|
||||||
GOptionContext *opt_ctx;
|
GOptionContext *opt_ctx;
|
||||||
GOptionEntry entries[] = {
|
gboolean arg_debug = FALSE;
|
||||||
{"debug", 0, 0, G_OPTION_ARG_NONE, &gl.debug, "Output to console rather than syslog", NULL},
|
GOptionEntry entries[] = {{
|
||||||
{"persist", 0, 0, G_OPTION_ARG_NONE, &gl.persist, "Don't quit after a short timeout", NULL},
|
"debug",
|
||||||
{NULL}};
|
0,
|
||||||
|
0,
|
||||||
|
G_OPTION_ARG_NONE,
|
||||||
|
&arg_debug,
|
||||||
|
"Output to console rather than syslog",
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"persist",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
G_OPTION_ARG_NONE,
|
||||||
|
&gl.persist,
|
||||||
|
"Don't quit after a short timeout",
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NULL,
|
||||||
|
}};
|
||||||
gboolean success;
|
gboolean success;
|
||||||
|
|
||||||
|
gl.log_stdout = FALSE;
|
||||||
|
gl.log_verbose = _nm_utils_ascii_str_to_bool(g_getenv(_ENV("NM_DISPATCHER_DEBUG_LOG")), FALSE);
|
||||||
|
|
||||||
opt_ctx = g_option_context_new(NULL);
|
opt_ctx = g_option_context_new(NULL);
|
||||||
g_option_context_set_summary(opt_ctx, "Executes scripts upon actions by NetworkManager.");
|
g_option_context_set_summary(opt_ctx, "Executes scripts upon actions by NetworkManager.");
|
||||||
g_option_context_add_main_entries(opt_ctx, entries, NULL);
|
g_option_context_add_main_entries(opt_ctx, entries, NULL);
|
||||||
@@ -1048,6 +1076,11 @@ parse_command_line(int *p_argc, char ***p_argv, GError **error)
|
|||||||
|
|
||||||
g_option_context_free(opt_ctx);
|
g_option_context_free(opt_ctx);
|
||||||
|
|
||||||
|
if (success && arg_debug) {
|
||||||
|
gl.log_stdout = TRUE;
|
||||||
|
gl.log_verbose = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1070,7 +1103,7 @@ main(int argc, char **argv)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gl.debug) {
|
if (gl.log_stdout) {
|
||||||
if (!g_getenv("G_MESSAGES_DEBUG")) {
|
if (!g_getenv("G_MESSAGES_DEBUG")) {
|
||||||
/* we log our regular messages using g_debug() and g_info().
|
/* we log our regular messages using g_debug() and g_info().
|
||||||
* When we redirect glib logging to syslog, there is no problem.
|
* When we redirect glib logging to syslog, there is no problem.
|
||||||
@@ -1179,7 +1212,7 @@ done:
|
|||||||
|
|
||||||
_LOG_X_T("shutdown: exiting with %s", gl.exit_with_failure ? "failure" : "success");
|
_LOG_X_T("shutdown: exiting with %s", gl.exit_with_failure ? "failure" : "success");
|
||||||
|
|
||||||
if (!gl.debug)
|
if (gl.log_stdout)
|
||||||
logging_shutdown();
|
logging_shutdown();
|
||||||
|
|
||||||
nm_clear_g_source_inst(&source_term);
|
nm_clear_g_source_inst(&source_term);
|
||||||
|
Reference in New Issue
Block a user