summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2012-10-02 20:32:49 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2012-10-02 20:32:49 +0400
commit14e1129068d55bc8de0618832d4f7d33bb1b0f06 (patch)
tree787a2156ec9e2181a2c8b273ded9ddc2a1777ece /src
parent5d1f19fc9988261e23f190c216eb17958f178904 (diff)
downloadrspamd-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.c133
-rw-r--r--src/dynamic_cfg.c22
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);