From 512154c538336e68b59ef0ed2c87ef9ba1e94151 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 11 Mar 2009 19:45:57 +0300 Subject: [PATCH] * Add log line for each message in SA style --- src/main.h | 1 + src/message.c | 4 ++++ src/plugins/surbl.c | 12 +++++------ src/protocol.c | 51 +++++++++++++++++++++++++++++++++------------ 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/main.h b/src/main.h index 0a727bcce3..7b7c221ca7 100644 --- a/src/main.h +++ b/src/main.h @@ -175,6 +175,7 @@ struct worker_task { char *helo; /**< helo header value */ char *from; /**< from header value */ char *queue_id; /**< queue id if specified */ + const char *message_id; /**< message id */ GList *rcpt; /**< recipients list */ unsigned int nrcpt; /**< number of recipients */ struct in_addr from_addr; /**< client addr in numeric form */ diff --git a/src/message.c b/src/message.c index 61f89317e4..4780a11ffb 100644 --- a/src/message.c +++ b/src/message.c @@ -366,6 +366,10 @@ process_message (struct worker_task *task) if (task->queue_id == NULL) { task->queue_id = (char *)g_mime_message_get_message_id (task->message); } + task->message_id = g_mime_message_get_message_id (task->message); + if (task->message_id == NULL) { + task->message_id = "undef"; + } task->worker->srv->stat->messages_scanned ++; diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index a5ea46865a..11abc49d96 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -387,12 +387,12 @@ dns_callback (int result, char type, int count, int ttl, void *addresses, void * /* If we have result from DNS server, this url exists in SURBL, so increase score */ if (result == DNS_ERR_NONE && type == DNS_IPv4_A) { msg_info ("surbl_check: <%s> url %s is in surbl %s", - param->task->queue_id, param->url->host, param->suffix->suffix); + param->task->message_id, param->url->host, param->suffix->suffix); process_dns_results (param->task, param->suffix, param->url->host, (uint32_t)(((in_addr_t *)addresses)[0])); } else { msg_debug ("surbl_check: <%s> url %s is not in surbl %s", - param->task->queue_id, param->url->host, param->suffix->suffix); + param->task->message_id, param->url->host, param->suffix->suffix); } *(param->url->host + param->url->hostlen) = c; @@ -556,7 +556,7 @@ redirector_callback (int fd, short what, void *arg) else { event_del (¶m->ev); msg_info ("redirector_callback: <%s> connection to redirector timed out while waiting for write", - param->task->queue_id); + param->task->message_id); param->task->save.saved --; make_surbl_requests (param->url, param->task, param->tree); @@ -581,7 +581,7 @@ redirector_callback (int fd, short what, void *arg) } if (*p == '\0') { msg_info ("redirector_callback: <%s> got reply from redirector: '%s' -> '%s'", - param->task->queue_id, struri (param->url), c); + param->task->message_id, struri (param->url), c); parse_uri (param->url, c, param->task->task_pool); } } @@ -597,7 +597,7 @@ redirector_callback (int fd, short what, void *arg) else { event_del (¶m->ev); msg_info ("redirector_callback: <%s> reading redirector timed out, while waiting for read", - param->task->queue_id); + param->task->message_id); param->task->save.saved --; make_surbl_requests (param->url, param->task, param->tree); if (param->task->save.saved == 0) { @@ -622,7 +622,7 @@ register_redirector_call (struct uri *url, struct worker_task *task, GTree *url_ if (s == -1) { msg_info ("register_redirector_call: <%s> cannot create tcp socket failed: %s", - task->queue_id, strerror (errno)); + task->message_id, strerror (errno)); task->save.saved --; make_surbl_requests (url, task, url_tree); return; diff --git a/src/protocol.c b/src/protocol.c index 257426813d..f65d0b1a5a 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -321,6 +321,13 @@ read_rspamd_input_line (struct worker_task *task, f_str_t *line) } } +struct metric_callback_data { + struct worker_task *task; + char *log_buf; + int log_offset; + int log_size; +}; + static void show_url_header (struct worker_task *task) { @@ -365,7 +372,8 @@ show_url_header (struct worker_task *task) static void metric_symbols_callback (gpointer key, gpointer value, void *user_data) { - struct worker_task *task = (struct worker_task *)user_data; + struct metric_callback_data *cd = (struct metric_callback_data *)user_data; + struct worker_task *task = cd->task; int r = 0; char outbuf[OUTBUFSIZ]; struct symbol *s = (struct symbol *)value; @@ -392,18 +400,20 @@ metric_symbols_callback (gpointer key, gpointer value, void *user_data) else { r = snprintf (outbuf, OUTBUFSIZ, "Symbol: %s" CRLF, (char *)key); } + cd->log_offset += snprintf (cd->log_buf + cd->log_offset, cd->log_size - cd->log_offset, + "%s,", (char *)key); rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE); } static void -show_metric_symbols (struct metric_result *metric_res, struct worker_task *task) +show_metric_symbols (struct metric_result *metric_res, struct metric_callback_data *cd) { int r = 0; GList *symbols, *cur; char outbuf[OUTBUFSIZ]; - if (task->proto == SPAMC_PROTO) { + if (cd->task->proto == SPAMC_PROTO) { symbols = g_hash_table_get_keys (metric_res->symbols); cur = symbols; while (cur) { @@ -416,17 +426,18 @@ show_metric_symbols (struct metric_result *metric_res, struct worker_task *task) cur = g_list_next (cur); } g_list_free (symbols); - rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE); + rspamd_dispatcher_write (cd->task->dispatcher, outbuf, r, FALSE); } else { - g_hash_table_foreach (metric_res->symbols, metric_symbols_callback, task); + g_hash_table_foreach (metric_res->symbols, metric_symbols_callback, cd); } } static void show_metric_result (gpointer metric_name, gpointer metric_value, void *user_data) { - struct worker_task *task = (struct worker_task *)user_data; + struct metric_callback_data *cd = (struct metric_callback_data *)user_data; + struct worker_task *task = cd->task; int r; char outbuf[OUTBUFSIZ]; struct metric_result *metric_res = (struct metric_result *)metric_value; @@ -443,6 +454,8 @@ show_metric_result (gpointer metric_name, gpointer metric_value, void *user_data r = snprintf (outbuf, sizeof (outbuf), "Metric: default; False; 0 / %.2f" CRLF, m != NULL ? m->required_score : 0); } + cd->log_offset += snprintf (cd->log_buf + cd->log_offset, cd->log_size - cd->log_offset, + "(%s: F: [0/%.2f] [", "default", m != NULL ? m->required_score : 0); } else { if (metric_res->score >= metric_res->metric->required_score) { @@ -456,32 +469,43 @@ show_metric_result (gpointer metric_name, gpointer metric_value, void *user_data r = snprintf (outbuf, sizeof (outbuf), "Metric: %s; %s; %.2f / %.2f" CRLF, (char *)metric_name, (is_spam) ? "True" : "False", metric_res->score, metric_res->metric->required_score); } + cd->log_offset += snprintf (cd->log_buf + cd->log_offset, cd->log_size - cd->log_offset, + "(%s: %s: [%.2f/%.2f] [", (char *)metric_name, is_spam ? "T" : "F", + metric_res->score, metric_res->metric->required_score); } rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE); if (task->cmd == CMD_SYMBOLS && metric_value != NULL) { - show_metric_symbols (metric_res, task); + show_metric_symbols (metric_res, cd); } + cd->log_offset += snprintf (cd->log_buf + cd->log_offset, cd->log_size - cd->log_offset, "] )"); } static int write_check_reply (struct worker_task *task) { int r; - char outbuf[OUTBUFSIZ]; + char outbuf[OUTBUFSIZ], logbuf[OUTBUFSIZ]; struct metric_result *metric_res; + struct metric_callback_data cd; r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK"); rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE); + + cd.task = task; + cd.log_buf = logbuf; + cd.log_offset = snprintf (logbuf, sizeof (logbuf), "process_message: msg ok, id: <%s>, ", task->message_id); + cd.log_size = sizeof (logbuf); + if (task->proto == SPAMC_PROTO) { /* Ignore metrics, just write report for 'default' metric */ metric_res = g_hash_table_lookup (task->results, "default"); if (metric_res == NULL) { /* Implicit metric result */ - show_metric_result (NULL, NULL, (void *)task); + show_metric_result (NULL, NULL, (void *)&cd); } else { - show_metric_result ((gpointer)"default", (gpointer)metric_res, (void *)task); + show_metric_result ((gpointer)"default", (gpointer)metric_res, (void *)&cd); } } else { @@ -489,18 +513,19 @@ write_check_reply (struct worker_task *task) metric_res = g_hash_table_lookup (task->results, "default"); if (metric_res == NULL) { /* Implicit metric result */ - show_metric_result (NULL, NULL, (void *)task); + show_metric_result (NULL, NULL, (void *)&cd); } else { - show_metric_result ((gpointer)"default", (gpointer)metric_res, (void *)task); + show_metric_result ((gpointer)"default", (gpointer)metric_res, (void *)&cd); } g_hash_table_remove (task->results, "default"); /* Write result for each metric separately */ - g_hash_table_foreach (task->results, show_metric_result, task); + g_hash_table_foreach (task->results, show_metric_result, &cd); /* URL stat */ show_url_header (task); } + msg_info ("%s", logbuf); rspamd_dispatcher_write (task->dispatcher, CRLF, sizeof (CRLF) - 1, FALSE); return 0; -- 2.47.3