diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2012-10-02 20:32:49 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2012-10-02 20:32:49 +0400 |
commit | 14e1129068d55bc8de0618832d4f7d33bb1b0f06 (patch) | |
tree | 787a2156ec9e2181a2c8b273ded9ddc2a1777ece /src | |
parent | 5d1f19fc9988261e23f190c216eb17958f178904 (diff) | |
download | rspamd-14e1129068d55bc8de0618832d4f7d33bb1b0f06.tar.gz rspamd-14e1129068d55bc8de0618832d4f7d33bb1b0f06.zip |
* Add support for dynamic configuration to the client.
Cleanup client's code.
Update manual page for client.
Make 'bayes' as the default classifier for client learning operations.
Diffstat (limited to 'src')
-rw-r--r-- | src/client/rspamc.c | 133 | ||||
-rw-r--r-- | src/dynamic_cfg.c | 22 |
2 files changed, 94 insertions, 61 deletions
diff --git a/src/client/rspamc.c b/src/client/rspamc.c index 877b0285f..aae8345d5 100644 --- a/src/client/rspamc.c +++ b/src/client/rspamc.c @@ -38,7 +38,7 @@ static gchar *from = NULL; static gchar *deliver_to = NULL; static gchar *rcpt = NULL; static gchar *user = NULL; -static gchar *classifier = NULL; +static gchar *classifier = "bayes"; static gchar *local_addr = NULL; static gint weight = 1; static gint flag; @@ -75,7 +75,9 @@ enum rspamc_command { RSPAMC_COMMAND_FUZZY_ADD, RSPAMC_COMMAND_FUZZY_DEL, RSPAMC_COMMAND_STAT, - RSPAMC_COMMAND_UPTIME + RSPAMC_COMMAND_UPTIME, + RSPAMC_COMMAND_ADD_SYMBOL, + RSPAMC_COMMAND_ADD_ACTION }; /* @@ -131,6 +133,12 @@ check_rspamc_command (const gchar *cmd) else if (g_ascii_strcasecmp (cmd, "UPTIME") == 0) { return RSPAMC_COMMAND_UPTIME; } + else if (g_ascii_strcasecmp (cmd, "ADD_SYMBOL") == 0) { + return RSPAMC_COMMAND_ADD_SYMBOL; + } + else if (g_ascii_strcasecmp (cmd, "ADD_ACTION") == 0) { + return RSPAMC_COMMAND_ADD_ACTION; + } return RSPAMC_COMMAND_UNKNOWN; } @@ -379,6 +387,8 @@ scan_rspamd_file (const gchar *file) struct rspamd_result *res; GHashTable *opts; + /* Add server */ + add_rspamd_server (FALSE); /* Init options hash */ opts = g_hash_table_new (g_str_hash, g_str_equal); add_options (opts); @@ -470,6 +480,8 @@ learn_rspamd_file (gboolean is_spam, const gchar *file) exit (EXIT_FAILURE); } + /* Add server */ + add_rspamd_server (TRUE); params = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (params, "Classifier", classifier); @@ -573,6 +585,9 @@ fuzzy_rspamd_file (const gchar *file, gboolean delete) gchar valuebuf[sizeof("65535")], flagbuf[sizeof("65535")]; struct rspamd_controller_result *res; + /* Add server */ + add_rspamd_server (TRUE); + params = g_hash_table_new (g_str_hash, g_str_equal); rspamd_snprintf (valuebuf, sizeof (valuebuf), "%d", weight); rspamd_snprintf (flagbuf, sizeof (flagbuf), "%d", flag); @@ -609,16 +624,15 @@ fuzzy_rspamd_file (const gchar *file, gboolean delete) } static void -rspamd_do_controller_simple_command (gchar *command) +rspamd_do_controller_simple_command (gchar *command, GHashTable *kwattrs) { GError *err = NULL; GList *results, *cur; struct rspamd_controller_result *res; - /* Add server */ add_rspamd_server (TRUE); - results = rspamd_controller_command_simple (client, command, password, NULL, &err); + results = rspamd_controller_command_simple (client, command, password, kwattrs, &err); if (results == NULL || err != NULL) { if (err != NULL) { fprintf (stderr, "cannot perform command: %s\n", err->message); @@ -651,10 +665,13 @@ rspamd_do_controller_simple_command (gchar *command) gint main (gint argc, gchar **argv, gchar **env) { - enum rspamc_command cmd; - gint i; - struct in_addr ina; + enum rspamc_command cmd; + gint i; + struct in_addr ina; + GHashTable *kwattrs; + + kwattrs = g_hash_table_new (g_str_hash, g_str_equal); read_cmd_line (&argc, &argv); @@ -711,10 +728,10 @@ main (gint argc, gchar **argv, gchar **env) fuzzy_rspamd_stdin (TRUE); break; case RSPAMC_COMMAND_STAT: - rspamd_do_controller_simple_command ("stat"); + rspamd_do_controller_simple_command ("stat", NULL); break; case RSPAMC_COMMAND_UPTIME: - rspamd_do_controller_simple_command ("uptime"); + rspamd_do_controller_simple_command ("uptime", NULL); break; default: fprintf (stderr, "invalid arguments\n"); @@ -722,61 +739,69 @@ main (gint argc, gchar **argv, gchar **env) } } else { - add_rspamd_server (FALSE); scan_rspamd_file (argv[1]); } } else { if ((cmd = check_rspamc_command (argv[1])) != RSPAMC_COMMAND_UNKNOWN) { /* In case of command read arguments starting from 2 */ - switch (cmd) { - case RSPAMC_COMMAND_SYMBOLS: - /* Add server */ - add_rspamd_server (FALSE); - break; - default: - add_rspamd_server (TRUE); - break; - } - for (i = 2; i < argc; i ++) { - if (tty) { - printf ("\033[1m"); + if (cmd == RSPAMC_COMMAND_ADD_SYMBOL || cmd == RSPAMC_COMMAND_ADD_ACTION) { + if (argc < 4 || argc > 5) { + fprintf (stderr, "invalid arguments\n"); + exit (EXIT_FAILURE); } - PRINT_FUNC ("Results for file: %s\n\n", argv[i]); - if (tty) { - printf ("\033[0m"); + if (argc == 5) { + g_hash_table_insert (kwattrs, "metric", argv[2]); + g_hash_table_insert (kwattrs, "name", argv[3]); + g_hash_table_insert (kwattrs, "value", argv[4]); } - switch (cmd) { - case RSPAMC_COMMAND_SYMBOLS: - scan_rspamd_file (argv[i]); - break; - case RSPAMC_COMMAND_LEARN_SPAM: - if (classifier != NULL) { - learn_rspamd_file (TRUE, argv[i]); - } - else { - fprintf (stderr, "no classifier specified\n"); - exit (EXIT_FAILURE); + else { + g_hash_table_insert (kwattrs, "name", argv[2]); + g_hash_table_insert (kwattrs, "value", argv[3]); + } + rspamd_do_controller_simple_command (cmd == RSPAMC_COMMAND_ADD_SYMBOL ? "add_symbol" : "add_action", kwattrs); + } + else { + for (i = 2; i < argc; i ++) { + if (tty) { + printf ("\033[1m"); } - break; - case RSPAMC_COMMAND_LEARN_HAM: - if (classifier != NULL) { - learn_rspamd_file (FALSE, argv[i]); + PRINT_FUNC ("Results for file: %s\n\n", argv[i]); + if (tty) { + printf ("\033[0m"); } - else { - fprintf (stderr, "no classifier specified\n"); + switch (cmd) { + case RSPAMC_COMMAND_SYMBOLS: + scan_rspamd_file (argv[i]); + break; + case RSPAMC_COMMAND_LEARN_SPAM: + if (classifier != NULL) { + learn_rspamd_file (TRUE, argv[i]); + } + else { + fprintf (stderr, "no classifier specified\n"); + exit (EXIT_FAILURE); + } + break; + case RSPAMC_COMMAND_LEARN_HAM: + if (classifier != NULL) { + learn_rspamd_file (FALSE, argv[i]); + } + else { + fprintf (stderr, "no classifier specified\n"); + exit (EXIT_FAILURE); + } + break; + case RSPAMC_COMMAND_FUZZY_ADD: + fuzzy_rspamd_file (argv[i], FALSE); + break; + case RSPAMC_COMMAND_FUZZY_DEL: + fuzzy_rspamd_file (argv[i], TRUE); + break; + default: + fprintf (stderr, "invalid arguments\n"); exit (EXIT_FAILURE); } - break; - case RSPAMC_COMMAND_FUZZY_ADD: - fuzzy_rspamd_file (argv[i], FALSE); - break; - case RSPAMC_COMMAND_FUZZY_DEL: - fuzzy_rspamd_file (argv[i], TRUE); - break; - default: - fprintf (stderr, "invalid arguments\n"); - exit (EXIT_FAILURE); } } } @@ -789,5 +814,7 @@ main (gint argc, gchar **argv, gchar **env) rspamd_client_close (client); + g_hash_table_destroy (kwattrs); + return 0; } diff --git a/src/dynamic_cfg.c b/src/dynamic_cfg.c index 1375463f0..279b1e0a9 100644 --- a/src/dynamic_cfg.c +++ b/src/dynamic_cfg.c @@ -499,7 +499,7 @@ add_dynamic_symbol (struct config_file *cfg, const gchar *metric_name, const gch { GList *cur; struct dynamic_cfg_metric *metric = NULL; - struct dynamic_cfg_symbol *sym; + struct dynamic_cfg_symbol *sym = NULL; if (cfg->dynamic_conf == NULL) { msg_info ("dynamic conf is disabled"); @@ -523,6 +523,7 @@ add_dynamic_symbol (struct config_file *cfg, const gchar *metric_name, const gch sym = cur->data; if (g_ascii_strcasecmp (sym->name, symbol) == 0) { sym->value = value; + msg_debug ("change value of action %s to %.2f", symbol, value); break; } sym = NULL; @@ -534,6 +535,7 @@ add_dynamic_symbol (struct config_file *cfg, const gchar *metric_name, const gch sym->name = g_strdup (symbol); sym->value = value; metric->symbols = g_list_prepend (metric->symbols, sym); + msg_debug ("create symbol %s in metric %s", symbol, metric_name); } } else { @@ -545,6 +547,7 @@ add_dynamic_symbol (struct config_file *cfg, const gchar *metric_name, const gch metric->symbols = g_list_prepend (metric->symbols, sym); metric->name = g_strdup (metric_name); cfg->current_dynamic_conf = g_list_prepend (cfg->current_dynamic_conf, metric); + msg_debug ("create metric %s for symbol %s", metric_name, symbol); } apply_dynamic_conf (cfg->current_dynamic_conf, cfg); @@ -566,7 +569,7 @@ add_dynamic_action (struct config_file *cfg, const gchar *metric_name, const gch { GList *cur; struct dynamic_cfg_metric *metric = NULL; - struct dynamic_cfg_action *act; + struct dynamic_cfg_action *act = NULL; gint real_act; if (cfg->dynamic_conf == NULL) { @@ -590,12 +593,13 @@ add_dynamic_action (struct config_file *cfg, const gchar *metric_name, const gch } if (metric != NULL) { - /* Search for a symbol */ - cur = metric->symbols; + /* Search for an action */ + cur = metric->actions; while (cur) { act = cur->data; if ((gint)act->action == real_act) { act->value = value; + msg_debug ("change value of action %s to %.2f", action, value); break; } act = NULL; @@ -603,21 +607,23 @@ add_dynamic_action (struct config_file *cfg, const gchar *metric_name, const gch } if (act == NULL) { /* Action not found, insert it */ - act = g_slice_alloc (sizeof (struct dynamic_cfg_symbol)); + act = g_slice_alloc (sizeof (struct dynamic_cfg_action)); act->action = real_act; act->value = value; - metric->actions = g_list_prepend (metric->symbols, act); + metric->actions = g_list_prepend (metric->actions, act); + msg_debug ("create action %s in metric %s", action, metric_name); } } else { /* Metric not found, create it */ metric = g_slice_alloc0 (sizeof (struct dynamic_cfg_metric)); - act = g_slice_alloc (sizeof (struct dynamic_cfg_symbol)); + act = g_slice_alloc (sizeof (struct dynamic_cfg_action)); act->action = real_act; act->value = value; - metric->actions = g_list_prepend (metric->symbols, act); + metric->actions = g_list_prepend (metric->actions, act); metric->name = g_strdup (metric_name); cfg->current_dynamic_conf = g_list_prepend (cfg->current_dynamic_conf, metric); + msg_debug ("create metric %s for action %s", metric_name, action); } apply_dynamic_conf (cfg->current_dynamic_conf, cfg); |