1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
%x incl
%x module
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <syslog.h>
#include "cfg_file.h"
#include "cfg_yacc.h"
#define MAX_INCLUDE_DEPTH 10
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
int include_stack_ptr = 0;
extern struct config_file *cfg;
%}
%option noyywrap
%option yylineno
%%
^[ \t]*#.* /* ignore comments */;
.include BEGIN(incl);
.module BEGIN(module);
composites return COMPOSITES;
tempdir return TEMPDIR;
pidfile return PIDFILE;
workers return WORKERS;
error_time return ERROR_TIME;
dead_time return DEAD_TIME;
maxerrors return MAXERRORS;
reconnect_timeout return RECONNECT_TIMEOUT;
connect_timeout return CONNECT_TIMEOUT;
protocol return PROTOCOL;
memcached return MEMCACHED;
bind_socket return BINDSOCK;
servers return SERVERS;
require return REQUIRE;
header_filters return HEADER_FILTERS;
mime_filters return MIME_FILTERS;
message_filters return MESSAGE_FILTERS;
url_filters return URL_FILTERS;
factors return FACTORS;
metric return METRIC;
name return NAME;
required_score return REQUIRED_SCORE;
function return FUNCTION;
control return CONTROL;
password return PASSWORD;
logging return LOGGING;
log_type return LOG_TYPE;
console return LOG_TYPE_CONSOLE;
syslog return LOG_TYPE_SYSLOG;
file return LOG_TYPE_FILE;
log_level return LOG_LEVEL;
DEBUG return LOG_LEVEL_DEBUG;
INFO return LOG_LEVEL_INFO;
WARNING return LOG_LEVEL_WARNING;
ERROR return LOG_LEVEL_ERROR;
log_facility return LOG_FACILITY;
log_file return LOG_FILENAME;
\{ return OBRACE;
\} return EBRACE;
; return SEMICOLON;
, return COMMA;
= return EQSIGN;
yes|YES|no|NO|[yY]|[nN] yylval.flag=parse_flag(yytext); return FLAG;
\n /* ignore EOL */;
[ \t]+ /* ignore whitespace */;
\"[^"]+\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return QUOTEDSTRING;
\" return QUOTE;
\$[a-zA-Z_][a-zA-Z0-9_]+ yylval.string=strdup(yytext + 1); return VARIABLE;
[0-9]+ yylval.number=strtol(yytext, NULL, 10); return NUMBER;
-?[0-9]+\.?[0-9]* yylval.fract=strtod(yytext, NULL); return FRACT;
[0-9]+[kKmMgG]? yylval.limit=parse_limit(yytext); return SIZELIMIT;
[0-9]+[sS]|[0-9]+[mM][sS] yylval.seconds=parse_seconds(yytext); return SECONDS;
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} yylval.string=strdup(yytext); return IPADDR;
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2} yylval.string=strdup(yytext); return IPNETWORK;
[a-zA-Z0-9.-]+:[0-9]{1,5} yylval.string=strdup(yytext); return HOSTPORT;
[a-zA-Z<][a-zA-Z@+>_-]* yylval.string=strdup(yytext); return STRING;
\/[^/\n]+\/ yylval.string=strdup(yytext); return REGEXP;
[a-zA-Z0-9].[a-zA-Z0-9\/.-]+ yylval.string=strdup(yytext); return DOMAIN;
<incl>[ \t]* /* eat the whitespace */
<incl>[^ \t\n]+ { /* got the include file name */
if (include_stack_ptr >= MAX_INCLUDE_DEPTH) {
yyerror ("yylex: includes nested too deeply");
return -1;
}
include_stack[include_stack_ptr++] =
YY_CURRENT_BUFFER;
yyin = fopen (yytext, "r");
if (! yyin) {
yyerror ("yylex: cannot open include file");
return -1;
}
yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
BEGIN(INITIAL);
}
<<EOF>> {
if ( --include_stack_ptr < 0 ) {
post_load_config (cfg);
yyterminate ();
}
else {
yy_delete_buffer (YY_CURRENT_BUFFER);
yy_switch_to_buffer (include_stack[include_stack_ptr]);
}
}
<module>\n /* ignore EOL */;
<module>[ \t]+ /* ignore whitespace */;
<module>\'[a-zA-Z0-9_-]\' yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return MODULE_OPT;
<module>\{ return OBRACE;
<module>\} return EBRACE;
<module>\; return SEMICOLON;
<module>[a-zA-Z0-9_-] yylval.string=strdup(yytext); return PARAM;
<module>\$[a-zA-Z_][a-zA-Z0-9_]+ yylval.string=strdup(yytext + 1); return VARIABLE;
<module>\"[^"]+\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return QUOTEDSTRING;
%%
/*
* vi:ts=4
*/
|