/* 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;
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);
}
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);
}
}
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) {
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;
}
}
+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)
{
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;
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) {
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;
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) {
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 {
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;