]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Skeleton for redis fuzzy backend
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 2 Sep 2016 15:01:55 +0000 (16:01 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 2 Sep 2016 15:01:55 +0000 (16:01 +0100)
src/fuzzy_storage.c
src/libserver/CMakeLists.txt
src/libserver/fuzzy_backend.c
src/libserver/fuzzy_backend.h
src/libserver/fuzzy_backend_redis.c [new file with mode: 0644]
src/libserver/fuzzy_backend_redis.h [new file with mode: 0644]

index 56f62ba543e4cd959d6f0655944b512d267a6f89..c49a9f277f871b1733771a34d95a1ace605e633a 100644 (file)
@@ -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);
index 4f3b9a260f405055839e376c06258f07dace90e9..53e59be8a0c87c8c2c1c9102b035b63394b2a156 100644 (file)
@@ -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
index 36f448989d59e1dc3fb1e1bf967351baa1abf20a..12c506eb5e4007d19f63b5cf8521663b8f4adcd1 100644 (file)
 #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);
        }
 
index a9385c2f6fcc6ad6586de87adba2cb0f6f7c737a..21b8735810dbb09572e8671260f59dd5dc1d723b 100644 (file)
@@ -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);
 
 
 /**
diff --git a/src/libserver/fuzzy_backend_redis.c b/src/libserver/fuzzy_backend_redis.c
new file mode 100644 (file)
index 0000000..a5e9ea8
--- /dev/null
@@ -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)
+{
+
+}
diff --git a/src/libserver/fuzzy_backend_redis.h b/src/libserver/fuzzy_backend_redis.h
new file mode 100644 (file)
index 0000000..083bcca
--- /dev/null
@@ -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_ */