diff --git a/rsyslog.changes b/rsyslog.changes index f677278..08cb7fc 100644 --- a/rsyslog.changes +++ b/rsyslog.changes @@ -1,3 +1,32 @@ +------------------------------------------------------------------- +Wed Apr 28 17:21:03 UTC 2010 - mt@suse.de + +- Added $klogConsoleLogLevel 1 to the config, to use same default + [KERNEL_LOGLEVEL in /etc/sysconfig/syslog] as klogd (bnc#593699). +- Improved filter to discard iptables msgs higher err on console, + changed to set default file template instead per file, removed + duplicate filters (bnc#593699). + +------------------------------------------------------------------- +Tue Apr 27 12:01:44 UTC 2010 - mt@suse.de + +- Applied fix to avoid a tight send-retry loop in case there is + nobody receiving the messages sent to the xconsole pipe + (bnc#597293, http://bugzilla.adiscon.com/show_bug.cgi?id=186). +- Disabled relp support for < 11.3 (librelp is new) +- Fixed to create /var/run/rsyslog in post-install (rpmlint) + +------------------------------------------------------------------- +Wed Apr 14 12:16:29 UTC 2010 - mrueckert@suse.de + +- dropped install_all_modules_in_lib conditional and all related + code +- new subpackages + - enable RELP support. new depdendency librelp + - enable diagnotic tools. + - enable UDP spoof support. new dependency libnet +- moved module paths to 2 variables defined on top of the spec + ------------------------------------------------------------------- Tue Apr 13 08:56:15 UTC 2010 - mt@suse.de diff --git a/rsyslog.conf.in b/rsyslog.conf.in index 4465a28..a7db511 100644 --- a/rsyslog.conf.in +++ b/rsyslog.conf.in @@ -19,108 +19,136 @@ # rsyslog v3: load input modules # If you do not load inputs, nothing happens! -$ModLoad immark.so # provides --MARK-- message capability -$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command) -$ModLoad imklog.so # kernel logging (may be also provided by /sbin/klogd) +$ModLoad immark.so # provides --MARK-- message capability +$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command) + +$ModLoad imklog.so # kernel logging (may be also provided by /sbin/klogd), + # see also http://www.rsyslog.com/doc-imklog.html. +$klogConsoleLogLevel 1 # set log level 1 (same as in /etc/sysconfig/syslog). + + +# +# Use traditional log format by default. To change it for a single +# file, append ";RSYSLOG_TraditionalFileFormat" to the filename. +# +$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + # # Include config generated by /etc/init.d/syslog script # using the SYSLOGD_ADDITIONAL_SOCKET* variables in the # /etc/sysconfig/syslog file. # -$IncludeConfig ADDITIONAL_SOCKETS +$IncludeConfig /var/run/rsyslog/additional-log-sockets.conf # # Include config files, that the admin provided? : # -$IncludeConfig ETC_RSYSLOG_D_GLOB +$IncludeConfig /etc/rsyslog.d/*.conf + ### +# print most important on tty10 and on the xconsole pipe # -# print most on tty10 and on the xconsole pipe -# -kern.warning;*.err;authpriv.none /dev/tty10;RSYSLOG_TraditionalFileFormat -kern.warning;*.err;authpriv.none |/dev/xconsole;RSYSLOG_TraditionalFileFormat +if ( \ + /* kernel up to warning except of firewall */ \ + ($syslogfacility-text == 'kern') and \ + ($syslogseverity <= 4 /* warning */ ) and not \ + ($msg contains 'IN=' and $msg contains 'OUT=') \ + ) or ( \ + /* up to errors except of facility authpriv */ \ + ($syslogseverity <= 3 /* errors */ ) and not \ + ($syslogfacility-text == 'authpriv') \ + ) \ +then /dev/tty10 +& |/dev/xconsole + + +# Emergency messages to everyone logged on (wall) *.emerg * # enable this, if you want that root is informed # immediately, e.g. of logins #*.alert root + # # firewall messages into separate file and stop their further processing # if ($syslogfacility-text == 'kern') and \ - ($msg contains 'IN=' and $msg contains 'OUT=') then \ - -/var/log/firewall;RSYSLOG_TraditionalFileFormat -if ($syslogfacility-text == 'kern') and \ - ($msg contains 'IN=' and $msg contains 'OUT=') then \ - ~ + ($msg contains 'IN=' and $msg contains 'OUT=') \ +then -/var/log/firewall +& ~ + # # acpid messages into separate file and stop their further processing # # => all acpid messages for debuging (uncomment if needed): #if ($programname == 'acpid' or $syslogtag == '[acpid]:') then \ -# -/var/log/acpid;RSYSLOG_TraditionalFileFormat +# -/var/log/acpid # # => up to notice (skip info and debug) if ($programname == 'acpid' or $syslogtag == '[acpid]:') and \ - ($syslogseverity <= 5) then \ - -/var/log/acpid;RSYSLOG_TraditionalFileFormat -if ($programname == 'acpid' or $syslogtag == '[acpid]:') then \ - ~ + ($syslogseverity <= 5 /* notice */) \ +then -/var/log/acpid +& ~ + # # NetworkManager into separate file and stop their further processing # if ($programname == 'NetworkManager') or \ - ($programname startswith 'nm-') then \ - -/var/log/NetworkManager;RSYSLOG_TraditionalFileFormat -if ($programname == 'NetworkManager') or \ - ($programname startswith 'nm-') then \ - ~ + ($programname startswith 'nm-') \ +then -/var/log/NetworkManager +& ~ + # # email-messages # -mail.* -/var/log/mail;RSYSLOG_TraditionalFileFormat -mail.info -/var/log/mail.info;RSYSLOG_TraditionalFileFormat -mail.warning -/var/log/mail.warn;RSYSLOG_TraditionalFileFormat -mail.err /var/log/mail.err;RSYSLOG_TraditionalFileFormat +mail.* -/var/log/mail +mail.info -/var/log/mail.info +mail.warning -/var/log/mail.warn +mail.err /var/log/mail.err + # # news-messages # -news.crit -/var/log/news/news.crit;RSYSLOG_TraditionalFileFormat -news.err -/var/log/news/news.err;RSYSLOG_TraditionalFileFormat -news.notice -/var/log/news/news.notice;RSYSLOG_TraditionalFileFormat +news.crit -/var/log/news/news.crit +news.err -/var/log/news/news.err +news.notice -/var/log/news/news.notice # enable this, if you want to keep all news messages # in one file -#news.* -/var/log/news.all;RSYSLOG_TraditionalFileFormat +#news.* -/var/log/news.all + # # Warnings in one file # -*.=warning;*.=err -/var/log/warn;RSYSLOG_TraditionalFileFormat -*.crit /var/log/warn;RSYSLOG_TraditionalFileFormat +*.=warning;*.=err -/var/log/warn +*.crit /var/log/warn + # # the rest in one file # -*.*;mail.none;news.none -/var/log/messages;RSYSLOG_TraditionalFileFormat +*.*;mail.none;news.none -/var/log/messages + # # enable this, if you want to keep all messages # in one file -#*.* -/var/log/allmessages;RSYSLOG_TraditionalFileFormat +#*.* -/var/log/allmessages + # # Some foreign boot scripts require local7 # -local0,local1.* -/var/log/localmessages;RSYSLOG_TraditionalFileFormat -local2,local3.* -/var/log/localmessages;RSYSLOG_TraditionalFileFormat -local4,local5.* -/var/log/localmessages;RSYSLOG_TraditionalFileFormat -local6,local7.* -/var/log/localmessages;RSYSLOG_TraditionalFileFormat +local0,local1.* -/var/log/localmessages +local2,local3.* -/var/log/localmessages +local4,local5.* -/var/log/localmessages +local6,local7.* -/var/log/localmessages ### diff --git a/rsyslog.spec b/rsyslog.spec index f837af5..cf14da0 100644 --- a/rsyslog.spec +++ b/rsyslog.spec @@ -19,11 +19,18 @@ Name: rsyslog -%define upstream_version 5.4.0 -%define rsyslog_docdir %{_docdir}/%{name} -%define install_all_modules_in_lib 0 +%define upstream_version 5.4.0 +# add %define build_with_relp 1 to enable relp on < 11.3, e.g. +# via %define build_with_relp 1 in _link file. +%define with_relp 0%{?suse_version} >= 1130 || 0%{?build_with_relp:1} +%define _sbindir /sbin +%define rsyslogdocdir %{_docdir}/%{name} +%define additional_sockets %{_localstatedir}/run/rsyslog/additional-log-sockets.conf +%define _libdir /%_lib +%define rsyslog_module_dir_nodeps %{_libdir}/rsyslog/ +%define rsyslog_module_dir_withdeps %{_prefix}/%{_lib}/rsyslog/ Version: 5.4.0 -Release: 1 +Release: 2 License: GPLv3+ Group: System/Daemons Summary: Rsyslog, the enhanced syslogd for Linux and Unix @@ -35,6 +42,12 @@ BuildRequires: klogd BuildRequires: dos2unix openssl-devel pcre-devel pkgconfig zlib-devel BuildRequires: krb5-devel mysql-devel net-snmp-devel postgresql-devel BuildRequires: libgnutls-devel +%if %{?with_relp} +# RELP support +BuildRequires: librelp-devel +%endif +# UDP spoof support +BuildRequires: libnet BuildRoot: %{_tmppath}/%{name}-%{version}-build #Source0: http://download.rsyslog.com/rsyslog/%{name}-%{upstream_version}.tar.gz Source0: %{name}-%{upstream_version}.tar.bz2 @@ -42,10 +55,7 @@ Source1: rsyslog.sysconfig Source2: rsyslog.conf.in Source3: rsyslog.early.conf.in Source4: rsyslog.d.remote.conf.in -%define _sbindir /sbin -%define _libdir /%_lib -%define rsyslogdocdir %{_docdir}/%{name} -%define additional_sockets %{_localstatedir}/run/rsyslog/additional-log-sockets.conf +Patch1: rsyslog.xconsole-pipe-loop.patch %description Rsyslog is an enhanced multi-threaded syslogd supporting, among others, @@ -56,13 +66,12 @@ Its advanced features make it suitable for enterprise-class, encryption protected syslog relay chains while at the same time being very easy to setup for the novice user. - - Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH + %package doc License: GPLv3+ Group: System/Daemons @@ -75,13 +84,31 @@ package. This package provides additional documentation for rsyslog. +Authors: +-------- + Rainer Gerhards , Adiscon GmbH + Michael Meckelein , Adiscon GmbH +%package diag-tools +License: GPLv3+ +Group: System/Daemons +Requires: %{name} = %{version} +Summary: Diagnostic tools + +%description diag-tools +Rsyslog is an enhanced multi-threaded syslog daemon. See rsyslog +package. + +This package provides additional diagnostic tools (small helpers, +usually not needed). + Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH + %package module-gssapi License: GPLv3+ Group: System/Daemons @@ -95,13 +122,12 @@ package. This module provides the support to receive syslog messages from the network protected via Kerberos 5 encryption and authentication. - - Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH + %package module-mysql License: GPLv3+ Group: System/Daemons @@ -115,13 +141,12 @@ package. This package provides a module with the support for logging into MySQL databases. - - Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH + %package module-pgsql License: GPLv3+ Group: System/Daemons @@ -134,13 +159,12 @@ package. This module provides the support for logging into PostgreSQL databases. - - Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH + %package module-snmp License: GPLv3+ Group: System/Daemons @@ -154,13 +178,12 @@ package. This module provides the ability to send syslog messages as an SNMPv1 & v2c traps. - - Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH + %package module-gtls License: GPLv3+ Group: System/Daemons @@ -174,27 +197,67 @@ package. This module provides the ability for TLS encrypted TCP logging (based on current syslog-transport-tls internet drafts). +Authors: +-------- + Rainer Gerhards , Adiscon GmbH + Michael Meckelein , Adiscon GmbH +%if %{?with_relp} + +%package module-relp +License: GPLv3+ +Group: System/Daemons +Requires: %{name} = %{version} +Summary: RELP protocol support module for syslog + +%description module-relp +Rsyslog is an enhanced multi-threaded syslog daemon. See rsyslog +package. + +This module provides Reliable Event Logging Protocol support. + Authors: -------- Rainer Gerhards , Adiscon GmbH Michael Meckelein , Adiscon GmbH +%endif + +%package module-udpspoof +License: GPLv3+ +Group: System/Daemons +Requires: %{name} = %{version} +Summary: UDP spoof support module for syslog + +%description module-udpspoof +Rsyslog is an enhanced multi-threaded syslog daemon. See rsyslog +package. + +This module provides a UDP forwarder that allows changing the sender address. + +Authors: +-------- + Rainer Gerhards , Adiscon GmbH + Michael Meckelein , Adiscon GmbH + + %prep %setup -q -n %{name}-%{upstream_version} dos2unix doc/*.html +%patch1 -p1 %build export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -W -Wall" %if 0%{?suse_version} > 1000 && 0%{?suse_version} < 1030 export CFLAGS="$CFLAGS -fstack-protector" %endif -autoreconf -fi +# needs liblogging +# --enable-rfc3195 \ +# needs java +# --enable-gui \ %configure \ -%if ! 0%{install_all_modules_in_lib} - --with-moddirs=%{_prefix}%{_libdir}/rsyslog/ \ -%endif + --with-moddirs=%{rsyslog_module_dir_withdeps} \ --enable-option-checking \ --enable-largefile \ --enable-pthreads \ @@ -213,25 +276,33 @@ autoreconf -fi --enable-imtemplate \ --enable-omprog \ --enable-omtemplate \ + --enable-diagtools \ +%if %{?with_relp} + --enable-relp \ +%endif + --enable-omudpspoof \ + --enable-omstdout \ --disable-static -make %{?_smp_mflags:%{_smp_mflags}} + +make %{?_smp_mflags:%{_smp_mflags}} V=1 %install -make install DESTDIR="%{buildroot}" +make install DESTDIR="%{buildroot}" V=1 # -rm -f %{buildroot}%{_libdir}/rsyslog/*.la +rm -f %{buildroot}%{rsyslog_module_dir_nodeps}/*.la # -%if ! 0%{install_all_modules_in_lib} # move all modules linking libraries in /usr to /usr/%_lib # the user has to specify them with full path then... -install -d -m0755 %{buildroot}%{_prefix}%{_libdir}/rsyslog +install -d -m0755 %{buildroot}%{rsyslog_module_dir_withdeps} for mod in omgssapi.so imgssapi.so lmgssutil.so ommysql.so \ - ompgsql.so omsnmp.so lmnsd_gtls.so ; -do - mv -f %{buildroot}%{_libdir}/rsyslog/$mod \ - %{buildroot}%{_prefix}%{_libdir}/rsyslog/ -done + ompgsql.so omsnmp.so lmnsd_gtls.so \ +%if %{?with_relp} + imrelp.so omrelp.so \ %endif +; do + mv -f %{buildroot}%{rsyslog_module_dir_nodeps}/$mod \ + %{buildroot}%{rsyslog_module_dir_withdeps} +done # install -d -m0755 %{buildroot}%{_sysconfdir}/rsyslog.d install -d -m0755 %{buildroot}%{_localstatedir}/run/rsyslog @@ -339,7 +410,9 @@ touch var/log/NetworkManager; chmod 640 var/log/NetworkManager # touch the additional log sockets config file # additional_sockets="%{additional_sockets}" -touch "${additional_sockets#/}"; chmod 640 "${additional_sockets#/}" +mkdir -p -m750 ${additional_sockets%/*} +touch "${additional_sockets#/}" +chmod 640 "${additional_sockets#/}" %preun # @@ -378,30 +451,29 @@ fi %config(noreplace) %attr(600,root,root) %{_sysconfdir}/rsyslog.early.conf %config(noreplace) %attr(600,root,root) %{_sysconfdir}/rsyslog.d/remote.conf %{_sbindir}/rsyslogd -%dir %{_libdir}/rsyslog -%{_libdir}/rsyslog/imfile.so -%{_libdir}/rsyslog/imklog.so -%{_libdir}/rsyslog/immark.so -%{_libdir}/rsyslog/imtcp.so -%{_libdir}/rsyslog/imtemplate.so -%{_libdir}/rsyslog/imudp.so -%{_libdir}/rsyslog/imuxsock.so -%{_libdir}/rsyslog/lmnet.so -%{_libdir}/rsyslog/lmnetstrms.so -%{_libdir}/rsyslog/lmnsd_ptcp.so -%{_libdir}/rsyslog/lmregexp.so -%{_libdir}/rsyslog/lmstrmsrv.so -%{_libdir}/rsyslog/lmtcpclt.so -%{_libdir}/rsyslog/lmtcpsrv.so -%{_libdir}/rsyslog/lmzlibw.so -%{_libdir}/rsyslog/ommail.so -%{_libdir}/rsyslog/omprog.so -%{_libdir}/rsyslog/omruleset.so -%{_libdir}/rsyslog/omtemplate.so -%{_libdir}/rsyslog/omtesting.so -%if ! 0%{install_all_modules_in_lib} -%dir %{_prefix}%{_libdir}/rsyslog -%endif +%dir %{rsyslog_module_dir_nodeps} +%{rsyslog_module_dir_nodeps}/imfile.so +%{rsyslog_module_dir_nodeps}/imklog.so +%{rsyslog_module_dir_nodeps}/immark.so +%{rsyslog_module_dir_nodeps}/imtcp.so +%{rsyslog_module_dir_nodeps}/imtemplate.so +%{rsyslog_module_dir_nodeps}/imudp.so +%{rsyslog_module_dir_nodeps}/imuxsock.so +%{rsyslog_module_dir_nodeps}/lmnet.so +%{rsyslog_module_dir_nodeps}/lmnetstrms.so +%{rsyslog_module_dir_nodeps}/lmnsd_ptcp.so +%{rsyslog_module_dir_nodeps}/lmregexp.so +%{rsyslog_module_dir_nodeps}/lmstrmsrv.so +%{rsyslog_module_dir_nodeps}/lmtcpclt.so +%{rsyslog_module_dir_nodeps}/lmtcpsrv.so +%{rsyslog_module_dir_nodeps}/lmzlibw.so +%{rsyslog_module_dir_nodeps}/ommail.so +%{rsyslog_module_dir_nodeps}/omprog.so +%{rsyslog_module_dir_nodeps}/omruleset.so +%{rsyslog_module_dir_nodeps}/omtemplate.so +%{rsyslog_module_dir_nodeps}/omtesting.so +%{rsyslog_module_dir_nodeps}/omstdout.so +%dir %{rsyslog_module_dir_withdeps} %{_mandir}/man5/rsyslog.conf.5* %{_mandir}/man8/rsyslogd.8* %dir %{rsyslogdocdir} @@ -411,7 +483,6 @@ fi %doc %{rsyslogdocdir}/AUTHORS %doc %{rsyslogdocdir}/COPYING %doc %{rsyslogdocdir}/COPYING.LESSER -%dir %{_localstatedir}/run/rsyslog %dir %{_localstatedir}/spool/rsyslog /var/adm/fillup-templates/sysconfig.syslog-rsyslog @@ -420,60 +491,46 @@ fi %dir %{rsyslogdocdir} %doc %{rsyslogdocdir}/doc +%files diag-tools +%defattr(-,root,root) +%{_sbindir}/msggen +%{_sbindir}/rsyslog_diag_hostname +%{_sbindir}/zpipe + %files module-gssapi %defattr(-,root,root) -%if 0%{install_all_modules_in_lib} -%dir %{_libdir}/rsyslog -%{_libdir}/rsyslog/omgssapi.so -%{_libdir}/rsyslog/imgssapi.so -%{_libdir}/rsyslog/lmgssutil.so -%else -%dir %{_prefix}%{_libdir}/rsyslog -%{_prefix}%{_libdir}/rsyslog/omgssapi.so -%{_prefix}%{_libdir}/rsyslog/imgssapi.so -%{_prefix}%{_libdir}/rsyslog/lmgssutil.so -%endif +%{rsyslog_module_dir_withdeps}/omgssapi.so +%{rsyslog_module_dir_withdeps}/imgssapi.so +%{rsyslog_module_dir_withdeps}/lmgssutil.so %files module-mysql %defattr(-,root,root) %doc %{rsyslogdocdir}/mysql-createDB.sql -%if 0%{install_all_modules_in_lib} -%dir %{_libdir}/rsyslog -%{_libdir}/rsyslog/ommysql.so -%else -%dir %{_prefix}%{_libdir}/rsyslog -%{_prefix}%{_libdir}/rsyslog/ommysql.so -%endif +%{rsyslog_module_dir_withdeps}/ommysql.so %files module-pgsql %defattr(-,root,root) %doc %{rsyslogdocdir}/pgsql-createDB.sql -%if 0%{install_all_modules_in_lib} -%dir %{_libdir}/rsyslog -%{_libdir}/rsyslog/ompgsql.so -%else -%dir %{_prefix}%{_libdir}/rsyslog -%{_prefix}%{_libdir}/rsyslog/ompgsql.so -%endif +%{rsyslog_module_dir_withdeps}/ompgsql.so %files module-snmp %defattr(-,root,root) -%if 0%{install_all_modules_in_lib} -%dir %{_libdir}/rsyslog -%{_libdir}/rsyslog/omsnmp.so -%else -%dir %{_prefix}%{_libdir}/rsyslog -%{_prefix}%{_libdir}/rsyslog/omsnmp.so -%endif +%{rsyslog_module_dir_withdeps}/omsnmp.so %files module-gtls %defattr(-,root,root) -%if 0%{install_all_modules_in_lib} -%dir %{_libdir}/rsyslog -%{_libdir}/rsyslog/lmnsd_gtls.so -%else -%dir %{_prefix}%{_libdir}/rsyslog -%{_prefix}%{_libdir}/rsyslog/lmnsd_gtls.so +%{rsyslog_module_dir_withdeps}/lmnsd_gtls.so + +%if %{?with_relp} + +%files module-relp +%defattr(-,root,root) +%{rsyslog_module_dir_withdeps}/imrelp.so +%{rsyslog_module_dir_withdeps}/omrelp.so %endif +%files module-udpspoof +%defattr(-,root,root) +%{rsyslog_module_dir_nodeps}/omudpspoof.so + %changelog diff --git a/rsyslog.xconsole-pipe-loop.patch b/rsyslog.xconsole-pipe-loop.patch new file mode 100644 index 0000000..2949342 --- /dev/null +++ b/rsyslog.xconsole-pipe-loop.patch @@ -0,0 +1,109 @@ + +Fix for: +https://bugzilla.novell.com/show_bug.cgi?id=597293 + +Extracted the bare fix (without ChangeLog and testcase) to test if it +solves the problem from: + +http://bugzilla.adiscon.com/show_bug.cgi?id=186 +http://git.adiscon.com/?p=rsyslog.git;a=commitdiff;h=eec894fbc5eb263e6def1f2e35f9882967c95a88 + +Rainer Gerhards [Mon, 26 Apr 2010 13:19:13 +0000 (15:19 +0200)] + +The rsyslog engine did not guard itself against output modules that do +not properly convey back the tryResume() behaviour. This then leads to +what looks like an endless loop. I consider this to be a bug of the +engine not only because it should be hardened against plugin misbehaviour, +but also because plugins may not be totally able to avoid this situation +(depending on the type of and processing done by the plugin). + + +* Unmerged path ChangeLog +diff --git a/action.c b/action.c +index aaf4559..256ca09 100644 +--- a/action.c ++++ b/action.c +@@ -445,6 +445,7 @@ static void actionCommitted(action_t *pThis) + static void actionRetry(action_t *pThis) + { + actionSetState(pThis, ACT_STATE_RTRY); ++ pThis->iResumeOKinRow++; + } + + +@@ -480,23 +481,39 @@ static inline void actionSuspend(action_t *pThis, time_t ttNow) + /* actually do retry processing. Note that the function receives a timestamp so + * that we do not need to call the (expensive) time() API. + * Note that we do the full retry processing here, doing the configured number of +- * iterations. +- * rgerhards, 2009-05-07 ++ * iterations. -- rgerhards, 2009-05-07 ++ * We need to guard against module which always return RS_RET_OK from their tryResume() ++ * entry point. This is invalid, but has harsh consequences: it will cause the rsyslog ++ * engine to go into a tight loop. That obviously is not acceptable. As such, we track the ++ * count of iterations that a tryResume returning RS_RET_OK is immediately followed by ++ * an unsuccessful call to doAction(). If that happens more than 1,000 times, we assume ++ * the return acutally is a RS_RET_SUSPENDED. In order to go through the various ++ * resumption stages, we do this for every 1000 requests. This magic number 1000 may ++ * not be the most appropriate, but it should be thought of a "if nothing else helps" ++ * kind of facility: in the first place, the module should return a proper indication ++ * of its inability to recover. -- rgerhards, 2010-04-26. + */ + static rsRetVal actionDoRetry(action_t *pThis, time_t ttNow) + { + int iRetries; + int iSleepPeriod; ++ int bTreatOKasSusp; + DEFiRet; + + ASSERT(pThis != NULL); + + iRetries = 0; + while(pThis->eState == ACT_STATE_RTRY) { ++dbgprintf("YYY: resume in row %d\n", pThis->iResumeOKinRow); + iRet = pThis->pMod->tryResume(pThis->pModData); +- if(iRet == RS_RET_OK) { ++ if((pThis->iResumeOKinRow > 999) && (pThis->iResumeOKinRow % 1000 == 0)) { ++ bTreatOKasSusp = 1; ++ } else { ++ bTreatOKasSusp = 0; ++ } ++ if((iRet == RS_RET_OK) && (!bTreatOKasSusp)) { + actionSetState(pThis, ACT_STATE_RDY); +- } else if(iRet == RS_RET_SUSPENDED) { ++ } else if(iRet == RS_RET_SUSPENDED || bTreatOKasSusp) { + /* max retries reached? */ + if((pThis->iResumeRetryCount != -1 && iRetries >= pThis->iResumeRetryCount)) { + actionSuspend(pThis, ttNow); +@@ -715,13 +732,16 @@ actionCallDoAction(action_t *pThis, msg_t *pMsg) + switch(iRet) { + case RS_RET_OK: + actionCommitted(pThis); ++ pThis->iResumeOKinRow = 0; /* we had a successful call! */ + break; + case RS_RET_DEFER_COMMIT: ++ pThis->iResumeOKinRow = 0; /* we had a successful call! */ + /* we are done, action state remains the same */ + break; + case RS_RET_PREVIOUS_COMMITTED: + /* action state remains the same, but we had a commit. */ + pThis->bHadAutoCommit = 1; ++ pThis->iResumeOKinRow = 0; /* we had a successful call! */ + break; + case RS_RET_SUSPENDED: + actionRetry(pThis); +diff --git a/action.h b/action.h +index 6cc4df5..4a6c3c8 100644 +--- a/action.h ++++ b/action.h +@@ -56,8 +56,9 @@ struct action_s { + bool bWriteAllMarkMsgs;/* should all mark msgs be written (not matter how recent the action was executed)? */ + int iSecsExecOnceInterval; /* if non-zero, minimum seconds to wait until action is executed again */ + action_state_t eState; /* current state of action */ +- int bHadAutoCommit; /* did an auto-commit happen during doAction()? */ ++ bool bHadAutoCommit; /* did an auto-commit happen during doAction()? */ + time_t ttResumeRtry; /* when is it time to retry the resume? */ ++ int iResumeOKinRow; /* number of times in a row that resume said OK with an immediate failure following */ + int iResumeInterval;/* resume interval for this action */ + int iResumeRetryCount;/* how often shall we retry a suspended action? (-1 --> eternal) */ + int iNbrResRtry; /* number of retries since last suspend */