123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545 |
- /* $Id$ */
-
- %{
-
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <ctype.h>
- #include <errno.h>
- #include <stdarg.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <syslog.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <glib.h>
-
- #include "cfg_file.h"
- #include "main.h"
-
- #define YYDEBUG 1
-
- extern struct config_file *cfg;
- extern int yylineno;
- extern char *yytext;
-
- LIST_HEAD (moduleoptq, module_opt) *cur_module_opt = NULL;
- struct metric *cur_metric = NULL;
-
- %}
-
- %union
- {
- char *string;
- size_t limit;
- char flag;
- unsigned int seconds;
- unsigned int number;
- double fract;
- }
-
- %token ERROR STRING QUOTEDSTRING FLAG
- %token FILENAME REGEXP QUOTE SEMICOLON OBRACE EBRACE COMMA EQSIGN
- %token BINDSOCK SOCKCRED DOMAIN IPADDR IPNETWORK HOSTPORT NUMBER CHECK_TIMEOUT
- %token MAXSIZE SIZELIMIT SECONDS BEANSTALK MYSQL USER PASSWORD DATABASE
- %token TEMPDIR PIDFILE SERVERS ERROR_TIME DEAD_TIME MAXERRORS CONNECT_TIMEOUT PROTOCOL RECONNECT_TIMEOUT
- %token READ_SERVERS WRITE_SERVER DIRECTORY_SERVERS MAILBOX_QUERY USERS_QUERY LASTLOGIN_QUERY
- %token MEMCACHED WORKERS REQUIRE MODULE
- %token MODULE_OPT PARAM VARIABLE
- %token HEADER_FILTERS MIME_FILTERS MESSAGE_FILTERS URL_FILTERS FACTORS METRIC NAME
- %token REQUIRED_SCORE FUNCTION FRACT COMPOSITES CONTROL PASSWORD
- %token LOGGING LOG_TYPE LOG_TYPE_CONSOLE LOG_TYPE_SYSLOG LOG_TYPE_FILE
- %token LOG_LEVEL LOG_LEVEL_DEBUG LOG_LEVEL_INFO LOG_LEVEL_WARNING LOG_LEVEL_ERROR LOG_FACILITY LOG_FILENAME
-
- %type <string> STRING
- %type <string> VARIABLE
- %type <string> QUOTEDSTRING MODULE_OPT PARAM
- %type <string> FILENAME
- %type <string> SOCKCRED
- %type <string> IPADDR IPNETWORK
- %type <string> HOSTPORT
- %type <string> DOMAIN
- %type <limit> SIZELIMIT
- %type <flag> FLAG
- %type <seconds> SECONDS
- %type <number> NUMBER
- %type <string> memcached_hosts bind_cred
- %type <fract> FRACT
- %%
-
- file : /* empty */
- | file command SEMICOLON { }
- ;
-
- command :
- bindsock
- | control
- | tempdir
- | pidfile
- | memcached
- | workers
- | require
- | header_filters
- | mime_filters
- | message_filters
- | url_filters
- | module_opt
- | variable
- | factors
- | metric
- | composites
- | logging
- ;
-
- tempdir :
- TEMPDIR EQSIGN QUOTEDSTRING {
- struct stat st;
-
- if (stat ($3, &st) == -1) {
- yyerror ("yyparse: cannot stat directory \"%s\": %s", $3, strerror (errno));
- YYERROR;
- }
- if (!S_ISDIR (st.st_mode)) {
- yyerror ("yyparse: \"%s\" is not a directory", $3);
- YYERROR;
- }
- cfg->temp_dir = memory_pool_strdup (cfg->cfg_pool, $3);
- free ($3);
- }
- ;
-
- pidfile :
- PIDFILE EQSIGN QUOTEDSTRING {
- cfg->pid_file = $3;
- }
- ;
-
- control:
- CONTROL OBRACE controlbody EBRACE
- ;
-
- controlbody:
- controlcmd SEMICOLON
- | controlbody controlcmd SEMICOLON
- ;
-
- controlcmd:
- controlsock
- | controlpassword
- ;
-
- controlsock:
- BINDSOCK EQSIGN bind_cred {
- if (!parse_bind_line (cfg, $3, 1)) {
- yyerror ("yyparse: parse_bind_line");
- YYERROR;
- }
- cfg->controller_enabled = 1;
- free ($3);
- }
- ;
- controlpassword:
- PASSWORD EQSIGN QUOTEDSTRING {
- cfg->control_password = memory_pool_strdup (cfg->cfg_pool, $3);
- }
- ;
-
- bindsock:
- BINDSOCK EQSIGN bind_cred {
- if (!parse_bind_line (cfg, $3, 0)) {
- yyerror ("yyparse: parse_bind_line");
- YYERROR;
- }
- free ($3);
- }
- ;
-
- bind_cred:
- STRING {
- $$ = $1;
- }
- | IPADDR{
- $$ = $1;
- }
- | DOMAIN {
- $$ = $1;
- }
- | HOSTPORT {
- $$ = $1;
- }
- | QUOTEDSTRING {
- $$ = $1;
- }
- ;
-
- header_filters:
- HEADER_FILTERS EQSIGN QUOTEDSTRING {
- cfg->header_filters_str = memory_pool_strdup (cfg->cfg_pool, $3);
- free ($3);
- }
- ;
-
- mime_filters:
- MIME_FILTERS EQSIGN QUOTEDSTRING {
- cfg->mime_filters_str = memory_pool_strdup (cfg->cfg_pool, $3);
- free ($3);
- }
- ;
-
- message_filters:
- MESSAGE_FILTERS EQSIGN QUOTEDSTRING {
- cfg->message_filters_str = memory_pool_strdup (cfg->cfg_pool, $3);
- free ($3);
- }
- ;
-
- url_filters:
- URL_FILTERS EQSIGN QUOTEDSTRING {
- cfg->url_filters_str = memory_pool_strdup (cfg->cfg_pool, $3);
- free ($3);
- }
- ;
-
- memcached:
- MEMCACHED OBRACE memcachedbody EBRACE
- ;
-
- memcachedbody:
- memcachedcmd SEMICOLON
- | memcachedbody memcachedcmd SEMICOLON
- ;
-
- memcachedcmd:
- memcached_servers
- | memcached_connect_timeout
- | memcached_error_time
- | memcached_dead_time
- | memcached_maxerrors
- | memcached_protocol
- ;
-
- memcached_servers:
- SERVERS EQSIGN memcached_server
- ;
-
- memcached_server:
- memcached_params
- | memcached_server COMMA memcached_params
- ;
-
- memcached_params:
- memcached_hosts {
- if (!add_memcached_server (cfg, $1)) {
- yyerror ("yyparse: add_memcached_server");
- YYERROR;
- }
- free ($1);
- }
- ;
- memcached_hosts:
- STRING
- | IPADDR
- | DOMAIN
- | HOSTPORT
- ;
- memcached_error_time:
- ERROR_TIME EQSIGN NUMBER {
- cfg->memcached_error_time = $3;
- }
- ;
- memcached_dead_time:
- DEAD_TIME EQSIGN NUMBER {
- cfg->memcached_dead_time = $3;
- }
- ;
- memcached_maxerrors:
- MAXERRORS EQSIGN NUMBER {
- cfg->memcached_maxerrors = $3;
- }
- ;
- memcached_connect_timeout:
- CONNECT_TIMEOUT EQSIGN SECONDS {
- cfg->memcached_connect_timeout = $3;
- }
- ;
-
- memcached_protocol:
- PROTOCOL EQSIGN STRING {
- if (strncasecmp ($3, "udp", sizeof ("udp") - 1) == 0) {
- cfg->memcached_protocol = UDP_TEXT;
- }
- else if (strncasecmp ($3, "tcp", sizeof ("tcp") - 1) == 0) {
- cfg->memcached_protocol = TCP_TEXT;
- }
- else {
- yyerror ("yyparse: cannot recognize protocol: %s", $3);
- YYERROR;
- }
- }
- ;
- workers:
- WORKERS EQSIGN NUMBER {
- cfg->workers_number = $3;
- }
- ;
-
- metric:
- METRIC OBRACE metricbody EBRACE {
- if (cur_metric == NULL || cur_metric->name == NULL) {
- yyerror ("yyparse: not enough arguments in metric definition");
- YYERROR;
- }
- g_hash_table_insert (cfg->metrics, cur_metric->name, cur_metric);
- cur_metric = NULL;
- }
- ;
-
- metricbody:
- | metriccmd SEMICOLON
- | metricbody metriccmd SEMICOLON
- ;
- metriccmd:
- | metricname
- | metricfunction
- | metricscore
- ;
-
- metricname:
- NAME EQSIGN QUOTEDSTRING {
- if (cur_metric == NULL) {
- cur_metric = memory_pool_alloc0 (cfg->cfg_pool, sizeof (struct metric));
- }
- cur_metric->name = memory_pool_strdup (cfg->cfg_pool, $3);
- }
- ;
-
- metricfunction:
- FUNCTION EQSIGN QUOTEDSTRING {
- if (cur_metric == NULL) {
- cur_metric = memory_pool_alloc0 (cfg->cfg_pool, sizeof (struct metric));
- }
- cur_metric->func_name = memory_pool_strdup (cfg->cfg_pool, $3);
- }
- ;
-
- metricscore:
- REQUIRED_SCORE EQSIGN NUMBER {
- if (cur_metric == NULL) {
- cur_metric = memory_pool_alloc0 (cfg->cfg_pool, sizeof (struct metric));
- }
- cur_metric->required_score = $3;
- }
- | REQUIRED_SCORE EQSIGN FRACT {
- if (cur_metric == NULL) {
- cur_metric = memory_pool_alloc0 (cfg->cfg_pool, sizeof (struct metric));
- }
- cur_metric->required_score = $3;
- }
- ;
-
- factors:
- FACTORS OBRACE factorsbody EBRACE
- ;
-
- factorsbody:
- factorparam SEMICOLON
- | factorsbody factorparam SEMICOLON
- ;
-
- factorparam:
- QUOTEDSTRING EQSIGN FRACT {
- double *tmp = memory_pool_alloc (cfg->cfg_pool, sizeof (double));
- *tmp = $3;
- g_hash_table_insert (cfg->factors, $1, tmp);
- }
- | QUOTEDSTRING EQSIGN NUMBER {
- double *tmp = memory_pool_alloc (cfg->cfg_pool, sizeof (double));
- *tmp = $3;
- g_hash_table_insert (cfg->factors, $1, tmp);
- };
-
- require:
- REQUIRE OBRACE requirebody EBRACE
- ;
-
- requirebody:
- requirecmd SEMICOLON
- | requirebody requirecmd SEMICOLON
- ;
-
- requirecmd:
- MODULE EQSIGN QUOTEDSTRING {
- struct stat st;
- struct perl_module *cur;
- if (stat ($3, &st) == -1) {
- yyerror ("yyparse: cannot stat file %s, %m", $3);
- YYERROR;
- }
- cur = memory_pool_alloc (cfg->cfg_pool, sizeof (struct perl_module));
- if (cur == NULL) {
- yyerror ("yyparse: g_malloc: %s", strerror(errno));
- YYERROR;
- }
- cur->path = $3;
- LIST_INSERT_HEAD (&cfg->perl_modules, cur, next);
- }
- ;
-
- composites:
- COMPOSITES OBRACE compositesbody EBRACE
- ;
-
- compositesbody:
- compositescmd SEMICOLON
- | compositesbody compositescmd SEMICOLON
- ;
-
- compositescmd:
- QUOTEDSTRING EQSIGN QUOTEDSTRING {
- struct expression *expr;
- if ((expr = parse_expression (cfg->cfg_pool, $3)) == NULL) {
- yyerror ("yyparse: cannot parse composite expression: %s", $3);
- YYERROR;
- }
- g_hash_table_insert (cfg->composite_symbols, $1, expr);
- }
- ;
- module_opt:
- MODULE_OPT OBRACE moduleoptbody EBRACE {
- g_hash_table_insert (cfg->modules_opts, $1, cur_module_opt);
- cur_module_opt = NULL;
- }
- ;
-
- moduleoptbody:
- optcmd SEMICOLON
- | moduleoptbody optcmd SEMICOLON
- ;
-
- optcmd:
- PARAM EQSIGN QUOTEDSTRING {
- struct module_opt *mopt;
- if (cur_module_opt == NULL) {
- cur_module_opt = g_malloc (sizeof (cur_module_opt));
- LIST_INIT (cur_module_opt);
- }
- mopt = memory_pool_alloc (cfg->cfg_pool, sizeof (struct module_opt));
- mopt->param = $1;
- mopt->value = $3;
- LIST_INSERT_HEAD (cur_module_opt, mopt, next);
- }
- ;
-
- variable:
- VARIABLE EQSIGN QUOTEDSTRING {
- g_hash_table_insert (cfg->variables, $1, $3);
- }
- ;
-
- logging:
- LOGGING OBRACE loggingbody EBRACE
- ;
-
- loggingbody:
- loggingcmd SEMICOLON
- | loggingbody loggingcmd SEMICOLON
- ;
-
- loggingcmd:
- loggingtype
- | logginglevel
- | loggingfacility
- | loggingfile
- ;
-
- loggingtype:
- LOG_TYPE EQSIGN LOG_TYPE_CONSOLE {
- cfg->log_type = RSPAMD_LOG_CONSOLE;
- }
- LOG_TYPE EQSIGN LOG_TYPE_SYSLOG {
- cfg->log_type = RSPAMD_LOG_SYSLOG;
- }
- LOG_TYPE EQSIGN LOG_TYPE_FILE {
- cfg->log_type = RSPAMD_LOG_FILE;
- }
- ;
-
- logginglevel:
- LOG_LEVEL EQSIGN LOG_LEVEL_DEBUG {
- cfg->log_level = G_LOG_LEVEL_DEBUG;
- }
- LOG_LEVEL EQSIGN LOG_LEVEL_INFO {
- cfg->log_level = G_LOG_LEVEL_INFO | G_LOG_LEVEL_MESSAGE;
- }
- LOG_LEVEL EQSIGN LOG_LEVEL_WARNING {
- cfg->log_level = G_LOG_LEVEL_WARNING;
- }
- LOG_LEVEL EQSIGN LOG_LEVEL_ERROR {
- cfg->log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
- }
- ;
-
- loggingfacility:
- LOG_FACILITY EQSIGN QUOTEDSTRING {
- if (strncasecmp ($3, "LOG_AUTH", sizeof ("LOG_AUTH") - 1) == 0) {
- cfg->log_facility = LOG_AUTH;
- }
- else if (strncasecmp ($3, "LOG_CRON", sizeof ("LOG_CRON") - 1) == 0) {
- cfg->log_facility = LOG_CRON;
- }
- else if (strncasecmp ($3, "LOG_DAEMON", sizeof ("LOG_DAEMON") - 1) == 0) {
- cfg->log_facility = LOG_DAEMON;
- }
- else if (strncasecmp ($3, "LOG_MAIL", sizeof ("LOG_MAIL") - 1) == 0) {
- cfg->log_facility = LOG_MAIL;
- }
- else if (strncasecmp ($3, "LOG_USER", sizeof ("LOG_USER") - 1) == 0) {
- cfg->log_facility = LOG_USER;
- }
- else if (strncasecmp ($3, "LOG_LOCAL0", sizeof ("LOG_LOCAL0") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL0;
- }
- else if (strncasecmp ($3, "LOG_LOCAL1", sizeof ("LOG_LOCAL1") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL1;
- }
- else if (strncasecmp ($3, "LOG_LOCAL2", sizeof ("LOG_LOCAL2") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL2;
- }
- else if (strncasecmp ($3, "LOG_LOCAL3", sizeof ("LOG_LOCAL3") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL3;
- }
- else if (strncasecmp ($3, "LOG_LOCAL4", sizeof ("LOG_LOCAL4") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL4;
- }
- else if (strncasecmp ($3, "LOG_LOCAL5", sizeof ("LOG_LOCAL5") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL5;
- }
- else if (strncasecmp ($3, "LOG_LOCAL6", sizeof ("LOG_LOCAL6") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL6;
- }
- else if (strncasecmp ($3, "LOG_LOCAL7", sizeof ("LOG_LOCAL7") - 1) == 0) {
- cfg->log_facility = LOG_LOCAL7;
- }
- else {
- yyerror ("yyparse: invalid logging facility: %s", $3);
- YYERROR;
- }
-
- free ($3);
- }
- ;
-
- loggingfile:
- LOG_FILENAME EQSIGN QUOTEDSTRING {
- cfg->log_file = memory_pool_strdup (cfg->cfg_pool, $3);
-
- free ($3);
- }
- ;
-
- %%
- /*
- * vi:ts=4
- */
|