add_dynamic_action (ctx->cfg, DEFAULT_METRIC, act, score);
added ++;
}
+ else {
+ if (remove_dynamic_action (ctx->cfg, DEFAULT_METRIC, act)) {
+ added ++;
+ }
+ }
}
if (dump_dynamic_config (ctx->cfg)) {
}
added ++;
}
+ else if (sym) {
+ if (remove_dynamic_symbol (ctx->cfg, DEFAULT_METRIC,
+ ucl_object_tostring (jname))) {
+ added ++;
+ }
+ }
}
if (added > 0) {
return TRUE;
}
+gboolean
+remove_dynamic_symbol (struct rspamd_config *cfg,
+ const gchar *metric_name,
+ const gchar *symbol)
+{
+ ucl_object_t *metric, *syms;
+ gboolean ret = FALSE;
+
+ if (cfg->dynamic_conf == NULL) {
+ msg_info ("dynamic conf is disabled");
+ return FALSE;
+ }
+
+ metric = dynamic_metric_find_metric (cfg->current_dynamic_conf,
+ metric_name);
+ if (metric == NULL) {
+ return FALSE;
+ }
+
+ syms = (ucl_object_t *)ucl_object_lookup (metric, "symbols");
+ if (syms != NULL) {
+ ucl_object_t *sym;
+
+ sym = dynamic_metric_find_elt (syms, symbol);
+
+ if (sym) {
+ ret = ucl_array_delete ((ucl_object_t *)syms, sym) != NULL;
+
+ if (ret) {
+ ucl_object_unref (sym);
+ }
+ }
+ }
+
+ if (ret) {
+ apply_dynamic_conf (cfg->current_dynamic_conf, cfg);
+ }
+
+ return TRUE;
+}
+
/**
* Add action for specified metric
return TRUE;
}
+
+gboolean
+remove_dynamic_action (struct rspamd_config *cfg,
+ const gchar *metric_name,
+ guint action)
+{
+ ucl_object_t *metric, *acts;
+ const gchar *action_name = rspamd_action_to_str (action);
+ gboolean ret = FALSE;
+
+ if (cfg->dynamic_conf == NULL) {
+ msg_info ("dynamic conf is disabled");
+ return FALSE;
+ }
+
+ metric = dynamic_metric_find_metric (cfg->current_dynamic_conf,
+ metric_name);
+ if (metric == NULL) {
+ return FALSE;
+ }
+
+ acts = (ucl_object_t *)ucl_object_lookup (metric, "actions");
+
+ if (acts != NULL) {
+ ucl_object_t *act;
+
+ act = dynamic_metric_find_elt (acts, action_name);
+
+ if (act) {
+ ret = ucl_array_delete (acts, act) != NULL;
+ }
+ if (ret) {
+ ucl_object_unref (act);
+ }
+ }
+
+ if (ret) {
+ apply_dynamic_conf (cfg->current_dynamic_conf, cfg);
+ }
+
+ return ret;
+}
const gchar *symbol,
gdouble value);
+gboolean remove_dynamic_symbol (struct rspamd_config *cfg,
+ const gchar *metric,
+ const gchar *symbol);
/**
* Add action for specified metric
guint action,
gdouble value);
+/**
+ * Removes dynamic action
+ */
+gboolean remove_dynamic_action (struct rspamd_config *cfg,
+ const gchar *metric,
+ guint action);
#endif /* DYNAMIC_CFG_H_ */