diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 16:28:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 16:28:20 +0000 |
commit | dcc721a95bef6f0d8e6d8775b8efe33e5aecd562 (patch) | |
tree | 66a2774cd0ee294d019efd71d2544c70f42b2842 /contrib/omtcl/omtcl.c | |
parent | Initial commit. (diff) | |
download | rsyslog-dcc721a95bef6f0d8e6d8775b8efe33e5aecd562.tar.xz rsyslog-dcc721a95bef6f0d8e6d8775b8efe33e5aecd562.zip |
Adding upstream version 8.2402.0.upstream/8.2402.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'contrib/omtcl/omtcl.c')
-rw-r--r-- | contrib/omtcl/omtcl.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/contrib/omtcl/omtcl.c b/contrib/omtcl/omtcl.c new file mode 100644 index 0000000..c0f7f66 --- /dev/null +++ b/contrib/omtcl/omtcl.c @@ -0,0 +1,164 @@ +/* omtcl.c + * invoke a tcl procedure for every message + * + * NOTE: read comments in module-template.h for more specifics! + * + * File begun on 2016-05-16 by fcr + * + * Copyright 2016 Francisco Castro <fcr@adinet.com.uy> + * + * This file is part of rsyslog. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * -or- + * see COPYING.ASL20 in the source distribution + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "config.h" +#include "rsyslog.h" +/* work around gcc-7 build problems - acceptable for contributed module */ +#pragma GCC diagnostic ignored "-Wundef" + +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <signal.h> +#include <errno.h> +#include <unistd.h> +#include "conf.h" +#include "syslogd-types.h" +#include "srUtils.h" +#include "template.h" +#include "module-template.h" +#include "errmsg.h" +#include "cfsysline.h" +#include "tcl.h" + +MODULE_TYPE_OUTPUT +MODULE_TYPE_NOKEEP + +DEF_OMOD_STATIC_DATA + +typedef struct _instanceData { + Tcl_Interp * interp; + Tcl_Obj * cmdName; +} instanceData; + +typedef struct wrkrInstanceData { + instanceData * pData; +} wrkrInstanceData_t; + +BEGINinitConfVars +CODESTARTinitConfVars +ENDinitConfVars + +BEGINcreateInstance +CODESTARTcreateInstance + pData->interp = Tcl_CreateInterp(); + pData->cmdName = NULL; +ENDcreateInstance + +BEGINcreateWrkrInstance +CODESTARTcreateWrkrInstance +ENDcreateWrkrInstance + +BEGINisCompatibleWithFeature +CODESTARTisCompatibleWithFeature +/* not compatible with message reduction */ +ENDisCompatibleWithFeature + +BEGINfreeInstance +CODESTARTfreeInstance + if(pData->cmdName != NULL) + Tcl_DecrRefCount(pData->cmdName); + Tcl_DeleteInterp(pData->interp); +ENDfreeInstance + +BEGINfreeWrkrInstance +CODESTARTfreeWrkrInstance +ENDfreeWrkrInstance + +BEGINdbgPrintInstInfo +CODESTARTdbgPrintInstInfo +ENDdbgPrintInstInfo + +BEGINtryResume +CODESTARTtryResume +ENDtryResume + +BEGINdoAction + Tcl_Obj * objv[2]; +CODESTARTdoAction + objv[0] = pWrkrData->pData->cmdName; + objv[1] = Tcl_NewStringObj((char*) ppString[0], -1); + if (Tcl_EvalObjv(pWrkrData->pData->interp, 2, objv, 0) != TCL_OK) { + iRet = RS_RET_ERR; + DBGPRINTF("omtcl: %s", Tcl_GetStringResult(pWrkrData->pData->interp)); + } +ENDdoAction + +BEGINparseSelectorAct + char fileName[PATH_MAX+1]; + char buffer[4096]; +CODESTARTparseSelectorAct +CODE_STD_STRING_REQUESTparseSelectorAct(1) + if(strncmp((char*) p, ":omtcl:", sizeof(":omtcl:") - 1)) { + ABORT_FINALIZE(RS_RET_CONFLINE_UNPROCESSED); + } + p += sizeof(":omtcl:") - 1; + + if(getSubString(&p, fileName, PATH_MAX+1, ',') || getSubString(&p, buffer, 4096, ';') || !strlen(buffer)) { + LogError(0, RS_RET_INVALID_PARAMS, "Invalid OmTcl parameters"); + ABORT_FINALIZE(RS_RET_INVALID_PARAMS); + } + + if (*(p-1) == ';') + --p; + + CHKiRet(cflineParseTemplateName(&p, *ppOMSR, 0, 0, (uchar*) "RSYSLOG_FileFormat")); + + CHKiRet(createInstance(&pData)); + pData->cmdName = Tcl_NewStringObj(buffer, -1); + Tcl_IncrRefCount(pData->cmdName); + + // TODO parse arguments: file,procname + if (Tcl_EvalFile(pData->interp, fileName) == TCL_ERROR) { + LogError(0, RS_RET_CONFIG_ERROR, "Loading Tcl script: %s", Tcl_GetStringResult(pData->interp)); + ABORT_FINALIZE(RS_RET_CONFIG_ERROR); + } + +CODE_STD_FINALIZERparseSelectorAct +ENDparseSelectorAct + +BEGINmodExit +CODESTARTmodExit +ENDmodExit + + +BEGINqueryEtryPt +CODESTARTqueryEtryPt +CODEqueryEtryPt_STD_OMOD_QUERIES +CODEqueryEtryPt_STD_OMOD8_QUERIES +ENDqueryEtryPt + + +BEGINmodInit() +CODESTARTmodInit +INITLegCnfVars + *ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */ +CODEmodInit_QueryRegCFSLineHdlr + DBGPRINTF("omtcl: module compiled with rsyslog version %s.\n", VERSION); + +ENDmodInit + |