summaryrefslogtreecommitdiffstats
path: root/grammar
diff options
context:
space:
mode:
Diffstat (limited to 'grammar')
-rw-r--r--grammar/grammar.y23
-rw-r--r--grammar/parserif.h1
-rw-r--r--grammar/rainerscript.c86
-rw-r--r--grammar/rainerscript.h25
4 files changed, 112 insertions, 23 deletions
diff --git a/grammar/grammar.y b/grammar/grammar.y
index 65a6e8dc..a9f179e0 100644
--- a/grammar/grammar.y
+++ b/grammar/grammar.y
@@ -148,20 +148,15 @@ script: stmt { $$ = $1; }
stmt: actlst { $$ = $1; }
| STOP { $$ = cnfstmtNew(S_STOP); }
| IF expr THEN block { $$ = cnfstmtNew(S_IF);
- $$->d.cond.expr = $2;
- $$->d.cond.t_then = $4;
- $$->d.cond.t_else = NULL; }
+ $$->d.s_if.expr = $2;
+ $$->d.s_if.t_then = $4;
+ $$->d.s_if.t_else = NULL; }
| IF expr THEN block ELSE block { $$ = cnfstmtNew(S_IF);
- $$->d.cond.expr = $2;
- $$->d.cond.t_then = $4;
- $$->d.cond.t_else = $6; }
- | PRIFILT block { $$ = cnfstmtNew(S_PRIFILT);
- $$->printable = $1;
- $$->d.cond.expr = $1;
- $$->d.cond.t_then = $2; }
- | PROPFILT block { $$ = cnfstmtNew(S_PROPFILT);
- $$->d.cond.expr = $1;
- $$->d.cond.t_then = $2; }
+ $$->d.s_if.expr = $2;
+ $$->d.s_if.t_then = $4;
+ $$->d.s_if.t_else = $6; }
+ | PRIFILT block { $$ = cnfstmtNewPRIFILT($1, $2); }
+ | PROPFILT block { $$ = cnfstmtNewPROPFILT($1, $2); }
block: stmt { $$ = $1; }
| '{' script '}' { $$ = $2; }
actlst: s_act { $$ = $1; }
@@ -170,7 +165,7 @@ s_act: BEGIN_ACTION nvlst ENDOBJ { $$ = cnfstmtNew(S_ACT);
$$->printable="action()";
dbgprintf("RRRR: action object\n"); }
| LEGACY_ACTION { $$ = cnfstmtNew(S_ACT);
- $$->printable = $1;
+ $$->printable = (uchar*) $1;
dbgprintf("RRRR: legacy action\n"); }
expr: expr AND expr { $$ = cnfexprNew(AND, $1, $3); }
| expr OR expr { $$ = cnfexprNew(OR, $1, $3); }
diff --git a/grammar/parserif.h b/grammar/parserif.h
index 3b2a9a7b..aa271ec4 100644
--- a/grammar/parserif.h
+++ b/grammar/parserif.h
@@ -16,7 +16,6 @@ extern int yylineno;
*/
void cnfDoObj(struct cnfobj *o);
void cnfDoScript(struct cnfstmt *script);
-void cnfDoRule(struct cnfrule *rule);
void cnfDoCfsysline(char *ln);
void cnfDoBSDTag(char *ln);
void cnfDoBSDHost(char *ln);
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index b127b906..0e3f30ae 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -37,6 +37,7 @@
#include <libestr.h>
#include "rsyslog.h"
#include "rainerscript.h"
+#include "conf.h"
#include "parserif.h"
#include "grammar.h"
#include "queue.h"
@@ -47,6 +48,37 @@
DEFobjCurrIf(obj)
DEFobjCurrIf(regexp)
+static char*
+getFIOPName(unsigned iFIOP)
+{
+ char *pRet;
+ switch(iFIOP) {
+ case FIOP_CONTAINS:
+ pRet = "contains";
+ break;
+ case FIOP_ISEQUAL:
+ pRet = "isequal";
+ break;
+ case FIOP_STARTSWITH:
+ pRet = "startswith";
+ break;
+ case FIOP_REGEX:
+ pRet = "regex";
+ break;
+ case FIOP_EREREGEX:
+ pRet = "ereregex";
+ break;
+ case FIOP_ISEMPTY:
+ pRet = "isempty";
+ break;
+ default:
+ pRet = "NOP";
+ break;
+ }
+ return pRet;
+}
+
+
void
readConfFile(FILE *fp, es_str_t **str)
{
@@ -1531,26 +1563,42 @@ cnfstmtPrint(struct cnfstmt *root, int indent)
break;
case S_IF:
doIndent(indent); dbgprintf("IF\n");
- cnfexprPrint(stmt->d.cond.expr, indent+1);
+ cnfexprPrint(stmt->d.s_if.expr, indent+1);
doIndent(indent); dbgprintf("THEN\n");
- cnfstmtPrint(stmt->d.cond.t_then, indent+1);
- if(stmt->d.cond.t_else != NULL) {
+ cnfstmtPrint(stmt->d.s_if.t_then, indent+1);
+ if(stmt->d.s_if.t_else != NULL) {
doIndent(indent); dbgprintf("ELSE\n");
- cnfstmtPrint(stmt->d.cond.t_else, indent+1);
+ cnfstmtPrint(stmt->d.s_if.t_else, indent+1);
}
doIndent(indent); dbgprintf("END IF\n");
break;
case S_PRIFILT:
doIndent(indent); dbgprintf("PRIFILT '%s'\n", stmt->printable);
//cnfexprPrint(stmt->d.cond.expr, indent+1);
- cnfstmtPrint(stmt->d.cond.t_then, indent+1);
+ cnfstmtPrint(stmt->d.s_prifilt.t_then, indent+1);
doIndent(indent); dbgprintf("END PRIFILT\n");
break;
case S_PROPFILT:
doIndent(indent); dbgprintf("PROPFILT\n");
- cnfexprPrint(stmt->d.cond.expr, indent+1);
+ doIndent(indent); dbgprintf("\tProperty.: '%s'\n",
+ propIDToName(stmt->d.s_propfilt.propID));
+ if(stmt->d.s_propfilt.propName != NULL) {
+ char *cstr;
+ cstr = es_str2cstr(stmt->d.s_propfilt.propName, NULL);
+ doIndent(indent);
+ dbgprintf("\tCEE-Prop.: '%s'\n", cstr);
+ free(cstr);
+ }
+ doIndent(indent); dbgprintf("\tOperation: ");
+ if(stmt->d.s_propfilt.isNegated)
+ dbgprintf("NOT ");
+ dbgprintf("'%s'\n", getFIOPName(stmt->d.s_propfilt.operation));
+ if(stmt->d.s_propfilt.pCSCompValue != NULL) {
+ doIndent(indent); dbgprintf("\tValue....: '%s'\n",
+ rsCStrGetSzStrNoNULL(stmt->d.s_propfilt.pCSCompValue));
+ }
doIndent(indent); dbgprintf("THEN\n");
- cnfstmtPrint(stmt->d.cond.t_then, indent+1);
+ cnfstmtPrint(stmt->d.s_propfilt.t_then, indent+1);
doIndent(indent); dbgprintf("END PROPFILT\n");
break;
default:
@@ -1605,6 +1653,30 @@ cnfstmtNew(unsigned s_type)
return cnfstmt;
}
+struct cnfstmt *
+cnfstmtNewPRIFILT(char *prifilt, struct cnfstmt *t_then)
+{
+ struct cnfstmt* cnfstmt;
+ if((cnfstmt = cnfstmtNew(S_PRIFILT)) != NULL) {
+ cnfstmt->printable = (uchar*)strdup(prifilt);
+ cnfstmt->d.s_prifilt.t_then = t_then;
+ DecodePRIFilter((uchar*)prifilt, cnfstmt->d.s_prifilt.pmask);
+ }
+ return cnfstmt;
+}
+
+struct cnfstmt *
+cnfstmtNewPROPFILT(char *propfilt, struct cnfstmt *t_then)
+{
+ struct cnfstmt* cnfstmt;
+ if((cnfstmt = cnfstmtNew(S_PROPFILT)) != NULL) {
+ cnfstmt->printable = (uchar*)strdup(propfilt);
+ cnfstmt->d.s_propfilt.t_then = t_then;
+ DecodePropFilter((uchar*)propfilt, cnfstmt);
+ }
+ return cnfstmt;
+}
+
struct cnfrule *
cnfruleNew(enum cnfFiltType filttype, struct cnfactlst *actlst)
{
diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h
index 2d4d9271..89d7c050 100644
--- a/grammar/rainerscript.h
+++ b/grammar/rainerscript.h
@@ -3,7 +3,14 @@
#include <stdio.h>
#include <libestr.h>
#include <typedefs.h>
+#include <sys/types.h>
+#include <regex.h>
+//#include "stringbuf.h"
+/* TODO: make this hack cleaner... we have circular definitions, so we need: */
+
+
+#define LOG_NFACILITIES 24 /* current number of syslog facilities */
#define CNFFUNC_MAX_ARGS 32
/**< maximum number of arguments that any function can have (among
* others, this is used to size data structures).
@@ -163,7 +170,20 @@ struct cnfstmt { /* base statement, for simple types */
struct cnfexpr *expr;
struct cnfstmt *t_then;
struct cnfstmt *t_else;
- } cond;
+ } s_if;
+ struct {
+ uchar pmask[LOG_NFACILITIES+1]; /* priority mask */
+ struct cnfstmt *t_then;
+ } s_prifilt;
+ struct {
+ fiop_t operation;
+ regex_t *regex_cache;/* cache for compiled REs, if used */
+ struct cstr_s *pCSCompValue;/* value to "compare" against */
+ sbool isNegated;
+ uintTiny propID;/* ID of the requested property */
+ es_str_t *propName;/* name of property for CEE-based filters */
+ struct cnfstmt *t_then;
+ } s_propfilt;
struct action_s *act;
} d;
};
@@ -297,7 +317,10 @@ void cnfcfsyslinelstDestruct(struct cnfcfsyslinelst *cfslst);
struct cnfstmt * cnfstmtNew(unsigned s_type);
void cnfstmtPrint(struct cnfstmt *stmt, int indent);
struct cnfstmt* scriptAddStmt(struct cnfstmt *root, struct cnfstmt *s);
+struct objlst* objlstAdd(struct objlst *root, struct cnfobj *o);
char *rmLeadingSpace(char *s);
+struct cnfstmt * cnfstmtNewPRIFILT(char *prifilt, struct cnfstmt *t_then);
+struct cnfstmt * cnfstmtNewPROPFILT(char *propfilt, struct cnfstmt *t_then);
rsRetVal initRainerscript(void);
/* debug helper */