diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2008-02-14 15:43:50 +0000 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2008-02-14 15:43:50 +0000 |
commit | 52b6b6f2211718101e43de05e5292f555e8198a8 (patch) | |
tree | e84f9d0fe3cc2c436d944357812712e6961ef296 | |
parent | d6b22dd69ea85d024eaaac93e2a6521669f1ccc0 (diff) | |
download | rsyslog-52b6b6f2211718101e43de05e5292f555e8198a8.tar.gz rsyslog-52b6b6f2211718101e43de05e5292f555e8198a8.tar.xz rsyslog-52b6b6f2211718101e43de05e5292f555e8198a8.zip |
- added new facility and severity syntaxes to cfsysline handler
- implemented $InputFileFacility config directive
- implemented $InputFileSeverity config directive
-rw-r--r-- | cfsysline.c | 124 | ||||
-rw-r--r-- | cfsysline.h | 2 | ||||
-rw-r--r-- | doc/imfile.html | 19 | ||||
-rw-r--r-- | plugins/imfile/imfile.c | 20 | ||||
-rwxr-xr-x | srUtils.c | 8 | ||||
-rwxr-xr-x | srUtils.h | 10 | ||||
-rw-r--r-- | syslogd.c | 1 |
7 files changed, 143 insertions, 41 deletions
diff --git a/cfsysline.c b/cfsysline.c index 0cc6c134..7249188e 100644 --- a/cfsysline.c +++ b/cfsysline.c @@ -438,7 +438,40 @@ finalize_it: } -/* Parse and a word config line option. A word is a consequitive +/* parse a whitespace-delimited word from the provided string. This is a + * helper function for a number of syntaxes. The parsed value is returned + * in ppStrB (which must be provided by caller). + * rgerhards, 2008-02-14 + */ +static rsRetVal +getWord(uchar **pp, rsCStrObj **ppStrB) +{ + DEFiRet; + uchar *p; + + ASSERT(pp != NULL); + ASSERT(*pp != NULL); + ASSERT(*ppStrB != NULL); + + if((*ppStrB = rsCStrConstruct()) == NULL) + ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); + + /* parse out the word */ + p = *pp; + + while(*p && !isspace((int) *p)) { + CHKiRet(rsCStrAppendChar(*ppStrB, *p++)); + } + CHKiRet(rsCStrFinish(*ppStrB)); + + *pp = p; + +finalize_it: + RETiRet; +} + + +/* Parse and a word config line option. A word is a consequtive * sequence of non-whitespace characters. pVal must be * a pointer to a string which is to receive the option * value. The returned string must be freed by the caller. @@ -455,23 +488,12 @@ static rsRetVal doGetWord(uchar **pp, rsRetVal (*pSetHdlr)(void*, uchar*), void { DEFiRet; rsCStrObj *pStrB; - uchar *p; uchar *pNewVal; - assert(pp != NULL); - assert(*pp != NULL); - - if((pStrB = rsCStrConstruct()) == NULL) - return RS_RET_OUT_OF_MEMORY; - - /* parse out the word */ - p = *pp; - - while(*p && !isspace((int) *p)) { - CHKiRet(rsCStrAppendChar(pStrB, *p++)); - } - CHKiRet(rsCStrFinish(pStrB)); + ASSERT(pp != NULL); + ASSERT(*pp != NULL); + CHKiRet(getWord(pp, &pStrB)); CHKiRet(rsCStrConvSzStrAndDestruct(pStrB, &pNewVal, 0)); pStrB = NULL; @@ -486,7 +508,6 @@ static rsRetVal doGetWord(uchar **pp, rsRetVal (*pSetHdlr)(void*, uchar*), void CHKiRet(pSetHdlr(pVal, pNewVal)); } - *pp = p; skipWhiteSpace(pp); /* skip over any whitespace */ finalize_it: @@ -499,6 +520,66 @@ finalize_it: } +/* parse a syslog name from the string. This is the generic code that is + * called by the facility/severity functions. Note that we do not check the + * validity of numerical values, something that should probably change over + * time (TODO). -- rgerhards, 2008-02-14 + */ +static rsRetVal +doSyslogName(uchar **pp, rsRetVal (*pSetHdlr)(void*, int), void *pVal, syslogName_t *pNameTable) +{ + DEFiRet; + rsCStrObj *pStrB; + int iNewVal; + + ASSERT(pp != NULL); + ASSERT(*pp != NULL); + + CHKiRet(getWord(pp, &pStrB)); /* get word */ + iNewVal = decodeSyslogName(rsCStrGetSzStr(pStrB), pNameTable); + + if(pSetHdlr == NULL) { + /* we should set value directly to var */ + *((int*)pVal) = iNewVal; /* set new one */ + } else { + /* we set value via a set function */ + CHKiRet(pSetHdlr(pVal, iNewVal)); + } + + skipWhiteSpace(pp); /* skip over any whitespace */ + +finalize_it: + if(pStrB != NULL) + rsCStrDestruct(pStrB); + + RETiRet; +} + + +/* Implements the facility syntax. + * rgerhards, 2008-02-14 + */ +static rsRetVal +doFacility(uchar **pp, rsRetVal (*pSetHdlr)(void*, int), void *pVal) +{ + DEFiRet; + iRet = doSyslogName(pp, pSetHdlr, pVal, syslogFacNames); + RETiRet; +} + + +/* Implements the severity syntax. + * rgerhards, 2008-02-14 + */ +static rsRetVal +doSeverity(uchar **pp, rsRetVal (*pSetHdlr)(void*, int), void *pVal) +{ + DEFiRet; + iRet = doSyslogName(pp, pSetHdlr, pVal, syslogPriNames); + RETiRet; +} + + /* --------------- END functions for handling canned syntaxes --------------- */ /* destructor for cslCmdHdlr @@ -507,7 +588,7 @@ finalize_it: */ static rsRetVal cslchDestruct(void *pThis) { - assert(pThis != NULL); + ASSERT(pThis != NULL); free(pThis); return RS_RET_OK; @@ -607,6 +688,12 @@ static rsRetVal cslchCallHdlr(cslCmdHdlr_t *pThis, uchar **ppConfLine) case eCmdHdlrGetChar: pHdlr = doGetChar; break; + case eCmdHdlrFacility: + pHdlr = doFacility; + break; + case eCmdHdlrSeverity: + pHdlr = doSeverity; + break; case eCmdHdlrGetWord: pHdlr = doGetWord; break; @@ -892,6 +979,5 @@ void dbgPrintCfSysLineHandlers(void) ENDfunc } -/* - * vi:set ai: +/* vim:set ai: */ diff --git a/cfsysline.h b/cfsysline.h index 2aa54595..2eec18ab 100644 --- a/cfsysline.h +++ b/cfsysline.h @@ -37,6 +37,8 @@ typedef enum cslCmdHdlrType { eCmdHdlrInt, eCmdHdlrSize, eCmdHdlrGetChar, + eCmdHdlrFacility, + eCmdHdlrSeverity, eCmdHdlrGetWord } ecslCmdHdrlType; diff --git a/doc/imfile.html b/doc/imfile.html index 15ace7c1..3cc8308d 100644 --- a/doc/imfile.html +++ b/doc/imfile.html @@ -54,6 +54,16 @@ $WorkDirectory). Be careful to use unique names for different files being monitored. If there are duplicates, all sorts of "interesting" things may happen. Rsyslog currently does not check if a name is specified multiple times.</li> +<li><span style="font-weight: bold;">$InputFileFacility +facility</span><br> +The syslog facility to be assigned to lines read. Can be specified in +textual form (e.g. "local0", "local1", ...) or as numbers (e.g. 128 for +"local0"). Textual form is suggested. <span style="font-weight: bold;">Default</span> is "local0".<span style="font-weight: bold;"></span></li> +<li><span style="font-weight: bold;">$InputFileSeverity</span><br> +The +syslog severity to be assigned to lines read. Can be specified in +textual form (e.g. "info", "warning", ...) or as numbers (e.g. 4 for +"info"). Textual form is suggested. <span style="font-weight: bold;">Default</span> is "notice".</li> <li><span style="font-weight: bold;">$InputRunFileMonitor</span><br> This <span style="font-weight: bold;">activates</span> the current monitor. It has no parameters. If you forget this @@ -61,7 +71,8 @@ directive, no file monitoring will take place.</li> <li><span style="font-weight: bold;">$InputFilePollInterval seconds</span><br> This is a global setting. It specifies how often files are to be polled -for new data. The time specified is in seconds. The <span style="font-weight: bold;">default value</span> is 10 seconds. Please note that future +for new data. The time specified is in seconds. The <span style="font-weight: bold;">default value</span> is 10 +seconds. Please note that future releases of imfile may support per-file polling intervals, but currently this is not the case. If multiple $InputFilePollInterval statements are present in rsyslog.conf, only the last one is used.<br> @@ -83,7 +94,9 @@ the source needs to be patched. See define MAX_INPUT_FILES in imfile.c <p>The following sample monitors two files. If you need just one, remove the second one. If you need more, add them according to the sample ;). This code must be placed in /etc/rsyslog.conf (or wherever -your distro puts rsyslog's config files).<br> +your distro puts rsyslog's config files). Note that only commands +actually needed need to be specified. The second file uses less +commands and uses defaults instead.<br> </p> <textarea rows="15" cols="60">$ModLoad imfile.so # needs to be done just once @@ -91,6 +104,8 @@ needs to be done just once $InputFileName /path/to/file1 $InputFileTag tag1: $InputFileStateFile stat-file1 +$InputFileSeverity error +$InputFileFacility local7 $InputRunFileMonitor # File 2 $InputFileName /path/to/file2 diff --git a/plugins/imfile/imfile.c b/plugins/imfile/imfile.c index 46d8af51..47df37f3 100644 --- a/plugins/imfile/imfile.c +++ b/plugins/imfile/imfile.c @@ -62,8 +62,8 @@ static uchar *pszFileName = NULL; static uchar *pszFileTag = NULL; static uchar *pszStateFile = NULL; static int iPollInterval = 10; /* number of seconds to sleep when there was no file activity */ -static int iFacility; -static int iSeverity; +static int iFacility = 128; /* local0 */ +static int iSeverity = 5; /* notice, as of rfc 3164 */ static int iFilPtr = 0; /* number of files to be monitored; pointer to next free spot during config */ #define MAX_INPUT_FILES 100 @@ -90,8 +90,8 @@ static rsRetVal enqLine(fileInfo_t *pInfo, rsCStrObj *cstrLine) MsgSetMSG(pMsg, (char*)rsCStrGetSzStr(cstrLine)); MsgSetHOSTNAME(pMsg, LocalHostName); MsgSetTAG(pMsg, (char*)pInfo->pszTag); - pMsg->iFacility = pInfo->iFacility; - pMsg->iSeverity = pInfo->iSeverity; + pMsg->iFacility = LOG_FAC(pInfo->iFacility); + pMsg->iSeverity = LOG_PRI(pInfo->iSeverity); pMsg->bParseHOSTNAME = 0; getCurrTime(&(pMsg->tTIMESTAMP)); /* use the current time! */ CHKiRet(submitMsg(pMsg)); @@ -394,7 +394,7 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a /* set defaults... */ iPollInterval = 10; - iFacility = 16; /* local0, as of RFC 3164 */ + iFacility = 128; /* local0 */ iSeverity = 5; /* notice, as of rfc 3164 */ RETiRet; @@ -438,6 +438,8 @@ static rsRetVal addMonitor(void __attribute__((unused)) *pVal, uchar __attribute ABORT_FINALIZE(RS_RET_OUT_OF_DESRIPTORS); } + CHKiRet(resetConfigVariables((uchar*) "dummy", (void*) pThis)); /* values are both dummies */ + finalize_it: if(iRet == RS_RET_OK) ++iFilPtr; /* we got a new file to monitor */ @@ -464,10 +466,9 @@ CODEmodInit_QueryRegCFSLineHdlr NULL, &pszFileTag, STD_LOADABLE_MODULE_ID)); CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputfilestatefile", 0, eCmdHdlrGetWord, NULL, &pszStateFile, STD_LOADABLE_MODULE_ID)); - /* use numerical values as of RFC 3164 for the time being... */ - CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputfileseverity", 0, eCmdHdlrInt, + CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputfileseverity", 0, eCmdHdlrSeverity, NULL, &iSeverity, STD_LOADABLE_MODULE_ID)); - CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputfilefacility", 0, eCmdHdlrInt, + CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputfilefacility", 0, eCmdHdlrFacility, NULL, &iFacility, STD_LOADABLE_MODULE_ID)); CHKiRet(omsdRegCFSLineHdlr((uchar *)"inputfilepollinterval", 0, eCmdHdlrInt, NULL, &iPollInterval, STD_LOADABLE_MODULE_ID)); @@ -477,6 +478,5 @@ CODEmodInit_QueryRegCFSLineHdlr CHKiRet(omsdRegCFSLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, STD_LOADABLE_MODULE_ID)); ENDmodInit -/* - * vim:set ai: +/* vim:set ai: */ @@ -50,7 +50,7 @@ /* here we host some syslog specific names. There currently is no better place * to do it, but over here is also not ideal... -- rgerhards, 2008-02-14 */ -struct code syslogPriNames[] = { +syslogName_t syslogPriNames[] = { {"alert", LOG_ALERT}, {"crit", LOG_CRIT}, {"debug", LOG_DEBUG}, @@ -67,7 +67,7 @@ struct code syslogPriNames[] = { {NULL, -1} }; -struct code syslogFacNames[] = { +syslogName_t syslogFacNames[] = { {"auth", LOG_AUTH}, {"authpriv", LOG_AUTHPRIV}, {"cron", LOG_CRON}, @@ -470,9 +470,9 @@ char *rs_strerror_r(int errnum, char *buf, size_t buflen) { /* Decode a symbolic name to a numeric value */ -int decodeSyslogName(uchar *name, struct code *codetab) +int decodeSyslogName(uchar *name, syslogName_t *codetab) { - register struct code *c; + register syslogName_t *c; register uchar *p; uchar buf[80]; @@ -34,13 +34,13 @@ #define TABLE_ALLPRI 0xFF /* Value to indicate all priorities in f_pmask */ #define LOG_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) /* mark "facility" */ -struct code { +typedef struct syslogName_s { char *c_name; int c_val; -}; +} syslogName_t; -extern struct code syslogPriNames[]; -extern struct code syslogFacNames[]; +extern syslogName_t syslogPriNames[]; +extern syslogName_t syslogFacNames[]; /** * A reimplementation of itoa(), as this is not available @@ -86,7 +86,7 @@ long timeoutVal(struct timespec *pt); void mutexCancelCleanup(void *arg); void srSleep(int iSeconds, int iuSeconds); char *rs_strerror_r(int errnum, char *buf, size_t buflen); -int decodeSyslogName(uchar *name, struct code *codetab); +int decodeSyslogName(uchar *name, syslogName_t *codetab); /* mutex operations */ /* some macros to cancel-safe lock a mutex (it will automatically be released @@ -102,7 +102,6 @@ * once the situation has been resolved. */ #define DEFUPRI (LOG_USER|LOG_NOTICE) -#define DEFSPRI (LOG_KERN|LOG_CRIT) #define TIMERINTVL 30 /* interval for checking flush, mark */ #define CONT_LINE 1 /* Allow continuation lines */ |