mirror of
https://github.com/rsyslog/rsyslog.git
synced 2025-12-15 21:00:41 +01:00
enable shuffling of crypto parameters down through queue definition
This commit is contained in:
parent
4ae3176e28
commit
415b26d5a1
15
action.c
15
action.c
@ -357,7 +357,7 @@ finalize_it:
|
||||
/* action construction finalizer
|
||||
*/
|
||||
rsRetVal
|
||||
actionConstructFinalize(action_t *pThis, struct cnfparamvals *queueParams)
|
||||
actionConstructFinalize(action_t *pThis, struct nvlst *lst)
|
||||
{
|
||||
DEFiRet;
|
||||
uchar pszAName[64]; /* friendly name of our action */
|
||||
@ -432,7 +432,7 @@ actionConstructFinalize(action_t *pThis, struct cnfparamvals *queueParams)
|
||||
obj.SetName((obj_t*) pThis->pQueue, pszAName);
|
||||
qqueueSetpAction(pThis->pQueue, pThis);
|
||||
|
||||
if(queueParams == NULL) { /* use legacy params? */
|
||||
if(lst == NULL) { /* use legacy params? */
|
||||
/* ... set some properties ... */
|
||||
# define setQPROP(func, directive, data) \
|
||||
CHKiRet_Hdlr(func(pThis->pQueue, data)) { \
|
||||
@ -466,7 +466,7 @@ actionConstructFinalize(action_t *pThis, struct cnfparamvals *queueParams)
|
||||
} else {
|
||||
/* we have v6-style config params */
|
||||
qqueueSetDefaultsActionQueue(pThis->pQueue);
|
||||
qqueueApplyCnfParam(pThis->pQueue, queueParams);
|
||||
qqueueApplyCnfParam(pThis->pQueue, lst);
|
||||
}
|
||||
|
||||
# undef setQPROP
|
||||
@ -1788,7 +1788,7 @@ actionApplyCnfParam(action_t *pAction, struct cnfparamvals *pvals)
|
||||
rsRetVal
|
||||
addAction(action_t **ppAction, modInfo_t *pMod, void *pModData,
|
||||
omodStringRequest_t *pOMSR, struct cnfparamvals *actParams,
|
||||
struct cnfparamvals *queueParams, int bSuspended)
|
||||
struct nvlst *lst, int bSuspended)
|
||||
{
|
||||
DEFiRet;
|
||||
int i;
|
||||
@ -1881,7 +1881,7 @@ addAction(action_t **ppAction, modInfo_t *pMod, void *pModData,
|
||||
if(bSuspended)
|
||||
actionSuspend(pAction);
|
||||
|
||||
CHKiRet(actionConstructFinalize(pAction, queueParams));
|
||||
CHKiRet(actionConstructFinalize(pAction, lst));
|
||||
|
||||
/* TODO: if we exit here, we have a memory leak... */
|
||||
|
||||
@ -1940,7 +1940,6 @@ rsRetVal
|
||||
actionNewInst(struct nvlst *lst, action_t **ppAction)
|
||||
{
|
||||
struct cnfparamvals *paramvals;
|
||||
struct cnfparamvals *queueParams;
|
||||
modInfo_t *pMod;
|
||||
uchar *cnfModName = NULL;
|
||||
omodStringRequest_t *pOMSR;
|
||||
@ -1971,9 +1970,7 @@ actionNewInst(struct nvlst *lst, action_t **ppAction)
|
||||
FINALIZE; /* iRet is already set to error state */
|
||||
}
|
||||
|
||||
qqueueDoCnfParams(lst, &queueParams);
|
||||
|
||||
if((iRet = addAction(&pAction, pMod, pModData, pOMSR, paramvals, queueParams,
|
||||
if((iRet = addAction(&pAction, pMod, pModData, pOMSR, paramvals, lst,
|
||||
(iRet == RS_RET_SUSPENDED)? 1 : 0)) == RS_RET_OK) {
|
||||
/* check if the module is compatible with select features
|
||||
* (currently no such features exist) */
|
||||
|
||||
4
action.h
4
action.h
@ -91,7 +91,7 @@ struct action_s {
|
||||
/* function prototypes
|
||||
*/
|
||||
rsRetVal actionConstruct(action_t **ppThis);
|
||||
rsRetVal actionConstructFinalize(action_t *pThis, struct cnfparamvals *queueParams);
|
||||
rsRetVal actionConstructFinalize(action_t *pThis, struct nvlst *lst);
|
||||
rsRetVal actionDestruct(action_t *pThis);
|
||||
rsRetVal actionDbgPrint(action_t *pThis);
|
||||
rsRetVal actionSetGlobalResumeInterval(int iNewVal);
|
||||
@ -99,7 +99,7 @@ rsRetVal actionDoAction(action_t *pAction);
|
||||
rsRetVal actionWriteToAction(action_t *pAction, msg_t *pMsg);
|
||||
rsRetVal actionCallHUPHdlr(action_t *pAction);
|
||||
rsRetVal actionClassInit(void);
|
||||
rsRetVal addAction(action_t **ppAction, modInfo_t *pMod, void *pModData, omodStringRequest_t *pOMSR, struct cnfparamvals *actParams, struct cnfparamvals *queueParams, int bSuspended);
|
||||
rsRetVal addAction(action_t **ppAction, modInfo_t *pMod, void *pModData, omodStringRequest_t *pOMSR, struct cnfparamvals *actParams, struct nvlst *lst, int bSuspended);
|
||||
rsRetVal activateActions(void);
|
||||
rsRetVal actionNewInst(struct nvlst *lst, action_t **ppAction);
|
||||
rsRetVal actionProcessCnf(struct cnfobj *o);
|
||||
|
||||
2
dirty.h
2
dirty.h
@ -35,7 +35,7 @@ rsRetVal multiSubmitFlush(multi_submit_t *pMultiSub);
|
||||
rsRetVal logmsgInternal(int iErr, int pri, uchar *msg, int flags);
|
||||
rsRetVal __attribute__((deprecated)) parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int flags, flowControl_t flowCtlTypeu, prop_t *pInputName, struct syslogTime *stTime, time_t ttGenTime, ruleset_t *pRuleset);
|
||||
rsRetVal diagGetMainMsgQSize(int *piSize); /* for imdiag */
|
||||
rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct cnfparamvals *queueParams);
|
||||
rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct nvlst *lst);
|
||||
|
||||
extern int MarkInterval;
|
||||
extern qqueue_t *pMsgQueue; /* the main message queue */
|
||||
|
||||
113
runtime/queue.c
113
runtime/queue.c
@ -12,7 +12,7 @@
|
||||
* function names - this makes it really hard to read and does not provide much
|
||||
* benefit, at least I (now) think so...
|
||||
*
|
||||
* Copyright 2008-2011 Rainer Gerhards and Adiscon GmbH.
|
||||
* Copyright 2008-2013 Rainer Gerhards and Adiscon GmbH.
|
||||
*
|
||||
* This file is part of the rsyslog runtime library.
|
||||
*
|
||||
@ -118,6 +118,7 @@ static struct cnfparamdescr cnfpdescr[] = {
|
||||
{ "queue.dequeueslowdown", eCmdHdlrInt, 0 },
|
||||
{ "queue.dequeuetimebegin", eCmdHdlrInt, 0 },
|
||||
{ "queue.dequeuetimeend", eCmdHdlrInt, 0 },
|
||||
{ "queue.cry.provider", eCmdHdlrGetWord, 0 }
|
||||
};
|
||||
static struct cnfparamblk pblk =
|
||||
{ CNFPARAMBLK_VERSION,
|
||||
@ -2389,6 +2390,7 @@ CODESTARTobjDestruct(qqueue)
|
||||
|
||||
free(pThis->pszFilePrefix);
|
||||
free(pThis->pszSpoolDir);
|
||||
free(pThis->cryprovName);
|
||||
|
||||
/* some queues do not provide stats and thus have no statsobj! */
|
||||
if(pThis->statsobj != NULL)
|
||||
@ -2672,43 +2674,93 @@ finalize_it:
|
||||
}
|
||||
|
||||
|
||||
/* take v6 config list and extract the queue params out of it. Hand the
|
||||
* param values back to the caller. Caller is responsible for destructing
|
||||
* them when no longer needed. Caller can use this param block to configure
|
||||
* all parameters for a newly created queue with one call to qqueueSetParams().
|
||||
* rgerhards, 2011-07-22
|
||||
/* are any queue params set at all? 1 - yes, 0 - no
|
||||
* We need to evaluate the param block for this function, which is somewhat
|
||||
* inefficient. HOWEVER, this is only done during config load, so we really
|
||||
* don't care... -- rgerhards, 2013-05-10
|
||||
*/
|
||||
rsRetVal
|
||||
qqueueDoCnfParams(struct nvlst *lst, struct cnfparamvals **ppvals)
|
||||
{
|
||||
*ppvals = nvlstGetParams(lst, &pblk, NULL);
|
||||
return RS_RET_OK;
|
||||
}
|
||||
|
||||
|
||||
/* are any queue params set at all? 1 - yes, 0 - no */
|
||||
int
|
||||
queueCnfParamsSet(struct cnfparamvals *pvals)
|
||||
queueCnfParamsSet(struct nvlst *lst)
|
||||
{
|
||||
return cnfparamvalsIsSet(&pblk, pvals);
|
||||
int r;
|
||||
struct cnfparamvals *pvals;
|
||||
|
||||
pvals = nvlstGetParams(lst, &pblk, NULL);
|
||||
r = cnfparamvalsIsSet(&pblk, pvals);
|
||||
cnfparamvalsDestruct(pvals, &pblk);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
static inline rsRetVal
|
||||
initCryprov(qqueue_t *pThis, struct nvlst *lst)
|
||||
{
|
||||
uchar szDrvrName[1024];
|
||||
DEFiRet;
|
||||
|
||||
if(snprintf((char*)szDrvrName, sizeof(szDrvrName), "lmcry_%s", pThis->cryprovName)
|
||||
== sizeof(szDrvrName)) {
|
||||
errmsg.LogError(0, RS_RET_ERR, "omfile: crypto provider "
|
||||
"name is too long: '%s' - encryption disabled",
|
||||
pThis->cryprovName);
|
||||
ABORT_FINALIZE(RS_RET_ERR);
|
||||
}
|
||||
pThis->cryprovNameFull = ustrdup(szDrvrName);
|
||||
|
||||
pThis->cryprov.ifVersion = cryprovCURR_IF_VERSION;
|
||||
/* The pDrvrName+2 below is a hack to obtain the object name. It
|
||||
* safes us to have yet another variable with the name without "lm" in
|
||||
* front of it. If we change the module load interface, we may re-think
|
||||
* about this hack, but for the time being it is efficient and clean enough.
|
||||
*/
|
||||
if(obj.UseObj(__FILE__, szDrvrName, szDrvrName, (void*) &pThis->cryprov)
|
||||
!= RS_RET_OK) {
|
||||
errmsg.LogError(0, RS_RET_LOAD_ERROR, "omfile: could not load "
|
||||
"crypto provider '%s' - encryption disabled",
|
||||
szDrvrName);
|
||||
ABORT_FINALIZE(RS_RET_CRYPROV_ERR);
|
||||
}
|
||||
|
||||
if(pThis->cryprov.Construct(&pThis->cryprovData) != RS_RET_OK) {
|
||||
errmsg.LogError(0, RS_RET_CRYPROV_ERR, "omfile: error constructing "
|
||||
"crypto provider %s dataset - encryption disabled",
|
||||
szDrvrName);
|
||||
ABORT_FINALIZE(RS_RET_CRYPROV_ERR);
|
||||
}
|
||||
CHKiRet(pThis->cryprov.SetCnfParam(pThis->cryprovData, lst, CRYPROV_PARAMTYPE_DISK));
|
||||
|
||||
dbgprintf("loaded crypto provider %s, data instance at %p\n",
|
||||
szDrvrName, pThis->cryprovData);
|
||||
pThis->useCryprov = 1;
|
||||
finalize_it:
|
||||
RETiRet;
|
||||
}
|
||||
|
||||
/* apply all params from param block to queue. Must be called before
|
||||
* finalizing. This supports the v6 config system. Defaults were already
|
||||
* set during queue creation. The pvals object is destructed by this
|
||||
* function.
|
||||
*/
|
||||
rsRetVal
|
||||
qqueueApplyCnfParam(qqueue_t *pThis, struct cnfparamvals *pvals)
|
||||
qqueueApplyCnfParam(qqueue_t *pThis, struct nvlst *lst)
|
||||
{
|
||||
int i;
|
||||
struct cnfparamvals *pvals;
|
||||
|
||||
pvals = nvlstGetParams(lst, &pblk, NULL);
|
||||
if(Debug) {
|
||||
dbgprintf("queue param blk:\n");
|
||||
cnfparamsPrint(&pblk, pvals);
|
||||
}
|
||||
for(i = 0 ; i < pblk.nParams ; ++i) {
|
||||
if(!pvals[i].bUsed)
|
||||
continue;
|
||||
if(!strcmp(pblk.descr[i].name, "queue.filename")) {
|
||||
pThis->pszFilePrefix = (uchar*) es_str2cstr(pvals[i].val.d.estr, NULL);
|
||||
pThis->lenFilePrefix = es_strlen(pvals[i].val.d.estr);
|
||||
} else if(!strcmp(pblk.descr[i].name, "queue.cry.provider")) {
|
||||
pThis->cryprovName = (uchar*) es_str2cstr(pvals[i].val.d.estr, NULL);
|
||||
dbgprintf("DDDD: crypto provider set: '%s'\n", pThis->cryprovName);
|
||||
} else if(!strcmp(pblk.descr[i].name, "queue.size")) {
|
||||
pThis->iMaxQueueSize = pvals[i].val.d.n;
|
||||
} else if(!strcmp(pblk.descr[i].name, "queue.dequeuebatchsize")) {
|
||||
@ -2760,12 +2812,27 @@ qqueueApplyCnfParam(qqueue_t *pThis, struct cnfparamvals *pvals)
|
||||
"param '%s'\n", pblk.descr[i].name);
|
||||
}
|
||||
}
|
||||
if(pThis->qType == QUEUETYPE_DISK && pThis->pszFilePrefix == NULL) {
|
||||
errmsg.LogError(0, RS_RET_QUEUE_DISK_NO_FN, "error on queue '%s', disk mode selected, but "
|
||||
"no queue file name given; queue type changed to 'linkedList'",
|
||||
obj.GetName((obj_t*) pThis));
|
||||
pThis->qType = QUEUETYPE_LINKEDLIST;
|
||||
if(pThis->qType == QUEUETYPE_DISK) {
|
||||
if(pThis->pszFilePrefix == NULL) {
|
||||
errmsg.LogError(0, RS_RET_QUEUE_DISK_NO_FN, "error on queue '%s', disk mode selected, but "
|
||||
"no queue file name given; queue type changed to 'linkedList'",
|
||||
obj.GetName((obj_t*) pThis));
|
||||
pThis->qType = QUEUETYPE_LINKEDLIST;
|
||||
}
|
||||
}
|
||||
|
||||
if(pThis->pszFilePrefix == NULL && pThis->cryprovName != NULL) {
|
||||
errmsg.LogError(0, RS_RET_QUEUE_CRY_DISK_ONLY, "error on queue '%s', crypto provider can "
|
||||
"only be set for disk or disk assisted queue - ignored",
|
||||
obj.GetName((obj_t*) pThis));
|
||||
free(pThis->cryprovName);
|
||||
pThis->cryprovName = NULL;
|
||||
}
|
||||
|
||||
if(pThis->cryprovName != NULL) {
|
||||
initCryprov(pThis, lst);
|
||||
}
|
||||
|
||||
cnfparamvalsDestruct(pvals, &pblk);
|
||||
return RS_RET_OK;
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@
|
||||
#include "batch.h"
|
||||
#include "stream.h"
|
||||
#include "statsobj.h"
|
||||
#include "cryprov.h"
|
||||
|
||||
/* support for the toDelete list */
|
||||
typedef struct toDeleteLst_s toDeleteLst_t;
|
||||
@ -168,6 +169,11 @@ struct queue_s {
|
||||
strm_t *pReadDel; /* current file for deleting */
|
||||
} disk;
|
||||
} tVars;
|
||||
sbool useCryprov; /* quicker than checkig ptr (1 vs 8 bytes!) */
|
||||
uchar *cryprovName; /* crypto provider to use */
|
||||
cryprov_if_t cryprov; /* ptr to crypto provider interface */
|
||||
uchar *cryprovNameFull;/* full internal crypto provider name */
|
||||
void *cryprovData; /* opaque data ptr for provider use */
|
||||
DEF_ATOMIC_HELPER_MUT(mutQueueSize);
|
||||
DEF_ATOMIC_HELPER_MUT(mutLogDeq);
|
||||
/* for statistics subsystem */
|
||||
@ -197,9 +203,8 @@ rsRetVal qqueueSetFilePrefix(qqueue_t *pThis, uchar *pszPrefix, size_t iLenPrefi
|
||||
rsRetVal qqueueConstruct(qqueue_t **ppThis, queueType_t qType, int iWorkerThreads,
|
||||
int iMaxQueueSize, rsRetVal (*pConsumer)(void*,batch_t*, int*));
|
||||
rsRetVal qqueueEnqObjDirectBatch(qqueue_t *pThis, batch_t *pBatch);
|
||||
rsRetVal qqueueDoCnfParams(struct nvlst *lst, struct cnfparamvals **ppvals);
|
||||
int queueCnfParamsSet(struct cnfparamvals *pvals);
|
||||
rsRetVal qqueueApplyCnfParam(qqueue_t *pThis, struct cnfparamvals *pvals);
|
||||
int queueCnfParamsSet(struct nvlst *lst);
|
||||
rsRetVal qqueueApplyCnfParam(qqueue_t *pThis, struct nvlst *lst);
|
||||
void qqueueSetDefaultsRulesetQueue(qqueue_t *pThis);
|
||||
void qqueueSetDefaultsActionQueue(qqueue_t *pThis);
|
||||
void qqueueDbgPrint(qqueue_t *pThis);
|
||||
|
||||
@ -413,6 +413,8 @@ enum rsRetVal_ /** return value. All methods return this if not specified oth
|
||||
RS_RET_CRY_INVLD_ALGO = -2326,/**< user specified invalid (unkonwn) crypto algorithm */
|
||||
RS_RET_CRY_INVLD_MODE = -2327,/**< user specified invalid (unkonwn) crypto mode */
|
||||
RS_RET_QUEUE_DISK_NO_FN = -2328,/**< disk queue configured, but filename not set */
|
||||
/* up to 2350 reserved for 7.4 */
|
||||
RS_RET_QUEUE_CRY_DISK_ONLY = -2351,/**< crypto provider only supported for disk-associated queues */
|
||||
|
||||
/* RainerScript error messages (range 1000.. 1999) */
|
||||
RS_RET_SYSVAR_NOT_FOUND = 1001, /**< system variable could not be found (maybe misspelled) */
|
||||
|
||||
@ -928,7 +928,6 @@ rsRetVal
|
||||
rulesetProcessCnf(struct cnfobj *o)
|
||||
{
|
||||
struct cnfparamvals *pvals;
|
||||
struct cnfparamvals *queueParams;
|
||||
rsRetVal localRet;
|
||||
uchar *rsName = NULL;
|
||||
uchar *parserName;
|
||||
@ -974,11 +973,10 @@ rulesetProcessCnf(struct cnfobj *o)
|
||||
}
|
||||
|
||||
/* pick up ruleset queue parameters */
|
||||
qqueueDoCnfParams(o->nvlst, &queueParams);
|
||||
if(queueCnfParamsSet(queueParams)) {
|
||||
if(queueCnfParamsSet(o->nvlst)) {
|
||||
rsname = (pRuleset->pszName == NULL) ? (uchar*) "[ruleset]" : pRuleset->pszName;
|
||||
DBGPRINTF("adding a ruleset-specific \"main\" queue for ruleset '%s'\n", rsname);
|
||||
CHKiRet(createMainQueue(&pRuleset->pQueue, rsname, queueParams));
|
||||
CHKiRet(createMainQueue(&pRuleset->pQueue, rsname, o->nvlst));
|
||||
}
|
||||
|
||||
finalize_it:
|
||||
|
||||
@ -1057,7 +1057,7 @@ finalize_it:
|
||||
* the time being (remember that we want to restructure config processing at large!).
|
||||
* rgerhards, 2009-10-27
|
||||
*/
|
||||
rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct cnfparamvals *queueParams)
|
||||
rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct nvlst *lst)
|
||||
{
|
||||
struct queuefilenames_s *qfn;
|
||||
uchar *qfname = NULL;
|
||||
@ -1073,7 +1073,7 @@ rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct cnfpara
|
||||
/* name our main queue object (it's not fatal if it fails...) */
|
||||
obj.SetName((obj_t*) (*ppQueue), pszQueueName);
|
||||
|
||||
if(queueParams == NULL) { /* use legacy parameters? */
|
||||
if(lst == NULL) { /* use legacy parameters? */
|
||||
/* ... set some properties ... */
|
||||
# define setQPROP(func, directive, data) \
|
||||
CHKiRet_Hdlr(func(*ppQueue, data)) { \
|
||||
@ -1130,7 +1130,7 @@ rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct cnfpara
|
||||
# undef setQPROPstr
|
||||
} else { /* use new style config! */
|
||||
qqueueSetDefaultsRulesetQueue(*ppQueue);
|
||||
qqueueApplyCnfParam(*ppQueue, queueParams);
|
||||
qqueueApplyCnfParam(*ppQueue, lst);
|
||||
}
|
||||
|
||||
/* ... and finally start the queue! */
|
||||
@ -1887,7 +1887,7 @@ int realMain(int argc, char **argv)
|
||||
if(glbl.GetSourceIPofLocalClient() != NULL) {
|
||||
fprintf (stderr, "rsyslogd: Only one -S argument allowed, the first one is taken.\n");
|
||||
} else {
|
||||
glbl.SetSourceIPofLocalClient(arg);
|
||||
glbl.SetSourceIPofLocalClient((uchar*)arg);
|
||||
}
|
||||
break;
|
||||
case 'f': /* configuration file */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user