- Backport HUPisRestart option
This commit is contained in:
parent
0b11dca908
commit
d33cb6e55e
485
rsyslog-3.21.10-HUPisRestart.patch
Normal file
485
rsyslog-3.21.10-HUPisRestart.patch
Normal file
@ -0,0 +1,485 @@
|
|||||||
|
From 5f83b6a346faca241b310c7d5be2b7eacc6239f9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rainer Gerhards <rgerhards@adiscon.com>
|
||||||
|
Date: Thu, 23 Oct 2008 14:46:47 +0200
|
||||||
|
Subject: [PATCH] added configuration directive "HUPisRestart"
|
||||||
|
|
||||||
|
...which enables to configure HUP to be either a full restart
|
||||||
|
or "just" a leightweight way to close open files
|
||||||
|
---
|
||||||
|
ChangeLog | 3 ++
|
||||||
|
action.c | 33 ++++++++++++++++++++++
|
||||||
|
action.h | 1 +
|
||||||
|
doc/rsyslog_conf.html | 5 +++
|
||||||
|
runtime/glbl.c | 5 +++
|
||||||
|
runtime/glbl.h | 1 +
|
||||||
|
runtime/module-template.h | 31 +++++++++++++++++++-
|
||||||
|
runtime/modules.c | 5 +++
|
||||||
|
runtime/modules.h | 1 +
|
||||||
|
tools/omfile.c | 68 ++++++++++++++++++++++++++++++++------------
|
||||||
|
tools/syslogd.c | 57 ++++++++++++++++++++++++++++++++-----
|
||||||
|
11 files changed, 181 insertions(+), 29 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ChangeLog b/ChangeLog
|
||||||
|
index db6abcf..d1bceeb 100644
|
||||||
|
--- a/ChangeLog
|
||||||
|
+++ b/ChangeLog
|
||||||
|
@@ -1,3 +1,6 @@
|
||||||
|
+- added configuration directive "HUPisRestart" which enables to configure
|
||||||
|
+ HUP to be either a full restart or "just" a leightweight way to
|
||||||
|
+ close open files.
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
Version 3.21.10 [BETA] (rgerhards), 2009-02-02
|
||||||
|
- bugfix: inconsistent use of mutex/atomic operations could cause segfault
|
||||||
|
diff --git a/action.c b/action.c
|
||||||
|
index 5c5bdbe..d257290 100644
|
||||||
|
--- a/action.c
|
||||||
|
+++ b/action.c
|
||||||
|
@@ -498,6 +498,39 @@ finalize_it:
|
||||||
|
}
|
||||||
|
#pragma GCC diagnostic warning "-Wempty-body"
|
||||||
|
|
||||||
|
+
|
||||||
|
+/* call the HUP handler for a given action, if such a handler is defined. The
|
||||||
|
+ * action mutex is locked, because the HUP handler most probably needs to modify
|
||||||
|
+ * some internal state information.
|
||||||
|
+ * rgerhards, 2008-10-22
|
||||||
|
+ */
|
||||||
|
+#pragma GCC diagnostic ignored "-Wempty-body"
|
||||||
|
+rsRetVal
|
||||||
|
+actionCallHUPHdlr(action_t *pAction)
|
||||||
|
+{
|
||||||
|
+ DEFiRet;
|
||||||
|
+ int iCancelStateSave;
|
||||||
|
+
|
||||||
|
+ ASSERT(pAction != NULL);
|
||||||
|
+ dbgprintf("Action %p checks HUP hdlr: %p\n", pAction, pAction->pMod->doHUP);
|
||||||
|
+
|
||||||
|
+ if(pAction->pMod->doHUP == NULL) {
|
||||||
|
+ FINALIZE; /* no HUP handler, so we are done ;) */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &iCancelStateSave);
|
||||||
|
+ d_pthread_mutex_lock(&pAction->mutActExec);
|
||||||
|
+ pthread_cleanup_push(mutexCancelCleanup, &pAction->mutActExec);
|
||||||
|
+ pthread_setcancelstate(iCancelStateSave, NULL);
|
||||||
|
+ CHKiRet(pAction->pMod->doHUP(pAction->pModData));
|
||||||
|
+ pthread_cleanup_pop(1); /* unlock mutex */
|
||||||
|
+
|
||||||
|
+finalize_it:
|
||||||
|
+ RETiRet;
|
||||||
|
+}
|
||||||
|
+#pragma GCC diagnostic warning "-Wempty-body"
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* set the action message queue mode
|
||||||
|
* TODO: probably move this into queue object, merge with MainMsgQueue!
|
||||||
|
* rgerhards, 2008-01-28
|
||||||
|
diff --git a/action.h b/action.h
|
||||||
|
index d26d15b..8d9d510 100644
|
||||||
|
--- a/action.h
|
||||||
|
+++ b/action.h
|
||||||
|
@@ -85,6 +85,7 @@ rsRetVal actionSetGlobalResumeInterval(int iNewVal);
|
||||||
|
rsRetVal actionDoAction(action_t *pAction);
|
||||||
|
rsRetVal actionCallAction(action_t *pAction, msg_t *pMsg);
|
||||||
|
rsRetVal actionWriteToAction(action_t *pAction);
|
||||||
|
+rsRetVal actionCallHUPHdlr(action_t *pAction);
|
||||||
|
rsRetVal actionClassInit(void);
|
||||||
|
rsRetVal addAction(action_t **ppAction, modInfo_t *pMod, void *pModData, omodStringRequest_t *pOMSR, int bSuspended);
|
||||||
|
|
||||||
|
diff --git a/doc/rsyslog_conf.html b/doc/rsyslog_conf.html
|
||||||
|
index 8947165..2698a71 100644
|
||||||
|
--- a/doc/rsyslog_conf.html
|
||||||
|
+++ b/doc/rsyslog_conf.html
|
||||||
|
@@ -175,6 +175,11 @@ default 60000 (1 minute)]</li>
|
||||||
|
<li><a href="rsconf1_gssforwardservicename.html">$GssForwardServiceName</a></li>
|
||||||
|
<li><a href="rsconf1_gsslistenservicename.html">$GssListenServiceName</a></li>
|
||||||
|
<li><a href="rsconf1_gssmode.html">$GssMode</a></li>
|
||||||
|
+<li>$HUPisRestart [<b>on</b>/off] - if set to on, a HUP is a full daemon restart. This means any queued messages are discarded (depending
|
||||||
|
+on queue configuration, of course) all modules are unloaded and reloaded. This mode keeps compatible with sysklogd, but is
|
||||||
|
+not recommended for use with rsyslog. To do a full restart, simply stop and start the daemon. The default is "on" for
|
||||||
|
+compatibility reasons. If it is set to "off", a HUP will only close open files. This is a much quicker action and usually
|
||||||
|
+the only one that is needed e.g. for log rotation. <b>It is recommended to set the setting to "off".</b></li>
|
||||||
|
<li><a href="rsconf1_includeconfig.html">$IncludeConfig</a></li><li>MainMsgQueueCheckpointInterval <number></li>
|
||||||
|
<li>$MainMsgQueueDequeueSlowdown <number> [number
|
||||||
|
is timeout in <i> micro</i>seconds (1000000us is 1sec!),
|
||||||
|
diff --git a/runtime/glbl.c b/runtime/glbl.c
|
||||||
|
index 1114fcd..67509e9 100644
|
||||||
|
--- a/runtime/glbl.c
|
||||||
|
+++ b/runtime/glbl.c
|
||||||
|
@@ -52,6 +52,7 @@ DEFobjStaticHelpers
|
||||||
|
*/
|
||||||
|
static uchar *pszWorkDir = NULL;
|
||||||
|
static int iMaxLine = 2048; /* maximum length of a syslog message */
|
||||||
|
+static int bHUPisRestart = 1; /* should SIGHUP cause a full system restart? */
|
||||||
|
static int iDefPFFamily = PF_UNSPEC; /* protocol family (IPv4, IPv6 or both) */
|
||||||
|
static int bDropMalPTRMsgs = 0;/* Drop messages which have malicious PTR records during DNS lookup */
|
||||||
|
static int option_DisallowWarning = 1; /* complain if message from disallowed sender is received */
|
||||||
|
@@ -86,6 +87,7 @@ static dataType Get##nameFunc(void) \
|
||||||
|
}
|
||||||
|
|
||||||
|
SIMP_PROP(MaxLine, iMaxLine, int)
|
||||||
|
+SIMP_PROP(HUPisRestart, bHUPisRestart, int)
|
||||||
|
SIMP_PROP(DefPFFamily, iDefPFFamily, int) /* note that in the future we may check the family argument */
|
||||||
|
SIMP_PROP(DropMalPTRMsgs, bDropMalPTRMsgs, int)
|
||||||
|
SIMP_PROP(Option_DisallowWarning, option_DisallowWarning, int)
|
||||||
|
@@ -173,6 +175,7 @@ CODESTARTobjQueryInterface(glbl)
|
||||||
|
pIf->Get##name = Get##name; \
|
||||||
|
pIf->Set##name = Set##name;
|
||||||
|
SIMP_PROP(MaxLine);
|
||||||
|
+ SIMP_PROP(HUPisRestart);
|
||||||
|
SIMP_PROP(DefPFFamily);
|
||||||
|
SIMP_PROP(DropMalPTRMsgs);
|
||||||
|
SIMP_PROP(Option_DisallowWarning);
|
||||||
|
@@ -216,6 +219,7 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a
|
||||||
|
pszWorkDir = NULL;
|
||||||
|
}
|
||||||
|
bDropMalPTRMsgs = 0;
|
||||||
|
+ bHUPisRestart = 1;
|
||||||
|
return RS_RET_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -235,6 +239,7 @@ BEGINAbstractObjClassInit(glbl, 1, OBJ_IS_CORE_MODULE) /* class, version */
|
||||||
|
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdrivercafile", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvrCAF, NULL));
|
||||||
|
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdriverkeyfile", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvrKeyFile, NULL));
|
||||||
|
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdrivercertfile", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvrCertFile, NULL));
|
||||||
|
+ CHKiRet(regCfSysLineHdlr((uchar *)"hupisrestart", 0, eCmdHdlrBinary, NULL, &bHUPisRestart, NULL));
|
||||||
|
CHKiRet(regCfSysLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, NULL));
|
||||||
|
ENDObjClassInit(glbl)
|
||||||
|
|
||||||
|
diff --git a/runtime/glbl.h b/runtime/glbl.h
|
||||||
|
index 0c83bdd..bcb9ad2 100644
|
||||||
|
--- a/runtime/glbl.h
|
||||||
|
+++ b/runtime/glbl.h
|
||||||
|
@@ -41,6 +41,7 @@ BEGINinterface(glbl) /* name must also be changed in ENDinterface macro! */
|
||||||
|
dataType (*Get##name)(void); \
|
||||||
|
rsRetVal (*Set##name)(dataType);
|
||||||
|
SIMP_PROP(MaxLine, int)
|
||||||
|
+ SIMP_PROP(HUPisRestart, int)
|
||||||
|
SIMP_PROP(DefPFFamily, int)
|
||||||
|
SIMP_PROP(DropMalPTRMsgs, int)
|
||||||
|
SIMP_PROP(Option_DisallowWarning, int)
|
||||||
|
diff --git a/runtime/module-template.h b/runtime/module-template.h
|
||||||
|
index eb39b58..6f7d877 100644
|
||||||
|
--- a/runtime/module-template.h
|
||||||
|
+++ b/runtime/module-template.h
|
||||||
|
@@ -481,6 +481,33 @@ static rsRetVal afterRun(void)\
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * vi:set ai:
|
||||||
|
+/* doHUP()
|
||||||
|
+ * This function is optional. Currently, it is available to output plugins
|
||||||
|
+ * only, but may be made available to other types of plugins in the future.
|
||||||
|
+ * A plugin does not need to define this entry point. If if does, it gets
|
||||||
|
+ * called when a non-restart type of HUP is done. A plugin should register
|
||||||
|
+ * this function so that it can close files, connection or other ressources
|
||||||
|
+ * on HUP - if it can be assume the user wanted to do this as a part of HUP
|
||||||
|
+ * processing. Note that the name "HUP" has historical reasons, it stems back
|
||||||
|
+ * to the infamous SIGHUP which was sent to restart a syslogd. We still retain
|
||||||
|
+ * that legacy, but may move this to a different signal.
|
||||||
|
+ * rgerhards, 2008-10-22
|
||||||
|
+ */
|
||||||
|
+#define CODEqueryEtryPt_doHUP \
|
||||||
|
+ else if(!strcmp((char*) name, "doHUP")) {\
|
||||||
|
+ *pEtryPoint = doHUP;\
|
||||||
|
+ }
|
||||||
|
+#define BEGINdoHUP \
|
||||||
|
+static rsRetVal doHUP(instanceData __attribute__((unused)) *pData)\
|
||||||
|
+{\
|
||||||
|
+ DEFiRet;
|
||||||
|
+
|
||||||
|
+#define CODESTARTdoHUP
|
||||||
|
+
|
||||||
|
+#define ENDdoHUP \
|
||||||
|
+ RETiRet;\
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* vim:set ai:
|
||||||
|
*/
|
||||||
|
diff --git a/runtime/modules.c b/runtime/modules.c
|
||||||
|
index d5730ed..169d234 100644
|
||||||
|
--- a/runtime/modules.c
|
||||||
|
+++ b/runtime/modules.c
|
||||||
|
@@ -347,6 +347,7 @@ static rsRetVal
|
||||||
|
doModInit(rsRetVal (*modInit)(int, int*, rsRetVal(**)(), rsRetVal(*)(), modInfo_t*), uchar *name, void *pModHdlr)
|
||||||
|
{
|
||||||
|
DEFiRet;
|
||||||
|
+ rsRetVal localRet;
|
||||||
|
modInfo_t *pNew = NULL;
|
||||||
|
rsRetVal (*modGetType)(eModType_t *pType);
|
||||||
|
|
||||||
|
@@ -391,6 +392,10 @@ doModInit(rsRetVal (*modInit)(int, int*, rsRetVal(**)(), rsRetVal(*)(), modInfo_
|
||||||
|
CHKiRet((*pNew->modQueryEtryPt)((uchar*)"parseSelectorAct", &pNew->mod.om.parseSelectorAct));
|
||||||
|
CHKiRet((*pNew->modQueryEtryPt)((uchar*)"isCompatibleWithFeature", &pNew->isCompatibleWithFeature));
|
||||||
|
CHKiRet((*pNew->modQueryEtryPt)((uchar*)"tryResume", &pNew->tryResume));
|
||||||
|
+ /* try load optional interfaces */
|
||||||
|
+ localRet = (*pNew->modQueryEtryPt)((uchar*)"doHUP", &pNew->doHUP);
|
||||||
|
+ if(localRet != RS_RET_OK && localRet != RS_RET_MODULE_ENTRY_POINT_NOT_FOUND)
|
||||||
|
+ ABORT_FINALIZE(localRet);
|
||||||
|
break;
|
||||||
|
case eMOD_LIB:
|
||||||
|
break;
|
||||||
|
diff --git a/runtime/modules.h b/runtime/modules.h
|
||||||
|
index 7d34bcf..77bc5d1 100644
|
||||||
|
--- a/runtime/modules.h
|
||||||
|
+++ b/runtime/modules.h
|
||||||
|
@@ -88,6 +88,7 @@ typedef struct modInfo_s {
|
||||||
|
rsRetVal (*tryResume)(void*);/* called to see if module actin can be resumed now */
|
||||||
|
rsRetVal (*modExit)(void); /* called before termination or module unload */
|
||||||
|
rsRetVal (*modGetID)(void **); /* get its unique ID from module */
|
||||||
|
+ rsRetVal (*doHUP)(void *); /* non-restart type HUP handler */
|
||||||
|
/* below: parse a configuration line - return if processed
|
||||||
|
* or not. If not, must be parsed to next module.
|
||||||
|
*/
|
||||||
|
diff --git a/tools/omfile.c b/tools/omfile.c
|
||||||
|
index d76e24a..5b661cb 100644
|
||||||
|
--- a/tools/omfile.c
|
||||||
|
+++ b/tools/omfile.c
|
||||||
|
@@ -244,7 +244,6 @@ static rsRetVal cflineParseOutchannel(instanceData *pData, uchar* p, omodStringR
|
||||||
|
*/
|
||||||
|
pData->f_sizeLimitCmd = (char*) pOch->cmdOnSizeLimit;
|
||||||
|
|
||||||
|
-RUNLOG_VAR("%p", pszTplName);
|
||||||
|
iRet = cflineParseTemplateName(&p, pOMSR, iEntry, iTplOpts,
|
||||||
|
(pszTplName == NULL) ? (uchar*)"RSYSLOG_FileFormat" : pszTplName);
|
||||||
|
|
||||||
|
@@ -349,9 +348,11 @@ finalize_it:
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-/* This function frees the dynamic file name cache.
|
||||||
|
+/* This function frees all dynamic file name cache entries and closes the
|
||||||
|
+ * relevant files. Part of Shutdown and HUP processing.
|
||||||
|
+ * rgerhards, 2008-10-23
|
||||||
|
*/
|
||||||
|
-static void dynaFileFreeCache(instanceData *pData)
|
||||||
|
+static inline void dynaFileFreeCacheEntries(instanceData *pData)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
ASSERT(pData != NULL);
|
||||||
|
@@ -360,17 +361,36 @@ static void dynaFileFreeCache(instanceData *pData)
|
||||||
|
for(i = 0 ; i < pData->iCurrCacheSize ; ++i) {
|
||||||
|
dynaFileDelCacheEntry(pData->dynCache, i, 1);
|
||||||
|
}
|
||||||
|
+ ENDfunc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* This function frees the dynamic file name cache.
|
||||||
|
+ */
|
||||||
|
+static void dynaFileFreeCache(instanceData *pData)
|
||||||
|
+{
|
||||||
|
+ ASSERT(pData != NULL);
|
||||||
|
|
||||||
|
+ BEGINfunc;
|
||||||
|
+ dynaFileFreeCacheEntries(pData);
|
||||||
|
if(pData->dynCache != NULL)
|
||||||
|
d_free(pData->dynCache);
|
||||||
|
ENDfunc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-/* This is a shared code for both static and dynamic files.
|
||||||
|
+/* This is now shared code for all types of files. It simply prepares
|
||||||
|
+ * file access, which, among others, means the the file wil be opened
|
||||||
|
+ * and any directories in between will be created (based on config, of
|
||||||
|
+ * course). -- rgerhards, 2008-10-22
|
||||||
|
*/
|
||||||
|
static void prepareFile(instanceData *pData, uchar *newFileName)
|
||||||
|
{
|
||||||
|
+ if(pData->fileType == eTypePIPE) {
|
||||||
|
+ pData->fd = open((char*) pData->f_fname, O_RDWR|O_NONBLOCK);
|
||||||
|
+ FINALIZE; /* we are done in this case */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if(access((char*)newFileName, F_OK) == 0) {
|
||||||
|
/* file already exists */
|
||||||
|
pData->fd = open((char*) newFileName, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY,
|
||||||
|
@@ -413,6 +433,12 @@ static void prepareFile(instanceData *pData, uchar *newFileName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+finalize_it:
|
||||||
|
+ if((pData->fd) != 0 && isatty(pData->fd)) {
|
||||||
|
+ dbgprintf("file %d is a tty file\n", pData->fd);
|
||||||
|
+ pData->fileType = eTypeTTY;
|
||||||
|
+ untty();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -537,6 +563,8 @@ static rsRetVal writeFile(uchar **ppString, unsigned iMsgOpts, instanceData *pDa
|
||||||
|
if(pData->bDynamicName) {
|
||||||
|
if(prepareDynFile(pData, ppString[1], iMsgOpts) != 0)
|
||||||
|
ABORT_FINALIZE(RS_RET_ERR);
|
||||||
|
+ } else if(pData->fd == -1) {
|
||||||
|
+ prepareFile(pData, pData->f_fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create the message based on format specified */
|
||||||
|
@@ -642,12 +670,7 @@ ENDtryResume
|
||||||
|
BEGINdoAction
|
||||||
|
CODESTARTdoAction
|
||||||
|
dbgprintf(" (%s)\n", pData->f_fname);
|
||||||
|
- /* pData->fd == -1 is an indicator that the we couldn't
|
||||||
|
- * open the file at startup. For dynaFiles, this is ok,
|
||||||
|
- * all others are doomed.
|
||||||
|
- */
|
||||||
|
- if(pData->bDynamicName || (pData->fd != -1))
|
||||||
|
- iRet = writeFile(ppString, iMsgOpts, pData);
|
||||||
|
+ iRet = writeFile(ppString, iMsgOpts, pData);
|
||||||
|
ENDdoAction
|
||||||
|
|
||||||
|
|
||||||
|
@@ -764,11 +787,7 @@ CODESTARTparseSelectorAct
|
||||||
|
pData->dirUID = dirUID;
|
||||||
|
pData->dirGID = dirGID;
|
||||||
|
|
||||||
|
- if(pData->fileType == eTypePIPE) {
|
||||||
|
- pData->fd = open((char*) pData->f_fname, O_RDWR|O_NONBLOCK);
|
||||||
|
- } else {
|
||||||
|
- prepareFile(pData, pData->f_fname);
|
||||||
|
- }
|
||||||
|
+ prepareFile(pData, pData->f_fname);
|
||||||
|
|
||||||
|
if ( pData->fd < 0 ){
|
||||||
|
pData->fd = -1;
|
||||||
|
@@ -776,10 +795,6 @@ CODESTARTparseSelectorAct
|
||||||
|
errmsg.LogError(0, NO_ERRCODE, "%s", pData->f_fname);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- if (isatty(pData->fd)) {
|
||||||
|
- pData->fileType = eTypeTTY;
|
||||||
|
- untty();
|
||||||
|
- }
|
||||||
|
if (strcmp((char*) p, _PATH_CONSOLE) == 0)
|
||||||
|
pData->fileType = eTypeCONSOLE;
|
||||||
|
break;
|
||||||
|
@@ -815,6 +830,20 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+BEGINdoHUP
|
||||||
|
+CODESTARTdoHUP
|
||||||
|
+ if(pData->bDynamicName) {
|
||||||
|
+ dynaFileFreeCacheEntries(pData);
|
||||||
|
+ pData->iCurrElt = -1; /* invalidate current element */
|
||||||
|
+ } else {
|
||||||
|
+ if(pData->fd != -1) {
|
||||||
|
+ close(pData->fd);
|
||||||
|
+ pData->fd = -1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ENDdoHUP
|
||||||
|
+
|
||||||
|
+
|
||||||
|
BEGINmodExit
|
||||||
|
CODESTARTmodExit
|
||||||
|
if(pszTplName != NULL)
|
||||||
|
@@ -825,6 +854,7 @@ ENDmodExit
|
||||||
|
BEGINqueryEtryPt
|
||||||
|
CODESTARTqueryEtryPt
|
||||||
|
CODEqueryEtryPt_STD_OMOD_QUERIES
|
||||||
|
+CODEqueryEtryPt_doHUP
|
||||||
|
ENDqueryEtryPt
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/tools/syslogd.c b/tools/syslogd.c
|
||||||
|
index b0d6fa2..98c7882 100644
|
||||||
|
--- a/tools/syslogd.c
|
||||||
|
+++ b/tools/syslogd.c
|
||||||
|
@@ -219,7 +219,7 @@ static char *PidFile = _PATH_LOGPID; /* read-only after startup */
|
||||||
|
|
||||||
|
static pid_t myPid; /* our pid for use in self-generated messages, e.g. on startup */
|
||||||
|
/* mypid is read-only after the initial fork() */
|
||||||
|
-static int restart = 0; /* do restart (config read) - multithread safe */
|
||||||
|
+static int bHadHUP = 0; /* did we have a HUP? */
|
||||||
|
|
||||||
|
static int bParseHOSTNAMEandTAG = 1; /* global config var: should the hostname and tag be
|
||||||
|
* parsed inside message - rgerhards, 2006-03-13 */
|
||||||
|
@@ -2525,13 +2525,13 @@ static rsRetVal setMainMsgQueType(void __attribute__((unused)) *pVal, uchar *psz
|
||||||
|
* The following function is resposible for handling a SIGHUP signal. Since
|
||||||
|
* we are now doing mallocs/free as part of init we had better not being
|
||||||
|
* doing this during a signal handler. Instead this function simply sets
|
||||||
|
- * a flag variable which will tell the main loop to go through a restart.
|
||||||
|
+ * a flag variable which will tells the main loop to do "the right thing".
|
||||||
|
*/
|
||||||
|
void sighup_handler()
|
||||||
|
{
|
||||||
|
struct sigaction sigAct;
|
||||||
|
|
||||||
|
- restart = 1;
|
||||||
|
+ bHadHUP = 1;
|
||||||
|
|
||||||
|
memset(&sigAct, 0, sizeof (sigAct));
|
||||||
|
sigemptyset(&sigAct.sa_mask);
|
||||||
|
@@ -2560,6 +2560,49 @@ static void processImInternal(void)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+/* helper to doHUP(), this "HUPs" each action. The necessary locking
|
||||||
|
+ * is done inside the action class and nothing we need to take care of.
|
||||||
|
+ * rgerhards, 2008-10-22
|
||||||
|
+ */
|
||||||
|
+DEFFUNC_llExecFunc(doHUPActions)
|
||||||
|
+{
|
||||||
|
+ BEGINfunc
|
||||||
|
+ actionCallHUPHdlr((action_t*) pData);
|
||||||
|
+ ENDfunc
|
||||||
|
+ return RS_RET_OK; /* we ignore errors, we can not do anything either way */
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* This function processes a HUP after one has been detected. Note that this
|
||||||
|
+ * is *NOT* the sighup handler. The signal is recorded by the handler, that record
|
||||||
|
+ * detected inside the mainloop and then this function is called to do the
|
||||||
|
+ * real work. -- rgerhards, 2008-10-22
|
||||||
|
+ */
|
||||||
|
+static inline void
|
||||||
|
+doHUP(void)
|
||||||
|
+{
|
||||||
|
+ selector_t *f;
|
||||||
|
+ char buf[512];
|
||||||
|
+
|
||||||
|
+ snprintf(buf, sizeof(buf) / sizeof(char),
|
||||||
|
+ " [origin software=\"rsyslogd\" " "swVersion=\"" VERSION
|
||||||
|
+ "\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"] rsyslogd was HUPed, type '%s'.",
|
||||||
|
+ (int) myPid, glbl.GetHUPisRestart() ? "restart" : "lightweight");
|
||||||
|
+ errno = 0;
|
||||||
|
+ logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)buf, 0);
|
||||||
|
+
|
||||||
|
+ if(glbl.GetHUPisRestart()) {
|
||||||
|
+ dbgprintf("Received SIGHUP, configured to be restart, reloading rsyslogd.\n");
|
||||||
|
+ init(); /* main queue is stopped as part of init() */
|
||||||
|
+ } else {
|
||||||
|
+ dbgprintf("Received SIGHUP, configured to be a non-restart type of HUP - notifying actions.\n");
|
||||||
|
+ for(f = Files; f != NULL ; f = f->f_next) {
|
||||||
|
+ llExecFunc(&f->llActList, doHUPActions, NULL);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* This is the main processing loop. It is called after successful initialization.
|
||||||
|
* When it returns, the syslogd terminates.
|
||||||
|
* Its sole function is to provide some housekeeping things. The real work is done
|
||||||
|
@@ -2616,11 +2659,9 @@ mainloop(void)
|
||||||
|
if(bReduceRepeatMsgs == 1)
|
||||||
|
doFlushRptdMsgs();
|
||||||
|
|
||||||
|
- if(restart) {
|
||||||
|
- dbgprintf("\nReceived SIGHUP, reloading rsyslogd.\n");
|
||||||
|
- /* main queue is stopped as part of init() */
|
||||||
|
- init();
|
||||||
|
- restart = 0;
|
||||||
|
+ if(bHadHUP) {
|
||||||
|
+ doHUP();
|
||||||
|
+ bHadHUP = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.5.5.6
|
||||||
|
|
@ -3,7 +3,7 @@
|
|||||||
Summary: Enhanced system logging and kernel message trapping daemons
|
Summary: Enhanced system logging and kernel message trapping daemons
|
||||||
Name: rsyslog
|
Name: rsyslog
|
||||||
Version: 3.21.10
|
Version: 3.21.10
|
||||||
Release: 3%{?dist}
|
Release: 4%{?dist}
|
||||||
License: GPLv3+
|
License: GPLv3+
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
URL: http://www.rsyslog.com/
|
URL: http://www.rsyslog.com/
|
||||||
@ -13,6 +13,7 @@ Source2: rsyslog.conf
|
|||||||
Source3: rsyslog.sysconfig
|
Source3: rsyslog.sysconfig
|
||||||
Source4: rsyslog.log
|
Source4: rsyslog.log
|
||||||
Patch0: rsyslog-3.21.10-convVar.patch
|
Patch0: rsyslog-3.21.10-convVar.patch
|
||||||
|
Patch1: rsyslog-3.21.10-HUPisRestart.patch
|
||||||
BuildRequires: zlib-devel
|
BuildRequires: zlib-devel
|
||||||
BuildRequires: autoconf automake
|
BuildRequires: autoconf automake
|
||||||
Requires: logrotate >= 3.5.2
|
Requires: logrotate >= 3.5.2
|
||||||
@ -89,6 +90,7 @@ IETF standard protocol.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1 -b .convVar
|
%patch0 -p1 -b .convVar
|
||||||
|
%patch1 -p1 -b .HUPisRestart
|
||||||
|
|
||||||
%build
|
%build
|
||||||
export CFLAGS="$RPM_OPT_FLAGS -DSYSLOGD_PIDNAME=\\\"syslogd.pid\\\""
|
export CFLAGS="$RPM_OPT_FLAGS -DSYSLOGD_PIDNAME=\\\"syslogd.pid\\\""
|
||||||
@ -194,6 +196,9 @@ fi
|
|||||||
%{_libdir}/rsyslog/lmnsd_gtls.so
|
%{_libdir}/rsyslog/lmnsd_gtls.so
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Mar 31 2009 Lubomir Rintel <lkundrak@v3.sk> 3.21.10-4
|
||||||
|
- Backport HUPisRestart option
|
||||||
|
|
||||||
* Wed Mar 18 2009 Tomas Heinrich <theinric@redhat.com> 3.21.10-3
|
* Wed Mar 18 2009 Tomas Heinrich <theinric@redhat.com> 3.21.10-3
|
||||||
- fix variables' type conversion in expression-based filters (#485937)
|
- fix variables' type conversion in expression-based filters (#485937)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user