enable shuffling of crypto parameters down through queue definition

This commit is contained in:
Rainer Gerhards 2013-05-10 15:39:42 +02:00
parent 4ae3176e28
commit 415b26d5a1
8 changed files with 115 additions and 46 deletions

View File

@ -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) */

View File

@ -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);

View File

@ -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 */

View File

@ -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;
}

View File

@ -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);

View File

@ -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) */

View File

@ -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:

View File

@ -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 */