summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--runtime/conf.c6
-rw-r--r--tests/DevNull.cfgtest1
-rw-r--r--tests/Makefile.am6
-rw-r--r--tests/NoExistFile.cfgtest1
-rw-r--r--tests/testsuites/invalid.conf3
-rw-r--r--tests/testsuites/valid.conf3
-rwxr-xr-xtests/validation-run.sh38
-rw-r--r--tools/syslogd.c10
9 files changed, 70 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 6e7f552d..86ac485f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
- bugfix: internal messages were emitted to whatever file had fd2 when
rsyslogd ran in forked mode (as usual!)
Thanks to varmojfekoj for the patch
+- small enhancement: config validation run now exits with code 1 if an
+ error is detected. This change is considered important but small enough
+ to apply it directly to the stable version. [But it is a border case,
+ the change requires more code than I had hoped. Thus I have NOT tried
+ to actually catch all cases, this is left for the current devel
+ releases, if necessary]
---------------------------------------------------------------------------
Version 3.22.1 [v3-stable] (rgerhards), 2009-04-??
- bugfix: light and full delay watermarks had invalid values, badly
diff --git a/runtime/conf.c b/runtime/conf.c
index f71d5669..da6026c5 100644
--- a/runtime/conf.c
+++ b/runtime/conf.c
@@ -395,6 +395,7 @@ processConfFile(uchar *pConfFile)
uchar cbuf[CFGLNSIZ];
uchar *cline;
int i;
+ int bHadAnError = 0;
ASSERT(pConfFile != NULL);
if((cf = fopen((char*)pConfFile, "r")) == NULL) {
@@ -456,6 +457,7 @@ processConfFile(uchar *pConfFile)
snprintf((char*)szErrLoc, sizeof(szErrLoc) / sizeof(uchar),
"%s, line %d", pConfFile, iLnNbr);
errmsg.LogError(0, NO_ERRCODE, "the last error occured in %s", (char*)szErrLoc);
+ bHadAnError = 1;
}
}
@@ -475,6 +477,10 @@ finalize_it:
dbgprintf("error %d processing config file '%s'; os error (if any): %s\n",
iRet, pConfFile, errStr);
}
+
+ if(bHadAnError && (iRet == RS_RET_OK)) { /* a bit dirty, enhance in future releases */
+ iRet = RS_RET_ERR;
+ }
RETiRet;
}
diff --git a/tests/DevNull.cfgtest b/tests/DevNull.cfgtest
index d30d936b..7822b6df 100644
--- a/tests/DevNull.cfgtest
+++ b/tests/DevNull.cfgtest
@@ -1,3 +1,2 @@
rsyslogd: CONFIG ERROR: there are no active actions configured. Inputs will run, but no output whatsoever is created. [try http://www.rsyslog.com/e/2103 ]
rsyslogd: EMERGENCY CONFIGURATION ACTIVATED - fix rsyslog config file!
-rsyslogd: End of config validation run. Bye.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 14e7c195..802a3ccb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,10 +1,14 @@
check_PROGRAMS = rt_init rscript
-TESTS = $(check_PROGRAMS) cfg.sh
+TESTS = $(check_PROGRAMS) cfg.sh \
+ validation-run.sh
TESTS_ENVIRONMENT = RSYSLOG_MODDIR='$(abs_top_builddir)'/runtime/.libs/
#TESTS = $(check_PROGRAMS)
test_files = testbench.h runtime-dummy.c
EXTRA_DIST=1.rstest 2.rstest err1.rstest \
+ validation-run.sh \
+ testsuites/invalid.conf \
+ testsuites/valid.conf \
cfg.sh \
cfg1.cfgtest \
cfg1.testin \
diff --git a/tests/NoExistFile.cfgtest b/tests/NoExistFile.cfgtest
index 4cbcc029..88d3123f 100644
--- a/tests/NoExistFile.cfgtest
+++ b/tests/NoExistFile.cfgtest
@@ -1,3 +1,2 @@
rsyslogd: CONFIG ERROR: could not interpret master config file '/This/does/not/exist'. [try http://www.rsyslog.com/e/2013 ]
rsyslogd: EMERGENCY CONFIGURATION ACTIVATED - fix rsyslog config file!
-rsyslogd: End of config validation run. Bye.
diff --git a/tests/testsuites/invalid.conf b/tests/testsuites/invalid.conf
new file mode 100644
index 00000000..8a865ba5
--- /dev/null
+++ b/tests/testsuites/invalid.conf
@@ -0,0 +1,3 @@
+# This is an invalid config file that shall trigger an exit code
+# with the config verification run
+$invalid
diff --git a/tests/testsuites/valid.conf b/tests/testsuites/valid.conf
new file mode 100644
index 00000000..250f0546
--- /dev/null
+++ b/tests/testsuites/valid.conf
@@ -0,0 +1,3 @@
+# This is an invalid config file that shall trigger an exit code
+# with the config verification run
+*.* /tmp/data.log
diff --git a/tests/validation-run.sh b/tests/validation-run.sh
new file mode 100755
index 00000000..10981290
--- /dev/null
+++ b/tests/validation-run.sh
@@ -0,0 +1,38 @@
+# check if the configuration test run detects invalid config files.
+#
+# Part of the testbench for rsyslog.
+#
+# Copyright 2009 Rainer Gerhards and Adiscon GmbH.
+#
+# This file is part of rsyslog.
+#
+# Rsyslog is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Rsyslog is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Rsyslog. If not, see <http://www.gnu.org/licenses/>.
+#
+# A copy of the GPL can be found in the file "COPYING" in this distribution.
+#set -x
+echo "testing a failed configuration verification run"
+../tools/rsyslogd -u2 -c3 -N1 -f$srcdir/testsuites/invalid.conf
+if [ $? -ne 1 ]; then
+ exit 1
+fi
+echo testing a valid config verification run
+../tools/rsyslogd -u2 -c3 -N1 -f$srcdir/testsuites/valid.conf
+if [ $? -ne 0 ]; then
+ exit 1
+fi
+echo testing empty config file
+../tools/rsyslogd -u2 -c3 -N1 -f/dev/null
+if [ $? -ne 1 ]; then
+ exit 1
+fi
diff --git a/tools/syslogd.c b/tools/syslogd.c
index 1840030b..01d3af71 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -2237,6 +2237,7 @@ init(void)
DEFiRet;
rsRetVal localRet;
int iNbrActions;
+ int bHadConfigErr = 0;
char cbuf[BUFSIZ];
char bufStartUpMsg[512];
struct sigaction sigAct;
@@ -2287,9 +2288,11 @@ init(void)
if(localRet != RS_RET_OK) {
errmsg.LogError(0, localRet, "CONFIG ERROR: could not interpret master config file '%s'.", ConfFile);
+ bHadConfigErr = 1;
} else if(iNbrActions == 0) {
errmsg.LogError(0, RS_RET_NO_ACTIONS, "CONFIG ERROR: there are no active actions configured. Inputs will "
"run, but no output whatsoever is created.");
+ bHadConfigErr = 1;
}
if(localRet != RS_RET_OK || iNbrActions == 0) {
@@ -2355,8 +2358,13 @@ init(void)
/* we are done checking the config - now validate if we should actually run or not.
* If not, terminate. -- rgerhards, 2008-07-25
*/
- if(iConfigVerify)
+ if(iConfigVerify) {
+ if(bHadConfigErr) {
+ /* a bit dirty, but useful... */
+ exit(1);
+ }
ABORT_FINALIZE(RS_RET_VALIDATION_RUN);
+ }
/* switch the message object to threaded operation, if necessary */
if(MainMsgQueType == QUEUETYPE_DIRECT || iMainMsgQueueNumWorkers > 1) {