diff --git a/SOURCES/rsyslog-7.4.1-sd-service.patch b/SOURCES/rsyslog-7.4.1-sd-service.patch index 69114ed..a9de3a3 100644 --- a/SOURCES/rsyslog-7.4.1-sd-service.patch +++ b/SOURCES/rsyslog-7.4.1-sd-service.patch @@ -1,13 +1,15 @@ diff -up rsyslog-7.4.1/rsyslog.service.in.orig rsyslog-7.4.1/rsyslog.service.in --- rsyslog-7.4.1/rsyslog.service.in.orig 2013-06-17 15:28:54.430023493 +0200 +++ rsyslog-7.4.1/rsyslog.service.in 2013-06-17 15:30:05.874378084 +0200 -@@ -4,7 +4,8 @@ Requires=syslog.socket +@@ -4,7 +4,10 @@ Requires=syslog.socket [Service] Type=notify -ExecStart=@sbindir@/rsyslogd -n +EnvironmentFile=-/etc/sysconfig/rsyslog +ExecStart=@sbindir@/rsyslogd -n $SYSLOGD_OPTIONS ++Restart=on-failure ++UMask=0066 StandardOutput=null [Install] diff --git a/SOURCES/rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch b/SOURCES/rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch deleted file mode 100644 index 9974cf6..0000000 --- a/SOURCES/rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 8e0ac9576056a71dd7ad69157a94d56d433afbf6 Mon Sep 17 00:00:00 2001 -From: Tomas Heinrich -Date: Mon, 20 Jan 2014 16:23:17 +0100 -Subject: [PATCH] imuxsock: don't issue a warning if there are no sockets - configured - ---- - plugins/imuxsock/imuxsock.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c -index df504dd..aadb853 100644 ---- a/plugins/imuxsock/imuxsock.c -+++ b/plugins/imuxsock/imuxsock.c -@@ -1291,6 +1291,10 @@ CODESTARTactivateCnfPrePrivDrop - for(inst = runModConf->root ; inst != NULL ; inst = inst->next) { - addListner(inst); - } -+ if(runModConf->bOmitLocalLogging && nfd == 1) { -+ /* No sockets were configured, no reason to run. */ -+ ABORT_FINALIZE(RS_RET_OK); -+ } - CHKiRet(activateListeners()); - finalize_it: - ENDactivateCnfPrePrivDrop -@@ -1329,6 +1333,10 @@ BEGINrunInput - #endif - - CODESTARTrunInput -+ if(runModConf->bOmitLocalLogging && nfd == 1) { -+ /* No sockets were configured, no reason to run. */ -+ ABORT_FINALIZE(RS_RET_OK); -+ } - /* this is an endless loop - it is terminated when the thread is - * signalled to do so. This, however, is handled by the framework, - * right into the sleep below. --- -1.8.4.3 - diff --git a/SOURCES/rsyslog-7.4.7-bz1254511-ppc64le_bug.patch b/SOURCES/rsyslog-7.4.7-bz1254511-ppc64le_bug.patch new file mode 100644 index 0000000..ee9cbf2 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-bz1254511-ppc64le_bug.patch @@ -0,0 +1,13 @@ +diff -up ./config.guess.ppc64le_bug ./config.guess +--- ./config.guess.ppc64le_bug 2015-08-18 16:19:31.354030831 +0200 ++++ ./config.guess 2015-08-18 16:20:38.573473606 +0200 +@@ -972,6 +972,9 @@ EOF + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; ++ ppc64le:Linux:*:*) ++ echo powerpc64le-unknown-linux-gnu ++ exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; diff --git a/SOURCES/rsyslog-7.4.7-rhbz1078878-division-by-zero.patch b/SOURCES/rsyslog-7.4.7-rhbz1078878-division-by-zero.patch new file mode 100644 index 0000000..834452e --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1078878-division-by-zero.patch @@ -0,0 +1,75 @@ +From 0e95414ab2705649cea323115a618b558c30397f Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Wed, 2 Jul 2014 17:01:09 +0200 +Subject: [PATCH] bugfix: prevent division by zero + +The result is set to 0 in that case. Might be better to do something +else in the future, but at least it'll stop crashing for now. +--- + grammar/rainerscript.c | 29 +++++++++++++++++++++++++---- + 1 file changed, 25 insertions(+), 4 deletions(-) + +diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c +index 25d9c9a..c3365b1 100644 +--- a/grammar/rainerscript.c ++++ b/grammar/rainerscript.c +@@ -1560,6 +1560,17 @@ evalStrArrayCmp(es_str_t *estr_l, struct cnfarray* ar, int cmpop) + ret->d.n = var2Number(&l, &convok_l) x var2Number(&r, &convok_r); \ + FREE_BOTH_RET + ++#define COMP_NUM_BINOP_DIV(x) \ ++ cnfexprEval(expr->l, &l, usrptr); \ ++ cnfexprEval(expr->r, &r, usrptr); \ ++ ret->datatype = 'N'; \ ++ if((ret->d.n = var2Number(&r, &convok_r)) == 0) { \ ++ /* division by zero */ \ ++ } else { \ ++ ret->d.n = var2Number(&l, &convok_l) x ret->d.n; \ ++ } \ ++ FREE_BOTH_RET ++ + /* NOTE: array as right-hand argument MUST be handled by user */ + #define PREP_TWO_STRINGS \ + cnfexprEval(expr->l, &l, usrptr); \ +@@ -1965,10 +1976,10 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr) + COMP_NUM_BINOP(*); + break; + case '/': +- COMP_NUM_BINOP(/); ++ COMP_NUM_BINOP_DIV(/); + break; + case '%': +- COMP_NUM_BINOP(%); ++ COMP_NUM_BINOP_DIV(%); + break; + case 'M': + cnfexprEval(expr->r, &r, usrptr); +@@ -2907,13 +2918,23 @@ cnfexprOptimize(struct cnfexpr *expr) + case '/': + if(getConstNumber(expr, &ln, &rn)) { + expr->nodetype = 'N'; +- ((struct cnfnumval*)expr)->val = ln / rn; ++ if(rn == 0) { ++ /* division by zero */ ++ ((struct cnfnumval*)expr)->val = 0; ++ } else { ++ ((struct cnfnumval*)expr)->val = ln / rn; ++ } + } + break; + case '%': + if(getConstNumber(expr, &ln, &rn)) { + expr->nodetype = 'N'; +- ((struct cnfnumval*)expr)->val = ln % rn; ++ if(rn == 0) { ++ /* division by zero */ ++ ((struct cnfnumval*)expr)->val = 0; ++ } else { ++ ((struct cnfnumval*)expr)->val = ln % rn; ++ } + } + break; + case CMP_NE: +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch b/SOURCES/rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch new file mode 100644 index 0000000..c73d8c5 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch @@ -0,0 +1,175 @@ +From 3d7abc2131bcf4dd2dc21428ea2c7fee6dd7be94 Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Fri, 1 Aug 2014 13:58:10 +0200 +Subject: [PATCH] imjournal: escape zero bytes in fields' values + +--- + plugins/imjournal/imjournal.c | 86 +++++++++++++++++++++++-------------------- + 1 file changed, 46 insertions(+), 40 deletions(-) + +diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c +index b0b034c..b6910e8 100755 +--- a/plugins/imjournal/imjournal.c ++++ b/plugins/imjournal/imjournal.c +@@ -135,6 +135,31 @@ static rsRetVal facilityHdlr(uchar **pp, void *pVal) + } + + ++/* Currently just replaces '\0' with ' '. Not doing so would cause ++ * the value to be truncated. New space is allocated for the resulting ++ * string. ++ */ ++static rsRetVal ++sanitizeValue(const char *in, size_t len, char **out) ++{ ++ char *buf, *p; ++ DEFiRet; ++ ++ CHKmalloc(p = buf = malloc(len + 1)); ++ memcpy(buf, in, len); ++ buf[len] = '\0'; ++ ++ while ((p = memchr(p, '\0', len + buf - p)) != NULL) { ++ *p++ = ' '; ++ } ++ ++ *out = buf; ++ ++finalize_it: ++ RETiRet; ++} ++ ++ + /* enqueue the the journal message into the message queue. + * The provided msg string is not freed - thus must be done + * by the caller. +@@ -195,10 +220,9 @@ readjournal() { + int r; + + /* Information from messages */ +- char *message; +- char *sys_pid; ++ char *message = NULL; + char *sys_iden; +- char *sys_iden_help; ++ char *sys_iden_help = NULL; + + const void *get; + const void *pidget; +@@ -208,8 +232,6 @@ readjournal() { + + const void *equal_sign; + struct json_object *jval; +- char *data; +- char *name; + size_t l; + + long prefixlen = 0; +@@ -221,11 +243,7 @@ readjournal() { + if (sd_journal_get_data(j, "MESSAGE", &get, &length) < 0) { + message = strdup(""); + } else { +- message = strndup(get+8, length-8); +- if (message == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto ret; +- } ++ CHKiRet(sanitizeValue(((const char *)get) + 8, length - 8, &message)); + } + + /* Get message severity ("priority" in journald's terminology) */ +@@ -264,43 +282,36 @@ readjournal() { + + /* Get message identifier, client pid and add ':' */ + if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) { +- sys_iden = strndup(get+18, length-18); ++ CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden)); + } else { +- sys_iden = strdup("journal"); +- } +- if (sys_iden == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto free_message; ++ CHKmalloc(sys_iden = strdup("journal")); + } + + if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { +- sys_pid = strndup(pidget+11, pidlength-11); +- if (sys_pid == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; ++ char *sys_pid; ++ ++ CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) { + free (sys_iden); +- goto free_message; ++ FINALIZE; + } +- } else { +- sys_pid = NULL; +- } +- +- if (sys_pid) { + r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); ++ free (sys_pid); + } else { + r = asprintf(&sys_iden_help, "%s:", sys_iden); + } + + free (sys_iden); +- free (sys_pid); + + if (-1 == r) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto finalize_it; ++ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); + } + + json = json_object_new_object(); + + SD_JOURNAL_FOREACH_DATA(j, get, l) { ++ char *data; ++ char *name; ++ + /* locate equal sign, this is always present */ + equal_sign = memchr(get, '=', l); + +@@ -372,18 +383,13 @@ readjournal() { + break; + } + +- if (name == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; +- goto ret; +- } ++ CHKmalloc(name); + + prefixlen++; /* remove '=' */ + +- data = strndup(get + prefixlen, l - prefixlen); +- if (data == NULL) { +- iRet = RS_RET_OUT_OF_MEMORY; ++ CHKiRet_Hdlr(sanitizeValue(((const char *)get) + prefixlen, l - prefixlen, &data)) { + free (name); +- goto ret; ++ FINALIZE; + } + + /* and save them to json object */ +@@ -403,10 +409,10 @@ readjournal() { + enqMsg((uchar *)message, (uchar *) sys_iden_help, facility, severity, &tv, json); + + finalize_it: +- free(sys_iden_help); +-free_message: +- free(message); +-ret: ++ if (sys_iden_help != NULL) ++ free(sys_iden_help); ++ if (message != NULL) ++ free(message); + RETiRet; + } + +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch b/SOURCES/rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch new file mode 100644 index 0000000..19762fd --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch @@ -0,0 +1,36 @@ +From 9ee4d67c9c833e746ec8b2e5abff03a184eb6b4c Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Tue, 21 Jul 2015 17:50:22 +0200 +Subject: [PATCH] Clarify usage of the SysSock.Use option + +--- + doc/imuxsock.html | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/doc/imuxsock.html b/doc/imuxsock.html +index 123771f..c70f720 100644 +--- a/doc/imuxsock.html ++++ b/doc/imuxsock.html +@@ -71,8 +71,8 @@ is no reason to receive messages from ourselfs. This setting is vital + when writing messages to the Linux journal. See omjournal + module documentation for a more in-depth description. + +-
  • SysSock.Use (imuxsock) [on/off] +-do NOT listen for the local log socket. This is most useful if you run multiple ++
  • SysSock.Use (imuxsock) [on/off] ++Listen on the local log socket. This is most useful if you run multiple + instances of rsyslogd where only one shall handle the system log socket. +
  • +
  • SysSock.Name <name-of-socket> +@@ -259,7 +259,7 @@ the default of "127.0.0.1" is used. +
  • $InputUnixListenSocketUseSysTimeStamp [on/off] equivalent to: UseSysTimeStamp .
    +
  • $SystemLogSocketIgnoreMsgTimestamp [on/off]
    + equivalent to: SysSock.IgnoreTimestamp.
  • +-
  • $OmitLocalLogging (imuxsock) [on/off] equivalent to: SysSock.Use
  • ++
  • $OmitLocalLogging (imuxsock) [on/off] - The inverse of: SysSock.Use.
  • +
  • $SystemLogSocketName <name-of-socket> equivalent to: SysSock.Name
  • +
  • $SystemLogFlowControl [on/off] - equivalent to: SysSock.FlowControl.
  • +
  • $SystemLogUsePIDFromSystem [on/off] - equivalent to: SysSock.UsePIDFromSystem. +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1151037-add-mmcount.patch b/SOURCES/rsyslog-7.4.7-rhbz1151037-add-mmcount.patch new file mode 100644 index 0000000..dbb6ce1 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1151037-add-mmcount.patch @@ -0,0 +1,1179 @@ +diff -Npru a/Makefile.in b/Makefile.in +--- a/Makefile.in 2015-07-07 15:45:08.144516940 +0200 ++++ b/Makefile.in 2015-07-07 15:42:47.027059036 +0200 +@@ -85,8 +85,9 @@ sbin_PROGRAMS = + @ENABLE_MMJSONPARSE_TRUE@am__append_42 = plugins/mmjsonparse + @ENABLE_MMAUDIT_TRUE@am__append_43 = plugins/mmaudit + @ENABLE_MMANON_TRUE@am__append_44 = plugins/mmanon +-@ENABLE_ORACLE_TRUE@am__append_45 = plugins/omoracle +-@ENABLE_GUI_TRUE@am__append_46 = java ++@ENABLE_MMCOUNT_TRUE@am__append_45 = plugins/mmcount ++@ENABLE_ORACLE_TRUE@am__append_46 = plugins/omoracle ++@ENABLE_GUI_TRUE@am__append_47 = java + subdir = . + DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ +@@ -231,7 +232,7 @@ DIST_SUBDIRS = doc compat runtime gramma + plugins/imptcp plugins/imttcp plugins/imdiag plugins/ommail \ + plugins/omprog plugins/im3195 plugins/mmnormalize \ + plugins/mmjsonparse plugins/mmaudit plugins/mmanon \ +- plugins/omoracle java tests ++ plugins/mmcount plugins/omoracle java tests + DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + distdir = $(PACKAGE)-$(VERSION) + top_distdir = $(distdir) +@@ -532,7 +533,7 @@ SUBDIRS = doc compat runtime grammar . p + $(am__append_37) $(am__append_38) $(am__append_39) \ + $(am__append_40) $(am__append_41) $(am__append_42) \ + $(am__append_43) $(am__append_44) $(am__append_45) \ +- $(am__append_46) tests ++ $(am__append_46) $(am__append_47) tests + + # make sure "make distcheck" tries to build all modules. This means that + # a developer must always have an environment where every supporting library +diff -Npru a/configure b/configure +--- a/configure 2015-07-07 15:45:08.149516991 +0200 ++++ b/configure 2015-07-07 15:42:47.036059129 +0200 +@@ -690,6 +690,8 @@ ENABLE_RELP_FALSE + ENABLE_RELP_TRUE + RELP_LIBS + RELP_CFLAGS ++ENABLE_MMCOUNT_FALSE ++ENABLE_MMCOUNT_TRUE + ENABLE_MMANON_FALSE + ENABLE_MMANON_TRUE + ENABLE_MMAUDIT_FALSE +@@ -977,6 +979,7 @@ enable_mmnormalize + enable_mmjsonparse + enable_mmaudit + enable_mmanon ++enable_mmcount + enable_relp + enable_guardtime + enable_cached_man_pages +@@ -1722,6 +1725,7 @@ Optional Features: + --enable-mmjsonparse Enable building mmjsonparse support [default=no] + --enable-mmaudit Enable building mmaudit support [default=no] + --enable-mmanon Enable building mmanon support [default=no] ++ --enable-mmcount Enable message counting [default=no] + --enable-relp Enable RELP support [default=no] + --enable-guardtime Enable log file signing support (via GuardTime) + [default=no] +@@ -18311,6 +18315,29 @@ fi + + + ++# mmcount ++# Check whether --enable-mmcount was given. ++if test "${enable_mmcount+set}" = set; then : ++ enableval=$enable_mmcount; case "${enableval}" in ++ yes) enable_mmcount="yes" ;; ++ no) enable_mmcount="no" ;; ++ *) as_fn_error $? "bad value ${enableval} for --enable-mmcount" "$LINENO" 5 ;; ++ esac ++else ++ enable_mmcount=no ++ ++fi ++ ++ if test x$enable_mmcount = xyes; then ++ ENABLE_MMCOUNT_TRUE= ++ ENABLE_MMCOUNT_FALSE='#' ++else ++ ENABLE_MMCOUNT_TRUE='#' ++ ENABLE_MMCOUNT_FALSE= ++fi ++ ++ ++ + # RELP support + # Check whether --enable-relp was given. + if test "${enable_relp+set}" = set; then : +@@ -19974,7 +20001,7 @@ fi + + # END HIREDIS SUPPORT + +-ac_config_files="$ac_config_files Makefile runtime/Makefile compat/Makefile grammar/Makefile tools/Makefile doc/Makefile plugins/imudp/Makefile plugins/imtcp/Makefile plugins/im3195/Makefile plugins/imgssapi/Makefile plugins/imuxsock/Makefile plugins/imjournal/Makefile plugins/immark/Makefile plugins/imklog/Makefile plugins/imkmsg/Makefile plugins/omhdfs/Makefile plugins/omprog/Makefile plugins/omstdout/Makefile plugins/omjournal/Makefile plugins/pmrfc3164sd/Makefile plugins/pmlastmsg/Makefile plugins/pmcisconames/Makefile plugins/pmsnare/Makefile plugins/pmaixforwardedfrom/Makefile plugins/omruleset/Makefile plugins/omuxsock/Makefile plugins/imfile/Makefile plugins/imsolaris/Makefile plugins/imptcp/Makefile plugins/imttcp/Makefile plugins/impstats/Makefile plugins/imrelp/Makefile plugins/imdiag/Makefile plugins/imzmq3/Makefile plugins/omtesting/Makefile plugins/omgssapi/Makefile plugins/ommysql/Makefile plugins/ompgsql/Makefile plugins/omrelp/Makefile plugins/omlibdbi/Makefile plugins/ommail/Makefile plugins/omsnmp/Makefile plugins/omoracle/Makefile plugins/omudpspoof/Makefile plugins/ommongodb/Makefile plugins/omhiredis/Makefile plugins/omzmq3/Makefile plugins/omrabbitmq/Makefile plugins/mmnormalize/Makefile plugins/mmjsonparse/Makefile plugins/mmaudit/Makefile plugins/mmanon/Makefile plugins/omelasticsearch/Makefile plugins/sm_cust_bindcdr/Makefile plugins/mmsnmptrapd/Makefile java/Makefile tests/Makefile" ++ac_config_files="$ac_config_files Makefile runtime/Makefile compat/Makefile grammar/Makefile tools/Makefile doc/Makefile plugins/imudp/Makefile plugins/imtcp/Makefile plugins/im3195/Makefile plugins/imgssapi/Makefile plugins/imuxsock/Makefile plugins/imjournal/Makefile plugins/immark/Makefile plugins/imklog/Makefile plugins/imkmsg/Makefile plugins/omhdfs/Makefile plugins/omprog/Makefile plugins/omstdout/Makefile plugins/omjournal/Makefile plugins/pmrfc3164sd/Makefile plugins/pmlastmsg/Makefile plugins/pmcisconames/Makefile plugins/pmsnare/Makefile plugins/pmaixforwardedfrom/Makefile plugins/omruleset/Makefile plugins/omuxsock/Makefile plugins/imfile/Makefile plugins/imsolaris/Makefile plugins/imptcp/Makefile plugins/imttcp/Makefile plugins/impstats/Makefile plugins/imrelp/Makefile plugins/imdiag/Makefile plugins/imzmq3/Makefile plugins/omtesting/Makefile plugins/omgssapi/Makefile plugins/ommysql/Makefile plugins/ompgsql/Makefile plugins/omrelp/Makefile plugins/omlibdbi/Makefile plugins/ommail/Makefile plugins/omsnmp/Makefile plugins/omoracle/Makefile plugins/omudpspoof/Makefile plugins/ommongodb/Makefile plugins/omhiredis/Makefile plugins/omzmq3/Makefile plugins/omrabbitmq/Makefile plugins/mmnormalize/Makefile plugins/mmjsonparse/Makefile plugins/mmaudit/Makefile plugins/mmanon/Makefile plugins/omelasticsearch/Makefile plugins/sm_cust_bindcdr/Makefile plugins/mmsnmptrapd/Makefile plugins/mmcount/Makefile java/Makefile tests/Makefile" + + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure +@@ -20241,6 +20291,10 @@ if test -z "${ENABLE_MMANON_TRUE}" && te + as_fn_error $? "conditional \"ENABLE_MMANON\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${ENABLE_MMCOUNT_TRUE}" && test -z "${ENABLE_MMCOUNT_FALSE}"; then ++ as_fn_error $? "conditional \"ENABLE_MMCOUNT\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${ENABLE_RELP_TRUE}" && test -z "${ENABLE_RELP_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_RELP\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 +@@ -21296,6 +21327,7 @@ do + "plugins/omelasticsearch/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/omelasticsearch/Makefile" ;; + "plugins/sm_cust_bindcdr/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/sm_cust_bindcdr/Makefile" ;; + "plugins/mmsnmptrapd/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/mmsnmptrapd/Makefile" ;; ++ "plugins/mmcount/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/mmcount/Makefile" ;; + "java/Makefile") CONFIG_FILES="$CONFIG_FILES java/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + +@@ -22673,6 +22705,7 @@ echo " uuid support enabled: + echo " Log file signing support: $enable_guardtime" + echo " Log file encryption support: $enable_libgcrypt" + echo " anonymization support enabled: $enable_mmanon" ++echo " message counting support enabled: $enable_mmcount" + echo + echo "---{ input plugins }---" + echo " Klog functionality enabled: $enable_klog ($os_type)" +diff -Npru a/plugins/mmcount/Makefile.in b/plugins/mmcount/Makefile.in +--- a/plugins/mmcount/Makefile.in 1970-01-01 01:00:00.000000000 +0100 ++++ b/plugins/mmcount/Makefile.in 2015-07-07 15:42:47.057059346 +0200 +@@ -0,0 +1,702 @@ ++# Makefile.in generated by automake 1.13.4 from Makefile.am. ++# @configure_input@ ++ ++# Copyright (C) 1994-2013 Free Software Foundation, Inc. ++ ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++@SET_MAKE@ ++ ++VPATH = @srcdir@ ++am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' ++am__make_running_with_option = \ ++ case $${target_option-} in \ ++ ?) ;; \ ++ *) echo "am__make_running_with_option: internal error: invalid" \ ++ "target option '$${target_option-}' specified" >&2; \ ++ exit 1;; \ ++ esac; \ ++ has_opt=no; \ ++ sane_makeflags=$$MAKEFLAGS; \ ++ if $(am__is_gnu_make); then \ ++ sane_makeflags=$$MFLAGS; \ ++ else \ ++ case $$MAKEFLAGS in \ ++ *\\[\ \ ]*) \ ++ bs=\\; \ ++ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ ++ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ ++ esac; \ ++ fi; \ ++ skip_next=no; \ ++ strip_trailopt () \ ++ { \ ++ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ ++ }; \ ++ for flg in $$sane_makeflags; do \ ++ test $$skip_next = yes && { skip_next=no; continue; }; \ ++ case $$flg in \ ++ *=*|--*) continue;; \ ++ -*I) strip_trailopt 'I'; skip_next=yes;; \ ++ -*I?*) strip_trailopt 'I';; \ ++ -*O) strip_trailopt 'O'; skip_next=yes;; \ ++ -*O?*) strip_trailopt 'O';; \ ++ -*l) strip_trailopt 'l'; skip_next=yes;; \ ++ -*l?*) strip_trailopt 'l';; \ ++ -[dEDm]) skip_next=yes;; \ ++ -[JT]) skip_next=yes;; \ ++ esac; \ ++ case $$flg in \ ++ *$$target_option*) has_opt=yes; break;; \ ++ esac; \ ++ done; \ ++ test $$has_opt = yes ++am__make_dryrun = (target_option=n; $(am__make_running_with_option)) ++am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkglibexecdir = $(libexecdir)/@PACKAGE@ ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_triplet = @build@ ++host_triplet = @host@ ++subdir = plugins/mmcount ++DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ ++ $(top_srcdir)/depcomp ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/m4/atomic_operations.m4 \ ++ $(top_srcdir)/m4/atomic_operations_64bit.m4 \ ++ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ ++ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ ++ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(install_sh) -d ++CONFIG_HEADER = $(top_builddir)/config.h ++CONFIG_CLEAN_FILES = ++CONFIG_CLEAN_VPATH_FILES = ++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; ++am__vpath_adj = case $$p in \ ++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ ++ *) f=$$p;; \ ++ esac; ++am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; ++am__install_max = 40 ++am__nobase_strip_setup = \ ++ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` ++am__nobase_strip = \ ++ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" ++am__nobase_list = $(am__nobase_strip_setup); \ ++ for p in $$list; do echo "$$p $$p"; done | \ ++ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ ++ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ ++ if (++n[$$2] == $(am__install_max)) \ ++ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ ++ END { for (dir in files) print dir, files[dir] }' ++am__base_list = \ ++ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ ++ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' ++am__uninstall_files_from_dir = { \ ++ test -z "$$files" \ ++ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ ++ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ ++ $(am__cd) "$$dir" && rm -f $$files; }; \ ++ } ++am__installdirs = "$(DESTDIR)$(pkglibdir)" ++LTLIBRARIES = $(pkglib_LTLIBRARIES) ++mmcount_la_DEPENDENCIES = ++am_mmcount_la_OBJECTS = mmcount_la-mmcount.lo ++mmcount_la_OBJECTS = $(am_mmcount_la_OBJECTS) ++AM_V_lt = $(am__v_lt_@AM_V@) ++am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) ++am__v_lt_0 = --silent ++am__v_lt_1 = ++mmcount_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ ++ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++ $(mmcount_la_LDFLAGS) $(LDFLAGS) -o $@ ++AM_V_P = $(am__v_P_@AM_V@) ++am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) ++am__v_P_0 = false ++am__v_P_1 = : ++AM_V_GEN = $(am__v_GEN_@AM_V@) ++am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) ++am__v_GEN_0 = @echo " GEN " $@; ++am__v_GEN_1 = ++AM_V_at = $(am__v_at_@AM_V@) ++am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) ++am__v_at_0 = @ ++am__v_at_1 = ++DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) ++depcomp = $(SHELL) $(top_srcdir)/depcomp ++am__depfiles_maybe = depfiles ++am__mv = mv -f ++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ ++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ ++ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ ++ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ ++ $(AM_CFLAGS) $(CFLAGS) ++AM_V_CC = $(am__v_CC_@AM_V@) ++am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) ++am__v_CC_0 = @echo " CC " $@; ++am__v_CC_1 = ++CCLD = $(CC) ++LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ ++ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++ $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++AM_V_CCLD = $(am__v_CCLD_@AM_V@) ++am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) ++am__v_CCLD_0 = @echo " CCLD " $@; ++am__v_CCLD_1 = ++SOURCES = $(mmcount_la_SOURCES) ++DIST_SOURCES = $(mmcount_la_SOURCES) ++am__can_run_installinfo = \ ++ case $$AM_UPDATE_INFO_DIR in \ ++ n|no|NO) false;; \ ++ *) (install-info --version) >/dev/null 2>&1;; \ ++ esac ++am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) ++# Read a list of newline-separated strings from the standard input, ++# and print each of them once, without duplicates. Input order is ++# *not* preserved. ++am__uniquify_input = $(AWK) '\ ++ BEGIN { nonempty = 0; } \ ++ { items[$$0] = 1; nonempty = 1; } \ ++ END { if (nonempty) { for (i in items) print i; }; } \ ++' ++# Make sure the list of sources is unique. This is necessary because, ++# e.g., the same source file might be shared among _SOURCES variables ++# for different programs/libraries. ++am__define_uniq_tagged_files = \ ++ list='$(am__tagged_files)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | $(am__uniquify_input)` ++ETAGS = etags ++CTAGS = ctags ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ACLOCAL = @ACLOCAL@ ++AMTAR = @AMTAR@ ++AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ++AR = @AR@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ ++AWK = @AWK@ ++CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ ++CURL_CFLAGS = @CURL_CFLAGS@ ++CURL_LIBS = @CURL_LIBS@ ++CYGPATH_W = @CYGPATH_W@ ++CZMQ_CFLAGS = @CZMQ_CFLAGS@ ++CZMQ_LIBS = @CZMQ_LIBS@ ++DEFS = @DEFS@ ++DEPDIR = @DEPDIR@ ++DLLTOOL = @DLLTOOL@ ++DL_LIBS = @DL_LIBS@ ++DSYMUTIL = @DSYMUTIL@ ++DUMPBIN = @DUMPBIN@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++EXEEXT = @EXEEXT@ ++FGREP = @FGREP@ ++GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ ++GNUTLS_LIBS = @GNUTLS_LIBS@ ++GREP = @GREP@ ++GSS_LIBS = @GSS_LIBS@ ++GUARDTIME_CFLAGS = @GUARDTIME_CFLAGS@ ++GUARDTIME_LIBS = @GUARDTIME_LIBS@ ++HAVE_LIBGCRYPT_CONFIG = @HAVE_LIBGCRYPT_CONFIG@ ++HAVE_MYSQL_CONFIG = @HAVE_MYSQL_CONFIG@ ++HAVE_ORACLE_CONFIG = @HAVE_ORACLE_CONFIG@ ++HAVE_PGSQL_CONFIG = @HAVE_PGSQL_CONFIG@ ++HIREDIS_CFLAGS = @HIREDIS_CFLAGS@ ++HIREDIS_LIBS = @HIREDIS_LIBS@ ++IMUDP_LIBS = @IMUDP_LIBS@ ++INSTALL = @INSTALL@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++JSON_C_CFLAGS = @JSON_C_CFLAGS@ ++JSON_C_LIBS = @JSON_C_LIBS@ ++LD = @LD@ ++LDFLAGS = @LDFLAGS@ ++LEX = @LEX@ ++LEXLIB = @LEXLIB@ ++LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ ++LIBDBI_CFLAGS = @LIBDBI_CFLAGS@ ++LIBDBI_LIBS = @LIBDBI_LIBS@ ++LIBEE_CFLAGS = @LIBEE_CFLAGS@ ++LIBEE_LIBS = @LIBEE_LIBS@ ++LIBESTR_CFLAGS = @LIBESTR_CFLAGS@ ++LIBESTR_LIBS = @LIBESTR_LIBS@ ++LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ ++LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ ++LIBLOGGING_CFLAGS = @LIBLOGGING_CFLAGS@ ++LIBLOGGING_LIBS = @LIBLOGGING_LIBS@ ++LIBLOGNORM_CFLAGS = @LIBLOGNORM_CFLAGS@ ++LIBLOGNORM_LIBS = @LIBLOGNORM_LIBS@ ++LIBM = @LIBM@ ++LIBMONGO_CLIENT_CFLAGS = @LIBMONGO_CLIENT_CFLAGS@ ++LIBMONGO_CLIENT_LIBS = @LIBMONGO_CLIENT_LIBS@ ++LIBOBJS = @LIBOBJS@ ++LIBS = @LIBS@ ++LIBSYSTEMD_JOURNAL_CFLAGS = @LIBSYSTEMD_JOURNAL_CFLAGS@ ++LIBSYSTEMD_JOURNAL_LIBS = @LIBSYSTEMD_JOURNAL_LIBS@ ++LIBTOOL = @LIBTOOL@ ++LIBUUID_CFLAGS = @LIBUUID_CFLAGS@ ++LIBUUID_LIBS = @LIBUUID_LIBS@ ++LIPO = @LIPO@ ++LN_S = @LN_S@ ++LTLIBOBJS = @LTLIBOBJS@ ++MAKEINFO = @MAKEINFO@ ++MANIFEST_TOOL = @MANIFEST_TOOL@ ++MKDIR_P = @MKDIR_P@ ++MYSQL_CFLAGS = @MYSQL_CFLAGS@ ++MYSQL_LIBS = @MYSQL_LIBS@ ++NM = @NM@ ++NMEDIT = @NMEDIT@ ++OBJDUMP = @OBJDUMP@ ++OBJEXT = @OBJEXT@ ++ORACLE_CFLAGS = @ORACLE_CFLAGS@ ++ORACLE_LIBS = @ORACLE_LIBS@ ++OTOOL = @OTOOL@ ++OTOOL64 = @OTOOL64@ ++PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_URL = @PACKAGE_URL@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ ++PGSQL_CFLAGS = @PGSQL_CFLAGS@ ++PGSQL_LIBS = @PGSQL_LIBS@ ++PKG_CONFIG = @PKG_CONFIG@ ++PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ ++PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ ++PTHREADS_CFLAGS = @PTHREADS_CFLAGS@ ++PTHREADS_LIBS = @PTHREADS_LIBS@ ++RABBITMQ_CFLAGS = @RABBITMQ_CFLAGS@ ++RABBITMQ_LIBS = @RABBITMQ_LIBS@ ++RANLIB = @RANLIB@ ++RELP_CFLAGS = @RELP_CFLAGS@ ++RELP_LIBS = @RELP_LIBS@ ++RSRT_CFLAGS = @RSRT_CFLAGS@ ++RSRT_CFLAGS1 = @RSRT_CFLAGS1@ ++RSRT_LIBS = @RSRT_LIBS@ ++RSRT_LIBS1 = @RSRT_LIBS1@ ++RST2MAN = @RST2MAN@ ++RT_LIBS = @RT_LIBS@ ++SED = @SED@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ ++SNMP_CFLAGS = @SNMP_CFLAGS@ ++SNMP_LIBS = @SNMP_LIBS@ ++SOL_LIBS = @SOL_LIBS@ ++STRIP = @STRIP@ ++UDPSPOOF_CFLAGS = @UDPSPOOF_CFLAGS@ ++UDPSPOOF_LIBS = @UDPSPOOF_LIBS@ ++VERSION = @VERSION@ ++YACC = @YACC@ ++YFLAGS = @YFLAGS@ ++ZLIB_LIBS = @ZLIB_LIBS@ ++abs_builddir = @abs_builddir@ ++abs_srcdir = @abs_srcdir@ ++abs_top_builddir = @abs_top_builddir@ ++abs_top_srcdir = @abs_top_srcdir@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ++am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ ++am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ ++builddir = @builddir@ ++datadir = @datadir@ ++datarootdir = @datarootdir@ ++docdir = @docdir@ ++dvidir = @dvidir@ ++exec_prefix = @exec_prefix@ ++have_valgrind = @have_valgrind@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++htmldir = @htmldir@ ++includedir = @includedir@ ++infodir = @infodir@ ++install_sh = @install_sh@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localedir = @localedir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++mkdir_p = @mkdir_p@ ++moddirs = @moddirs@ ++oldincludedir = @oldincludedir@ ++pdfdir = @pdfdir@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++psdir = @psdir@ ++sbindir = @sbindir@ ++sharedstatedir = @sharedstatedir@ ++srcdir = @srcdir@ ++sysconfdir = @sysconfdir@ ++systemdsystemunitdir = @systemdsystemunitdir@ ++target_alias = @target_alias@ ++top_build_prefix = @top_build_prefix@ ++top_builddir = @top_builddir@ ++top_srcdir = @top_srcdir@ ++pkglib_LTLIBRARIES = mmcount.la ++mmcount_la_SOURCES = mmcount.c ++mmcount_la_CPPFLAGS = $(RSRT_CFLAGS) $(PTHREADS_CFLAGS) ++mmcount_la_LDFLAGS = -module -avoid-version ++mmcount_la_LIBADD = ++EXTRA_DIST = ++all: all-am ++ ++.SUFFIXES: ++.SUFFIXES: .c .lo .o .obj ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(am__aclocal_m4_deps): ++ ++install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) ++ @$(NORMAL_INSTALL) ++ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ ++ list2=; for p in $$list; do \ ++ if test -f $$p; then \ ++ list2="$$list2 $$p"; \ ++ else :; fi; \ ++ done; \ ++ test -z "$$list2" || { \ ++ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ ++ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ ++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ ++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ ++ } ++ ++uninstall-pkglibLTLIBRARIES: ++ @$(NORMAL_UNINSTALL) ++ @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ ++ for p in $$list; do \ ++ $(am__strip_dir) \ ++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ ++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ ++ done ++ ++clean-pkglibLTLIBRARIES: ++ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) ++ @list='$(pkglib_LTLIBRARIES)'; \ ++ locs=`for p in $$list; do echo $$p; done | \ ++ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ ++ sort -u`; \ ++ test -z "$$locs" || { \ ++ echo rm -f $${locs}; \ ++ rm -f $${locs}; \ ++ } ++ ++mmcount.la: $(mmcount_la_OBJECTS) $(mmcount_la_DEPENDENCIES) $(EXTRA_mmcount_la_DEPENDENCIES) ++ $(AM_V_CCLD)$(mmcount_la_LINK) -rpath $(pkglibdir) $(mmcount_la_OBJECTS) $(mmcount_la_LIBADD) $(LIBS) ++ ++mostlyclean-compile: ++ -rm -f *.$(OBJEXT) ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmcount_la-mmcount.Plo@am__quote@ ++ ++.c.o: ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< ++ ++.c.obj: ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ++ ++.c.lo: ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< ++ ++mmcount_la-mmcount.lo: mmcount.c ++@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mmcount_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mmcount_la-mmcount.lo -MD -MP -MF $(DEPDIR)/mmcount_la-mmcount.Tpo -c -o mmcount_la-mmcount.lo `test -f 'mmcount.c' || echo '$(srcdir)/'`mmcount.c ++@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mmcount_la-mmcount.Tpo $(DEPDIR)/mmcount_la-mmcount.Plo ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mmcount.c' object='mmcount_la-mmcount.lo' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mmcount_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mmcount_la-mmcount.lo `test -f 'mmcount.c' || echo '$(srcdir)/'`mmcount.c ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++ID: $(am__tagged_files) ++ $(am__define_uniq_tagged_files); mkid -fID $$unique ++tags: tags-am ++TAGS: tags ++ ++tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) ++ set x; \ ++ here=`pwd`; \ ++ $(am__define_uniq_tagged_files); \ ++ shift; \ ++ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ if test $$# -gt 0; then \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ "$$@" $$unique; \ ++ else \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$unique; \ ++ fi; \ ++ fi ++ctags: ctags-am ++ ++CTAGS: ctags ++ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) ++ $(am__define_uniq_tagged_files); \ ++ test -z "$(CTAGS_ARGS)$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && $(am__cd) $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) "$$here" ++cscopelist: cscopelist-am ++ ++cscopelist-am: $(am__tagged_files) ++ list='$(am__tagged_files)'; \ ++ case "$(srcdir)" in \ ++ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ ++ *) sdir=$(subdir)/$(srcdir) ;; \ ++ esac; \ ++ for i in $$list; do \ ++ if test -f "$$i"; then \ ++ echo "$(subdir)/$$i"; \ ++ else \ ++ echo "$$sdir/$$i"; \ ++ fi; \ ++ done >> $(top_builddir)/cscope.files ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ ++ list='$(DISTFILES)'; \ ++ dist_files=`for file in $$list; do echo $$file; done | \ ++ sed -e "s|^$$srcdirstrip/||;t" \ ++ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ ++ case $$dist_files in \ ++ */*) $(MKDIR_P) `echo "$$dist_files" | \ ++ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ ++ sort -u` ;; \ ++ esac; \ ++ for file in $$dist_files; do \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ if test -d $$d/$$file; then \ ++ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test -d "$(distdir)/$$file"; then \ ++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ ++ fi; \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ ++ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ ++ fi; \ ++ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ ++ else \ ++ test -f "$(distdir)/$$file" \ ++ || cp -p $$d/$$file "$(distdir)/$$file" \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-am ++all-am: Makefile $(LTLIBRARIES) ++installdirs: ++ for dir in "$(DESTDIR)$(pkglibdir)"; do \ ++ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ ++ done ++install: install-am ++install-exec: install-exec-am ++install-data: install-data-am ++uninstall: uninstall-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-am ++install-strip: ++ if test -z '$(STRIP)'; then \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ install; \ ++ else \ ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ ++ fi ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) ++ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++clean: clean-am ++ ++clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ ++ mostlyclean-am ++ ++distclean: distclean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-tags ++ ++dvi: dvi-am ++ ++dvi-am: ++ ++html: html-am ++ ++html-am: ++ ++info: info-am ++ ++info-am: ++ ++install-data-am: ++ ++install-dvi: install-dvi-am ++ ++install-dvi-am: ++ ++install-exec-am: install-pkglibLTLIBRARIES ++ ++install-html: install-html-am ++ ++install-html-am: ++ ++install-info: install-info-am ++ ++install-info-am: ++ ++install-man: ++ ++install-pdf: install-pdf-am ++ ++install-pdf-am: ++ ++install-ps: install-ps-am ++ ++install-ps-am: ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-am ++ ++mostlyclean-am: mostlyclean-compile mostlyclean-generic \ ++ mostlyclean-libtool ++ ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ ++uninstall-am: uninstall-pkglibLTLIBRARIES ++ ++.MAKE: install-am install-strip ++ ++.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ ++ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ++ ctags-am distclean distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags distdir dvi dvi-am html \ ++ html-am info info-am install install-am install-data \ ++ install-data-am install-dvi install-dvi-am install-exec \ ++ install-exec-am install-html install-html-am install-info \ ++ install-info-am install-man install-pdf install-pdf-am \ ++ install-pkglibLTLIBRARIES install-ps install-ps-am \ ++ install-strip installcheck installcheck-am installdirs \ ++ maintainer-clean maintainer-clean-generic mostlyclean \ ++ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ ++ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ ++ uninstall-pkglibLTLIBRARIES ++ ++ ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -Npru a/plugins/mmcount/mmcount.c b/plugins/mmcount/mmcount.c +--- a/plugins/mmcount/mmcount.c 1970-01-01 01:00:00.000000000 +0100 ++++ b/plugins/mmcount/mmcount.c 2015-07-07 15:42:47.057059346 +0200 +@@ -0,0 +1,342 @@ ++/* mmcount.c ++ * count messages by priority or json property of given app-name. ++ * ++ * Copyright 2013 Red Hat Inc. ++ * ++ * This file is part of rsyslog. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * -or- ++ * see COPYING.ASL20 in the source distribution ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++#include "config.h" ++#include "rsyslog.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "conf.h" ++#include "syslogd-types.h" ++#include "srUtils.h" ++#include "template.h" ++#include "module-template.h" ++#include "errmsg.h" ++#include "hashtable.h" ++ ++#define JSON_COUNT_NAME "!mmcount" ++#define SEVERITY_COUNT 8 ++ ++MODULE_TYPE_OUTPUT ++MODULE_TYPE_NOKEEP ++MODULE_CNFNAME("mmcount") ++ ++ ++DEFobjCurrIf(errmsg); ++DEF_OMOD_STATIC_DATA ++ ++/* config variables */ ++ ++typedef struct _instanceData { ++ char *pszAppName; ++ int severity[SEVERITY_COUNT]; ++ char *pszKey; ++ char *pszValue; ++ int valueCounter; ++ struct hashtable *ht; ++} instanceData; ++ ++struct modConfData_s { ++ rsconf_t *pConf; /* our overall config object */ ++}; ++static modConfData_t *loadModConf = NULL;/* modConf ptr to use for the current load process */ ++static modConfData_t *runModConf = NULL;/* modConf ptr to use for the current exec process */ ++ ++ ++/* tables for interfacing with the v6 config system */ ++/* action (instance) parameters */ ++static struct cnfparamdescr actpdescr[] = { ++ { "appname", eCmdHdlrGetWord, 0 }, ++ { "key", eCmdHdlrGetWord, 0 }, ++ { "value", eCmdHdlrGetWord, 0 }, ++}; ++static struct cnfparamblk actpblk = ++ { CNFPARAMBLK_VERSION, ++ sizeof(actpdescr)/sizeof(struct cnfparamdescr), ++ actpdescr ++ }; ++ ++BEGINbeginCnfLoad ++CODESTARTbeginCnfLoad ++ loadModConf = pModConf; ++ pModConf->pConf = pConf; ++ENDbeginCnfLoad ++ ++BEGINendCnfLoad ++CODESTARTendCnfLoad ++ENDendCnfLoad ++ ++BEGINcheckCnf ++CODESTARTcheckCnf ++ENDcheckCnf ++ ++BEGINactivateCnf ++CODESTARTactivateCnf ++ runModConf = pModConf; ++ENDactivateCnf ++ ++BEGINfreeCnf ++CODESTARTfreeCnf ++ENDfreeCnf ++ ++ ++BEGINcreateInstance ++CODESTARTcreateInstance ++ENDcreateInstance ++ ++ ++BEGINisCompatibleWithFeature ++CODESTARTisCompatibleWithFeature ++ENDisCompatibleWithFeature ++ ++ ++BEGINfreeInstance ++CODESTARTfreeInstance ++ENDfreeInstance ++ ++ ++static inline void ++setInstParamDefaults(instanceData *pData) ++{ ++ int i; ++ ++ pData->pszAppName = NULL; ++ for (i = 0; i < SEVERITY_COUNT; i++) ++ pData->severity[i] = 0; ++ pData->pszKey = NULL; ++ pData->pszValue = NULL; ++ pData->valueCounter = 0; ++ pData->ht = NULL; ++} ++ ++static unsigned int ++hash_from_key_fn(void *k) ++{ ++ return *(unsigned int *)k; ++} ++ ++static int ++key_equals_fn(void *k1, void *k2) ++{ ++ return (*(unsigned int *)k1 == *(unsigned int *)k2); ++} ++ ++BEGINnewActInst ++ struct cnfparamvals *pvals; ++ int i; ++CODESTARTnewActInst ++ DBGPRINTF("newActInst (mmcount)\n"); ++ if((pvals = nvlstGetParams(lst, &actpblk, NULL)) == NULL) { ++ ABORT_FINALIZE(RS_RET_MISSING_CNFPARAMS); ++ } ++ ++ CODE_STD_STRING_REQUESTnewActInst(1) ++ CHKiRet(OMSRsetEntry(*ppOMSR, 0, NULL, OMSR_TPL_AS_MSG)); ++ CHKiRet(createInstance(&pData)); ++ setInstParamDefaults(pData); ++ ++ for(i = 0 ; i < actpblk.nParams ; ++i) { ++ if(!pvals[i].bUsed) ++ continue; ++ if(!strcmp(actpblk.descr[i].name, "appname")) { ++ pData->pszAppName = es_str2cstr(pvals[i].val.d.estr, NULL); ++ continue; ++ } ++ if(!strcmp(actpblk.descr[i].name, "key")) { ++ pData->pszKey = es_str2cstr(pvals[i].val.d.estr, NULL); ++ continue; ++ } ++ if(!strcmp(actpblk.descr[i].name, "value")) { ++ pData->pszValue = es_str2cstr(pvals[i].val.d.estr, NULL); ++ continue; ++ } ++ dbgprintf("mmcount: program error, non-handled " ++ "param '%s'\n", actpblk.descr[i].name); ++ } ++ ++ if(pData->pszAppName == NULL) { ++ dbgprintf("mmcount: action requires a appname"); ++ ABORT_FINALIZE(RS_RET_MISSING_CNFPARAMS); ++ } ++ ++ if(pData->pszKey != NULL && pData->pszValue == NULL) { ++ if(NULL == (pData->ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, NULL))) { ++ DBGPRINTF("mmcount: error creating hash table!\n"); ++ ABORT_FINALIZE(RS_RET_ERR); ++ } ++ } ++CODE_STD_FINALIZERnewActInst ++ cnfparamvalsDestruct(pvals, &actpblk); ++ENDnewActInst ++ ++ ++BEGINdbgPrintInstInfo ++CODESTARTdbgPrintInstInfo ++ENDdbgPrintInstInfo ++ ++ ++BEGINtryResume ++CODESTARTtryResume ++ENDtryResume ++ ++static int * ++getCounter(struct hashtable *ht, char *str) { ++ unsigned int key; ++ int *pCounter; ++ unsigned int *pKey; ++ ++ /* we dont store str as key, instead we store hash of the str ++ as key to reduce memory usage */ ++ key = hash_from_string(str); ++ pCounter = hashtable_search(ht, &key); ++ if(pCounter) { ++ return pCounter; ++ } ++ ++ /* counter is not found for the str, so add new entry and ++ return the counter */ ++ if(NULL == (pKey = (unsigned int*)malloc(sizeof(unsigned int)))) { ++ DBGPRINTF("mmcount: memory allocation for key failed\n"); ++ return NULL; ++ } ++ *pKey = key; ++ ++ if(NULL == (pCounter = (int*)malloc(sizeof(int)))) { ++ DBGPRINTF("mmcount: memory allocation for value failed\n"); ++ free(pKey); ++ return NULL; ++ } ++ *pCounter = 0; ++ ++ if(!hashtable_insert(ht, pKey, pCounter)) { ++ DBGPRINTF("mmcount: inserting element into hashtable failed\n"); ++ free(pKey); ++ free(pCounter); ++ return NULL; ++ } ++ return pCounter; ++} ++ ++BEGINdoAction ++ msg_t *pMsg; ++ char *appname; ++ struct json_object *json = NULL; ++ es_str_t *estr = NULL; ++ struct json_object *keyjson = NULL; ++ char *pszValue; ++ int *pCounter; ++CODESTARTdoAction ++ pMsg = (msg_t*) ppString[0]; ++ appname = getAPPNAME(pMsg, LOCK_MUTEX); ++ ++ if(0 != strcmp(appname, pData->pszAppName)) { ++ /* we are not working for this appname. nothing to do */ ++ ABORT_FINALIZE(RS_RET_OK); ++ } ++ ++ if(!pData->pszKey) { ++ /* no key given for count, so we count severity */ ++ if(pMsg->iSeverity < SEVERITY_COUNT) { ++ pData->severity[pMsg->iSeverity]++; ++ json = json_object_new_int(pData->severity[pMsg->iSeverity]); ++ } ++ ABORT_FINALIZE(RS_RET_OK); ++ } ++ ++ /* key is given, so get the property json */ ++ estr = es_newStrFromBuf(pData->pszKey, strlen(pData->pszKey)); ++ if(msgGetCEEPropJSON(pMsg, estr, &keyjson) != RS_RET_OK) { ++ /* key not found in the message. nothing to do */ ++ ABORT_FINALIZE(RS_RET_OK); ++ } ++ ++ /* key found, so get the value */ ++ pszValue = (char*)json_object_get_string(keyjson); ++ ++ if(pData->pszValue) { ++ /* value also given for count */ ++ if(!strcmp(pszValue, pData->pszValue)) { ++ /* count for (value and key and appname) matched */ ++ pData->valueCounter++; ++ json = json_object_new_int(pData->valueCounter); ++ } ++ ABORT_FINALIZE(RS_RET_OK); ++ } ++ ++ /* value is not given, so we count for each value of given key */ ++ pCounter = getCounter(pData->ht, pszValue); ++ if(pCounter) { ++ (*pCounter)++; ++ json = json_object_new_int(*pCounter); ++ } ++finalize_it: ++ if(estr) { ++ es_deleteStr(estr); ++ } ++ ++ if(json) { ++ msgAddJSON(pMsg, (uchar *)JSON_COUNT_NAME, json); ++ } ++ENDdoAction ++ ++ ++BEGINparseSelectorAct ++CODESTARTparseSelectorAct ++CODE_STD_STRING_REQUESTparseSelectorAct(1) ++ if(strncmp((char*) p, ":mmcount:", sizeof(":mmcount:") - 1)) { ++ errmsg.LogError(0, RS_RET_LEGA_ACT_NOT_SUPPORTED, ++ "mmcount supports only v6+ config format, use: " ++ "action(type=\"mmcount\" ...)"); ++ } ++ ABORT_FINALIZE(RS_RET_CONFLINE_UNPROCESSED); ++CODE_STD_FINALIZERparseSelectorAct ++ENDparseSelectorAct ++ ++ ++BEGINmodExit ++CODESTARTmodExit ++ objRelease(errmsg, CORE_COMPONENT); ++ENDmodExit ++ ++ ++BEGINqueryEtryPt ++CODESTARTqueryEtryPt ++CODEqueryEtryPt_STD_OMOD_QUERIES ++CODEqueryEtryPt_STD_CONF2_OMOD_QUERIES ++CODEqueryEtryPt_STD_CONF2_QUERIES ++ENDqueryEtryPt ++ ++ ++ ++BEGINmodInit() ++CODESTARTmodInit ++ *ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */ ++CODEmodInit_QueryRegCFSLineHdlr ++ DBGPRINTF("mmcount: module compiled with rsyslog version %s.\n", VERSION); ++ CHKiRet(objUse(errmsg, CORE_COMPONENT)); ++ENDmodInit diff --git a/SOURCES/rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch b/SOURCES/rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch new file mode 100644 index 0000000..13d9490 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch @@ -0,0 +1,372 @@ +From 85f48d11900ade931cc667750b8dd69e7fa656ef Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Thu, 23 Jul 2015 17:28:50 +0200 +Subject: [PATCH] imuxsock: handle unlimited number of listeners + +--- + plugins/imuxsock/imuxsock.c | 258 ++++++++++++++++++++++---------------------- + 1 file changed, 130 insertions(+), 128 deletions(-) + +diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c +index 8fda133..eca9a34 100644 +--- a/plugins/imuxsock/imuxsock.c ++++ b/plugins/imuxsock/imuxsock.c +@@ -62,7 +62,6 @@ MODULE_TYPE_NOKEEP + MODULE_CNFNAME("imuxsock") + + /* defines */ +-#define MAXFUNIX 50 + #ifndef _PATH_LOG + #ifdef BSD + #define _PATH_LOG "/var/run/log" +@@ -148,7 +147,7 @@ typedef struct lstn_s { + sbool bUseSysTimeStamp; /* use timestamp from system (instead of from message) */ + sbool bUnlink; /* unlink&re-create socket at start and end of processing */ + } lstn_t; +-static lstn_t listeners[MAXFUNIX]; ++static lstn_t *listeners; + + static prop_t *pLocalHostIP = NULL; /* there is only one global IP for all internally-generated messages */ + static prop_t *pInputName = NULL; /* our inputName currently is always "imudp", and this will hold it */ +@@ -360,12 +359,7 @@ finalize_it: + } + + +-/* add an additional listen socket. Socket names are added +- * until the array is filled up. It is never reset, only at +- * module unload. +- * TODO: we should change the array to a list so that we +- * can support any number of listen socket names. +- * rgerhards, 2007-12-20 ++/* add an additional listen socket. + * added capability to specify hostname for socket -- rgerhards, 2008-08-01 + */ + static rsRetVal +@@ -373,66 +367,70 @@ addListner(instanceConf_t *inst) + { + DEFiRet; + +- if(nfd < MAXFUNIX) { +- if(*inst->sockName == ':') { +- listeners[nfd].bParseHost = 1; +- } else { +- listeners[nfd].bParseHost = 0; +- } +- if(inst->pLogHostName == NULL) { +- listeners[nfd].hostName = NULL; +- } else { +- CHKiRet(prop.Construct(&(listeners[nfd].hostName))); +- CHKiRet(prop.SetString(listeners[nfd].hostName, inst->pLogHostName, ustrlen(inst->pLogHostName))); +- CHKiRet(prop.ConstructFinalize(listeners[nfd].hostName)); +- } +- if(inst->ratelimitInterval > 0) { +- if((listeners[nfd].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, +- (void(*)(void*))ratelimitDestruct)) == NULL) { +- /* in this case, we simply turn off rate-limiting */ +- DBGPRINTF("imuxsock: turning off rate limiting because we could not " +- "create hash table\n"); +- inst->ratelimitInterval = 0; +- } ++ if(*inst->sockName == ':') { ++ listeners[nfd].bParseHost = 1; ++ } else { ++ listeners[nfd].bParseHost = 0; ++ } ++ if(inst->pLogHostName == NULL) { ++ listeners[nfd].hostName = NULL; ++ } else { ++ CHKiRet(prop.Construct(&(listeners[nfd].hostName))); ++ CHKiRet(prop.SetString(listeners[nfd].hostName, inst->pLogHostName, ustrlen(inst->pLogHostName))); ++ CHKiRet(prop.ConstructFinalize(listeners[nfd].hostName)); ++ } ++ if(inst->ratelimitInterval > 0) { ++ if((listeners[nfd].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, ++ (void(*)(void*))ratelimitDestruct)) == NULL) { ++ /* in this case, we simply turn off rate-limiting */ ++ DBGPRINTF("imuxsock: turning off rate limiting because we could not " ++ "create hash table\n"); ++ inst->ratelimitInterval = 0; + } +- listeners[nfd].ratelimitInterval = inst->ratelimitInterval; +- listeners[nfd].ratelimitBurst = inst->ratelimitBurst; +- listeners[nfd].ratelimitSev = inst->ratelimitSeverity; +- listeners[nfd].flowCtl = inst->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY; +- listeners[nfd].flags = inst->bIgnoreTimestamp ? IGNDATE : NOFLAG; +- listeners[nfd].bCreatePath = inst->bCreatePath; +- listeners[nfd].sockName = ustrdup(inst->sockName); +- listeners[nfd].bUseCreds = (inst->bDiscardOwnMsgs || inst->bWritePid || inst->ratelimitInterval || inst->bAnnotate || inst->bUseSysTimeStamp) ? 1 : 0; +- listeners[nfd].bAnnotate = inst->bAnnotate; +- listeners[nfd].bParseTrusted = inst->bParseTrusted; +- listeners[nfd].bDiscardOwnMsgs = inst->bDiscardOwnMsgs; +- listeners[nfd].bUnlink = inst->bUnlink; +- listeners[nfd].bWritePid = inst->bWritePid; +- listeners[nfd].bUseSysTimeStamp = inst->bUseSysTimeStamp; +- CHKiRet(ratelimitNew(&listeners[nfd].dflt_ratelimiter, "imuxsock", NULL)); +- ratelimitSetLinuxLike(listeners[nfd].dflt_ratelimiter, +- listeners[nfd].ratelimitInterval, +- listeners[nfd].ratelimitBurst); +- ratelimitSetSeverity(listeners[nfd].dflt_ratelimiter, +- listeners[nfd].ratelimitSev); +- nfd++; + } else { +- errmsg.LogError(0, NO_ERRCODE, "Out of unix socket name descriptors, ignoring %s\n", +- inst->sockName); ++ listeners[nfd].ht = NULL; + } ++ listeners[nfd].ratelimitInterval = inst->ratelimitInterval; ++ listeners[nfd].ratelimitBurst = inst->ratelimitBurst; ++ listeners[nfd].ratelimitSev = inst->ratelimitSeverity; ++ listeners[nfd].flowCtl = inst->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY; ++ listeners[nfd].flags = inst->bIgnoreTimestamp ? IGNDATE : NOFLAG; ++ listeners[nfd].bCreatePath = inst->bCreatePath; ++ listeners[nfd].sockName = ustrdup(inst->sockName); ++ listeners[nfd].bUseCreds = (inst->bDiscardOwnMsgs || inst->bWritePid || inst->ratelimitInterval || inst->bAnnotate || runModConf->bUseSysTimeStamp) ? 1 : 0; ++ listeners[nfd].bAnnotate = inst->bAnnotate; ++ listeners[nfd].bParseTrusted = inst->bParseTrusted; ++ listeners[nfd].bDiscardOwnMsgs = inst->bDiscardOwnMsgs; ++ listeners[nfd].bUnlink = inst->bUnlink; ++ listeners[nfd].bWritePid = inst->bWritePid; ++ listeners[nfd].bUseSysTimeStamp = inst->bUseSysTimeStamp; ++ CHKiRet(ratelimitNew(&listeners[nfd].dflt_ratelimiter, "imuxsock", NULL)); ++ ratelimitSetLinuxLike(listeners[nfd].dflt_ratelimiter, ++ listeners[nfd].ratelimitInterval, ++ listeners[nfd].ratelimitBurst); ++ ratelimitSetSeverity(listeners[nfd].dflt_ratelimiter, ++ listeners[nfd].ratelimitSev); ++ nfd++; + + finalize_it: + RETiRet; + } + + +-/* discard/Destruct all log sockets except for "socket" 0. Data for it comes from +- * the constant memory pool - and if not, it is freeed via some other pointer. +- */ + static rsRetVal discardLogSockets(void) + { + int i; + ++ /* Check whether the system socket is in use */ ++ if(startIndexUxLocalSockets == 0) { ++ /* Clean up rate limiting data for the system socket */ ++ if(listeners[0].ht != NULL) { ++ hashtable_destroy(listeners[0].ht, 1); /* 1 => free all values automatically */ ++ } ++ ratelimitDestruct(listeners[0].dflt_ratelimiter); ++ } ++ ++ /* Clean up all other sockets */ + for (i = 1; i < nfd; i++) { + if(listeners[i].sockName != NULL) { + free(listeners[i].sockName); +@@ -1033,50 +1031,51 @@ activateListeners() + int actSocks; + DEFiRet; + +- /* first apply some config settings */ +-# ifdef OS_SOLARIS +- /* under solaris, we must NEVER process the local log socket, because +- * it is implemented there differently. If we used it, we would actually +- * delete it and render the system partly unusable. So don't do that. +- * rgerhards, 2010-03-26 +- */ +- startIndexUxLocalSockets = 1; +-# else +- startIndexUxLocalSockets = runModConf->bOmitLocalLogging ? 1 : 0; +-# endif +- if(runModConf->pLogSockName != NULL) +- listeners[0].sockName = runModConf->pLogSockName; +- else if(sd_booted()) { +- struct stat st; +- if(stat(SYSTEMD_PATH_LOG, &st) != -1 && S_ISSOCK(st.st_mode)) { +- listeners[0].sockName = (uchar*) SYSTEMD_PATH_LOG; ++ /* Initialize the system socket only if it's in use */ ++ if(startIndexUxLocalSockets == 0) { ++ /* first apply some config settings */ ++ listeners[0].sockName = UCHAR_CONSTANT(_PATH_LOG); ++ if(runModConf->pLogSockName != NULL) ++ listeners[0].sockName = runModConf->pLogSockName; ++ else if(sd_booted()) { ++ struct stat st; ++ if(stat(SYSTEMD_PATH_LOG, &st) != -1 && S_ISSOCK(st.st_mode)) { ++ listeners[0].sockName = (uchar*) SYSTEMD_PATH_LOG; ++ } + } +- } +- if(runModConf->ratelimitIntervalSysSock > 0) { +- if((listeners[0].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, NULL)) == NULL) { +- /* in this case, we simply turn of rate-limiting */ +- errmsg.LogError(0, NO_ERRCODE, "imuxsock: turning off rate limiting because we could not " +- "create hash table\n"); +- runModConf->ratelimitIntervalSysSock = 0; ++ if(runModConf->ratelimitIntervalSysSock > 0) { ++ if((listeners[0].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, NULL)) == NULL) { ++ /* in this case, we simply turn of rate-limiting */ ++ errmsg.LogError(0, NO_ERRCODE, "imuxsock: turning off rate limiting because we could not " ++ "create hash table\n"); ++ runModConf->ratelimitIntervalSysSock = 0; ++ } ++ } else { ++ listeners[0].ht = NULL; + } +- } +- listeners[0].ratelimitInterval = runModConf->ratelimitIntervalSysSock; +- listeners[0].ratelimitBurst = runModConf->ratelimitBurstSysSock; +- listeners[0].ratelimitSev = runModConf->ratelimitSeveritySysSock; +- listeners[0].bUseCreds = (runModConf->bWritePidSysSock || runModConf->ratelimitIntervalSysSock || runModConf->bAnnotateSysSock || runModConf->bDiscardOwnMsgs || runModConf->bUseSysTimeStamp) ? 1 : 0; +- listeners[0].bWritePid = runModConf->bWritePidSysSock; +- listeners[0].bAnnotate = runModConf->bAnnotateSysSock; +- listeners[0].bParseTrusted = runModConf->bParseTrusted; +- listeners[0].bDiscardOwnMsgs = runModConf->bDiscardOwnMsgs; +- listeners[0].bUnlink = runModConf->bUnlink; +- listeners[0].bUseSysTimeStamp = runModConf->bUseSysTimeStamp; +- listeners[0].flags = runModConf->bIgnoreTimestamp ? IGNDATE : NOFLAG; +- listeners[0].flowCtl = runModConf->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY; +- CHKiRet(ratelimitNew(&listeners[0].dflt_ratelimiter, "imuxsock", NULL)); ++ listeners[0].fd = -1; ++ listeners[0].hostName = NULL; ++ listeners[0].bParseHost = 0; ++ listeners[0].bCreatePath = 0; ++ listeners[0].ratelimitInterval = runModConf->ratelimitIntervalSysSock; ++ listeners[0].ratelimitBurst = runModConf->ratelimitBurstSysSock; ++ listeners[0].ratelimitSev = runModConf->ratelimitSeveritySysSock; ++ listeners[0].bUseCreds = (runModConf->bWritePidSysSock || runModConf->ratelimitIntervalSysSock || runModConf->bAnnotateSysSock || runModConf->bDiscardOwnMsgs || runModConf->bUseSysTimeStamp) ? 1 : 0; ++ listeners[0].bWritePid = runModConf->bWritePidSysSock; ++ listeners[0].bAnnotate = runModConf->bAnnotateSysSock; ++ listeners[0].bParseTrusted = runModConf->bParseTrusted; ++ listeners[0].bDiscardOwnMsgs = runModConf->bDiscardOwnMsgs; ++ listeners[0].bUnlink = runModConf->bUnlink; ++ listeners[0].bUseSysTimeStamp = runModConf->bUseSysTimeStamp; ++ listeners[0].flags = runModConf->bIgnoreTimestamp ? IGNDATE : NOFLAG; ++ listeners[0].flowCtl = runModConf->bUseFlowCtl ? eFLOWCTL_LIGHT_DELAY : eFLOWCTL_NO_DELAY; ++ CHKiRet(ratelimitNew(&listeners[0].dflt_ratelimiter, "imuxsock", NULL)); ++ + ratelimitSetLinuxLike(listeners[0].dflt_ratelimiter, +- listeners[0].ratelimitInterval, +- listeners[0].ratelimitBurst); +- ratelimitSetSeverity(listeners[0].dflt_ratelimiter,listeners[0].ratelimitSev); ++ listeners[0].ratelimitInterval, ++ listeners[0].ratelimitBurst); ++ ratelimitSetSeverity(listeners[0].dflt_ratelimiter,listeners[0].ratelimitSev); ++ } + + sd_fds = sd_listen_fds(0); + if(sd_fds < 0) { +@@ -1286,12 +1284,39 @@ ENDcheckCnf + + BEGINactivateCnfPrePrivDrop + instanceConf_t *inst; ++ int nLstn; ++ int i; + CODESTARTactivateCnfPrePrivDrop + runModConf = pModConf; ++# ifdef OS_SOLARIS ++ /* under solaris, we must NEVER process the local log socket, because ++ * it is implemented there differently. If we used it, we would actually ++ * delete it and render the system partly unusable. So don't do that. ++ * rgerhards, 2010-03-26 ++ */ ++ startIndexUxLocalSockets = 1; ++# else ++ startIndexUxLocalSockets = runModConf->bOmitLocalLogging ? 1 : 0; ++# endif ++ /* we first calculate the number of listeners so that we can ++ * appropriately size the listener array. ++ */ ++ nLstn = 0; + for(inst = runModConf->root ; inst != NULL ; inst = inst->next) { +- addListner(inst); ++ ++nLstn; ++ } ++ if(nLstn > 0 || startIndexUxLocalSockets == 0) { ++ DBGPRINTF("imuxsock: allocating memory for %d listeners\n", nLstn); ++ CHKmalloc(listeners = realloc(listeners, (1+nLstn)*sizeof(lstn_t))); ++ for(i = 1 ; i < nLstn ; ++i) { ++ listeners[i].sockName = NULL; ++ listeners[i].fd = -1; ++ } ++ for(inst = runModConf->root ; inst != NULL ; inst = inst->next) { ++ addListner(inst); ++ } ++ CHKiRet(activateListeners()); + } +- CHKiRet(activateListeners()); + finalize_it: + ENDactivateCnfPrePrivDrop + +@@ -1329,6 +1354,11 @@ BEGINrunInput + #endif + + CODESTARTrunInput ++ CHKmalloc(pReadfds); ++ if(startIndexUxLocalSockets == 1 && nfd == 1) { ++ /* No sockets were configured, no reason to run. */ ++ ABORT_FINALIZE(RS_RET_OK); ++ } + /* this is an endless loop - it is terminated when the thread is + * signalled to do so. This, however, is handled by the framework, + * right into the sleep below. +@@ -1364,7 +1394,7 @@ CODESTARTrunInput + if(glbl.GetGlobalInputTermState() == 1) + break; /* terminate input! */ + +- for (i = 0; i < nfd && nfds > 0; i++) { ++ for (i = startIndexUxLocalSockets; i < nfd && nfds > 0; i++) { + if(glbl.GetGlobalInputTermState() == 1) + ABORT_FINALIZE(RS_RET_FORCE_TERM); /* terminate input! */ + if ((fd = listeners[i].fd) != -1 && FD_ISSET(fd, pReadfds)) { +@@ -1419,6 +1449,7 @@ ENDafterRun + + BEGINmodExit + CODESTARTmodExit ++ free(listeners); + if(pInputName != NULL) + prop.Destruct(&pInputName); + +@@ -1481,7 +1512,6 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a + + + BEGINmodInit() +- int i; + CODESTARTmodInit + *ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */ + CODEmodInit_QueryRegCFSLineHdlr +@@ -1511,34 +1541,6 @@ CODEmodInit_QueryRegCFSLineHdlr + */ + pLocalHostIP = glbl.GetLocalHostIP(); + +- /* init system log socket settings */ +- listeners[0].flags = IGNDATE; +- listeners[0].sockName = UCHAR_CONSTANT(_PATH_LOG); +- listeners[0].hostName = NULL; +- listeners[0].flowCtl = eFLOWCTL_NO_DELAY; +- listeners[0].fd = -1; +- listeners[0].bParseHost = 0; +- listeners[0].bUseCreds = 0; +- listeners[0].bAnnotate = 0; +- listeners[0].bParseTrusted = 0; +- listeners[0].bDiscardOwnMsgs = 1; +- listeners[0].bUnlink = 1; +- listeners[0].bCreatePath = 0; +- listeners[0].bUseSysTimeStamp = 1; +- if((listeners[0].ht = create_hashtable(100, hash_from_key_fn, key_equals_fn, +- (void(*)(void*))ratelimitDestruct)) == NULL) { +- /* in this case, we simply turn off rate-limiting */ +- DBGPRINTF("imuxsock: turning off rate limiting for system socket " +- "because we could not create hash table\n"); +- listeners[0].ratelimitInterval = 0; +- } +- +- /* initialize socket names */ +- for(i = 1 ; i < MAXFUNIX ; ++i) { +- listeners[i].sockName = NULL; +- listeners[i].fd = -1; +- } +- + /* register config file handlers */ + CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputunixlistensocketignoremsgtimestamp", 0, eCmdHdlrBinary, + NULL, &cs.bIgnoreTimestamp, STD_LOADABLE_MODULE_ID)); +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch b/SOURCES/rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch new file mode 100644 index 0000000..4c4971d --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch @@ -0,0 +1,28 @@ +From d989a9a24c5749c9e30ed33a5443cd659f56109e Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Wed, 22 Apr 2015 14:13:34 +0200 +Subject: [PATCH] imuxsock: fix a crash when setting a hostname + +Setting a hostname via the legacy directive would lead to a crash +during shutdown caused by a double-free. +--- + plugins/imuxsock/imuxsock.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c +index eca9a34..90fc49e 100644 +--- a/plugins/imuxsock/imuxsock.c ++++ b/plugins/imuxsock/imuxsock.c +@@ -350,8 +350,7 @@ static rsRetVal addInstance(void __attribute__((unused)) *pVal, uchar *pNewVal) + inst->bParseTrusted = cs.bParseTrusted; + inst->next = NULL; + +- /* some legacy conf processing */ +- free(cs.pLogHostName); /* reset hostname for next socket */ ++ /* reset hostname for next socket */ + cs.pLogHostName = NULL; + + finalize_it: +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch b/SOURCES/rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch new file mode 100644 index 0000000..79bd6a1 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch @@ -0,0 +1,63 @@ +From cd5fccc6a3534d06b9a0a4d8c2669c48f9cede6a Mon Sep 17 00:00:00 2001 +From: Andy Goldstein +Date: Mon, 13 Jan 2014 12:46:54 -0700 +Subject: [PATCH] Fix instance configuration + +Correct typo in newInpInst so it uses inppblk instead of modpblk when +configuring the instance. +--- + plugins/imuxsock/imuxsock.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c +index df504dd..8fda133 100644 +--- a/plugins/imuxsock/imuxsock.c ++++ b/plugins/imuxsock/imuxsock.c +@@ -1216,31 +1216,31 @@ CODESTARTnewInpInst + continue; + if(!strcmp(inppblk.descr[i].name, "socket")) { + inst->sockName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL); +- } else if(!strcmp(modpblk.descr[i].name, "createpath")) { ++ } else if(!strcmp(inppblk.descr[i].name, "createpath")) { + inst->bCreatePath = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "parsetrusted")) { ++ } else if(!strcmp(inppblk.descr[i].name, "parsetrusted")) { + inst->bParseTrusted = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "ignoreownmessages")) { ++ } else if(!strcmp(inppblk.descr[i].name, "ignoreownmessages")) { + inst->bDiscardOwnMsgs = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "unlink")) { ++ } else if(!strcmp(inppblk.descr[i].name, "unlink")) { + inst->bUnlink = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "hostname")) { ++ } else if(!strcmp(inppblk.descr[i].name, "hostname")) { + inst->pLogHostName = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL); +- } else if(!strcmp(modpblk.descr[i].name, "ignoretimestamp")) { ++ } else if(!strcmp(inppblk.descr[i].name, "ignoretimestamp")) { + inst->bIgnoreTimestamp = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "flowcontrol")) { ++ } else if(!strcmp(inppblk.descr[i].name, "flowcontrol")) { + inst->bUseFlowCtl = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "usesystimestamp")) { ++ } else if(!strcmp(inppblk.descr[i].name, "usesystimestamp")) { + inst->bUseSysTimeStamp = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "annotate")) { ++ } else if(!strcmp(inppblk.descr[i].name, "annotate")) { + inst->bAnnotate = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "usepidfromsystem")) { ++ } else if(!strcmp(inppblk.descr[i].name, "usepidfromsystem")) { + inst->bWritePid = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "ratelimit.interval")) { ++ } else if(!strcmp(inppblk.descr[i].name, "ratelimit.interval")) { + inst->ratelimitInterval = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "ratelimit.burst")) { ++ } else if(!strcmp(inppblk.descr[i].name, "ratelimit.burst")) { + inst->ratelimitBurst = (int) pvals[i].val.d.n; +- } else if(!strcmp(modpblk.descr[i].name, "ratelimit.severity")) { ++ } else if(!strcmp(inppblk.descr[i].name, "ratelimit.severity")) { + inst->ratelimitSeverity = (int) pvals[i].val.d.n; + } else { + dbgprintf("imuxsock: program error, non-handled " +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch b/SOURCES/rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch new file mode 100644 index 0000000..a87ac18 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch @@ -0,0 +1,161 @@ +From 4d68698ecaa4b13927352ce6bff74a0b6767abca Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Fri, 24 Apr 2015 23:51:20 +0200 +Subject: [PATCH] imjournal: enable setting a default message tag + +--- + plugins/imjournal/imjournal.c | 62 ++++++++++++++++++++++++++++++------------- + 1 file changed, 43 insertions(+), 19 deletions(-) + +diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c +index b6910e8..cd22c3a 100755 +--- a/plugins/imjournal/imjournal.c ++++ b/plugins/imjournal/imjournal.c +@@ -72,6 +72,7 @@ static struct configSettings_s { + int bIgnorePrevious; + int iDfltSeverity; + int iDfltFacility; ++ char *dfltTag; + } cs; + + static rsRetVal facilityHdlr(uchar **pp, void *pVal); +@@ -84,7 +85,8 @@ static struct cnfparamdescr modpdescr[] = { + { "persiststateinterval", eCmdHdlrInt, 0 }, + { "ignorepreviousmessages", eCmdHdlrBinary, 0 }, + { "defaultseverity", eCmdHdlrSeverity, 0 }, +- { "defaultfacility", eCmdHdlrString, 0 } ++ { "defaultfacility", eCmdHdlrString, 0 }, ++ { "defaulttag", eCmdHdlrGetWord, 0 }, + }; + static struct cnfparamblk modpblk = + { CNFPARAMBLK_VERSION, +@@ -95,6 +97,7 @@ static struct cnfparamblk modpblk = + #define DFLT_persiststateinterval 10 + #define DFLT_SEVERITY LOG_PRI(LOG_NOTICE) + #define DFLT_FACILITY LOG_FAC(LOG_USER) ++#define DFLT_TAG "journal" + + static int bLegacyCnfModGlobalsPermitted = 1;/* are legacy module-global config parameters permitted? */ + +@@ -183,8 +186,13 @@ enqMsg(uchar *msg, uchar *pszTag, int iFacility, int iSeverity, struct timeval * + } + MsgSetFlowControlType(pMsg, eFLOWCTL_LIGHT_DELAY); + MsgSetInputName(pMsg, pInputName); ++ /* Recalculating the message length shouldn't cause problems as all ++ * potential zero-bytes have been escaped in sanitizeValue(). */ + len = strlen((char*)msg); + MsgSetRawMsg(pMsg, (char*)msg, len); ++ /* NB: SanitizeMsg() only touches the raw message and its ++ * length which only contain the msg part. Thus the TAG and ++ * other fields are not sanitized. */ + if(len > 0) + parser.SanitizeMsg(pMsg); + MsgSetMSGoffs(pMsg, 0); /* we do not have a header... */ +@@ -221,7 +229,7 @@ readjournal() { + + /* Information from messages */ + char *message = NULL; +- char *sys_iden; ++ char *sys_iden = NULL; + char *sys_iden_help = NULL; + + const void *get; +@@ -283,27 +291,37 @@ readjournal() { + /* Get message identifier, client pid and add ':' */ + if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) { + CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden)); +- } else { +- CHKmalloc(sys_iden = strdup("journal")); + } + +- if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { +- char *sys_pid; ++ if (sys_iden == NULL && !cs.dfltTag[0]) { ++ /* This is a special case: if no tag was obtained from ++ * the message and the user has set the default tag to ++ * an empty string, nothing is inserted. ++ */ ++ CHKmalloc(sys_iden_help = calloc(1, 1)); ++ } else { ++ if (sys_iden == NULL) { ++ /* Use a predefined tag if it can't be obtained from the message */ ++ CHKmalloc(sys_iden = strdup(cs.dfltTag)); ++ } ++ if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { ++ char *sys_pid; + +- CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) { +- free (sys_iden); +- FINALIZE; ++ CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) { ++ free (sys_iden); ++ FINALIZE; ++ } ++ r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); ++ free (sys_pid); ++ } else { ++ r = asprintf(&sys_iden_help, "%s:", sys_iden); + } +- r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); +- free (sys_pid); +- } else { +- r = asprintf(&sys_iden_help, "%s:", sys_iden); +- } + +- free (sys_iden); ++ free (sys_iden); + +- if (-1 == r) { +- ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); ++ if (-1 == r) { ++ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); ++ } + } + + json = json_object_new_object(); +@@ -628,11 +646,14 @@ CODESTARTbeginCnfLoad + cs.ratelimitInterval = 600; + cs.iDfltSeverity = DFLT_SEVERITY; + cs.iDfltFacility = DFLT_FACILITY; ++ cs.dfltTag = NULL; + ENDbeginCnfLoad + + + BEGINendCnfLoad + CODESTARTendCnfLoad ++ if (cs.dfltTag == NULL) ++ cs.dfltTag = strdup(DFLT_TAG); + ENDendCnfLoad + + +@@ -648,6 +669,7 @@ ENDactivateCnf + + BEGINfreeCnf + CODESTARTfreeCnf ++ free(cs.dfltTag); + ENDfreeCnf + + /* open journal */ +@@ -728,6 +750,8 @@ CODESTARTsetModCnf + fac = p = es_str2cstr(pvals[i].val.d.estr, NULL); + facilityHdlr((uchar **) &p, (void *) &cs.iDfltFacility); + free(fac); ++ } else if (!strcmp(modpblk.descr[i].name, "defaulttag")) { ++ cs.dfltTag = (char *)es_str2cstr(pvals[i].val.d.estr, NULL); + } else { + dbgprintf("imjournal: program error, non-handled " + "param '%s' in beginCnfLoad\n", modpblk.descr[i].name); +@@ -786,8 +810,8 @@ CODEmodInit_QueryRegCFSLineHdlr + NULL, &cs.iDfltSeverity, STD_LOADABLE_MODULE_ID)); + CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaultfacility", 0, eCmdHdlrCustomHandler, + facilityHdlr, &cs.iDfltFacility, STD_LOADABLE_MODULE_ID)); +- +- ++ CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaulttag", 0, eCmdHdlrGetWord, ++ NULL, &cs.dfltTag, STD_LOADABLE_MODULE_ID)); + ENDmodInit + /* vim:set ai: + */ +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1202489-path-creation-race.patch b/SOURCES/rsyslog-7.4.7-rhbz1202489-path-creation-race.patch new file mode 100644 index 0000000..de11ba4 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1202489-path-creation-race.patch @@ -0,0 +1,55 @@ +From 625f4b9aacfa7fa226949c8d5a36c298196432ea Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Wed, 8 Jul 2015 17:16:46 +0200 +Subject: [PATCH] Fix race-condition detection in path-creation code + +The affected code is used to detect a race condition in between +testing for the existence of a directory and creating it if it didn't +exist. The variable tracking the number of attempts wasn't reset for +subsequent elements in the path, thus limiting the number of +reattempts to one per the whole path, instead of one per each path +element. + +It appears the detection never actually worked due to wrong error +checking. errno needs to be checked to determin the reason for the +failure. +--- + runtime/srutils.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/runtime/srutils.c b/runtime/srutils.c +index 6a509b4..e66c1cd 100644 +--- a/runtime/srutils.c ++++ b/runtime/srutils.c +@@ -195,7 +195,6 @@ int makeFileParentDirs(uchar *szFile, size_t lenFile, mode_t mode, + uchar *p; + uchar *pszWork; + size_t len; +- int err; + int iTry = 0; + int bErr = 0; + +@@ -210,9 +209,10 @@ int makeFileParentDirs(uchar *szFile, size_t lenFile, mode_t mode, + if(*p == '/') { + /* temporarily terminate string, create dir and go on */ + *p = '\0'; ++ iTry = 0; + again: + if(access((char*)pszWork, F_OK)) { +- if((err = mkdir((char*)pszWork, mode)) == 0) { ++ if(mkdir((char*)pszWork, mode) == 0) { + if(uid != (uid_t) -1 || gid != (gid_t) -1) { + /* we need to set owner/group */ + if(chown((char*)pszWork, uid, gid) != 0) +@@ -223,7 +223,7 @@ again: + */ + } + } else { +- if(err == EEXIST && iTry == 0) { ++ if(errno == EEXIST && iTry == 0) { + iTry = 1; + goto again; + } +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1238713-html-docs.patch b/SOURCES/rsyslog-7.4.7-rhbz1238713-html-docs.patch new file mode 100644 index 0000000..8a67345 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz1238713-html-docs.patch @@ -0,0 +1,432 @@ +From 6a1d227e4ee199bea2c8ba5bc01b7ece6da5e75b Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Thu, 23 Jul 2015 11:30:13 +0200 +Subject: [PATCH] Various corrections to the HTML documentation + +Provided by Stephen Wadeley. +--- + doc/features.html | 5 +-- + doc/free_support.html | 12 +++--- + doc/history.html | 8 +--- + doc/index.html | 29 +++++++------- + doc/manual.html | 89 ++++++++++++++++++------------------------- + doc/rsyslog_conf_actions.html | 2 +- + doc/troubleshoot.html | 20 +++++----- + doc/version_naming.html | 8 ++-- + 8 files changed, 76 insertions(+), 97 deletions(-) + +diff --git a/doc/features.html b/doc/features.html +index 626ff65..8fc2802 100644 +--- a/doc/features.html ++++ b/doc/features.html +@@ -28,7 +28,7 @@ OpenTDS (MS SQL, Sybase), SQLLite, Ingres, Oracle, and mSQL via libdbi, + a database abstraction layer (almost as good as native)
  • +
  • native support for sending + mail messages (first seen in 3.17.0)
  • +-
  • support for (plain) tcp based syslog - much better ++
  • support for (plain) TCP based syslog - much better + reliability
  • +
  • support for sending and receiving compressed syslog messages
  • +
  • support for on-demand on-disk spooling of messages that can +@@ -141,9 +141,6 @@ large number of applications. You may also read my blog post on the + future of liblogging, which contains interesting information about the + future of RFC 3195 in rsyslog.
  • + +-

    To see when each feature was added, see the +-rsyslog +-change log (online only).

    + +

    [manual index] + [rsyslog.conf] +diff --git a/doc/free_support.html b/doc/free_support.html +index 182a82c..4e33102 100644 +--- a/doc/free_support.html ++++ b/doc/free_support.html +@@ -16,16 +16,16 @@ system forward. + with a solution (but rather a link to this page ;)). I hope this does not offend you. The + reason is quite simple: If I do personal support, you gain some advantage without + contributing something back. Think about it: if you ask your question on the public +-forum or mailing list, other with the same problem can you and, most importantly, even ++forum or mailing list, others with the same problem can help you and, most importantly, even + years later find your post (and the answer) and get the problem solved. So by +-solving your issue in public, you help create a great community ressource and also ++solving your issue in public, you help create a great community resources and also + help your fellow users finding solutions quicker. In the long term, this + also contributes to improved code because the more questions users can find + solutions to themselves, the fewer I need to look at. +-

    But it comes even better: the rsyslog community is much broader than Rainer ;) - there +-are helpful other members hanging around at the public places. They often answer ++

    But it becomes even better: the rsyslog community is much broader than Rainer ;) - there ++are other helpful members hanging around at the public places. They often answer + questions, so that I do not need to look at them (btw, once again a big "thank you", folks!). +-And, more important, those folks have different background than me. So they often ++And, more important, those folks have a different background than me. So they often + either know better how to solve your problem (e.g. because it is distro-specific) + or they know how to better phrase it (after all, I like abstract terms and concepts ;)). + So you do yourself a favor if you use the public places. +@@ -36,7 +36,7 @@ mailing lists, the + rsyslog mailing list + also offers excellent advise. +

    Don't like to post your question in a public place? Well, then you should +-consider purchasing rsyslog professional support. ++consider purchasing rsyslog professional support. + The fees are very low and help fund the project. If you use rsyslog seriously inside + a corporate environment, there is no excuse for not getting one of the support + packages ;) +diff --git a/doc/history.html b/doc/history.html +index 57b6400..e3c12e3 100644 +--- a/doc/history.html ++++ b/doc/history.html +@@ -105,7 +105,7 @@ resulting in loadable input modules, now running on a separate thread each.

    < + January, 2nd 2008, rsyslog 1.21.2 is re-released as rsyslog v2.0.0 + stable. This is a major milestone as far as the stable build is concerned. v3 is + not yet officially announced. Other than the stable v2 build, v3 will not be +-backwards compatibile (including missing compatibility to stock sysklogd) for ++backwards compatible (including missing compatibility to stock sysklogd) for + quite a while. Config file changes are required and some command line options do + no longer work due to the new design.

    On January, 31st 2008 + the new massively-multithreaded queue engine was released for the first +@@ -137,11 +137,7 @@ namely anonymization support, as well as log file signing and + encryption capabilities. + +

    Be sure to visit Rainer's syslog blog +-to get some more insight into the development and futures of rsyslog and syslog in general. ++to get some more insight into the development and features of rsyslog and syslog in general. + Don't be shy to post to either the blog or the + rsyslog forums.

    +-

    Some useful links

    +- + +diff --git a/doc/index.html b/doc/index.html +index d753e2e..c8172f3 100644 +--- a/doc/index.html ++++ b/doc/index.html +@@ -6,26 +6,27 @@ + is an enhanced syslogd suitable both for small systems as + well as large enterprises. +

    This page provide a few quick pointers which hopefully make your +-experience with rsyslog a pleasant one. These are ++experience with rsyslog a pleasant one. These are: +

      +-
    • Most importantly, the rsyslog manual - this points to locally ++
    • The rsyslog manual - this points to locally + installed documentation which exactly matches the version you have installed. + It is highly suggested to at least briefly look over these files. +-
    • The rsyslog web site which offers +-probably every information you'll ever need (ok, just kidding...). +-
    • The project status page provides +-information on current releases +-
    • and the troubleshooting guide hopefully helps if +-things do not immediately work out ++
    • The rsyslog web site, which offers ++information for different versions of rsyslog. ++
    • The troubleshooting guide hopefully helps if ++things do not immediately work out. +
    +

    In general, rsyslog supports plain old syslog.conf format, except that the + config file is now called rsyslog.conf. This should help you get started +-quickly. +-To do the really cool things, though, +-you need to learn a bit about its new features. ++quickly.

    ++ + The man pages offer a bare minimum of information (and are still quite long). Read the +-html documentation instead. ++built-in html documentation instead. + When you change the configuration, remember to restart rsyslogd, because otherwise +-it will not use your new settings (and you'll end up totally puzzled why this great +-config of yours does not even work a bit...;)) ++it will not use your new settings.

    ++

    The built-in rsyslog history ++page is for you if you would like to learn a little more ++on why there is an rsyslog at all. If you are interested why you should ++care about rsyslog at all, you may want to read Rainer's essay on "why ++the world needs another syslogd".

    + +diff --git a/doc/manual.html b/doc/manual.html +index f0fffa8..ecf8cae 100644 +--- a/doc/manual.html ++++ b/doc/manual.html +@@ -2,11 +2,11 @@ + rsyslog documentation + +

    RSyslog - Documentation

    +-

    Rsyslog +-is an enhanced syslogd ++

    Rsyslog ++is an enhanced syslogd + supporting, among others, MySQL, + PostgreSQL, failover +-log destinations, syslog/tcp, fine grain output format ++log destinations, syslog over TCP, fine grain output format + control, high precision timestamps, queued operations and the ability to filter on any message + part. + It is quite compatible to stock sysklogd and can be used as a drop-in +@@ -16,48 +16,37 @@ relay chains while at the same time being very easy to setup for the + novice user. And as we know what enterprise users really need, there are + also rsyslog + professional services available directly from the source!

    +-

    Please visit the rsyslog sponsor's page ++

    Please visit the rsyslog sponsor's page + to honor the project sponsors or become one yourself! We are very grateful for any help towards the + project goals.

    +-

    This documentation is for version 7.4.7 (v7.4-stable branch) of rsyslog. +-Visit the rsyslog status page +-to obtain current version information and project status. +-

    If you like rsyslog, you might +-want to lend us a helping hand. It doesn't require a lot of ++

    This documentation is for version 7.4.7 (v7.4-stable branch) of rsyslog. If you use an older ++version, be sure to use the doc that came with it.

    ++

    If you like rsyslog, you might ++want to lend us a helping hand. It doesn't require a lot of + time - even a single mouse click helps. Learn how to help the rsyslog project. + Due to popular demand, there is now a side-by-side comparison + between rsyslog and syslog-ng.

    +-

    If you are upgrading from rsyslog v2 or stock sysklogd, +-be sure to read the rsyslog v3 compatibility notes, +-and if you are upgrading from v3, read the +-rsyslog v4 compatibility notes, +-if you upgrade from v4, read the +-rsyslog v5 compatibility notes, and +-if you upgrade from v5, read the +-rsyslog v6 compatibility notes. +-if you upgrade from v6, read the +-rsyslog v7 compatibility notes. +-

    Rsyslog will work even +-if you do not read the doc, but doing so will definitely improve your experience.

    +-

    Follow the links below for the

    ++

    If you are upgrading +

    ++

    The built-in Docs

    ++ +-

    To keep current on rsyslog development, follow +-Rainer's twitter feed.

    +-

    We have some in-depth papers on

    +- +-

    Our rsyslog history +-page is for you if you would like to learn a little more +-on why there is an rsyslog at all. If you are interested why you should +-care about rsyslog at all, you may want to read Rainer's essay on "why +-the world needs another syslogd".

    +-

    Documentation is added continuously. Please note that the +-documentation here +-matches only the current version of rsyslog. If you use an older +-version, be sure to use the doc that came with it.

    ++ +

    You can also browse the following online resources:

    +
      ++
    • preserving ++syslog sender over NAT
    • ++
    • a regular expression checker/generator tool for rsyslog
    • +
    • the rsyslog + wiki, a community resource which includes rsyslog configuration examples
    • +-
    • rsyslog +-online documentation (most current version only)
    • + +
    • rsyslog discussion forum - use this for technical support
    • +
    • rsyslog video tutorials
    • +-
    • rsyslog change log
    • +
    • rsyslog FAQ
    • +
    • syslog device configuration guide (off-site)
    • +
    • rsyslog discussion forum - use this for technical support
    • +@@ -111,7 +95,8 @@ may find + blog an + interesting read (filter on syslog and rsyslog tags). + Or meet Rainer Gerhards at Facebook +-or Google+. ++or Google+.

      ++ + If you would like to use rsyslog source code inside your open source project, you can do that without + any restriction as long as your license is GPLv3 compatible. If your license is incompatible to GPLv3, + you may even be still permitted to use rsyslog source code. However, then you need to look at the way +@@ -119,5 +104,5 @@ you may even be still permitted to use rsyslog source code. However, then you ne +

      Feedback is always welcome, but if you have a support question, please do not + mail Rainer directly (why not?) - use the + rsyslog mailing list +-or rsyslog formum instead. ++or rsyslog forum instead. + +diff --git a/doc/rsyslog_conf_actions.html b/doc/rsyslog_conf_actions.html +index 50b13a0..c0c29c7 100644 +--- a/doc/rsyslog_conf_actions.html ++++ b/doc/rsyslog_conf_actions.html +@@ -5,7 +5,7 @@ + back +

      Actions

      + Action object describe what is to be done with a message. They are +-implemented via outpout modules. ++implemented via output modules. +

      The action object has different parameters: +

        +
      • those that apply to all actions and are action specific. These +diff --git a/doc/troubleshoot.html b/doc/troubleshoot.html +index a0303a2..ef3a4b1 100644 +--- a/doc/troubleshoot.html ++++ b/doc/troubleshoot.html +@@ -4,8 +4,8 @@ +

        troubleshooting rsyslog

        +

        Having trouble with rsyslog? + This page provides some tips on where to look for help and what to do +-if you need to ask for assistance. This page is continously being expanded. +-

        Useful troubleshooting ressources are: ++if you need to ask for assistance. This page is continuously being expanded. ++

        Useful troubleshooting resources are: +

          +
        • The rsyslog documentation - note that the online version always covers + the most recent development version. However, there is a version-specific +@@ -19,7 +19,7 @@ is a rsyslog-doc package, that often needs to be installed separately. +

          A common trouble source are ill-formed syslog messages, which + lead to to all sorts of interesting problems, including malformed hostnames and dates. + Read the quoted guide to find relief. A common symptom is that the %HOSTNAME% property is +-used for generating dynafile names, but some glibberish shows up. This is caused by the ++used for generating dynafile names, but some gibberish shows up. This is caused by the + malformed syslog messages, so be sure to read the + guide if you face that problem. Just let me add that the + common work-around is to use %FROMHOST% or %FROMHOST-IP% instead. These do not take the +@@ -28,7 +28,7 @@ the socket layer). Of course, this does not work over NAT or relay chains, where + only cure is to make sure senders emit well-formed messages. +

          Configuration Problems +

          Rsyslog 3.21.1 and above has been enhanced to support extended configuration checking. +-It offers a special command line switch (-N1) that puts it into "config verfication mode". ++It offers a special command line switch (-N1) that puts it into "config verification mode". + In that mode, it interprets and check the configuration file, but does not startup. This + mode can be used in parallel to a running instance of rsyslogd. +

          To enable it, run rsyslog interactively as follows: +@@ -56,7 +56,7 @@ The mailing list is probably a good place for complex questions. +

        +

        Debug Log +

        If you ask for help, there are chances that we need to ask for an rsyslog debug log. +-The debug log is a detailled report of what rsyslog does during processing. As such, it may ++The debug log is a detailed report of what rsyslog does during processing. As such, it may + even be useful for your very own troubleshooting. People have seen things inside their debug + log that enabled them to find problems they did not see before. So having a look at the + debug log, even before asking for help, may be useful. +@@ -89,7 +89,7 @@ meaningless value. Do not delete the lines, as this renders the debug log + unusable (and makes Rainer quite angry for wasted time, aka significantly reduces the chance + he will remain motivated to look at your problem ;)). For the same reason, make sure + whatever you change is changed consistently. Really! +-

        While most debug log files are moderately large, some can get quite to extremly large. ++

        While most debug log files are moderately large, some can get quite to extremely large. + For those on the larger side, it is a good idea to zip them. If the file is less than + around 100KiB, it's probably not necessary. +

        A good place to post your debug log is at the +@@ -99,9 +99,9 @@ various common formats, but rejects others for security reasons. The zip, txt, a + are definitely permitted, so it probably is a good idea to use one of them. For others, please + simply try and revert to another format if the forum doesn't like what you used. +

        +-Please note that all information in your debug file is publically visiable. ++Please note that all information in your debug file is publicly visible. + If this is not acceptable for you, you are probably a +-candidate for a commercial support contract. Free support ++candidate for a commercial support contract. Free support + comes without any guarantees, include no guarantee on confidentiality + [aka "we don't want to be sued for work were are not even paid for ;)]. + So if you submit debug logs, do so at your sole risk. By submitting them, you accept +@@ -115,11 +115,11 @@ you may see a serious problem during deployments in demanding, non-standard, env + (hopefully not with a stable version, but chances are good you'll run into troubles with + the development versions). +

        Active support from the user base is very important to help us track down those things. +-Most often, serious problems are the result of some memory misadressing. During development, ++Most often, serious problems are the result of some memory misaddressing. During development, + we routinely use valgrind, a very well and capable memory debugger. This helps us to create + pretty clean code. But valgrind can not detect everything, most importantly not code pathes + that are never executed. So of most use for us is information about aborts and abort locations. +-

        Unforutnately, faults rooted in adressing errors typically show up only later, so the ++

        Unfortunately, faults rooted in addressing errors typically show up only later, so the + actual abort location is in an unrelated spot. To help track down the original spot, + libc + later than 5.4.23 offers support for finding, and possible temporary relief from it, +diff --git a/doc/version_naming.html b/doc/version_naming.html +index 3bfa19b..fe59d19 100644 +--- a/doc/version_naming.html ++++ b/doc/version_naming.html +@@ -23,7 +23,7 @@ maybe around once a year. A major version increment has important + implications from the support side: without support contracts, the + current major version's last stable release and the last stable release + of the version immediately below it are supported (Adiscon, the rsyslog +-sponsor, offers support contracts covering all other versions).

        ++sponsor, offers support contracts covering all other versions).

        +

        The minor version is + incremented whenever a non-trivial new feature is planned to be added. + Triviality of a feature is simply determined by time estimated to +@@ -57,7 +57,7 @@ more if someone has asked for the feature). So we do not like to wait + for the original focus feature to be ready (what could take maybe three + more weeks). As a result, we release the new features. But that version + will also include partial code of the focus feature. Typically this +-doesn't hurt as long as noone tries to use it (what of course would ++doesn't hurt as long as no one tries to use it (what of course would + miserably fail). But still, part of the new code is already in it. When + we release such a "minor-feature enhanced" but "focus-feature not yet + completed" version, we need a way to flag it. In current thinking, that +@@ -85,14 +85,14 @@ the next minor development version while the previous minor version is + still a -rc because it is not yet considered sufficiently stable.

        Note: the + absence of the -devstate part indicates that a release is stable. + Following the same logic, any release with a -devstate part is unstable.

        A quick sample: 

        4.0.0 +-is the stable release. We begin to implement relp, moving to ++is the stable release. We begin to implement RELP, moving to + major.minor to 4.1. While we develop it, someone requests a trivial + feature, which we implement. We need to release, so we will have + 4.1.0-mf0. Another new feature is requested, move to 4.1.0-mf2. A first + version of RELP is implemented: 4.1.0-rc0. A new trivial feature is + implemented: 4.1.0-rc1. Relp is being enhanced: 4.1.0-rc2. We now feel + RELP is good enough for the time being and begin to implement TLS on +-plain /Tcp syslog: logical increment to 4.2. Now another new feature in ++plain TCP syslog: logical increment to 4.2. Now another new feature in + that tree: 4.2.0-mf0. Note that we now have 4.0.0 (stable) and + 4.1.0-rc2 and 4.1.0-mf0 (both devel). We find a big bug in RELP coding. + Two new releases: 4.1.0-rc3, 4.2.0-mf1 (the bug fix acts like a +-- +1.9.3 + diff --git a/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch b/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch deleted file mode 100644 index b91cbe7..0000000 --- a/SOURCES/rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch +++ /dev/null @@ -1,264 +0,0 @@ -From 9c8beb13cb0d584fb4dc8561c42fa4ae73c841a7 Mon Sep 17 00:00:00 2001 -From: Tomas Heinrich -Date: Thu, 22 Oct 2015 11:56:27 +0200 -Subject: [PATCH] imjournal: enable setting a default message TAG - -Also escape zero bytes in fields' values. ---- - plugins/imjournal/imjournal.c | 129 +++++++++++++++++++++++++----------------- - 1 file changed, 77 insertions(+), 52 deletions(-) - -diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c -index 7d42b84..0795e07 100755 ---- a/plugins/imjournal/imjournal.c -+++ b/plugins/imjournal/imjournal.c -@@ -70,6 +70,7 @@ static struct configSettings_s { - int bIgnorePrevious; - int iDfltSeverity; - int iDfltFacility; -+ char *dfltTag; - } cs; - - static rsRetVal facilityHdlr(uchar **pp, void *pVal); -@@ -82,7 +83,8 @@ static struct cnfparamdescr modpdescr[] = { - { "persiststateinterval", eCmdHdlrInt, 0 }, - { "ignorepreviousmessages", eCmdHdlrBinary, 0 }, - { "defaultseverity", eCmdHdlrSeverity, 0 }, -- { "defaultfacility", eCmdHdlrString, 0 } -+ { "defaultfacility", eCmdHdlrString, 0 }, -+ { "defaulttag", eCmdHdlrGetWord, 0 }, - }; - static struct cnfparamblk modpblk = - { CNFPARAMBLK_VERSION, -@@ -93,6 +95,7 @@ static struct cnfparamblk modpblk = - #define DFLT_persiststateinterval 10 - #define DFLT_SEVERITY LOG_PRI(LOG_NOTICE) - #define DFLT_FACILITY LOG_FAC(LOG_USER) -+#define DFLT_TAG "journal" - - static int bLegacyCnfModGlobalsPermitted = 1;/* are legacy module-global config parameters permitted? */ - -@@ -133,6 +136,31 @@ static rsRetVal facilityHdlr(uchar **pp, void *pVal) - } - - -+/* Currently just replaces '\0' with ' '. Not doing so would cause -+ * the value to be truncated. New space is allocated for the resulting -+ * string. -+ */ -+static rsRetVal -+sanitizeValue(const char *in, size_t len, char **out) -+{ -+ char *buf, *p; -+ DEFiRet; -+ -+ CHKmalloc(p = buf = malloc(len + 1)); -+ memcpy(buf, in, len); -+ buf[len] = '\0'; -+ -+ while ((p = memchr(p, '\0', len + buf - p)) != NULL) { -+ *p++ = ' '; -+ } -+ -+ *out = buf; -+ -+finalize_it: -+ RETiRet; -+} -+ -+ - /* enqueue the the journal message into the message queue. - * The provided msg string is not freed - thus must be done - * by the caller. -@@ -189,10 +217,9 @@ readjournal() { - int r; - - /* Information from messages */ -- char *message; -- char *sys_pid; -- char *sys_iden; -- char *sys_iden_help; -+ char *message = NULL; -+ char *sys_iden = NULL; -+ char *sys_iden_help = NULL; - - const void *get; - const void *pidget; -@@ -202,8 +229,6 @@ readjournal() { - - const void *equal_sign; - struct json_object *jval; -- char *data; -- char *name; - size_t l; - - long prefixlen = 0; -@@ -215,11 +240,7 @@ readjournal() { - if (sd_journal_get_data(j, "MESSAGE", &get, &length) < 0) { - message = strdup(""); - } else { -- message = strndup(get+8, length-8); -- if (message == NULL) { -- iRet = RS_RET_OUT_OF_MEMORY; -- goto ret; -- } -+ CHKiRet(sanitizeValue(((const char *)get) + 8, length - 8, &message)); - } - - /* Get message severity ("priority" in journald's terminology) */ -@@ -258,43 +279,46 @@ readjournal() { - - /* Get message identifier, client pid and add ':' */ - if (sd_journal_get_data(j, "SYSLOG_IDENTIFIER", &get, &length) >= 0) { -- sys_iden = strndup(get+18, length-18); -- } else { -- sys_iden = strdup("journal"); -- } -- if (sys_iden == NULL) { -- iRet = RS_RET_OUT_OF_MEMORY; -- goto free_message; -+ CHKiRet(sanitizeValue(((const char *)get) + 18, length - 18, &sys_iden)); - } - -- if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { -- sys_pid = strndup(pidget+11, pidlength-11); -- if (sys_pid == NULL) { -- iRet = RS_RET_OUT_OF_MEMORY; -- free (sys_iden); -- goto free_message; -- } -+ if (sys_iden == NULL && !cs.dfltTag[0]) { -+ /* This is a special case: if no tag was obtained from -+ * the message and the user has set the default tag to -+ * an empty string, nothing is inserted. -+ */ -+ CHKmalloc(sys_iden_help = calloc(1, 1)); - } else { -- sys_pid = NULL; -- } -+ if (sys_iden == NULL) { -+ /* Use a predefined tag if it can't be obtained from the message */ -+ CHKmalloc(sys_iden = strdup(cs.dfltTag)); -+ } -+ if (sd_journal_get_data(j, "SYSLOG_PID", &pidget, &pidlength) >= 0) { -+ char *sys_pid; - -- if (sys_pid) { -- r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); -- } else { -- r = asprintf(&sys_iden_help, "%s:", sys_iden); -- } -+ CHKiRet_Hdlr(sanitizeValue(((const char *)pidget) + 11, pidlength - 11, &sys_pid)) { -+ free (sys_iden); -+ FINALIZE; -+ } -+ r = asprintf(&sys_iden_help, "%s[%s]:", sys_iden, sys_pid); -+ free (sys_pid); -+ } else { -+ r = asprintf(&sys_iden_help, "%s:", sys_iden); -+ } - -- free (sys_iden); -- free (sys_pid); -+ free (sys_iden); - -- if (-1 == r) { -- iRet = RS_RET_OUT_OF_MEMORY; -- goto finalize_it; -+ if (-1 == r) { -+ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); -+ } - } - - json = json_object_new_object(); - - SD_JOURNAL_FOREACH_DATA(j, get, l) { -+ char *data; -+ char *name; -+ - /* locate equal sign, this is always present */ - equal_sign = memchr(get, '=', l); - -@@ -366,18 +390,13 @@ readjournal() { - break; - } - -- if (name == NULL) { -- iRet = RS_RET_OUT_OF_MEMORY; -- goto ret; -- } -+ CHKmalloc(name); - - prefixlen++; /* remove '=' */ - -- data = strndup(get + prefixlen, l - prefixlen); -- if (data == NULL) { -- iRet = RS_RET_OUT_OF_MEMORY; -+ CHKiRet_Hdlr(sanitizeValue(((const char *)get) + prefixlen, l - prefixlen, &data)) { - free (name); -- goto ret; -+ FINALIZE; - } - - /* and save them to json object */ -@@ -397,10 +416,10 @@ readjournal() { - enqMsg((uchar *)message, (uchar *) sys_iden_help, facility, severity, &tv, json); - - finalize_it: -- free(sys_iden_help); --free_message: -- free(message); --ret: -+ if (sys_iden_help != NULL) -+ free(sys_iden_help); -+ if (message != NULL) -+ free(message); - RETiRet; - } - -@@ -616,11 +635,14 @@ CODESTARTbeginCnfLoad - cs.ratelimitInterval = 600; - cs.iDfltSeverity = DFLT_SEVERITY; - cs.iDfltFacility = DFLT_FACILITY; -+ cs.dfltTag = NULL; - ENDbeginCnfLoad - - - BEGINendCnfLoad - CODESTARTendCnfLoad -+ if (cs.dfltTag == NULL) -+ cs.dfltTag = strdup(DFLT_TAG); - ENDendCnfLoad - - -@@ -636,6 +658,7 @@ ENDactivateCnf - - BEGINfreeCnf - CODESTARTfreeCnf -+ free(cs.dfltTag); - ENDfreeCnf - - /* open journal */ -@@ -715,6 +738,8 @@ CODESTARTsetModCnf - fac = p = es_str2cstr(pvals[i].val.d.estr, NULL); - facilityHdlr((uchar **) &p, (void *) &cs.iDfltFacility); - free(fac); -+ } else if (!strcmp(modpblk.descr[i].name, "defaulttag")) { -+ cs.dfltTag = (char *)es_str2cstr(pvals[i].val.d.estr, NULL); - } else { - dbgprintf("imjournal: program error, non-handled " - "param '%s' in beginCnfLoad\n", modpblk.descr[i].name); -@@ -772,8 +797,8 @@ CODEmodInit_QueryRegCFSLineHdlr - NULL, &cs.iDfltSeverity, STD_LOADABLE_MODULE_ID)); - CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaultfacility", 0, eCmdHdlrCustomHandler, - facilityHdlr, &cs.iDfltFacility, STD_LOADABLE_MODULE_ID)); -- -- -+ CHKiRet(omsdRegCFSLineHdlr((uchar *)"imjournaldefaulttag", 0, eCmdHdlrGetWord, -+ NULL, &cs.dfltTag, STD_LOADABLE_MODULE_ID)); - ENDmodInit - /* vim:set ai: - */ --- -1.9.3 - diff --git a/SOURCES/rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch b/SOURCES/rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch new file mode 100644 index 0000000..eb58390 --- /dev/null +++ b/SOURCES/rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch @@ -0,0 +1,75 @@ +From 177a4863f016fae5640fffd6b6ff8f86b5ffee3a Mon Sep 17 00:00:00 2001 +From: Tomas Heinrich +Date: Mon, 28 Jul 2014 18:39:06 +0200 +Subject: [PATCH] imjournal: sanitize messages as imuxsock does it + +This change makes these directives available for imjournal: + $ControlCharacterEscapePrefix + $DropTrailingLFOnReception + $Escape8bitCharactersOnReceive + $EscapeControlCharacterTab + $EscapeControlCharactersOnReceive + $SpaceNLOnReceive +--- + plugins/imjournal/imjournal.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c +index 7d42b84..b0b034c 100755 +--- a/plugins/imjournal/imjournal.c ++++ b/plugins/imjournal/imjournal.c +@@ -44,6 +44,7 @@ + #include "imjournal.h" + #include "net.h" + #include "glbl.h" ++#include "parser.h" + #include "prop.h" + #include "errmsg.h" + #include "srUtils.h" +@@ -58,6 +59,7 @@ MODULE_CNFNAME("imjournal") + DEF_IMOD_STATIC_DATA + DEFobjCurrIf(datetime) + DEFobjCurrIf(glbl) ++DEFobjCurrIf(parser) + DEFobjCurrIf(prop) + DEFobjCurrIf(net) + DEFobjCurrIf(errmsg) +@@ -142,6 +144,7 @@ enqMsg(uchar *msg, uchar *pszTag, int iFacility, int iSeverity, struct timeval * + { + struct syslogTime st; + msg_t *pMsg; ++ size_t len; + DEFiRet; + + assert(msg != NULL); +@@ -155,7 +158,10 @@ enqMsg(uchar *msg, uchar *pszTag, int iFacility, int iSeverity, struct timeval * + } + MsgSetFlowControlType(pMsg, eFLOWCTL_LIGHT_DELAY); + MsgSetInputName(pMsg, pInputName); +- MsgSetRawMsgWOSize(pMsg, (char*)msg); ++ len = strlen((char*)msg); ++ MsgSetRawMsg(pMsg, (char*)msg, len); ++ if(len > 0) ++ parser.SanitizeMsg(pMsg); + MsgSetMSGoffs(pMsg, 0); /* we do not have a header... */ + MsgSetRcvFrom(pMsg, glbl.GetLocalHostNameProp()); + MsgSetRcvFromIP(pMsg, pLocalHostIP); +@@ -670,6 +676,7 @@ CODESTARTmodExit + objRelease(glbl, CORE_COMPONENT); + objRelease(net, CORE_COMPONENT); + objRelease(datetime, CORE_COMPONENT); ++ objRelease(parser, CORE_COMPONENT); + objRelease(prop, CORE_COMPONENT); + objRelease(errmsg, CORE_COMPONENT); + ENDmodExit +@@ -750,6 +757,7 @@ CODESTARTmodInit + CODEmodInit_QueryRegCFSLineHdlr + CHKiRet(objUse(datetime, CORE_COMPONENT)); + CHKiRet(objUse(glbl, CORE_COMPONENT)); ++ CHKiRet(objUse(parser, CORE_COMPONENT)); + CHKiRet(objUse(prop, CORE_COMPONENT)); + CHKiRet(objUse(net, CORE_COMPONENT)); + CHKiRet(objUse(errmsg, CORE_COMPONENT)); +-- +1.9.3 + diff --git a/SOURCES/rsyslog.log b/SOURCES/rsyslog.log index 3341f2f..e4b15af 100644 --- a/SOURCES/rsyslog.log +++ b/SOURCES/rsyslog.log @@ -4,6 +4,7 @@ /var/log/secure /var/log/spooler { + missingok sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true diff --git a/SPECS/rsyslog.spec b/SPECS/rsyslog.spec index 12b749e..a9c0ca8 100644 --- a/SPECS/rsyslog.spec +++ b/SPECS/rsyslog.spec @@ -1,5 +1,6 @@ %define rsyslog_statedir %{_sharedstatedir}/rsyslog %define rsyslog_pkidir %{_sysconfdir}/pki/rsyslog +%define rsyslog_docdir %{_docdir}/%{name}-%{version} %if 0%{?rhel} >= 7 %global want_hiredis 0 %global want_mongodb 0 @@ -13,7 +14,7 @@ Summary: Enhanced system logging and kernel message trapping daemon Name: rsyslog Version: 7.4.7 -Release: 7%{?dist}.1 +Release: 12%{?dist} License: (GPLv3+ and ASL 2.0) Group: System Environment/Daemons URL: http://www.rsyslog.com/ @@ -27,8 +28,6 @@ Patch1: rsyslog-7.2.2-manpage-dbg-mode.patch # prevent modification of trusted properties (proposed upstream) Patch2: rsyslog-7.2.1-msg_c_nonoverwrite_merge.patch # sent upstream -Patch3: rsyslog-7.4.7-bz1053669-imuxsock-wrn.patch -# sent upstream Patch5: rsyslog-7.4.7-bz1030044-remove-ads.patch # merged upstream Patch6: rsyslog-7.4.7-numeric-uid.patch @@ -38,7 +37,18 @@ Patch8: rsyslog-7.4.7-bz1052266-dont-link-libee.patch Patch9: rsyslog-7.4.7-bz1054171-omjournal-warning.patch Patch10: rsyslog-7.4.7-bz1038136-imjournal-message-loss.patch Patch11: rsyslog-7.4.7-bz1142373-cve-2014-3634.patch -Patch12: rsyslog-7.4.7-rhbz1249907-imjournal-default-tag.patch +Patch12: rsyslog-7.4.7-rhbz1151037-add-mmcount.patch +Patch13: rsyslog-7.4.7-rhbz743890-imjournal-sanitize-msgs.patch +Patch14: rsyslog-7.4.7-rhbz1184410-imuxsock-create-path.patch +Patch15: rsyslog-7.4.7-rhbz1202489-path-creation-race.patch +Patch16: rsyslog-7.4.7-rhbz1238713-html-docs.patch +Patch17: rsyslog-7.4.7-rhbz1078878-division-by-zero.patch +Patch18: rsyslog-7.4.7-rhbz1143846-clarify-SysSock.Use.patch +Patch19: rsyslog-7.4.7-rhbz1151041-imuxsock-socket-limit.patch +Patch20: rsyslog-7.4.7-rhbz1101602-imjournal-zero-bytes.patch +Patch21: rsyslog-7.4.7-rhbz1188503-imjournal-default-tag.patch +Patch22: rsyslog-7.4.7-rhbz1184402-imuxsock-hostname.patch +Patch23: rsyslog-7.4.7-bz1254511-ppc64le_bug.patch BuildRequires: bison BuildRequires: flex @@ -53,6 +63,7 @@ BuildRequires: zlib-devel Requires: logrotate >= 3.5.2 Requires: bash >= 2.0 +Requires: libestr >= 0.1.9 Requires(post): systemd Requires(preun): systemd Requires(postun): systemd @@ -67,7 +78,7 @@ Requires: %name = %version-%release BuildRequires: libgcrypt-devel %package doc -Summary: Documentation for rsyslog +Summary: HTML Documentation for rsyslog Group: Documentation %package elasticsearch @@ -150,6 +161,7 @@ BuildRequires: krb5-devel Summary: RELP protocol support for rsyslog Group: System Environment/Daemons Requires: %name = %version-%release +Requires: librelp >= 1.0.3 BuildRequires: librelp-devel >= 1.0.3 %package gnutls @@ -262,7 +274,6 @@ of source ports. %patch0 -p1 %patch1 -p1 %patch2 -p1 -%patch3 -p1 %patch5 -p1 %patch6 -p1 %patch7 -p1 @@ -271,6 +282,17 @@ of source ports. %patch10 -p1 %patch11 -p1 %patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 %build %ifarch sparc64 @@ -303,6 +325,7 @@ export HIREDIS_LIBS=-L%{_libdir} --enable-mail \ --enable-mmanon \ --enable-mmaudit \ + --enable-mmcount \ --enable-mmjsonparse \ --enable-mmnormalize \ --enable-mmsnmptrapd \ @@ -342,12 +365,16 @@ install -d -m 755 %{buildroot}%{_sysconfdir}/logrotate.d install -d -m 755 %{buildroot}%{_sysconfdir}/rsyslog.d install -d -m 700 %{buildroot}%{rsyslog_statedir} install -d -m 700 %{buildroot}%{rsyslog_pkidir} +install -d -m 755 %{buildroot}%{rsyslog_docdir}/html install -p -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/rsyslog.conf install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/sysconfig/rsyslog install -p -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/logrotate.d/syslog - -# get rid of *.la +install -p -m 644 plugins/ommysql/createDB.sql %{buildroot}%{rsyslog_docdir}/mysql-createDB.sql +install -p -m 644 plugins/ompgsql/createDB.sql %{buildroot}%{rsyslog_docdir}/pgsql-createDB.sql +# extract documentation +cp -r doc/*.{html,jpeg,jpg,png} %{buildroot}%{rsyslog_docdir}/html +# get rid of libtool libraries rm -f %{buildroot}%{_libdir}/rsyslog/*.la # get rid of socket activation by default sed -i '/^Alias/s/^/;/;/^Requires=syslog.socket/s/^/;/' %{buildroot}%{_unitdir}/rsyslog.service @@ -371,7 +398,10 @@ done %files %defattr(-,root,root,-) -%doc AUTHORS COPYING* NEWS README ChangeLog +%doc AUTHORS COPYING* ChangeLog +%exclude %{rsyslog_docdir}/html +%exclude %{rsyslog_docdir}/mysql-createDB.sql +%exclude %{rsyslog_docdir}/pgsql-createDB.sql %dir %{_libdir}/rsyslog %dir %{_sysconfdir}/rsyslog.d %dir %{rsyslog_statedir} @@ -404,6 +434,7 @@ done %{_libdir}/rsyslog/lmtcpsrv.so %{_libdir}/rsyslog/lmzlibw.so %{_libdir}/rsyslog/mmanon.so +%{_libdir}/rsyslog/mmcount.so %{_libdir}/rsyslog/omjournal.so %{_libdir}/rsyslog/ommail.so %{_libdir}/rsyslog/omprog.so @@ -425,7 +456,7 @@ done %files doc %defattr(-,root,root) -%doc doc/*html +%doc %{rsyslog_docdir}/html %files elasticsearch %defattr(-,root,root) @@ -459,7 +490,7 @@ done %files mysql %defattr(-,root,root) -%doc plugins/ommysql/createDB.sql +%doc %{rsyslog_docdir}/mysql-createDB.sql %{_libdir}/rsyslog/ommysql.so %if %{want_mongodb} @@ -471,7 +502,7 @@ done %files pgsql %defattr(-,root,root) -%doc plugins/ompgsql/createDB.sql +%doc %{rsyslog_docdir}/pgsql-createDB.sql %{_libdir}/rsyslog/ompgsql.so %if %{want_rabbitmq} @@ -504,9 +535,58 @@ done %{_libdir}/rsyslog/omudpspoof.so %changelog -* Thu Oct 22 2015 Tomas Heinrich 7.4.7-7.el7_1.1 +* Fri Aug 28 2015 Tomas Heinrich 7.4.7-12 +- amend the patch for rhbz#1151041 + resolves: rhbz#1257150 + +* Tue Aug 18 2015 Radovan Sroka 7.4.7-11 +- add patch that resolves config.guess system-recognition on ppc64le architecture + resolves: rhbz:1254511 + +* Mon Aug 03 2015 Tomas Heinrich 7.4.7-10 +- add a patch to prevent field truncation in imjournal + resolves: rhbz#1101602 - add a patch to enable setting a default TAG - resolves: rhbz#1249907 + resolves: rhbz#1188503 +- add a patch to fix a nonfunction hostname setting in imuxsock + resolves: rhbz#1184402 + +* Mon Jul 20 2015 Tomas Heinrich 7.4.7-9 +- update the patch fixing a race condition in directory creation + resolves: rhbz#1202489 +- improve provided documentation + - move documentation from all subpackages under a single directory + - add missing images + - remove doc files without content + - add a patch making various corrections to the HTML documentation + resolves: rhbz#1238713 +- add a patch to prevent division-by-zero errors + resolves: rhbz#1078878 +- add a patch to clarify usage of the SysSock.Use option + resolves: rhbz#1143846 +- add a patch to support arbitrary number of listeners in imuxsock + - drop patch for rhbz#1053669 as it has been merged into this one + resolves: rhbz#1151041 + +* Fri Jul 03 2015 Tomas Heinrich 7.4.7-8 +- modify the service file to automatically restart rsyslog on failure + resolves: rhbz#1061322 +- add explicitly versioned dependencies on libraries which do not have + correctly versioned sonames + resolves: rhbz#1107839 +- make logrotate tolerate missing log files + resolves: rhbz#1144465 +- backport the mmcount plugin + resolves: rhbz#1151037 +- set the default service umask to 0066 + resolves: rhbz#1228192 +- add a patch to make imjournal sanitize messages as imuxsock does it + resolves: rhbz#743890 +- add a patch to fix a bug preventing certain imuxsock directives from + taking effect + resolves: rhbz#1184410 +- add a patch to fix a race condition in directory creation + resolves: rhbz#1202489 * Tue Oct 07 2014 Tomas Heinrich 7.4.7-7 - fix CVE-2014-3634