From 23dac82b684e966490de707a44144b3ad0ce2323 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Thu, 28 May 2009 17:59:11 +0200 Subject: 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] --- ChangeLog | 6 ++++++ runtime/conf.c | 6 ++++++ tests/DevNull.cfgtest | 1 - tests/Makefile.am | 6 +++++- tests/NoExistFile.cfgtest | 1 - tests/testsuites/invalid.conf | 3 +++ tests/testsuites/valid.conf | 3 +++ tests/validation-run.sh | 38 ++++++++++++++++++++++++++++++++++++++ tools/syslogd.c | 10 +++++++++- 9 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 tests/testsuites/invalid.conf create mode 100644 tests/testsuites/valid.conf create mode 100755 tests/validation-run.sh 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 . +# +# 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) { -- cgit