The branch, master has been updated via 494eb0c22a6 debug: Add new smb.conf option "debug syslog format" via 5e1e9d74ab6 debug: Add debug_syslog_format setting from be3a47e22ad s3:modules:recycle - fix crash in recycle_unlink_internal
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 494eb0c22a67f0a9672a53f8941ad6fecf291a77 Author: Martin Schwenke <mar...@meltin.net> Date: Sun Oct 31 11:59:30 2021 +1100 debug: Add new smb.conf option "debug syslog format" Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Ralph Boehme <s...@samba.org> Autobuild-User(master): Ralph Böhme <s...@samba.org> Autobuild-Date(master): Mon Nov 1 07:29:47 UTC 2021 on sn-devel-184 commit 5e1e9d74ab6f59a62ac8dae3239299a0ef334708 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 28 19:05:19 2021 +1100 debug: Add debug_syslog_format setting Without debug_hires_timestamp this produces a syslog style header containing: "MON DD HH:MM:SS HOSTNAME PROGNAME[PID] " With debug_hires_timestamp this produces a syslog style header containing: "RFC5424-TIMESTAMP HOSTNAME PROGNAME[PID] " All other settings are ignored. This will be made visible via smb.conf in a subsequent commit. This commit adds some simple hostname handling. It avoids using get_myname() from util.c because using that potentially pulls in all manner of dependencies. No real error handling is done. In the worst case debug_set_hostname() sets the hostname to a truncated version of the given string. Similarly, in an even weirder world, ensure_hostname() sets the hostname to a truncation of "unknown". Both of these are unlikely in all reasonable cases. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Ralph Boehme <s...@samba.org> ----------------------------------------------------------------------- Summary of changes: .../smbdotconf/logging/debughirestimestamp.xml | 3 +- docs-xml/smbdotconf/logging/debugsyslogformat.xml | 21 ++++++ lib/param/loadparm.c | 2 + lib/util/debug.c | 75 +++++++++++++++++++++- lib/util/debug.h | 2 + lib/util/debug_s3.c | 2 + source3/param/loadparm.c | 1 + 7 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 docs-xml/smbdotconf/logging/debugsyslogformat.xml Changeset truncated at 500 lines: diff --git a/docs-xml/smbdotconf/logging/debughirestimestamp.xml b/docs-xml/smbdotconf/logging/debughirestimestamp.xml index 72598d757ca..79d928ab3d9 100644 --- a/docs-xml/smbdotconf/logging/debughirestimestamp.xml +++ b/docs-xml/smbdotconf/logging/debughirestimestamp.xml @@ -9,7 +9,8 @@ </para> <para> - Note that the parameter <smbconfoption name="debug timestamp"/> must be on for this to have an effect. + Note that the parameter <smbconfoption name="debug timestamp"/> or + <smbconfoption name="debug syslog format"/> must be on for this to have an effect. </para> </description> diff --git a/docs-xml/smbdotconf/logging/debugsyslogformat.xml b/docs-xml/smbdotconf/logging/debugsyslogformat.xml new file mode 100644 index 00000000000..f943f3a5323 --- /dev/null +++ b/docs-xml/smbdotconf/logging/debugsyslogformat.xml @@ -0,0 +1,21 @@ +<samba:parameter name="debug syslog format" + context="G" + type="boolean" + xmlns:samba="http://www.samba.org/samba/DTD/samba-doc"> +<description> + <para> + With this option enabled, debug messages are printed in a + single-line format like that traditionally produced by syslog. + The timestamp consists of an abbreviated month, space-padded date, + and time including seconds. This is followed by the hostname and + the program name, with the process-ID in square brackets. + </para> + + <para> + If <smbconfoption name="debug hires timestamp"/> is also enabled + then an RFC5424 timestamp is used instead. + </para> + +</description> +<value type="default">no</value> +</samba:parameter> diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c index 2eac1ba7c38..9c725402758 100644 --- a/lib/param/loadparm.c +++ b/lib/param/loadparm.c @@ -2559,6 +2559,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx) lpcfg_do_global_parameter(lp_ctx, "debug timestamp", "Yes"); lpcfg_do_global_parameter(lp_ctx, "debug prefix timestamp", "No"); lpcfg_do_global_parameter(lp_ctx, "debug hires timestamp", "Yes"); + lpcfg_do_global_parameter(lp_ctx, "debug syslog format", "No"); lpcfg_do_global_parameter(lp_ctx, "debug pid", "No"); lpcfg_do_global_parameter(lp_ctx, "debug uid", "No"); lpcfg_do_global_parameter(lp_ctx, "debug class", "No"); @@ -3102,6 +3103,7 @@ static bool lpcfg_update(struct loadparm_context *lp_ctx) settings.timestamp_logs = lp_ctx->globals->timestamp_logs; settings.debug_prefix_timestamp = lp_ctx->globals->debug_prefix_timestamp; settings.debug_hires_timestamp = lp_ctx->globals->debug_hires_timestamp; + settings.debug_syslog_format = lp_ctx->globals->debug_syslog_format; settings.debug_pid = lp_ctx->globals->debug_pid; settings.debug_uid = lp_ctx->globals->debug_uid; settings.debug_class = lp_ctx->globals->debug_class; diff --git a/lib/util/debug.c b/lib/util/debug.c index b0ac6ce40ea..2f4a86734ce 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -24,6 +24,8 @@ #include "system/filesys.h" #include "system/syslog.h" #include "system/locale.h" +#include "system/network.h" +#include "system/time.h" #include "time_basic.h" #include "close_low_fd.h" #include "memory.h" @@ -89,6 +91,7 @@ static struct { bool initialized; enum debug_logtype logtype; /* The type of logging we are doing: eg stdout, file, stderr */ char prog_name[255]; + char hostname[HOST_NAME_MAX+1]; bool reopening_logs; bool schedule_reopen_logs; @@ -1071,6 +1074,35 @@ void debug_set_settings(struct debug_settings *settings, debug_set_backends(logging_param); } +static void ensure_hostname(void) +{ + int ret; + + if (state.hostname[0] != '\0') { + return; + } + + ret = gethostname(state.hostname, sizeof(state.hostname)); + if (ret != 0) { + strlcpy(state.hostname, "unknown", sizeof(state.hostname)); + return; + } + + /* + * Ensure NUL termination, since POSIX isn't clear about that. + * + * Don't worry about truncating at the first '.' or similar, + * since this is usually not fully qualified. Trying to + * truncate opens up the multibyte character gates of hell. + */ + state.hostname[sizeof(state.hostname) - 1] = '\0'; +} + +void debug_set_hostname(const char *name) +{ + strlcpy(state.hostname, name, sizeof(state.hostname)); +} + /** control the name of the logfile and whether logging will be to stdout, stderr or a file, and set up syslog @@ -1671,11 +1703,52 @@ bool dbghdrclass(int level, int cls, const char *location, const char *func) * not yet loaded, then default to timestamps on. */ if (!(state.settings.timestamp_logs || - state.settings.debug_prefix_timestamp)) { + state.settings.debug_prefix_timestamp || + state.settings.debug_syslog_format)) { return true; } GetTimeOfDay(&tv); + + if (state.settings.debug_syslog_format) { + if (state.settings.debug_hires_timestamp) { + timeval_str_buf(&tv, true, true, &tvbuf); + } else { + time_t t; + struct tm *tm; + + t = (time_t)tv.tv_sec; + tm = localtime(&t); + if (tm != NULL) { + size_t len; + len = strftime(tvbuf.buf, + sizeof(tvbuf.buf), + "%b %e %T", + tm); + if (len == 0) { + /* Trigger default time format below */ + tm = NULL; + } + } + if (tm == NULL) { + snprintf(tvbuf.buf, + sizeof(tvbuf.buf), + "%ld seconds since the Epoch", (long)t); + } + } + + ensure_hostname(); + state.hs_len = snprintf(state.header_str, + sizeof(state.header_str), + "%s %s %s[%u]: ", + tvbuf.buf, + state.hostname, + state.prog_name, + (unsigned int) getpid()); + + goto full; + } + timeval_str_buf(&tv, false, state.settings.debug_hires_timestamp, &tvbuf); diff --git a/lib/util/debug.h b/lib/util/debug.h index 9ab699a4148..7317c2f43c5 100644 --- a/lib/util/debug.h +++ b/lib/util/debug.h @@ -300,6 +300,7 @@ struct debug_settings { bool timestamp_logs; bool debug_prefix_timestamp; bool debug_hires_timestamp; + bool debug_syslog_format; bool debug_pid; bool debug_uid; bool debug_class; @@ -315,6 +316,7 @@ void debug_set_logfile(const char *name); void debug_set_settings(struct debug_settings *settings, const char *logging_param, int syslog_level, bool syslog_only); +void debug_set_hostname(const char *name); bool reopen_logs_internal( void ); void force_check_log_size( void ); bool need_to_check_log_size( void ); diff --git a/lib/util/debug_s3.c b/lib/util/debug_s3.c index 151227c3419..1fd8637a65f 100644 --- a/lib/util/debug_s3.c +++ b/lib/util/debug_s3.c @@ -36,6 +36,7 @@ bool reopen_logs(void) .timestamp_logs = lp_timestamp_logs(), .debug_prefix_timestamp = lp_debug_prefix_timestamp(), .debug_hires_timestamp = lp_debug_hires_timestamp(), + .debug_syslog_format = lp_debug_syslog_format(), .debug_pid = lp_debug_pid(), .debug_uid = lp_debug_uid(), .debug_class = lp_debug_class(), @@ -60,6 +61,7 @@ bool reopen_logs(void) .timestamp_logs = true, .debug_prefix_timestamp = false, .debug_hires_timestamp = true, + .debug_syslog_format = false, .debug_pid = false, .debug_uid = false, .debug_class = false, diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 6c9830563c3..f35db213c14 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -675,6 +675,7 @@ static void init_globals(struct loadparm_context *lp_ctx, bool reinit_globals) lpcfg_string_set(Globals.ctx, &Globals.log_level, "0"); Globals.debug_prefix_timestamp = false; Globals.debug_hires_timestamp = true; + Globals.debug_syslog_format = false; Globals.debug_pid = false; Globals.debug_uid = false; Globals.debug_class = false; -- Samba Shared Repository