SET(EXAMPLESDIR "${CMAKE_INSTALL_PREFIX}/share/examples/rspamd")
ENDIF(NOT EXAMPLESDIR)
+IF(NOT LUALIBDIR)
+ SET(LUALIBDIR "${SHAREDIR}/lualib")
+ENDIF(NOT LUALIBDIR)
+
IF(NOT PLUGINSDIR)
- SET(PLUGINSDIR "${SHAREDIR}/lualib/plugins")
+ SET(PLUGINSDIR "${SHAREDIR}/plugins")
ENDIF(NOT PLUGINSDIR)
IF(NOT RULESDIR)
SET(RULESDIR "${SHAREDIR}/rules")
ENDIF(NOT RULESDIR)
-IF(NOT LUALIBDIR)
- SET(LUALIBDIR "${SHAREDIR}/lualib")
-ENDIF(NOT LUALIBDIR)
-
IF(NOT WWWDIR)
SET(WWWDIR "${SHAREDIR}/www")
ENDIF(NOT WWWDIR)
"${CMAKE_CURRENT_SOURCE_DIR}/lualib/*.lua")
FOREACH(LUA_LIB ${LUA_LIBS})
GET_FILENAME_COMPONENT(_rp ${LUA_LIB} PATH)
- INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${LUALIBDIR}/rspamd/${_rp})")
- INSTALL(FILES "lualib/${LUA_LIB}" DESTINATION ${LUALIBDIR}/rspamd/${_rp})
+ INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${LUALIBDIR}/${_rp})")
+ INSTALL(FILES "lualib/${LUA_LIB}" DESTINATION ${LUALIBDIR}/${_rp})
ENDFOREACH(LUA_LIB)
# Install lua fun library
gboolean
rspamd_rcl_add_lua_plugins_path (struct rspamd_config *cfg,
const gchar *path,
+ GHashTable *modules_seen,
GError **err)
{
struct stat st;
- struct script_module *cur_mod;
+ struct script_module *cur_mod, *seen_mod;
GPtrArray *paths;
gchar *fname, *ext_pos;
guint i;
if (stat (path, &st) == -1) {
- g_set_error (err,
- CFG_RCL_ERROR,
- errno,
- "cannot stat path %s, %s",
- path,
- strerror (errno));
- return FALSE;
+
+ if (errno != ENOENT) {
+ g_set_error (err,
+ CFG_RCL_ERROR,
+ errno,
+ "cannot stat path %s, %s",
+ path,
+ strerror (errno));
+ return FALSE;
+ }
+ else {
+ msg_info_config ("plugins path %s is absent, skip it", path);
+
+ return TRUE;
+ }
}
/* Handle directory */
*ext_pos = '\0';
}
+ if (modules_seen) {
+ seen_mod = g_hash_table_lookup (modules_seen, cur_mod->name);
+
+ if (seen_mod != NULL) {
+ msg_info_config ("already seen module %s at %s, skip %s",
+ cur_mod->name, seen_mod->path, cur_mod->path);
+ continue;
+ }
+ }
+
if (cfg->script_modules == NULL) {
cfg->script_modules = g_list_append (cfg->script_modules,
cur_mod);
cfg->script_modules = g_list_append (cfg->script_modules,
cur_mod);
}
+
+ if (modules_seen) {
+ g_hash_table_insert (modules_seen, cur_mod->name, cur_mod);
+ }
}
g_ptr_array_free (paths, TRUE);
*ext_pos = '\0';
}
+ if (modules_seen) {
+ seen_mod = g_hash_table_lookup (modules_seen, cur_mod->name);
+
+ if (seen_mod != NULL) {
+ msg_info_config ("already seen module %s at %s, skip %s",
+ cur_mod->name, seen_mod->path, cur_mod->path);
+
+ return TRUE;
+ }
+ }
+
if (cfg->script_modules == NULL) {
cfg->script_modules = g_list_append (cfg->script_modules,
cur_mod);
cfg->script_modules = g_list_append (cfg->script_modules,
cur_mod);
}
+
+ if (modules_seen) {
+ g_hash_table_insert (modules_seen, cur_mod->name, cur_mod);
+ }
}
return TRUE;
const gchar *data;
if (obj->type == UCL_OBJECT) {
+ GHashTable *mods_seen = g_hash_table_new (rspamd_strcase_hash,
+ rspamd_strcase_equal);
val = ucl_object_lookup (obj, "path");
- LL_FOREACH (val, cur)
- {
- if (ucl_object_tostring_safe (cur, &data)) {
- if (!rspamd_rcl_add_lua_plugins_path (cfg,
- rspamd_mempool_strdup (cfg->cfg_pool, data), err)) {
- return FALSE;
+ if (val) {
+ LL_FOREACH (val, cur) {
+ if (ucl_object_tostring_safe (cur, &data)) {
+ if (!rspamd_rcl_add_lua_plugins_path (cfg,
+ rspamd_mempool_strdup (cfg->cfg_pool, data),
+ mods_seen,
+ err)) {
+ return FALSE;
+ }
+ }
+ }
+ }
+ else {
+ g_set_error (err,
+ CFG_RCL_ERROR,
+ EINVAL,
+ "path attribute is missing");
+ return FALSE;
+ }
+
+ val = ucl_object_lookup (obj, "fallback_path");
+
+ if (val) {
+ LL_FOREACH (val, cur) {
+ if (ucl_object_tostring_safe (cur, &data)) {
+ if (!rspamd_rcl_add_lua_plugins_path (cfg,
+ rspamd_mempool_strdup (cfg->cfg_pool, data),
+ mods_seen,
+ err)) {
+ return FALSE;
+ }
}
}
}
}
else if (ucl_object_tostring_safe (obj, &data)) {
if (!rspamd_rcl_add_lua_plugins_path (cfg,
- rspamd_mempool_strdup (cfg->cfg_pool, data), err)) {
+ rspamd_mempool_strdup (cfg->cfg_pool, data), NULL, err)) {
return FALSE;
}
}