struct expression;
struct tokenizer;
-struct classifier;
+struct rspamd_stat_classifier;
enum { VAL_UNDEF=0, VAL_TRUE, VAL_FALSE };
# Librspamdserver
-SET(LIBSTATSRC stat_config.c)
-SET(TOKENIZERSSRC tokenizers/tokenizers.c
- tokenizers/osb.c)
+SET(LIBSTATSRC stat_config.c
+ stat_process.c)
-SET(CLASSIFIERSSRC classifiers/bayes.c)
+SET(TOKENIZERSSRC tokenizers/tokenizers.c
+ tokenizers/osb.c)
+
+SET(CLASSIFIERSSRC classifiers/bayes.c)
-SET(BACKENDSSRC backends/mmaped_file.c)
+SET(BACKENDSSRC backends/mmaped_file.c)
ADD_LIBRARY(rspamd-stat ${LINK_TYPE} ${LIBSTATSRC}
${TOKENIZERSSRC}
struct rspamd_classifier_config;
struct rspamd_statfile_config;
struct rspamd_config;
+struct rspamd_stat_ctx;
struct rspamd_stat_backend {
const char *name;
- gpointer (*init)(struct rspamd_statfile_config *cfg);
+ gpointer (*init)(struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg);
gpointer ctx;
};
-gpointer rspamd_mmaped_file_init(struct rspamd_config *cfg);
+gpointer rspamd_mmaped_file_init(struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg);
#endif /* BACKENDS_H_ */
}
gpointer
-rspamd_mmaped_file_init (struct rspamd_config *cfg)
+rspamd_mmaped_file_init (struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg)
{
rspamd_mmaped_file_ctx *new;
struct rspamd_classifier_config *clf;
size = ucl_object_toint (sizeo);
rspamd_mmaped_file_open (new, filename, size);
+
+ ctx->statfiles ++;
}
curst = curst->next;
struct rspamd_classifier_config *cfg;
};
-struct classifier {
+struct rspamd_stat_classifier {
char *name;
struct classifier_ctx * (*init_func)(rspamd_mempool_t *pool,
struct rspamd_classifier_config *cf);
#include "config.h"
#include "task.h"
+#include <lua.h>
/**
* @file stat_api.h
* @param task
* @return TRUE if task has been classified
*/
-gboolean rspamd_stat_classify (struct rspamd_task *task, GError **err);
+gboolean rspamd_stat_classify (struct rspamd_task *task, lua_State *L, GError **err);
/**
* @param spam if TRUE learn spam, otherwise learn ham
* @return TRUE if task has been learned
*/
-gboolean rspamd_stat_learn (struct rspamd_task *task, gboolean spam, GError **err);
+gboolean rspamd_stat_learn (struct rspamd_task *task, gboolean spam, lua_State *L,
+ GError **err);
void rspamd_stat_unload (void);
#include "main.h"
#include "cfg_rcl.h"
#include "stat_internal.h"
-#include "backends/mmaped_file.h"
static struct rspamd_stat_ctx *stat_ctx = NULL;
-static struct classifier classifiers[] = {
+static struct rspamd_stat_classifier stat_classifiers[] = {
{
.name = "bayes",
.init_func = bayes_init,
}
};
-static struct tokenizer tokenizers[] = {
- {"osb-text", osb_tokenize_text, rspamd_tokenizer_get_word},
+static struct rspamd_stat_tokenizer stat_tokenizers[] = {
+ {"osb-text", osb_tokenize_text},
};
-struct rspamd_stat_backend statfile_backends[] = {
+struct rspamd_stat_backend stat_backends[] = {
{
.name = RSPAMD_DEFAULT_BACKEND,
.init = rspamd_mmaped_file_init,
void
rspamd_stat_init (struct rspamd_config *cfg)
{
+ guint i;
+ if (stat_ctx == NULL) {
+ stat_ctx = g_slice_alloc0 (sizeof (*stat_ctx));
+ }
+
+ stat_ctx->backends = stat_backends;
+ stat_ctx->backends_count = G_N_ELEMENTS (stat_backends);
+ stat_ctx->classifiers = stat_classifiers;
+ stat_ctx->classifiers_count = G_N_ELEMENTS (stat_classifiers);
+ stat_ctx->tokenizers = stat_tokenizers;
+ stat_ctx->tokenizers_count = G_N_ELEMENTS (stat_tokenizers);
+
+ /* Init backends */
+ for (i = 0; i < stat_ctx->backends_count; i ++) {
+ stat_ctx->backends[i].ctx = stat_ctx->backends[i].init (stat_ctx, cfg);
+ }
+}
+
+struct rspamd_stat_ctx *
+rspamd_stat_get_ctx (void)
+{
+ return stat_ctx;
+}
+
+struct rspamd_stat_classifier *
+rspamd_stat_get_classifier (const gchar *name)
+{
+ guint i;
+
+ for (i = 0; i < stat_ctx->classifiers_count; i ++) {
+ if (strcmp (name, stat_ctx->classifiers[i].name) == 0) {
+ return &stat_ctx->classifiers[i];
+ }
+ }
+
+ return NULL;
+}
+
+struct rspamd_stat_backend *
+rspamd_stat_get_backend (const gchar *name)
+{
+ guint i;
+
+ if (name == NULL || name[0] == '\0') {
+ name = RSPAMD_DEFAULT_BACKEND;
+ }
+
+ for (i = 0; i < stat_ctx->backends_count; i ++) {
+ if (strcmp (name, stat_ctx->backends[i].name) == 0) {
+ return &stat_ctx->backends[i];
+ }
+ }
+
+ return NULL;
+}
+
+struct rspamd_stat_tokenizer *
+rspamd_stat_get_tokenizer (const gchar *name)
+{
+ guint i;
+
+ if (name == NULL || name[0] == '\0') {
+ name = RSPAMD_DEFAULT_TOKENIZER;
+ }
+
+ for (i = 0; i < stat_ctx->tokenizers_count; i ++) {
+ if (strcmp (name, stat_ctx->tokenizers[i].name) == 0) {
+ return &stat_ctx->tokenizers[i];
+ }
+ }
+
+ return NULL;
}
} rspamd_token_t;
struct rspamd_stat_ctx {
- struct classifier *classifiers;
+ struct rspamd_stat_classifier *classifiers;
guint classifiers_count;
- struct tokenizer *tokenizers;
+ struct rspamd_stat_tokenizer *tokenizers;
guint tokenizers_count;
struct rspamd_stat_backend *backends;
guint backends_count;
+
+ guint statfiles;
};
+struct rspamd_stat_ctx * rspamd_stat_get_ctx (void);
+struct rspamd_stat_classifier * rspamd_stat_get_classifier (const gchar *name);
+struct rspamd_stat_backend * rspamd_stat_get_backend (const gchar *name);
+struct rspamd_stat_tokenizer * rspamd_stat_get_tokenizer (const gchar *name);
+
+static GQuark rspamd_stat_quark (void)
+{
+ return g_quark_from_static_string ("rspamd-statistics");
+}
+
#endif /* STAT_INTERNAL_H_ */
struct pidfh;
struct rspamd_config;
struct tokenizer;
-struct classifier;
+struct rspamd_stat_classifier;
struct rspamd_classifier_config;
struct mime_part;
struct rspamd_dns_resolver;