123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- /* $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"
-
- #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
-
- %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
- | tempdir
- | pidfile
- | memcached
- | workers
- | require
- | header_filters
- | mime_filters
- | message_filters
- | url_filters
- | module_opt
- | variable
- | factors
- | metric
- ;
-
- 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;
- }
- ;
-
- bindsock:
- BINDSOCK EQSIGN bind_cred {
- if (!parse_bind_line (cfg, $3)) {
- 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);
- }
- ;
-
- 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);
- }
- ;
-
- %%
- /*
- * vi:ts=4
- */
|