@@ -1520,7 +1520,7 @@ rspamd_fuzzy_storage_reload (struct rspamd_main *rspamd_main, | |||
rep.type = RSPAMD_CONTROL_RELOAD; | |||
if ((ctx->backend = rspamd_fuzzy_backend_create (ctx->ev_base, | |||
worker->cf->options, | |||
worker->cf->options, rspamd_main->cfg, | |||
&err)) == NULL) { | |||
msg_err ("cannot open backend after reload: %e", err); | |||
g_error_free (err); | |||
@@ -2258,7 +2258,7 @@ start_fuzzy (struct rspamd_worker *worker) | |||
* Open DB and perform VACUUM | |||
*/ | |||
if ((ctx->backend = rspamd_fuzzy_backend_create (ctx->ev_base, | |||
worker->cf->options, &err)) == NULL) { | |||
worker->cf->options, cfg, &err)) == NULL) { | |||
msg_err ("cannot open backend: %e", err); | |||
g_error_free (err); | |||
exit (EXIT_SUCCESS); |
@@ -9,6 +9,7 @@ SET(LIBRSPAMDSERVERSRC | |||
${CMAKE_CURRENT_SOURCE_DIR}/dynamic_cfg.c | |||
${CMAKE_CURRENT_SOURCE_DIR}/events.c | |||
${CMAKE_CURRENT_SOURCE_DIR}/fuzzy_backend.c | |||
${CMAKE_CURRENT_SOURCE_DIR}/fuzzy_backend_redis.c | |||
${CMAKE_CURRENT_SOURCE_DIR}/fuzzy_backend_sqlite.c | |||
${CMAKE_CURRENT_SOURCE_DIR}/html.c | |||
${CMAKE_CURRENT_SOURCE_DIR}/monitored.c |
@@ -17,16 +17,18 @@ | |||
#include "config.h" | |||
#include "fuzzy_backend.h" | |||
#include "fuzzy_backend_sqlite.h" | |||
#include "fuzzy_backend_redis.h" | |||
#include "cfg_file.h" | |||
#define DEFAULT_EXPIRE 172800L | |||
enum rspamd_fuzzy_backend_type { | |||
RSPAMD_FUZZY_BACKEND_SQLITE = 0, | |||
// RSPAMD_FUZZY_BACKEND_REDIS | |||
RSPAMD_FUZZY_BACKEND_REDIS = 1, | |||
}; | |||
static void* rspamd_fuzzy_backend_init_sqlite (struct rspamd_fuzzy_backend *bk, | |||
const ucl_object_t *obj, GError **err); | |||
const ucl_object_t *obj, struct rspamd_config *cfg, GError **err); | |||
static void rspamd_fuzzy_backend_check_sqlite (struct rspamd_fuzzy_backend *bk, | |||
const struct rspamd_fuzzy_cmd *cmd, | |||
rspamd_fuzzy_check_cb cb, void *ud, | |||
@@ -51,6 +53,7 @@ static void rspamd_fuzzy_backend_close_sqlite (struct rspamd_fuzzy_backend *bk, | |||
struct rspamd_fuzzy_backend_subr { | |||
void* (*init) (struct rspamd_fuzzy_backend *bk, const ucl_object_t *obj, | |||
struct rspamd_config *cfg, | |||
GError **err); | |||
void (*check) (struct rspamd_fuzzy_backend *bk, | |||
const struct rspamd_fuzzy_cmd *cmd, | |||
@@ -105,7 +108,7 @@ rspamd_fuzzy_backend_quark (void) | |||
static void* | |||
rspamd_fuzzy_backend_init_sqlite (struct rspamd_fuzzy_backend *bk, | |||
const ucl_object_t *obj, GError **err) | |||
const ucl_object_t *obj, struct rspamd_config *cfg, GError **err) | |||
{ | |||
const ucl_object_t *elt; | |||
@@ -249,7 +252,9 @@ rspamd_fuzzy_backend_close_sqlite (struct rspamd_fuzzy_backend *bk, | |||
struct rspamd_fuzzy_backend * | |||
rspamd_fuzzy_backend_create (struct event_base *ev_base, | |||
const ucl_object_t *config, GError **err) | |||
const ucl_object_t *config, | |||
struct rspamd_config *cfg, | |||
GError **err) | |||
{ | |||
struct rspamd_fuzzy_backend *bk; | |||
enum rspamd_fuzzy_backend_type type = RSPAMD_FUZZY_BACKEND_SQLITE; | |||
@@ -263,6 +268,9 @@ rspamd_fuzzy_backend_create (struct event_base *ev_base, | |||
if (strcmp (ucl_object_tostring (elt), "sqlite") == 0) { | |||
type = RSPAMD_FUZZY_BACKEND_SQLITE; | |||
} | |||
else if (strcmp (ucl_object_tostring (elt), "redis") == 0) { | |||
type = RSPAMD_FUZZY_BACKEND_REDIS; | |||
} | |||
else { | |||
g_set_error (err, rspamd_fuzzy_backend_quark (), | |||
EINVAL, "invalid backend type: %s", | |||
@@ -284,7 +292,7 @@ rspamd_fuzzy_backend_create (struct event_base *ev_base, | |||
bk->type = type; | |||
bk->subr = &fuzzy_subrs[type]; | |||
if ((bk->subr_ud = bk->subr->init (bk, config, err)) == NULL) { | |||
if ((bk->subr_ud = bk->subr->init (bk, config, cfg, err)) == NULL) { | |||
g_slice_free1 (sizeof (*bk), bk); | |||
} | |||
@@ -21,6 +21,7 @@ | |||
#include "fuzzy_wire.h" | |||
struct rspamd_fuzzy_backend; | |||
struct rspamd_config; | |||
/* | |||
* Callbacks for fuzzy methods | |||
@@ -39,7 +40,9 @@ typedef gboolean (*rspamd_fuzzy_periodic_cb) (void *ud); | |||
* @return | |||
*/ | |||
struct rspamd_fuzzy_backend * rspamd_fuzzy_backend_create (struct event_base *ev_base, | |||
const ucl_object_t *config, GError **err); | |||
const ucl_object_t *config, | |||
struct rspamd_config *cfg, | |||
GError **err); | |||
/** |
@@ -0,0 +1,175 @@ | |||
/*- | |||
* Copyright 2016 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
#include "config.h" | |||
#include "fuzzy_backend.h" | |||
#include "fuzzy_backend_redis.h" | |||
#include "redis_pool.h" | |||
#include "contrib/hiredis/hiredis.h" | |||
#include "contrib/hiredis/async.h" | |||
#define REDIS_DEFAULT_PORT 6379 | |||
#define REDIS_DEFAULT_OBJECT "fuzzy" | |||
#define REDIS_DEFAULT_TIMEOUT 2.0 | |||
struct rspamd_fuzzy_backend_redis { | |||
struct upstream_list *read_servers; | |||
struct upstream_list *write_servers; | |||
const gchar *redis_object; | |||
const gchar *password; | |||
const gchar *dbname; | |||
gdouble timeout; | |||
}; | |||
static gboolean | |||
rspamd_redis_try_ucl (struct rspamd_fuzzy_backend_redis *backend, | |||
const ucl_object_t *obj, | |||
struct rspamd_config *cfg) | |||
{ | |||
const ucl_object_t *elt, *relt; | |||
elt = ucl_object_lookup_any (obj, "read_servers", "servers", NULL); | |||
if (elt == NULL) { | |||
return FALSE; | |||
} | |||
backend->read_servers = rspamd_upstreams_create (cfg->ups_ctx); | |||
if (!rspamd_upstreams_from_ucl (backend->read_servers, elt, | |||
REDIS_DEFAULT_PORT, NULL)) { | |||
msg_err_config ("cannot get read servers configuration"); | |||
return FALSE; | |||
} | |||
relt = elt; | |||
elt = ucl_object_lookup (obj, "write_servers"); | |||
if (elt == NULL) { | |||
/* Use read servers as write ones */ | |||
g_assert (relt != NULL); | |||
backend->write_servers = rspamd_upstreams_create (cfg->ups_ctx); | |||
if (!rspamd_upstreams_from_ucl (backend->write_servers, relt, | |||
REDIS_DEFAULT_PORT, NULL)) { | |||
msg_err_config ("cannot get write servers configuration"); | |||
return FALSE; | |||
} | |||
} | |||
else { | |||
backend->write_servers = rspamd_upstreams_create (cfg->ups_ctx); | |||
if (!rspamd_upstreams_from_ucl (backend->write_servers, elt, | |||
REDIS_DEFAULT_PORT, NULL)) { | |||
msg_err_config ("cannot get write servers configuration"); | |||
rspamd_upstreams_destroy (backend->write_servers); | |||
backend->write_servers = NULL; | |||
} | |||
} | |||
elt = ucl_object_lookup (obj, "prefix"); | |||
if (elt == NULL || ucl_object_type (elt) != UCL_STRING) { | |||
backend->redis_object = REDIS_DEFAULT_OBJECT; | |||
} | |||
else { | |||
backend->redis_object = ucl_object_tostring (elt); | |||
} | |||
elt = ucl_object_lookup (obj, "timeout"); | |||
if (elt) { | |||
backend->timeout = ucl_object_todouble (elt); | |||
} | |||
else { | |||
backend->timeout = REDIS_DEFAULT_TIMEOUT; | |||
} | |||
elt = ucl_object_lookup (obj, "password"); | |||
if (elt) { | |||
backend->password = ucl_object_tostring (elt); | |||
} | |||
else { | |||
backend->password = NULL; | |||
} | |||
elt = ucl_object_lookup_any (obj, "db", "database", "dbname", NULL); | |||
if (elt) { | |||
backend->dbname = ucl_object_tostring (elt); | |||
} | |||
else { | |||
backend->dbname = NULL; | |||
} | |||
return TRUE; | |||
} | |||
void* | |||
rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk, | |||
const ucl_object_t *obj, struct rspamd_config *cfg, GError **err) | |||
{ | |||
} | |||
void | |||
rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk, | |||
const struct rspamd_fuzzy_cmd *cmd, | |||
rspamd_fuzzy_check_cb cb, void *ud, | |||
void *subr_ud) | |||
{ | |||
} | |||
void | |||
rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk, | |||
GQueue *updates, const gchar *src, | |||
rspamd_fuzzy_update_cb cb, void *ud, | |||
void *subr_ud) | |||
{ | |||
} | |||
void | |||
rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk, | |||
rspamd_fuzzy_count_cb cb, void *ud, | |||
void *subr_ud) | |||
{ | |||
} | |||
void | |||
rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk, | |||
const gchar *src, | |||
rspamd_fuzzy_version_cb cb, void *ud, | |||
void *subr_ud) | |||
{ | |||
} | |||
const gchar* | |||
rspamd_fuzzy_backend_id_redis (struct rspamd_fuzzy_backend *bk, | |||
void *subr_ud) | |||
{ | |||
} | |||
void | |||
rspamd_fuzzy_backend_expire_redis (struct rspamd_fuzzy_backend *bk, | |||
void *subr_ud) | |||
{ | |||
} | |||
void | |||
rspamd_fuzzy_backend_close_redis (struct rspamd_fuzzy_backend *bk, | |||
void *subr_ud) | |||
{ | |||
} |
@@ -0,0 +1,49 @@ | |||
/*- | |||
* Copyright 2016 Vsevolod Stakhov | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
#ifndef SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ | |||
#define SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ | |||
#include "config.h" | |||
#include "fuzzy_backend.h" | |||
/* | |||
* Subroutines for fuzzy_backend | |||
*/ | |||
void* rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk, | |||
const ucl_object_t *obj, struct rspamd_config *cfg, GError **err); | |||
void rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk, | |||
const struct rspamd_fuzzy_cmd *cmd, | |||
rspamd_fuzzy_check_cb cb, void *ud, | |||
void *subr_ud); | |||
void rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk, | |||
GQueue *updates, const gchar *src, | |||
rspamd_fuzzy_update_cb cb, void *ud, | |||
void *subr_ud); | |||
void rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk, | |||
rspamd_fuzzy_count_cb cb, void *ud, | |||
void *subr_ud); | |||
void rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk, | |||
const gchar *src, | |||
rspamd_fuzzy_version_cb cb, void *ud, | |||
void *subr_ud); | |||
const gchar* rspamd_fuzzy_backend_id_redis (struct rspamd_fuzzy_backend *bk, | |||
void *subr_ud); | |||
void rspamd_fuzzy_backend_expire_redis (struct rspamd_fuzzy_backend *bk, | |||
void *subr_ud); | |||
void rspamd_fuzzy_backend_close_redis (struct rspamd_fuzzy_backend *bk, | |||
void *subr_ud); | |||
#endif /* SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ */ |