mirror of
https://github.com/rsyslog/rsyslog.git
synced 2025-12-19 02:10:42 +01:00
properties are now case-insensitive everywhere (script, filters, templates)
This commit is contained in:
parent
11461ad9c6
commit
5e279ea0f7
@ -2,6 +2,9 @@
|
||||
Version 3.17.0 (rgerhards), 2008-04-??
|
||||
- FEATURE FOCUS for 3.17 is TLS over plain TCP syslog
|
||||
- removed no longer needed file relptuil.c/.h
|
||||
- bugfix: memory leaks in script engine
|
||||
- properties are now case-insensitive everywhere (script, filters,
|
||||
templates)
|
||||
---------------------------------------------------------------------------
|
||||
Version 3.15.1 (rgerhards), 2008-04-??
|
||||
- disabled atomic operations for the time being because they introduce some
|
||||
|
||||
4
conf.c
4
conf.c
@ -816,7 +816,7 @@ static rsRetVal cflineProcessPropFilter(uchar **pline, register selector_t *f)
|
||||
}
|
||||
|
||||
/* read property */
|
||||
iRet = parsDelimCStr(pPars, &f->f_filterData.prop.pCSPropName, ',', 1, 1);
|
||||
iRet = parsDelimCStr(pPars, &f->f_filterData.prop.pCSPropName, ',', 1, 1, 1);
|
||||
if(iRet != RS_RET_OK) {
|
||||
errmsg.LogError(NO_ERRCODE, "error %d parsing filter property - ignoring selector", iRet);
|
||||
rsParsDestruct(pPars);
|
||||
@ -824,7 +824,7 @@ static rsRetVal cflineProcessPropFilter(uchar **pline, register selector_t *f)
|
||||
}
|
||||
|
||||
/* read operation */
|
||||
iRet = parsDelimCStr(pPars, &pCSCompOp, ',', 1, 1);
|
||||
iRet = parsDelimCStr(pPars, &pCSCompOp, ',', 1, 1, 1);
|
||||
if(iRet != RS_RET_OK) {
|
||||
errmsg.LogError(NO_ERRCODE, "error %d compare operation property - ignoring selector", iRet);
|
||||
rsParsDestruct(pPars);
|
||||
|
||||
@ -1,7 +1,5 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html><head><title>The Rsyslogd Property Replacer</title>
|
||||
|
||||
</head>
|
||||
<html><head><title>The Rsyslogd Property Replacer</title></head>
|
||||
<body>
|
||||
<h1>The Property Replacer</h1>
|
||||
<p><b>The property replacer is a core component in
|
||||
@ -17,7 +15,7 @@ modified by the property replacer. The full syntax is as follows:</p>
|
||||
<blockquote><b><code>%propname:fromChar:toChar:options%</code></b></blockquote>
|
||||
<h2>Available Properties</h2>
|
||||
<p><b><code>propname</code></b> is the
|
||||
name of the property to access. It is case-sensitive.
|
||||
name of the property to access. It is case-insensitive (prior to 3.17.0, they were case-senstive).
|
||||
Currently supported are:</p>
|
||||
<table>
|
||||
<tbody>
|
||||
@ -31,11 +29,11 @@ Currently supported are:</p>
|
||||
socket. Should be useful for debugging.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>UxTradMsg</b></td>
|
||||
<td><b>uxtradmsg</b></td>
|
||||
<td>will disappear soon - do NOT use!</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>HOSTNAME</b></td>
|
||||
<td><b>hostname</b></td>
|
||||
<td>hostname from the message</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -43,7 +41,7 @@ socket. Should be useful for debugging.</td>
|
||||
<td>alias for HOSTNAME</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>FROMHOST</b></td>
|
||||
<td><b>fromhost</b></td>
|
||||
<td>hostname of the system the message was received from
|
||||
(in a relay chain, this is the system immediately in front of us and
|
||||
not necessarily the original sender)</td>
|
||||
@ -59,16 +57,16 @@ BSD syslogd. For example, when TAG is "named[12345]", programname is
|
||||
"named".</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>PRI</b></td>
|
||||
<td><b>pri</b></td>
|
||||
<td>PRI part of the message - undecoded (single value)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>PRI-text</b></td>
|
||||
<td><b>pri-text</b></td>
|
||||
<td>the PRI part of the message in a textual form (e.g.
|
||||
"syslog.info")</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>IUT</b></td>
|
||||
<td><span style="font-weight: bold;">iut</span></td>
|
||||
<td>the monitorware InfoUnitType - used when talking
|
||||
to a <a href="http://www.monitorware.com">MonitorWare</a>
|
||||
backend (also for <a href="http://www.phplogcon.org/">phpLogCon</a>)</td>
|
||||
@ -110,67 +108,67 @@ what was provided in the message (in most cases,
|
||||
only seconds)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>TIMESTAMP</b></td>
|
||||
<td><b>timestamp</b></td>
|
||||
<td>alias for timereported</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>PROTOCOL-VERSION</b></td>
|
||||
<td><b>protocol-version</b></td>
|
||||
<td>The contents of the PROTCOL-VERSION field from IETF
|
||||
draft draft-ietf-syslog-protcol</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>STRUCTURED-DATA</b></td>
|
||||
<td><b>structured-data</b></td>
|
||||
<td>The contents of the STRUCTURED-DATA field from IETF
|
||||
draft draft-ietf-syslog-protocol</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>APP-NAME</b></td>
|
||||
<td><b>app-name</b></td>
|
||||
<td>The contents of the APP-NAME field from IETF draft
|
||||
draft-ietf-syslog-protocol</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>PROCID</b></td>
|
||||
<td><b>procid</b></td>
|
||||
<td>The contents of the PROCID field from IETF draft
|
||||
draft-ietf-syslog-protocol</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td height="24"><b>MSGID</b></td>
|
||||
<td height="24"><b>msgid</b></td>
|
||||
<td height="24">The contents of the MSGID field from
|
||||
IETF draft draft-ietf-syslog-protocol</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$NOW</b></td>
|
||||
<td><b>$now</b></td>
|
||||
<td>The current date stamp in the format YYYY-MM-DD</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$YEAR</b></td>
|
||||
<td><b>$year</b></td>
|
||||
<td>The current year (4-digit)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$MONTH</b></td>
|
||||
<td><b>$month</b></td>
|
||||
<td>The current month (2-digit)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$DAY</b></td>
|
||||
<td><b>$day</b></td>
|
||||
<td>The current day of the month (2-digit)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$HOUR</b></td>
|
||||
<td><b>$hour</b></td>
|
||||
<td>The current hour in military (24 hour) time (2-digit)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$HHOUR</b></td>
|
||||
<td><b>$hhour</b></td>
|
||||
<td>The current half hour we are in. From minute 0 to 29,
|
||||
this is always 0 while
|
||||
from 30 to 59 it is always 1.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$QHOUR</b></td>
|
||||
<td><b>$qhour</b></td>
|
||||
<td>The current quarter hour we are in. Much like $HHOUR, but values
|
||||
range from 0 to 3 (for the four quater hours that are in each hour)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>$MINUTE</b></td>
|
||||
<td><b>$minute</b></td>
|
||||
<td>The current minute (2-digit)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
40
msg.c
40
msg.c
@ -1604,18 +1604,17 @@ char *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
pRes = getMSG(pMsg);
|
||||
} else if(!strcmp((char*) pName, "rawmsg")) {
|
||||
pRes = getRawMsg(pMsg);
|
||||
} else if(!strcmp((char*) pName, "UxTradMsg")) {
|
||||
} else if(!strcmp((char*) pName, "uxtradmsg")) {
|
||||
pRes = getUxTradMsg(pMsg);
|
||||
} else if(!strcmp((char*) pName, "FROMHOST")) {
|
||||
} else if(!strcmp((char*) pName, "fromhost")) {
|
||||
pRes = getRcvFrom(pMsg);
|
||||
} else if(!strcmp((char*) pName, "source")
|
||||
|| !strcmp((char*) pName, "HOSTNAME")) {
|
||||
} else if(!strcmp((char*) pName, "source") || !strcmp((char*) pName, "hostname")) {
|
||||
pRes = getHOSTNAME(pMsg);
|
||||
} else if(!strcmp((char*) pName, "syslogtag")) {
|
||||
pRes = getTAG(pMsg);
|
||||
} else if(!strcmp((char*) pName, "PRI")) {
|
||||
} else if(!strcmp((char*) pName, "pri")) {
|
||||
pRes = getPRI(pMsg);
|
||||
} else if(!strcmp((char*) pName, "PRI-text")) {
|
||||
} else if(!strcmp((char*) pName, "pri-text")) {
|
||||
pBuf = malloc(20 * sizeof(char));
|
||||
if(pBuf == NULL) {
|
||||
*pbMustBeFreed = 0;
|
||||
@ -1637,57 +1636,57 @@ char *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
} else if(!strcmp((char*) pName, "timegenerated")) {
|
||||
pRes = getTimeGenerated(pMsg, pTpe->data.field.eDateFormat);
|
||||
} else if(!strcmp((char*) pName, "timereported")
|
||||
|| !strcmp((char*) pName, "TIMESTAMP")) {
|
||||
|| !strcmp((char*) pName, "timestamp")) {
|
||||
pRes = getTimeReported(pMsg, pTpe->data.field.eDateFormat);
|
||||
} else if(!strcmp((char*) pName, "programname")) {
|
||||
pRes = getProgramName(pMsg);
|
||||
} else if(!strcmp((char*) pName, "PROTOCOL-VERSION")) {
|
||||
} else if(!strcmp((char*) pName, "protocol-version")) {
|
||||
pRes = getProtocolVersionString(pMsg);
|
||||
} else if(!strcmp((char*) pName, "STRUCTURED-DATA")) {
|
||||
} else if(!strcmp((char*) pName, "structured-data")) {
|
||||
pRes = getStructuredData(pMsg);
|
||||
} else if(!strcmp((char*) pName, "APP-NAME")) {
|
||||
} else if(!strcmp((char*) pName, "app-name")) {
|
||||
pRes = getAPPNAME(pMsg);
|
||||
} else if(!strcmp((char*) pName, "PROCID")) {
|
||||
} else if(!strcmp((char*) pName, "procid")) {
|
||||
pRes = getPROCID(pMsg);
|
||||
} else if(!strcmp((char*) pName, "MSGID")) {
|
||||
} else if(!strcmp((char*) pName, "msgid")) {
|
||||
pRes = getMSGID(pMsg);
|
||||
/* here start system properties (those, that do not relate to the message itself */
|
||||
} else if(!strcmp((char*) pName, "$NOW")) {
|
||||
} else if(!strcmp((char*) pName, "$now")) {
|
||||
if((pRes = (char*) getNOW(NOW_NOW)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$YEAR")) {
|
||||
} else if(!strcmp((char*) pName, "$year")) {
|
||||
if((pRes = (char*) getNOW(NOW_YEAR)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$MONTH")) {
|
||||
} else if(!strcmp((char*) pName, "$month")) {
|
||||
if((pRes = (char*) getNOW(NOW_MONTH)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$DAY")) {
|
||||
} else if(!strcmp((char*) pName, "$day")) {
|
||||
if((pRes = (char*) getNOW(NOW_DAY)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$HOUR")) {
|
||||
} else if(!strcmp((char*) pName, "$hour")) {
|
||||
if((pRes = (char*) getNOW(NOW_HOUR)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$HHOUR")) {
|
||||
} else if(!strcmp((char*) pName, "$hhour")) {
|
||||
if((pRes = (char*) getNOW(NOW_HHOUR)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$QHOUR")) {
|
||||
} else if(!strcmp((char*) pName, "$qhour")) {
|
||||
if((pRes = (char*) getNOW(NOW_QHOUR)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
*pbMustBeFreed = 1; /* all of these functions allocate dyn. memory */
|
||||
} else if(!strcmp((char*) pName, "$MINUTE")) {
|
||||
} else if(!strcmp((char*) pName, "$minute")) {
|
||||
if((pRes = (char*) getNOW(NOW_MINUTE)) == NULL) {
|
||||
return "***OUT OF MEMORY***";
|
||||
} else
|
||||
@ -1696,6 +1695,7 @@ char *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
|
||||
/* there is no point in continuing, we may even otherwise render the
|
||||
* error message unreadable. rgerhards, 2007-07-10
|
||||
*/
|
||||
dbgprintf("invalid property name: '%s'\n", pName);
|
||||
return "**INVALID PROPERTY NAME**";
|
||||
}
|
||||
|
||||
|
||||
5
parse.c
5
parse.c
@ -235,11 +235,12 @@ rsRetVal parsSkipWhitespace(rsParsObj *pThis)
|
||||
* 0 means "no", 1 "yes"
|
||||
* - bTrimLeading
|
||||
* - bTrimTrailing
|
||||
* - bConvLower - convert string to lower case?
|
||||
*
|
||||
* Output:
|
||||
* ppCStr Pointer to the parsed string - must be freed by caller!
|
||||
*/
|
||||
rsRetVal parsDelimCStr(rsParsObj *pThis, cstr_t **ppCStr, char cDelim, int bTrimLeading, int bTrimTrailing)
|
||||
rsRetVal parsDelimCStr(rsParsObj *pThis, cstr_t **ppCStr, char cDelim, int bTrimLeading, int bTrimTrailing, int bConvLower)
|
||||
{
|
||||
DEFiRet;
|
||||
register unsigned char *pC;
|
||||
@ -256,7 +257,7 @@ rsRetVal parsDelimCStr(rsParsObj *pThis, cstr_t **ppCStr, char cDelim, int bTrim
|
||||
|
||||
while(pThis->iCurrPos < rsCStrLen(pThis->pCStr)
|
||||
&& *pC != cDelim) {
|
||||
if((iRet = rsCStrAppendChar(pCStr, *pC)) != RS_RET_OK) {
|
||||
if((iRet = rsCStrAppendChar(pCStr, bConvLower ? tolower(*pC) : *pC)) != RS_RET_OK) {
|
||||
rsCStrDestruct(&pCStr);
|
||||
FINALIZE;
|
||||
}
|
||||
|
||||
2
parse.h
2
parse.h
@ -91,7 +91,7 @@ rsRetVal parsSkipWhitespace(rsParsObj *pThis);
|
||||
* Output:
|
||||
* ppCStr Pointer to the parsed string
|
||||
*/
|
||||
rsRetVal parsDelimCStr(rsParsObj *pThis, cstr_t **ppCStr, char cDelim, int bTrimLeading, int bTrimTrailing);
|
||||
rsRetVal parsDelimCStr(rsParsObj *pThis, cstr_t **ppCStr, char cDelim, int bTrimLeading, int bTrimTrailing, int bConvLower);
|
||||
|
||||
rsRetVal parsSkipAfterChar(rsParsObj *pThis, char c);
|
||||
rsRetVal parsQuotedCStr(rsParsObj *pThis, cstr_t **ppCStr);
|
||||
|
||||
@ -385,7 +385,6 @@ static int do_Constant(unsigned char **pp, struct template *pTpl)
|
||||
if((pTpe = tpeConstruct(pTpl)) == NULL) {
|
||||
/* OK, we are out of luck. Let's invalidate the
|
||||
* entry and that's it.
|
||||
* TODO: add panic message once we have a mechanism for this
|
||||
*/
|
||||
pTpe->eEntryType = UNDEFINED;
|
||||
return 1;
|
||||
@ -510,7 +509,8 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
|
||||
pTpe->eEntryType = FIELD;
|
||||
|
||||
while(*p && *p != '%' && *p != ':') {
|
||||
rsCStrAppendChar(pStrB, *p++);
|
||||
rsCStrAppendChar(pStrB, tolower(*p));
|
||||
++p; /* do NOT do this in tolower()! */
|
||||
}
|
||||
|
||||
/* got the name*/
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user