summaryrefslogtreecommitdiffstats
path: root/src/controller.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2014-07-23 12:45:28 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2014-07-23 12:45:28 +0100
commite0483657ff6cf1adc828ccce457814d61fe90a0d (patch)
tree5183e4163f40b81b3e7d5f51488d360883782154 /src/controller.c
parent7962087e808fb824aa3af6d41d02abc92916ba1e (diff)
downloadrspamd-e0483657ff6cf1adc828ccce457814d61fe90a0d.tar.gz
rspamd-e0483657ff6cf1adc828ccce457814d61fe90a0d.zip
Unify code style.
Diffstat (limited to 'src/controller.c')
-rw-r--r--src/controller.c903
1 files changed, 535 insertions, 368 deletions
diff --git a/src/controller.c b/src/controller.c
index e3d82fa49..55d62ca20 100644
--- a/src/controller.c
+++ b/src/controller.c
@@ -22,20 +22,20 @@
*/
+#include "cfg_file.h"
+#include "classifiers/classifiers.h"
#include "config.h"
-#include "util.h"
-#include "main.h"
+#include "dns.h"
+#include "dynamic_cfg.h"
#include "http.h"
+#include "main.h"
+#include "map.h"
#include "message.h"
#include "protocol.h"
-#include "upstream.h"
-#include "cfg_file.h"
-#include "map.h"
-#include "dns.h"
-#include "tokenizers/tokenizers.h"
-#include "classifiers/classifiers.h"
-#include "dynamic_cfg.h"
#include "rrd.h"
+#include "tokenizers/tokenizers.h"
+#include "upstream.h"
+#include "util.h"
#ifdef WITH_GPERF_TOOLS
# include <glib/gprintf.h>
@@ -75,25 +75,25 @@ gpointer init_controller_worker (struct rspamd_config *cfg);
void start_controller_worker (struct rspamd_worker *worker);
worker_t controller_worker = {
- "controller", /* Name */
- init_controller_worker, /* Init function */
- start_controller_worker, /* Start function */
- TRUE, /* Has socket */
- TRUE, /* Non unique */
- FALSE, /* Non threaded */
- TRUE, /* Killable */
- SOCK_STREAM /* TCP socket */
+ "controller", /* Name */
+ init_controller_worker, /* Init function */
+ start_controller_worker, /* Start function */
+ TRUE, /* Has socket */
+ TRUE, /* Non unique */
+ FALSE, /* Non threaded */
+ TRUE, /* Killable */
+ SOCK_STREAM /* TCP socket */
};
/*
* Worker's context
*/
struct rspamd_controller_worker_ctx {
- guint32 timeout;
- struct timeval io_tv;
+ guint32 timeout;
+ struct timeval io_tv;
/* DNS resolver */
- struct rspamd_dns_resolver *resolver;
+ struct rspamd_dns_resolver *resolver;
/* Events base */
- struct event_base *ev_base;
+ struct event_base *ev_base;
/* Whether we use ssl for this server */
gboolean use_ssl;
/* Webui password */
@@ -138,11 +138,11 @@ struct rspamd_controller_session {
/* Check for password if it is required by configuration */
static gboolean
rspamd_controller_check_password (struct rspamd_http_connection_entry *entry,
- struct rspamd_controller_session *session, struct rspamd_http_message *msg,
- gboolean is_enable)
+ struct rspamd_controller_session *session, struct rspamd_http_message *msg,
+ gboolean is_enable)
{
- const gchar *password, *check;
- struct rspamd_controller_worker_ctx *ctx = session->ctx;
+ const gchar *password, *check;
+ struct rspamd_controller_worker_ctx *ctx = session->ctx;
gboolean ret = TRUE;
/* Access list logic */
@@ -151,9 +151,9 @@ rspamd_controller_check_password (struct rspamd_http_connection_entry *entry,
return TRUE;
}
else if (ctx->secure_map && radix32_tree_find_addr (ctx->secure_map,
- &session->from_addr) != RADIX_NO_VALUE) {
+ &session->from_addr) != RADIX_NO_VALUE) {
msg_info ("allow unauthorized connection from a trusted IP %s",
- rspamd_inet_address_to_string (&session->from_addr));
+ rspamd_inet_address_to_string (&session->from_addr));
return TRUE;
}
@@ -163,7 +163,8 @@ rspamd_controller_check_password (struct rspamd_http_connection_entry *entry,
password = rspamd_http_message_find_header (msg, "Password");
if (ctx->enable_password == NULL) {
/* Use just a password (legacy mode) */
- msg_info ("using password as enable_password for a privileged command");
+ msg_info (
+ "using password as enable_password for a privileged command");
check = ctx->password;
}
else {
@@ -176,7 +177,8 @@ rspamd_controller_check_password (struct rspamd_http_connection_entry *entry,
}
}
else {
- msg_warn ("no password to check while executing a privileged command");
+ msg_warn (
+ "no password to check while executing a privileged command");
if (ctx->secure_map) {
msg_info ("deny unauthorized connection");
ret = FALSE;
@@ -227,13 +229,13 @@ rspamd_controller_check_password (struct rspamd_http_connection_entry *entry,
*/
static int
rspamd_controller_handle_auth (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct rspamd_stat *st;
- int64_t uptime;
- gulong data[4];
- ucl_object_t *obj;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_stat *st;
+ int64_t uptime;
+ gulong data[4];
+ ucl_object_t *obj;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
return 0;
@@ -242,22 +244,32 @@ rspamd_controller_handle_auth (struct rspamd_http_connection_entry *conn_ent,
obj = ucl_object_typed_new (UCL_OBJECT);
st = session->ctx->srv->stat;
data[0] = st->actions_stat[METRIC_ACTION_NOACTION];
- data[1] = st->actions_stat[METRIC_ACTION_ADD_HEADER] + st->actions_stat[METRIC_ACTION_REWRITE_SUBJECT];
+ data[1] = st->actions_stat[METRIC_ACTION_ADD_HEADER] +
+ st->actions_stat[METRIC_ACTION_REWRITE_SUBJECT];
data[2] = st->actions_stat[METRIC_ACTION_GREYLIST];
data[3] = st->actions_stat[METRIC_ACTION_REJECT];
/* Get uptime */
uptime = time (NULL) - session->ctx->start_time;
- ucl_object_insert_key (obj, ucl_object_fromstring (RVERSION), "version", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromstring ("ok"), "auth", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (uptime), "uptime", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (data[0]), "clean", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (data[1]), "probable", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (data[2]), "greylist", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (data[3]), "reject", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (st->messages_scanned), "scanned", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (st->messages_learned), "learned", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ RVERSION), "version", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ "ok"), "auth", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ uptime), "uptime", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ data[0]), "clean", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ data[1]), "probable", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ data[2]), "greylist", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ data[3]), "reject", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ st->messages_scanned), "scanned", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ st->messages_learned), "learned", 0, false);
rspamd_controller_send_ucl (conn_ent, obj);
ucl_object_unref (obj);
@@ -269,26 +281,26 @@ rspamd_controller_handle_auth (struct rspamd_http_connection_entry *conn_ent,
* Symbols command handler:
* request: /symbols
* reply: json [{
- * "name": "group_name",
- * "symbols": [
- * {
- * "name": "name",
- * "weight": 0.1,
- * "description": "description of symbol"
- * },
- * {...}
+ * "name": "group_name",
+ * "symbols": [
+ * {
+ * "name": "name",
+ * "weight": 0.1,
+ * "description": "description of symbol"
+ * },
+ * {...}
* },
* {...}]
*/
static int
rspamd_controller_handle_symbols (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- GList *cur_gr, *cur_sym;
- struct rspamd_symbols_group *gr;
- struct rspamd_symbol_def *sym;
- ucl_object_t *obj, *top, *sym_obj;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ GList *cur_gr, *cur_sym;
+ struct rspamd_symbols_group *gr;
+ struct rspamd_symbol_def *sym;
+ ucl_object_t *obj, *top, *sym_obj;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
return 0;
@@ -301,7 +313,8 @@ rspamd_controller_handle_symbols (struct rspamd_http_connection_entry *conn_ent,
while (cur_gr) {
gr = cur_gr->data;
obj = ucl_object_typed_new (UCL_OBJECT);
- ucl_object_insert_key (obj, ucl_object_fromstring (gr->name), "group", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ gr->name), "group", 0, false);
/* Iterate through all symbols */
cur_sym = gr->symbols;
while (cur_sym) {
@@ -309,11 +322,13 @@ rspamd_controller_handle_symbols (struct rspamd_http_connection_entry *conn_ent,
sym = cur_sym->data;
ucl_object_insert_key (sym_obj, ucl_object_fromstring (sym->name),
- "symbol", 0, false);
- ucl_object_insert_key (sym_obj, ucl_object_fromdouble (*sym->weight_ptr),
- "weight", 0, false);
+ "symbol", 0, false);
+ ucl_object_insert_key (sym_obj,
+ ucl_object_fromdouble (*sym->weight_ptr),
+ "weight", 0, false);
if (sym->description) {
- ucl_object_insert_key (sym_obj, ucl_object_fromstring (sym->description),
+ ucl_object_insert_key (sym_obj,
+ ucl_object_fromstring (sym->description),
"description", 0, false);
}
@@ -334,20 +349,20 @@ rspamd_controller_handle_symbols (struct rspamd_http_connection_entry *conn_ent,
* Actions command handler:
* request: /actions
* reply: json [{
- * "action": "no action",
- * "value": 1.1
+ * "action": "no action",
+ * "value": 1.1
* },
* {...}]
*/
static int
rspamd_controller_handle_actions (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct metric *metric;
- struct metric_action *act;
- gint i;
- ucl_object_t *obj, *top;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct metric *metric;
+ struct metric_action *act;
+ gint i;
+ ucl_object_t *obj, *top;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
return 0;
@@ -358,13 +373,15 @@ rspamd_controller_handle_actions (struct rspamd_http_connection_entry *conn_ent,
/* Get actions for default metric */
metric = g_hash_table_lookup (session->ctx->cfg->metrics, DEFAULT_METRIC);
if (metric != NULL) {
- for (i = METRIC_ACTION_REJECT; i < METRIC_ACTION_MAX; i ++) {
+ for (i = METRIC_ACTION_REJECT; i < METRIC_ACTION_MAX; i++) {
act = &metric->actions[i];
if (act->score > 0) {
obj = ucl_object_typed_new (UCL_OBJECT);
ucl_object_insert_key (obj,
- ucl_object_fromstring (str_action_metric (act->action)), "action", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromdouble (act->score), "value", 0, false);
+ ucl_object_fromstring (str_action_metric (
+ act->action)), "action", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromdouble (
+ act->score), "value", 0, false);
ucl_array_append (top, obj);
}
}
@@ -380,23 +397,23 @@ rspamd_controller_handle_actions (struct rspamd_http_connection_entry *conn_ent,
* request: /maps
* headers: Password
* reply: json [
- * {
- * "map": "name",
- * "description": "description",
- * "editable": true
- * },
- * {...}
+ * {
+ * "map": "name",
+ * "description": "description",
+ * "editable": true
+ * },
+ * {...}
* ]
*/
static int
rspamd_controller_handle_maps (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- GList *cur, *tmp = NULL;
- struct rspamd_map *map;
- gboolean editable;
- ucl_object_t *obj, *top;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ GList *cur, *tmp = NULL;
+ struct rspamd_map *map;
+ gboolean editable;
+ ucl_object_t *obj, *top;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
@@ -422,12 +439,12 @@ rspamd_controller_handle_maps (struct rspamd_http_connection_entry *conn_ent,
editable = (access (map->uri, W_OK) == 0);
obj = ucl_object_typed_new (UCL_OBJECT);
- ucl_object_insert_key (obj, ucl_object_fromint (map->id),
- "map", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (map->id),
+ "map", 0, false);
ucl_object_insert_key (obj, ucl_object_fromstring (map->description),
- "description", 0, false);
- ucl_object_insert_key (obj, ucl_object_frombool (editable),
- "editable", 0, false);
+ "description", 0, false);
+ ucl_object_insert_key (obj, ucl_object_frombool (editable),
+ "editable", 0, false);
ucl_array_append (top, obj);
cur = g_list_next (cur);
@@ -451,18 +468,18 @@ rspamd_controller_handle_maps (struct rspamd_http_connection_entry *conn_ent,
*/
static int
rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- GList *cur;
- struct rspamd_map *map;
- const gchar *idstr;
- gchar *errstr;
- struct stat st;
- gint fd;
- guint32 id;
- gboolean found = FALSE;
- struct rspamd_http_message *reply;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ GList *cur;
+ struct rspamd_map *map;
+ const gchar *idstr;
+ gchar *errstr;
+ struct stat st;
+ gint fd;
+ guint32 id;
+ gboolean found = FALSE;
+ struct rspamd_http_message *reply;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
@@ -528,8 +545,8 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
rspamd_http_connection_reset (conn_ent->conn);
rspamd_http_connection_write_message (conn_ent->conn, reply, NULL,
- "text/plain", conn_ent, conn_ent->conn->fd,
- conn_ent->rt->ptv, conn_ent->rt->ev_base);
+ "text/plain", conn_ent, conn_ent->conn->fd,
+ conn_ent->rt->ptv, conn_ent->rt->ev_base);
conn_ent->is_reply = TRUE;
return 0;
@@ -541,20 +558,20 @@ rspamd_controller_handle_get_map (struct rspamd_http_connection_entry *conn_ent,
* request: /graph
* headers: Password
* reply: json [
- * { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] },
- * { label: "Bar", data: [ [10, 1], [17, -14], [30, 5] ] },
- * {...}
+ * { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] },
+ * { label: "Bar", data: [ [10, 1], [17, -14], [30, 5] ] },
+ * {...}
* ]
*/
/* XXX: now this function returns only random data */
static void
rspamd_controller_handle_graph (struct evhttp_request *req, gpointer arg)
{
- struct rspamd_controller_worker_ctx *ctx = arg;
- struct evbuffer *evb;
- gint i, seed;
- time_t now, t;
- double vals[5][100];
+ struct rspamd_controller_worker_ctx *ctx = arg;
+ struct evbuffer *evb;
+ gint i, seed;
+ time_t now, t;
+ double vals[5][100];
if (!http_check_password (ctx, req)) {
return;
@@ -572,8 +589,10 @@ rspamd_controller_handle_graph (struct evhttp_request *req, gpointer arg)
/* XXX: simple and stupid set */
seed = g_random_int ();
- for (i = 0; i < 100; i ++, seed ++) {
- vals[0][i] = fabs ((sin (seed * 0.1 * M_PI_2) + 1) * 40. + ((gint)(g_random_int () % 2) - 1));
+ for (i = 0; i < 100; i++, seed++) {
+ vals[0][i] =
+ fabs ((sin (seed * 0.1 *
+ M_PI_2) + 1) * 40. + ((gint)(g_random_int () % 2) - 1));
vals[1][i] = vals[0][i] * 0.5;
vals[2][i] = vals[0][i] * 0.1;
vals[3][i] = vals[0][i] * 0.3;
@@ -584,50 +603,75 @@ rspamd_controller_handle_graph (struct evhttp_request *req, gpointer arg)
/* Ham label */
t = now - 6000;
- evbuffer_add_printf (evb, "{\"label\": \"Clean messages\", \"lines\": {\"fill\": false}, \"color\": \""
- COLOR_CLEAN "\", \"data\":[");
- for (i = 0; i < 100; i ++, t += 60) {
- evbuffer_add_printf (evb, "[%llu,%.2f%s", (long long unsigned)t * 1000, vals[0][i], i == 99 ? "]" : "],");
+ evbuffer_add_printf (evb,
+ "{\"label\": \"Clean messages\", \"lines\": {\"fill\": false}, \"color\": \""
+ COLOR_CLEAN "\", \"data\":[");
+ for (i = 0; i < 100; i++, t += 60) {
+ evbuffer_add_printf (evb,
+ "[%llu,%.2f%s",
+ (long long unsigned)t * 1000,
+ vals[0][i],
+ i == 99 ? "]" : "],");
}
evbuffer_add (evb, "]},", 3);
/* Probable spam label */
t = now - 6000;
- evbuffer_add_printf (evb, "{\"label\": \"Probable spam messages\", \"lines\": {\"fill\": false}, \"color\": \""
- COLOR_PROBABLE_SPAM "\", \"data\":[");
- for (i = 0; i < 100; i ++, t += 60) {
- evbuffer_add_printf (evb, "[%llu,%.2f%s", (long long unsigned)t * 1000, vals[1][i], i == 99 ? "]" : "],");
+ evbuffer_add_printf (evb,
+ "{\"label\": \"Probable spam messages\", \"lines\": {\"fill\": false}, \"color\": \""
+ COLOR_PROBABLE_SPAM "\", \"data\":[");
+ for (i = 0; i < 100; i++, t += 60) {
+ evbuffer_add_printf (evb,
+ "[%llu,%.2f%s",
+ (long long unsigned)t * 1000,
+ vals[1][i],
+ i == 99 ? "]" : "],");
}
evbuffer_add (evb, "]},", 3);
/* Greylist label */
t = now - 6000;
- evbuffer_add_printf (evb, "{\"label\": \"Greylisted messages\", \"lines\": {\"fill\": false}, \"color\": \""
- COLOR_GREYLIST "\", \"data\":[");
- for (i = 0; i < 100; i ++, t += 60) {
- evbuffer_add_printf (evb, "[%llu,%.2f%s", (long long unsigned)t * 1000, vals[2][i], i == 99 ? "]" : "],");
+ evbuffer_add_printf (evb,
+ "{\"label\": \"Greylisted messages\", \"lines\": {\"fill\": false}, \"color\": \""
+ COLOR_GREYLIST "\", \"data\":[");
+ for (i = 0; i < 100; i++, t += 60) {
+ evbuffer_add_printf (evb,
+ "[%llu,%.2f%s",
+ (long long unsigned)t * 1000,
+ vals[2][i],
+ i == 99 ? "]" : "],");
}
evbuffer_add (evb, "]},", 3);
/* Reject label */
t = now - 6000;
- evbuffer_add_printf (evb, "{\"label\": \"Rejected messages\", \"lines\": {\"fill\": false}, \"color\": \""
- COLOR_REJECT "\", \"data\":[");
- for (i = 0; i < 100; i ++, t += 60) {
- evbuffer_add_printf (evb, "[%llu,%.2f%s", (long long unsigned)t * 1000, vals[3][i], i == 99 ? "]" : "],");
+ evbuffer_add_printf (evb,
+ "{\"label\": \"Rejected messages\", \"lines\": {\"fill\": false}, \"color\": \""
+ COLOR_REJECT "\", \"data\":[");
+ for (i = 0; i < 100; i++, t += 60) {
+ evbuffer_add_printf (evb,
+ "[%llu,%.2f%s",
+ (long long unsigned)t * 1000,
+ vals[3][i],
+ i == 99 ? "]" : "],");
}
evbuffer_add (evb, "]},", 3);
/* Total label */
t = now - 6000;
- evbuffer_add_printf (evb, "{\"label\": \"Total messages\", \"lines\": {\"fill\": false}, \"color\": \""
- COLOR_TOTAL "\", \"data\":[");
- for (i = 0; i < 100; i ++, t += 60) {
- evbuffer_add_printf (evb, "[%llu,%.2f%s", (long long unsigned)t * 1000, vals[4][i], i == 99 ? "]" : "],");
+ evbuffer_add_printf (evb,
+ "{\"label\": \"Total messages\", \"lines\": {\"fill\": false}, \"color\": \""
+ COLOR_TOTAL "\", \"data\":[");
+ for (i = 0; i < 100; i++, t += 60) {
+ evbuffer_add_printf (evb,
+ "[%llu,%.2f%s",
+ (long long unsigned)t * 1000,
+ vals[4][i],
+ i == 99 ? "]" : "],");
}
- evbuffer_add (evb, "]}", 2);
+ evbuffer_add (evb, "]}", 2);
- evbuffer_add (evb, "]" CRLF, 3);
+ evbuffer_add (evb, "]" CRLF, 3);
evhttp_add_header (req->output_headers, "Connection", "close");
http_calculate_content_length (evb, req);
@@ -641,19 +685,20 @@ rspamd_controller_handle_graph (struct evhttp_request *req, gpointer arg)
* request: /pie
* headers: Password
* reply: json [
- * { label: "Foo", data: 11 },
- * { label: "Bar", data: 20 },
- * {...}
+ * { label: "Foo", data: 11 },
+ * { label: "Bar", data: 20 },
+ * {...}
* ]
*/
static int
-rspamd_controller_handle_pie_chart (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_pie_chart (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct rspamd_controller_worker_ctx *ctx;
- gdouble data[4], total;
- ucl_object_t *top, *obj;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_worker_ctx *ctx;
+ gdouble data[4], total;
+ ucl_object_t *top, *obj;
ctx = session->ctx;
@@ -666,31 +711,36 @@ rspamd_controller_handle_pie_chart (struct rspamd_http_connection_entry *conn_en
if (total != 0) {
obj = ucl_object_typed_new (UCL_ARRAY);
- data[0] = ctx->srv->stat->actions_stat[METRIC_ACTION_NOACTION] / total * 100.;
+ data[0] = ctx->srv->stat->actions_stat[METRIC_ACTION_NOACTION] / total *
+ 100.;
data[1] = (ctx->srv->stat->actions_stat[METRIC_ACTION_ADD_HEADER] +
- ctx->srv->stat->actions_stat[METRIC_ACTION_REWRITE_SUBJECT]) / total * 100.;
- data[2] = ctx->srv->stat->actions_stat[METRIC_ACTION_GREYLIST] / total * 100.;
- data[3] = ctx->srv->stat->actions_stat[METRIC_ACTION_REJECT] / total * 100.;
+ ctx->srv->stat->actions_stat[METRIC_ACTION_REWRITE_SUBJECT]) /
+ total * 100.;
+ data[2] = ctx->srv->stat->actions_stat[METRIC_ACTION_GREYLIST] / total *
+ 100.;
+ data[3] = ctx->srv->stat->actions_stat[METRIC_ACTION_REJECT] / total *
+ 100.;
ucl_array_append (obj, ucl_object_fromstring ("Clean messages"));
ucl_array_append (obj, ucl_object_fromdouble (data[0]));
- ucl_array_append (top, obj);
- ucl_array_append (obj, ucl_object_fromstring ("Probable spam messages"));
+ ucl_array_append (top, obj);
+ ucl_array_append (obj,
+ ucl_object_fromstring ("Probable spam messages"));
ucl_array_append (obj, ucl_object_fromdouble (data[1]));
- ucl_array_append (top, obj);
+ ucl_array_append (top, obj);
ucl_array_append (obj, ucl_object_fromstring ("Greylisted messages"));
ucl_array_append (obj, ucl_object_fromdouble (data[2]));
- ucl_array_append (top, obj);
+ ucl_array_append (top, obj);
ucl_array_append (obj, ucl_object_fromstring ("Rejected messages"));
ucl_array_append (obj, ucl_object_fromdouble (data[3]));
- ucl_array_append (top, obj);
+ ucl_array_append (top, obj);
}
else {
obj = ucl_object_typed_new (UCL_ARRAY);
ucl_array_append (obj, ucl_object_fromstring ("Scanned messages"));
ucl_array_append (obj, ucl_object_fromdouble (0));
- ucl_array_append (top, obj);
+ ucl_array_append (top, obj);
}
rspamd_controller_send_ucl (conn_ent, top);
@@ -704,24 +754,24 @@ rspamd_controller_handle_pie_chart (struct rspamd_http_connection_entry *conn_en
* request: /history
* headers: Password
* reply: json [
- * { label: "Foo", data: 11 },
- * { label: "Bar", data: 20 },
- * {...}
+ * { label: "Foo", data: 11 },
+ * { label: "Bar", data: 20 },
+ * {...}
* ]
*/
static int
rspamd_controller_handle_history (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct rspamd_controller_worker_ctx *ctx;
- struct roll_history_row *row;
- struct roll_history copied_history;
- gint i, rows_proc, row_num;
- struct tm *tm;
- gchar timebuf[32];
- gchar ip_buf[INET6_ADDRSTRLEN];
- ucl_object_t *top, *obj;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_worker_ctx *ctx;
+ struct roll_history_row *row;
+ struct roll_history copied_history;
+ gint i, rows_proc, row_num;
+ struct tm *tm;
+ gchar timebuf[32];
+ gchar ip_buf[INET6_ADDRSTRLEN];
+ ucl_object_t *top, *obj;
ctx = session->ctx;
@@ -740,7 +790,7 @@ rspamd_controller_handle_history (struct rspamd_http_connection_entry *conn_ent,
/* Go through all rows */
row_num = copied_history.cur_row;
- for (i = 0, rows_proc = 0; i < HISTORY_MAX_ROWS; i ++, row_num ++) {
+ for (i = 0, rows_proc = 0; i < HISTORY_MAX_ROWS; i++, row_num++) {
if (row_num == HISTORY_MAX_ROWS) {
row_num = 0;
}
@@ -751,30 +801,44 @@ rspamd_controller_handle_history (struct rspamd_http_connection_entry *conn_ent,
strftime (timebuf, sizeof (timebuf), "%F %H:%M:%S", tm);
#ifdef HAVE_INET_PTON
if (row->from_addr.ipv6) {
- inet_ntop (AF_INET6, &row->from_addr.d.in6, ip_buf, sizeof (ip_buf));
+ inet_ntop (AF_INET6, &row->from_addr.d.in6, ip_buf,
+ sizeof (ip_buf));
}
else {
- inet_ntop (AF_INET, &row->from_addr.d.in4, ip_buf, sizeof (ip_buf));
+ inet_ntop (AF_INET, &row->from_addr.d.in4, ip_buf,
+ sizeof (ip_buf));
}
#else
- rspamd_strlcpy (ip_buf, inet_ntoa (task->from_addr), sizeof (ip_buf));
+ rspamd_strlcpy (ip_buf, inet_ntoa (task->from_addr),
+ sizeof (ip_buf));
#endif
obj = ucl_object_typed_new (UCL_OBJECT);
- ucl_object_insert_key (obj, ucl_object_fromstring (timebuf), "time", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromstring (row->message_id), "id", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromstring (ip_buf), "ip", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ timebuf), "time", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ row->message_id), "id", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ ip_buf), "ip", 0, false);
+ ucl_object_insert_key (obj,
+ ucl_object_fromstring (str_action_metric (
+ row->action)), "action", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromdouble (
+ row->score), "score", 0, false);
ucl_object_insert_key (obj,
- ucl_object_fromstring (str_action_metric (row->action)), "action", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromdouble (row->score), "score", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromdouble (row->required_score), "required_score", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromstring (row->symbols), "symbols", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (row->len), "size", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (row->scan_time), "scan_time", 0, false);
+ ucl_object_fromdouble (
+ row->required_score), "required_score", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ row->symbols), "symbols", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ row->len), "size", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ row->scan_time), "scan_time", 0, false);
if (row->user[0] != '\0') {
- ucl_object_insert_key (obj, ucl_object_fromstring (row->user), "user", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromstring (
+ row->user), "user", 0, false);
}
ucl_array_append (top, obj);
- rows_proc ++;
+ rows_proc++;
}
}
@@ -787,10 +851,10 @@ rspamd_controller_handle_history (struct rspamd_http_connection_entry *conn_ent,
static gboolean
rspamd_controller_learn_fin_task (void *ud)
{
- struct rspamd_task *task = ud;
- struct rspamd_controller_session *session;
- struct rspamd_http_connection_entry *conn_ent;
- GError *err = NULL;
+ struct rspamd_task *task = ud;
+ struct rspamd_controller_session *session;
+ struct rspamd_http_connection_entry *conn_ent;
+ GError *err = NULL;
conn_ent = task->fin_arg;
session = conn_ent->ud;
@@ -808,8 +872,8 @@ rspamd_controller_learn_fin_task (void *ud)
static gboolean
rspamd_controller_check_fin_task (void *ud)
{
- struct rspamd_task *task = ud;
- struct rspamd_http_connection_entry *conn_ent;
+ struct rspamd_task *task = ud;
+ struct rspamd_http_connection_entry *conn_ent;
struct rspamd_http_message *msg;
conn_ent = task->fin_arg;
@@ -819,22 +883,24 @@ rspamd_controller_check_fin_task (void *ud)
rspamd_protocol_http_reply (msg, task);
rspamd_http_connection_reset (conn_ent->conn);
rspamd_http_connection_write_message (conn_ent->conn, msg, NULL,
- "application/json", conn_ent, conn_ent->conn->fd, conn_ent->rt->ptv,
- conn_ent->rt->ev_base);
+ "application/json", conn_ent, conn_ent->conn->fd, conn_ent->rt->ptv,
+ conn_ent->rt->ev_base);
conn_ent->is_reply = TRUE;
return TRUE;
}
static int
-rspamd_controller_handle_learn_common (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg, gboolean is_spam)
+rspamd_controller_handle_learn_common (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg,
+ gboolean is_spam)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct rspamd_controller_worker_ctx *ctx;
- struct rspamd_classifier_config *cl;
- struct rspamd_task *task;
- const gchar *classifier;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_worker_ctx *ctx;
+ struct rspamd_classifier_config *cl;
+ struct rspamd_task *task;
+ const gchar *classifier;
ctx = session->ctx;
@@ -844,11 +910,14 @@ rspamd_controller_handle_learn_common (struct rspamd_http_connection_entry *conn
if (msg->body == NULL || msg->body->len == 0) {
msg_err ("got zero length body, cannot continue");
- rspamd_controller_send_error (conn_ent, 400, "Empty body is not permitted");
+ rspamd_controller_send_error (conn_ent,
+ 400,
+ "Empty body is not permitted");
return 0;
}
- if ((classifier = rspamd_http_message_find_header (msg, "Classifier")) == NULL) {
+ if ((classifier =
+ rspamd_http_message_find_header (msg, "Classifier")) == NULL) {
classifier = "bayes";
}
@@ -865,8 +934,11 @@ rspamd_controller_handle_learn_common (struct rspamd_http_connection_entry *conn
task->ev_base = ctx->ev_base;
- task->s = new_async_session (session->pool, rspamd_controller_learn_fin_task, NULL,
- rspamd_task_free_hard, task);
+ task->s = new_async_session (session->pool,
+ rspamd_controller_learn_fin_task,
+ NULL,
+ rspamd_task_free_hard,
+ task);
task->s->wanna_die = TRUE;
task->fin_arg = conn_ent;
task->http_conn = rspamd_http_connection_ref (conn_ent->conn);;
@@ -895,8 +967,9 @@ rspamd_controller_handle_learn_common (struct rspamd_http_connection_entry *conn
* reply: json {"success":true} or {"error":"error message"}
*/
static int
-rspamd_controller_handle_learnspam (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_learnspam (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
return rspamd_controller_handle_learn_common (conn_ent, msg, TRUE);
}
@@ -908,8 +981,9 @@ rspamd_controller_handle_learnspam (struct rspamd_http_connection_entry *conn_en
* reply: json {"success":true} or {"error":"error message"}
*/
static int
-rspamd_controller_handle_learnham (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_learnham (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
return rspamd_controller_handle_learn_common (conn_ent, msg, TRUE);
}
@@ -923,11 +997,11 @@ rspamd_controller_handle_learnham (struct rspamd_http_connection_entry *conn_ent
*/
static int
rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct rspamd_controller_worker_ctx *ctx;
- struct rspamd_task *task;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_worker_ctx *ctx;
+ struct rspamd_task *task;
ctx = session->ctx;
@@ -937,7 +1011,9 @@ rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent,
if (msg->body == NULL || msg->body->len == 0) {
msg_err ("got zero length body, cannot continue");
- rspamd_controller_send_error (conn_ent, 400, "Empty body is not permitted");
+ rspamd_controller_send_error (conn_ent,
+ 400,
+ "Empty body is not permitted");
return 0;
}
@@ -948,8 +1024,11 @@ rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent,
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
- task->s = new_async_session (session->pool, rspamd_controller_check_fin_task, NULL,
- rspamd_task_free_hard, task);
+ task->s = new_async_session (session->pool,
+ rspamd_controller_check_fin_task,
+ NULL,
+ rspamd_task_free_hard,
+ task);
task->s->wanna_die = TRUE;
task->fin_arg = conn_ent;
task->http_conn = rspamd_http_connection_ref (conn_ent->conn);
@@ -975,18 +1054,19 @@ rspamd_controller_handle_scan (struct rspamd_http_connection_entry *conn_ent,
* reply: json {"success":true} or {"error":"error message"}
*/
static int
-rspamd_controller_handle_saveactions (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_saveactions (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct ucl_parser *parser;
- struct metric *metric;
- ucl_object_t *obj, *cur;
- struct rspamd_controller_worker_ctx *ctx;
- const gchar *error;
- gdouble score;
- gint i;
- enum rspamd_metric_action act;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct ucl_parser *parser;
+ struct metric *metric;
+ ucl_object_t *obj, *cur;
+ struct rspamd_controller_worker_ctx *ctx;
+ const gchar *error;
+ gdouble score;
+ gint i;
+ enum rspamd_metric_action act;
ctx = session->ctx;
@@ -996,21 +1076,26 @@ rspamd_controller_handle_saveactions (struct rspamd_http_connection_entry *conn_
if (msg->body == NULL || msg->body->len == 0) {
msg_err ("got zero length body, cannot continue");
- rspamd_controller_send_error (conn_ent, 400, "Empty body is not permitted");
+ rspamd_controller_send_error (conn_ent,
+ 400,
+ "Empty body is not permitted");
return 0;
}
metric = g_hash_table_lookup (ctx->cfg->metrics, DEFAULT_METRIC);
if (metric == NULL) {
msg_err ("cannot find default metric");
- rspamd_controller_send_error (conn_ent, 500, "Default metric is absent");
+ rspamd_controller_send_error (conn_ent, 500,
+ "Default metric is absent");
return 0;
}
/* Now check for dynamic config */
if (!ctx->cfg->dynamic_conf) {
msg_err ("dynamic conf has not been defined");
- rspamd_controller_send_error (conn_ent, 500, "No dynamic_rules setting defined");
+ rspamd_controller_send_error (conn_ent,
+ 500,
+ "No dynamic_rules setting defined");
return 0;
}
@@ -1035,8 +1120,8 @@ rspamd_controller_handle_saveactions (struct rspamd_http_connection_entry *conn_
}
cur = obj->value.av;
- for (i = 0; i < 3 && cur != NULL; i ++, cur = cur->next) {
- switch(i) {
+ for (i = 0; i < 3 && cur != NULL; i++, cur = cur->next) {
+ switch (i) {
case 0:
act = METRIC_ACTION_REJECT;
break;
@@ -1068,19 +1153,20 @@ rspamd_controller_handle_saveactions (struct rspamd_http_connection_entry *conn_
* reply: json {"success":true} or {"error":"error message"}
*/
static int
-rspamd_controller_handle_savesymbols (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_savesymbols (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct ucl_parser *parser;
- struct metric *metric;
- ucl_object_t *obj;
- const ucl_object_t *cur, *jname, *jvalue;
- ucl_object_iter_t iter = NULL;
- struct rspamd_controller_worker_ctx *ctx;
- const gchar *error;
- gdouble val;
- struct symbol *sym;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct ucl_parser *parser;
+ struct metric *metric;
+ ucl_object_t *obj;
+ const ucl_object_t *cur, *jname, *jvalue;
+ ucl_object_iter_t iter = NULL;
+ struct rspamd_controller_worker_ctx *ctx;
+ const gchar *error;
+ gdouble val;
+ struct symbol *sym;
ctx = session->ctx;
@@ -1090,21 +1176,26 @@ rspamd_controller_handle_savesymbols (struct rspamd_http_connection_entry *conn_
if (msg->body == NULL || msg->body->len == 0) {
msg_err ("got zero length body, cannot continue");
- rspamd_controller_send_error (conn_ent, 400, "Empty body is not permitted");
+ rspamd_controller_send_error (conn_ent,
+ 400,
+ "Empty body is not permitted");
return 0;
}
metric = g_hash_table_lookup (ctx->cfg->metrics, DEFAULT_METRIC);
if (metric == NULL) {
msg_err ("cannot find default metric");
- rspamd_controller_send_error (conn_ent, 500, "Default metric is absent");
+ rspamd_controller_send_error (conn_ent, 500,
+ "Default metric is absent");
return 0;
}
/* Now check for dynamic config */
if (!ctx->cfg->dynamic_conf) {
msg_err ("dynamic conf has not been defined");
- rspamd_controller_send_error (conn_ent, 500, "No dynamic_rules setting defined");
+ rspamd_controller_send_error (conn_ent,
+ 500,
+ "No dynamic_rules setting defined");
return 0;
}
@@ -1138,12 +1229,15 @@ rspamd_controller_handle_savesymbols (struct rspamd_http_connection_entry *conn_
jname = ucl_object_find_key (cur, "name");
jvalue = ucl_object_find_key (cur, "value");
val = ucl_object_todouble (jvalue);
- sym = g_hash_table_lookup (metric->symbols, ucl_object_tostring (jname));
+ sym =
+ g_hash_table_lookup (metric->symbols, ucl_object_tostring (jname));
if (sym && fabs (sym->score - val) > 0.01) {
if (!add_dynamic_symbol (ctx->cfg, DEFAULT_METRIC,
- ucl_object_tostring (jname), val)) {
- msg_err ("add symbol failed for %s", ucl_object_tostring (jname));
- rspamd_controller_send_error (conn_ent, 506, "Add symbol failed");
+ ucl_object_tostring (jname), val)) {
+ msg_err ("add symbol failed for %s",
+ ucl_object_tostring (jname));
+ rspamd_controller_send_error (conn_ent, 506,
+ "Add symbol failed");
ucl_object_unref (obj);
return 0;
}
@@ -1166,17 +1260,17 @@ rspamd_controller_handle_savesymbols (struct rspamd_http_connection_entry *conn_
*/
static int
rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- GList *cur;
- struct rspamd_map *map;
- struct rspamd_controller_worker_ctx *ctx;
- const gchar *idstr;
- gchar *errstr;
- guint32 id;
- gboolean found = FALSE;
- gint fd;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ GList *cur;
+ struct rspamd_map *map;
+ struct rspamd_controller_worker_ctx *ctx;
+ const gchar *idstr;
+ gchar *errstr;
+ guint32 id;
+ gboolean found = FALSE;
+ gint fd;
ctx = session->ctx;
@@ -1186,7 +1280,9 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
if (msg->body == NULL || msg->body->len == 0) {
msg_err ("got zero length body, cannot continue");
- rspamd_controller_send_error (conn_ent, 400, "Empty body is not permitted");
+ rspamd_controller_send_error (conn_ent,
+ 400,
+ "Empty body is not permitted");
return 0;
}
@@ -1262,8 +1358,10 @@ rspamd_controller_handle_savemap (struct rspamd_http_connection_entry *conn_ent,
* reply: json data
*/
static int
-rspamd_controller_handle_stat_common (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg, gboolean do_reset)
+rspamd_controller_handle_stat_common (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg,
+ gboolean do_reset)
{
struct rspamd_controller_session *session = conn_ent->ud;
ucl_object_t *top, *sub;
@@ -1282,13 +1380,14 @@ rspamd_controller_handle_stat_common (struct rspamd_http_connection_entry *conn_
stat = &stat_copy;
top = ucl_object_typed_new (UCL_OBJECT);
- ucl_object_insert_key (top, ucl_object_fromint (stat->messages_scanned), "scanned", 0, false);
+ ucl_object_insert_key (top, ucl_object_fromint (
+ stat->messages_scanned), "scanned", 0, false);
if (stat->messages_scanned > 0) {
sub = ucl_object_typed_new (UCL_OBJECT);
- for (i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i ++) {
+ for (i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i++) {
ucl_object_insert_key (sub,
- ucl_object_fromint (stat->actions_stat[i]),
- str_action_metric (i), 0, false);
+ ucl_object_fromint (stat->actions_stat[i]),
+ str_action_metric (i), 0, false);
if (i < METRIC_ACTION_GREYLIST) {
spam += stat->actions_stat[i];
}
@@ -1302,35 +1401,42 @@ rspamd_controller_handle_stat_common (struct rspamd_http_connection_entry *conn_
ucl_object_insert_key (top, sub, "actions", 0, false);
}
- ucl_object_insert_key (top, ucl_object_fromint (spam), "spam_count", 0, false);
- ucl_object_insert_key (top, ucl_object_fromint (ham), "ham_count", 0, false);
+ ucl_object_insert_key (top, ucl_object_fromint (
+ spam), "spam_count", 0, false);
+ ucl_object_insert_key (top, ucl_object_fromint (
+ ham), "ham_count", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (stat->messages_learned), "learned", 0, false);
+ ucl_object_fromint (stat->messages_learned), "learned", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (stat->connections_count), "connections", 0, false);
+ ucl_object_fromint (stat->connections_count), "connections", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (stat->control_connections_count),
- "control_connections", 0, false);
+ ucl_object_fromint (stat->control_connections_count),
+ "control_connections", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.pools_allocated), "pools_allocated", 0, false);
+ ucl_object_fromint (mem_st.pools_allocated), "pools_allocated", 0,
+ false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.pools_freed), "pools_freed", 0, false);
+ ucl_object_fromint (mem_st.pools_freed), "pools_freed", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.bytes_allocated), "bytes_allocated", 0, false);
+ ucl_object_fromint (mem_st.bytes_allocated), "bytes_allocated", 0,
+ false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.chunks_allocated), "chunks_allocated", 0, false);
+ ucl_object_fromint (
+ mem_st.chunks_allocated), "chunks_allocated", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.shared_chunks_allocated),
- "shared_chunks_allocated", 0, false);
+ ucl_object_fromint (mem_st.shared_chunks_allocated),
+ "shared_chunks_allocated", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.chunks_freed), "chunks_freed", 0, false);
+ ucl_object_fromint (mem_st.chunks_freed), "chunks_freed", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (mem_st.oversized_chunks), "chunks_oversized", 0, false);
+ ucl_object_fromint (
+ mem_st.oversized_chunks), "chunks_oversized", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (stat->fuzzy_hashes), "fuzzy_stored", 0, false);
+ ucl_object_fromint (stat->fuzzy_hashes), "fuzzy_stored", 0, false);
ucl_object_insert_key (top,
- ucl_object_fromint (stat->fuzzy_hashes_expired), "fuzzy_expired", 0, false);
+ ucl_object_fromint (
+ stat->fuzzy_hashes_expired), "fuzzy_expired", 0, false);
/* Now write statistics for each statfile */
cur_cl = g_list_first (session->ctx->cfg->classifiers);
@@ -1340,8 +1446,9 @@ rspamd_controller_handle_stat_common (struct rspamd_http_connection_entry *conn_
cur_st = g_list_first (ccf->statfiles);
while (cur_st) {
st = cur_st->data;
- if ((statfile = statfile_pool_is_open (session->ctx->srv->statfile_pool,
- st->path)) == NULL) {
+ if ((statfile =
+ statfile_pool_is_open (session->ctx->srv->statfile_pool,
+ st->path)) == NULL) {
statfile = statfile_pool_open (session->ctx->srv->statfile_pool,
st->path, st->size, FALSE);
}
@@ -1352,14 +1459,17 @@ rspamd_controller_handle_stat_common (struct rspamd_http_connection_entry *conn_
total = statfile_get_total_blocks (statfile);
statfile_get_revision (statfile, &rev, &ti);
ucl_object_insert_key (obj,
- ucl_object_fromstring (st->symbol), "symbol", 0, false);
+ ucl_object_fromstring (st->symbol), "symbol", 0, false);
if (st->label != NULL) {
ucl_object_insert_key (obj,
- ucl_object_fromstring (st->label), "label", 0, false);
+ ucl_object_fromstring (st->label), "label", 0, false);
}
- ucl_object_insert_key (obj, ucl_object_fromint (rev), "revision", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (used), "used", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (total), "total", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ rev), "revision", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ used), "used", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (
+ total), "total", 0, false);
ucl_array_append (sub, obj);
}
@@ -1386,9 +1496,9 @@ rspamd_controller_handle_stat_common (struct rspamd_http_connection_entry *conn_
static int
rspamd_controller_handle_stat (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_session *session = conn_ent->ud;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
return 0;
@@ -1398,10 +1508,11 @@ rspamd_controller_handle_stat (struct rspamd_http_connection_entry *conn_ent,
}
static int
-rspamd_controller_handle_statreset (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_statreset (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_session *session = conn_ent->ud;
if (!rspamd_controller_check_password (conn_ent, session, msg, TRUE)) {
return 0;
@@ -1413,17 +1524,17 @@ rspamd_controller_handle_statreset (struct rspamd_http_connection_entry *conn_en
static ucl_object_t *
rspamd_controller_cache_item_to_ucl (struct cache_item *item)
{
- ucl_object_t *obj;
+ ucl_object_t *obj;
obj = ucl_object_typed_new (UCL_OBJECT);
ucl_object_insert_key (obj, ucl_object_fromstring (item->s->symbol),
- "symbol", 0, false);
+ "symbol", 0, false);
ucl_object_insert_key (obj, ucl_object_fromdouble (item->s->weight),
- "weight", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (item->s->frequency),
- "frequency", 0, false);
+ "weight", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (item->s->frequency),
+ "frequency", 0, false);
ucl_object_insert_key (obj, ucl_object_fromdouble (item->s->avg_time),
- "time", 0, false);
+ "time", 0, false);
return obj;
}
@@ -1435,14 +1546,15 @@ rspamd_controller_cache_item_to_ucl (struct cache_item *item)
* reply: json array of all counters
*/
static int
-rspamd_controller_handle_counters (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+rspamd_controller_handle_counters (
+ struct rspamd_http_connection_entry *conn_ent,
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- ucl_object_t *top;
- GList *cur;
- struct cache_item *item;
- struct symbols_cache *cache;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ ucl_object_t *top;
+ GList *cur;
+ struct cache_item *item;
+ struct symbols_cache *cache;
if (!rspamd_controller_check_password (conn_ent, session, msg, FALSE)) {
return 0;
@@ -1455,7 +1567,8 @@ rspamd_controller_handle_counters (struct rspamd_http_connection_entry *conn_ent
while (cur) {
item = cur->data;
if (!item->is_callback) {
- ucl_array_append (top, rspamd_controller_cache_item_to_ucl (item));
+ ucl_array_append (top, rspamd_controller_cache_item_to_ucl (
+ item));
}
cur = g_list_next (cur);
}
@@ -1463,7 +1576,8 @@ rspamd_controller_handle_counters (struct rspamd_http_connection_entry *conn_ent
while (cur) {
item = cur->data;
if (!item->is_callback) {
- ucl_array_append (top, rspamd_controller_cache_item_to_ucl (item));
+ ucl_array_append (top, rspamd_controller_cache_item_to_ucl (
+ item));
}
cur = g_list_next (cur);
}
@@ -1476,10 +1590,10 @@ rspamd_controller_handle_counters (struct rspamd_http_connection_entry *conn_ent
static int
rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent,
- struct rspamd_http_message *msg)
+ struct rspamd_http_message *msg)
{
- struct rspamd_controller_session *session = conn_ent->ud;
- struct rspamd_custom_controller_command *cmd;
+ struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_custom_controller_command *cmd;
cmd = g_hash_table_lookup (session->ctx->custom_commands, msg->url->str);
if (cmd == NULL || cmd->handler == NULL) {
@@ -1488,12 +1602,15 @@ rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent,
return 0;
}
- if (!rspamd_controller_check_password (conn_ent, session, msg, cmd->privilleged)) {
+ if (!rspamd_controller_check_password (conn_ent, session, msg,
+ cmd->privilleged)) {
return 0;
}
if (cmd->require_message && (msg->body == NULL || msg->body->len == 0)) {
msg_err ("got zero length body, cannot continue");
- rspamd_controller_send_error (conn_ent, 400, "Empty body is not permitted");
+ rspamd_controller_send_error (conn_ent,
+ 400,
+ "Empty body is not permitted");
return 0;
}
@@ -1501,7 +1618,8 @@ rspamd_controller_handle_custom (struct rspamd_http_connection_entry *conn_ent,
}
static void
-rspamd_controller_error_handler (struct rspamd_http_connection_entry *conn_ent, GError *err)
+rspamd_controller_error_handler (struct rspamd_http_connection_entry *conn_ent,
+ GError *err)
{
msg_err ("http error occurred: %s", err->message);
}
@@ -1509,7 +1627,7 @@ rspamd_controller_error_handler (struct rspamd_http_connection_entry *conn_ent,
static void
rspamd_controller_finish_handler (struct rspamd_http_connection_entry *conn_ent)
{
- struct rspamd_controller_session *session = conn_ent->ud;
+ struct rspamd_controller_session *session = conn_ent->ud;
if (session->task != NULL) {
destroy_session (session->task->s);
@@ -1524,16 +1642,16 @@ rspamd_controller_finish_handler (struct rspamd_http_connection_entry *conn_ent)
static void
rspamd_controller_accept_socket (gint fd, short what, void *arg)
{
- struct rspamd_worker *worker = (struct rspamd_worker *) arg;
- struct rspamd_controller_worker_ctx *ctx;
- struct rspamd_controller_session *nsession;
- rspamd_inet_addr_t addr;
- gint nfd;
+ struct rspamd_worker *worker = (struct rspamd_worker *) arg;
+ struct rspamd_controller_worker_ctx *ctx;
+ struct rspamd_controller_session *nsession;
+ rspamd_inet_addr_t addr;
+ gint nfd;
ctx = worker->ctx;
if ((nfd =
- rspamd_accept_from_socket (fd, &addr)) == -1) {
+ rspamd_accept_from_socket (fd, &addr)) == -1) {
msg_warn ("accept failed: %s", strerror (errno));
return;
}
@@ -1543,8 +1661,8 @@ rspamd_controller_accept_socket (gint fd, short what, void *arg)
}
msg_info ("accepted connection from %s port %d",
- rspamd_inet_address_to_string (&addr),
- rspamd_inet_address_get_port (&addr));
+ rspamd_inet_address_to_string (&addr),
+ rspamd_inet_address_get_port (&addr));
nsession = g_slice_alloc0 (sizeof (struct rspamd_controller_session));
nsession->pool = rspamd_mempool_new (rspamd_mempool_suggest_size ());
@@ -1558,8 +1676,8 @@ rspamd_controller_accept_socket (gint fd, short what, void *arg)
gpointer
init_controller_worker (struct rspamd_config *cfg)
{
- struct rspamd_controller_worker_ctx *ctx;
- GQuark type;
+ struct rspamd_controller_worker_ctx *ctx;
+ GQuark type;
type = g_quark_try_string ("controller");
@@ -1568,35 +1686,37 @@ init_controller_worker (struct rspamd_config *cfg)
ctx->timeout = DEFAULT_WORKER_IO_TIMEOUT;
rspamd_rcl_register_worker_option (cfg, type, "password",
- rspamd_rcl_parse_struct_string, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, password), 0);
+ rspamd_rcl_parse_struct_string, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, password), 0);
rspamd_rcl_register_worker_option (cfg, type, "enable_password",
- rspamd_rcl_parse_struct_string, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, password), 0);
+ rspamd_rcl_parse_struct_string, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, password), 0);
rspamd_rcl_register_worker_option (cfg, type, "ssl",
- rspamd_rcl_parse_struct_boolean, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, use_ssl), 0);
+ rspamd_rcl_parse_struct_boolean, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, use_ssl), 0);
rspamd_rcl_register_worker_option (cfg, type, "ssl_cert",
- rspamd_rcl_parse_struct_string, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, ssl_cert), 0);
+ rspamd_rcl_parse_struct_string, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, ssl_cert), 0);
rspamd_rcl_register_worker_option (cfg, type, "ssl_key",
- rspamd_rcl_parse_struct_string, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, ssl_key), 0);
+ rspamd_rcl_parse_struct_string, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, ssl_key), 0);
rspamd_rcl_register_worker_option (cfg, type, "timeout",
- rspamd_rcl_parse_struct_time, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, timeout), RSPAMD_CL_FLAG_TIME_INTEGER);
+ rspamd_rcl_parse_struct_time, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx,
+ timeout), RSPAMD_CL_FLAG_TIME_INTEGER);
rspamd_rcl_register_worker_option (cfg, type, "secure_ip",
- rspamd_rcl_parse_struct_string, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, secure_ip), 0);
+ rspamd_rcl_parse_struct_string, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, secure_ip), 0);
rspamd_rcl_register_worker_option (cfg, type, "static_dir",
- rspamd_rcl_parse_struct_string, ctx,
- G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx, static_files_dir), 0);
+ rspamd_rcl_parse_struct_string, ctx,
+ G_STRUCT_OFFSET (struct rspamd_controller_worker_ctx,
+ static_files_dir), 0);
return ctx;
}
@@ -1615,7 +1735,9 @@ start_controller_worker (struct rspamd_worker *worker)
gpointer key, value;
- ctx->ev_base = rspamd_prepare_worker (worker, "controller", rspamd_controller_accept_socket);
+ ctx->ev_base = rspamd_prepare_worker (worker,
+ "controller",
+ rspamd_controller_accept_socket);
msec_to_tv (ctx->timeout, &ctx->io_tv);
ctx->start_time = time (NULL);
@@ -1625,10 +1747,13 @@ start_controller_worker (struct rspamd_worker *worker)
ctx->custom_commands = g_hash_table_new (rspamd_strcase_hash,
rspamd_strcase_equal);
if (ctx->secure_ip != NULL) {
- if (!add_map (worker->srv->cfg, ctx->secure_ip, "Allow webui access from the specified IP",
- read_radix_list, fin_radix_list, (void **)&ctx->secure_map)) {
- if (!rspamd_config_parse_ip_list (ctx->secure_ip, &ctx->secure_map)) {
- msg_warn ("cannot load or parse ip list from '%s'", ctx->secure_ip);
+ if (!add_map (worker->srv->cfg, ctx->secure_ip,
+ "Allow webui access from the specified IP",
+ read_radix_list, fin_radix_list, (void **)&ctx->secure_map)) {
+ if (!rspamd_config_parse_ip_list (ctx->secure_ip,
+ &ctx->secure_map)) {
+ msg_warn ("cannot load or parse ip list from '%s'",
+ ctx->secure_ip);
}
}
}
@@ -1638,23 +1763,57 @@ start_controller_worker (struct rspamd_worker *worker)
ctx->static_files_dir);
/* Add callbacks for different methods */
- rspamd_http_router_add_path (ctx->http, PATH_AUTH, rspamd_controller_handle_auth);
- rspamd_http_router_add_path (ctx->http, PATH_SYMBOLS, rspamd_controller_handle_symbols);
- rspamd_http_router_add_path (ctx->http, PATH_ACTIONS, rspamd_controller_handle_actions);
- rspamd_http_router_add_path (ctx->http, PATH_MAPS, rspamd_controller_handle_maps);
- rspamd_http_router_add_path (ctx->http, PATH_GET_MAP, rspamd_controller_handle_get_map);
- rspamd_http_router_add_path (ctx->http, PATH_PIE_CHART, rspamd_controller_handle_pie_chart);
- rspamd_http_router_add_path (ctx->http, PATH_HISTORY, rspamd_controller_handle_history);
- rspamd_http_router_add_path (ctx->http, PATH_LEARN_SPAM, rspamd_controller_handle_learnspam);
- rspamd_http_router_add_path (ctx->http, PATH_LEARN_HAM, rspamd_controller_handle_learnham);
- rspamd_http_router_add_path (ctx->http, PATH_SAVE_ACTIONS, rspamd_controller_handle_saveactions);
- rspamd_http_router_add_path (ctx->http, PATH_SAVE_SYMBOLS, rspamd_controller_handle_savesymbols);
- rspamd_http_router_add_path (ctx->http, PATH_SAVE_MAP, rspamd_controller_handle_savemap);
- rspamd_http_router_add_path (ctx->http, PATH_SCAN, rspamd_controller_handle_scan);
- rspamd_http_router_add_path (ctx->http, PATH_CHECK, rspamd_controller_handle_scan);
- rspamd_http_router_add_path (ctx->http, PATH_STAT, rspamd_controller_handle_stat);
- rspamd_http_router_add_path (ctx->http, PATH_STAT_RESET, rspamd_controller_handle_statreset);
- rspamd_http_router_add_path (ctx->http, PATH_COUNTERS, rspamd_controller_handle_counters);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_AUTH,
+ rspamd_controller_handle_auth);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_SYMBOLS,
+ rspamd_controller_handle_symbols);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_ACTIONS,
+ rspamd_controller_handle_actions);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_MAPS,
+ rspamd_controller_handle_maps);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_GET_MAP,
+ rspamd_controller_handle_get_map);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_PIE_CHART,
+ rspamd_controller_handle_pie_chart);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_HISTORY,
+ rspamd_controller_handle_history);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_LEARN_SPAM,
+ rspamd_controller_handle_learnspam);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_LEARN_HAM,
+ rspamd_controller_handle_learnham);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_SAVE_ACTIONS,
+ rspamd_controller_handle_saveactions);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_SAVE_SYMBOLS,
+ rspamd_controller_handle_savesymbols);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_SAVE_MAP,
+ rspamd_controller_handle_savemap);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_SCAN,
+ rspamd_controller_handle_scan);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_CHECK,
+ rspamd_controller_handle_scan);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_STAT,
+ rspamd_controller_handle_stat);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_STAT_RESET,
+ rspamd_controller_handle_statreset);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_COUNTERS,
+ rspamd_controller_handle_counters);
/* Attach plugins */
cur = g_list_first (ctx->cfg->filters);
@@ -1662,21 +1821,29 @@ start_controller_worker (struct rspamd_worker *worker)
f = cur->data;
mctx = g_hash_table_lookup (ctx->cfg->c_modules, f->module->name);
if (mctx != NULL && f->module->module_attach_controller_func != NULL) {
- f->module->module_attach_controller_func (mctx, ctx->custom_commands);
+ f->module->module_attach_controller_func (mctx,
+ ctx->custom_commands);
}
cur = g_list_next (cur);
}
g_hash_table_iter_init (&iter, ctx->custom_commands);
while (g_hash_table_iter_next (&iter, &key, &value)) {
- rspamd_http_router_add_path (ctx->http, key, rspamd_controller_handle_custom);
+ rspamd_http_router_add_path (ctx->http,
+ key,
+ rspamd_controller_handle_custom);
}
#if 0
- rspamd_http_router_add_path (ctx->http, PATH_GRAPH, rspamd_controller_handle_graph, ctx);
+ rspamd_http_router_add_path (ctx->http,
+ PATH_GRAPH,
+ rspamd_controller_handle_graph,
+ ctx);
#endif
- ctx->resolver = dns_resolver_init (worker->srv->logger, ctx->ev_base, worker->srv->cfg);
+ ctx->resolver = dns_resolver_init (worker->srv->logger,
+ ctx->ev_base,
+ worker->srv->cfg);
/* Maps events */
start_map_watch (worker->srv->cfg, ctx->ev_base);