From 8bea0d1d5762a3f0af74a5b9e9c0b15518774bec Mon Sep 17 00:00:00 2001
From: Rainer Gerhards
Date: Thu, 17 Sep 2009 12:30:00 +0200
Subject: added $AbortOnUncleanConfig directive
permits to prevent startup when there are problems with the configuration
file. See it's doc for details.
---
ChangeLog | 3 +++
doc/rsconf1_abortonuncleanconfig.html | 37 +++++++++++++++++++++++++++++++++++
doc/rsyslog_conf_global.html | 2 ++
tools/syslogd.c | 11 +++++++++++
4 files changed, 53 insertions(+)
create mode 100644 doc/rsconf1_abortonuncleanconfig.html
diff --git a/ChangeLog b/ChangeLog
index 3367e09f..e2102c21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
---------------------------------------------------------------------------
Version 5.3.1 [DEVEL] (rgerhards), 2009-09-??
+- added $AbortOnUncleanConfig directive - permits to prevent startup when
+ there are problems with the configuration file. See it's doc for
+ details.
---------------------------------------------------------------------------
Version 5.3.0 [DEVEL] (rgerhards), 2009-09-14
- begun to add simple GUI programs to gain insight into running rsyslogd
diff --git a/doc/rsconf1_abortonuncleanconfig.html b/doc/rsconf1_abortonuncleanconfig.html
new file mode 100644
index 00000000..77526c07
--- /dev/null
+++ b/doc/rsconf1_abortonuncleanconfig.html
@@ -0,0 +1,37 @@
+
+
+rsyslog.conf file
+
+
+rsyslog.conf configuration directive
+
+$AboortOnUncleanConfig
+Type: global configuration directive
+Parameter Values: boolean (on/off, yes/no)
+Available since: 5.3.1+
+Default: off
+Description:
+This directive permits to prevent rsyslog from running when the configuration file
+is not clean. "Not Clean" means there are errors or some other annoyances that rsyslgod
+reports on startup. This is a user-requested feature to have a strict startup mode. Note
+that with the current code base it is not always possible to differentiate between an
+real error and a warning-like condition. As such, the startup will also prevented if
+warnings are present. I consider this a good thing in being "strict", but I admit
+there also currently is no other way of doing it.
+
Caveats:
+Note that the consequences of a failed rsyslogd startup can be much more serious than a
+startup with only partial configuration. For example, log data may be lost or systems that
+depend on the log server in question will not be able to send logs, what in the ultimate
+result could result in a system hang on those systems. Also, the local system may hang when
+the local log socket has become full and is not read. There exist many such scenarios.
+As such, it is strongly recommended not to turn on this directive.
+
+[rsyslog.conf overview] [manual
+index] [rsyslog site]
+This documentation is part of the
+rsyslog project.
+Copyright © 2009 by Rainer Gerhards and
+Adiscon. Released under the GNU GPL
+version 2 or higher.
+
+
diff --git a/doc/rsyslog_conf_global.html b/doc/rsyslog_conf_global.html
index 66a326fe..874ad30e 100644
--- a/doc/rsyslog_conf_global.html
+++ b/doc/rsyslog_conf_global.html
@@ -17,6 +17,8 @@ appear as implementation progresses.
many parameter settings modify queue parameters. If in doubt, use the
default, it is usually well-chosen and applicable in most cases.
+- $AbortOnUncleanConfig - abort startup if there is
+any issue with the config file
- $ActionExecOnlyWhenPreviousIsSuspended
- $ActionName <a_single_word> - used primarily for documentation, e.g. when
generating a configuration graph. Available sice 4.3.1.
diff --git a/tools/syslogd.c b/tools/syslogd.c
index 26281005..912cca69 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -258,6 +258,7 @@ uchar cCCEscapeChar = '\\';/* character to be used to start an escape sequence f
int bEscapeCCOnRcv = 1; /* escape control characters on reception: 0 - no, 1 - yes */
static int bErrMsgToStderr = 1; /* print error messages to stderr (in addition to everything else)? */
int bReduceRepeatMsgs; /* reduce repeated message - 0 - no, 1 - yes */
+int bAbortOnUncleanConfig = 0; /* abort run (rather than starting with partial config) if there was any issue in conf */
int bActExecWhenPrevSusp; /* execute action only when previous one was suspended? */
int iActExecOnceInterval = 0; /* execute action once every nn seconds */
/* end global config file state variables */
@@ -343,6 +344,7 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a
bDebugPrintModuleList = 1;
bEscapeCCOnRcv = 1; /* default is to escape control characters */
bReduceRepeatMsgs = 0;
+ bAbortOnUncleanConfig = 0;
free(pszMainMsgQFName);
pszMainMsgQFName = NULL;
iMainMsgQueueSize = 10000;
@@ -2251,6 +2253,14 @@ init(void)
ABORT_FINALIZE(RS_RET_VALIDATION_RUN);
}
+ if(bAbortOnUncleanConfig && bHadConfigErr) {
+ fprintf(stderr, "rsyslogd: $AbortOnUncleanConfig is set, and config is not clean.\n"
+ "Check error log for details, fix errors and restart. As a last\n"
+ "resort, you may want to remove $AbortOnUncleanConfig to permit a\n"
+ "startup with a dirty config.\n");
+ exit(2);
+ }
+
/* switch the message object to threaded operation, if necessary */
if(MainMsgQueType == QUEUETYPE_DIRECT || iMainMsgQueueNumWorkers > 1) {
MsgEnableThreadSafety();
@@ -2630,6 +2640,7 @@ static rsRetVal loadBuildInModules(void)
CHKiRet(regCfSysLineHdlr((uchar *)"mainmsgqueuesaveonshutdown", 0, eCmdHdlrBinary, NULL, &bMainMsgQSaveOnShutdown, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"mainmsgqueuedequeuetimebegin", 0, eCmdHdlrInt, NULL, &iMainMsgQueueDeqtWinFromHr, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"mainmsgqueuedequeuetimeend", 0, eCmdHdlrInt, NULL, &iMainMsgQueueDeqtWinToHr, NULL));
+ CHKiRet(regCfSysLineHdlr((uchar *)"abortonuncleanconfig", 0, eCmdHdlrBinary, NULL, &bAbortOnUncleanConfig, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"repeatedmsgreduction", 0, eCmdHdlrBinary, NULL, &bReduceRepeatMsgs, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"actionexeconlywhenpreviousissuspended", 0, eCmdHdlrBinary, NULL, &bActExecWhenPrevSusp, NULL));
CHKiRet(regCfSysLineHdlr((uchar *)"actionexeconlyonceeveryinterval", 0, eCmdHdlrInt, NULL, &iActExecOnceInterval, NULL));
--
cgit