]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
ulogd: load all plugins by default
authorArturo Borrero Gonzalez <arturo@netfilter.org>
Mon, 2 Oct 2017 13:06:49 +0000 (15:06 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 8 Jan 2018 21:00:31 +0000 (22:00 +0100)
This new configuration behaviour option eases a bit the configuration of ulogd2
by allowing to load all plugins in one go, without having to know their full
path.

Choosing concrete plugins and using full path for them is great for some
environmnets, but I don't think it's a common case. The common case is to
load all plugins, even ignoring where do they live in the filesystem.

Even worse, the full path may be architecture-dependant, which makes copying
the ulogd.conf file between machines unnecesarily complex.

To experiment this new behaviour, don't put any 'plugin=' directive in the
config file. Plugins will be loaded from a default directory, choosen at
build/configure time (--with-ulogd2libdir). If no specified, this is something
like '/usr/local/lib/ulogd/'.

This new configuration option doesn't implement any special logic. We simply
open the dir and try to load all files ending with '.so'.

The log message level for plugins loading is increased so users can see by
default which plugins are loaded.

Signed-off-by: Arturo Borrero Gonzalez <arturo@netfilter.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
configure.ac
src/ulogd.c
ulogd.conf.in

index e661981e40426dd5deb9e69acf4ecc5cd5fa6b75..b3441e4ac4d6ba5af079b9ec99a92e8efaaa663b 100644 (file)
@@ -36,9 +36,6 @@ dnl Checks for library functions.
 AC_FUNC_VPRINTF
 AC_CHECK_FUNCS(socket strerror)
 
-regular_CFLAGS="-Wall -Wextra -Wno-unused-parameter"
-AC_SUBST([regular_CFLAGS])
-
 AC_SEARCH_LIBS([pthread_create], [pthread], [libpthread_LIBS="$LIBS"; LIBS=""])
 AC_SUBST([libpthread_LIBS])
 
@@ -153,6 +150,16 @@ else
        enable_jansson="no"
 fi
 
+AC_ARG_WITH([ulogd2libdir],
+       AS_HELP_STRING([--with-ulogd2libdir=PATH],
+        [Default directory to load ulogd2 plugin from [[LIBDIR/ulogd]]]),
+        [ulogd2libdir="$withval"],
+        [ulogd2libdir="${libdir}/ulogd"])
+AC_SUBST([ulogd2libdir])
+
+regular_CFLAGS="-Wall -Wextra -Wno-unused-parameter -DULOGD2_LIBDIR=\\\"\${ulogd2libdir}\\\"";
+AC_SUBST([regular_CFLAGS])
+
 dnl AC_SUBST(DATABASE_DIR)
 dnl AC_SUBST(DATABASE_LIB)
 dnl AC_SUBST(DATABASE_LIB_DIR)
@@ -176,8 +183,25 @@ AC_CONFIG_FILES(include/Makefile include/ulogd/Makefile include/libipulog/Makefi
          src/Makefile Makefile Rules.make)
 AC_OUTPUT
 
+define([EXPAND_VARIABLE],
+[$2=[$]$1
+if test $prefix = 'NONE'; then
+        prefix="/usr/local"
+fi
+while true; do
+  case "[$]$2" in
+    *\[$]* ) eval "$2=[$]$2" ;;
+    *) break ;;
+  esac
+done
+eval "$2=[$]$2"
+])dnl EXPAND_VARIABLE
+
+EXPAND_VARIABLE(ulogd2libdir, e_ulogd2libdir)
+
 echo "
 Ulogd configuration:
+  Default plugins directory:           ${e_ulogd2libdir}
   Input plugins:
     NFLOG plugin:                      ${enable_nflog}
     NFCT plugin:                       ${enable_nfct}
index 684444f239ed2218daa655eff8f97ea6a241457e..b8bc57c80793ade55929966b345daa4baf72bf1e 100644 (file)
@@ -404,7 +404,7 @@ void ulogd_register_plugin(struct ulogd_plugin *me)
                                  me->name);
                        exit(EXIT_FAILURE);
                }
-               ulogd_log(ULOGD_DEBUG, "registering plugin `%s'\n", me->name);
+               ulogd_log(ULOGD_NOTICE, "registering plugin `%s'\n", me->name);
                llist_add(&me->list, &ulogd_plugins);
        } else {
                get_plugin_infos(me);
@@ -728,6 +728,41 @@ static int load_plugin(const char *file)
        return 0;
 }
 
+static int load_all_plugins(void)
+{
+       DIR *d;
+       struct dirent *dent;
+       char path[PATH_MAX];
+
+       d = opendir(ULOGD2_LIBDIR);
+       if (d == NULL) {
+               ulogd_log(ULOGD_ERROR, "load_all_plugins: opendir(%s): %s\n",
+                         ULOGD2_LIBDIR, strerror(errno));
+               return -1;
+       }
+
+       ulogd_log(ULOGD_NOTICE, "loading all plugins at %s\n", ULOGD2_LIBDIR);
+
+       while ((dent = readdir(d)) != NULL) {
+               if (strcmp(dent->d_name, ".") == 0 ||
+                   strcmp(dent->d_name, "..") == 0)
+                       continue;
+
+               int len = strlen(dent->d_name);
+               if (len < 3)
+                       continue;
+
+               if (strcmp(&dent->d_name[len - 3], ".so") != 0)
+                       continue;
+
+               snprintf(path, sizeof(path), "%s/%s", ULOGD2_LIBDIR,
+                        dent->d_name);
+               if (load_plugin(path) != 0)
+                       return -1;
+       }
+       return 0;
+}
+
 /* find an output key in a given stack, starting at 'start' */
 static struct ulogd_key *
 find_okey_in_stack(char *name,
@@ -925,6 +960,9 @@ static int create_stack(const char *option)
        char *tok;
        int ret;
 
+       if (llist_empty(&ulogd_plugins_handle))
+               load_all_plugins();
+
        if (!buf) {
                ulogd_log(ULOGD_ERROR, "");
                ret = -ENOMEM;
index a987d642414a75d4bf591151fd4b39e97c6f0b29..62222db25c883a0097c14f6e9c89ab9778c36af3 100644 (file)
@@ -20,35 +20,36 @@ logfile="/var/log/ulogd.log"
 # We have to configure and load all the plugins we want to use
 
 # general rules:
+#
+# 0. don't specify any plugin for ulogd to load them all
 # 1. load the plugins _first_ from the global section
 # 2. options for each plugin in seperate section below
 
-
-plugin="@pkglibdir@/ulogd_inppkt_NFLOG.so"
+#plugin="@pkglibdir@/ulogd_inppkt_NFLOG.so"
 #plugin="@pkglibdir@/ulogd_inppkt_ULOG.so"
 #plugin="@pkglibdir@/ulogd_inppkt_UNIXSOCK.so"
-plugin="@pkglibdir@/ulogd_inpflow_NFCT.so"
-plugin="@pkglibdir@/ulogd_filter_IFINDEX.so"
-plugin="@pkglibdir@/ulogd_filter_IP2STR.so"
-plugin="@pkglibdir@/ulogd_filter_IP2BIN.so"
+#plugin="@pkglibdir@/ulogd_inpflow_NFCT.so"
+#plugin="@pkglibdir@/ulogd_filter_IFINDEX.so"
+#plugin="@pkglibdir@/ulogd_filter_IP2STR.so"
+#plugin="@pkglibdir@/ulogd_filter_IP2BIN.so"
 #plugin="@pkglibdir@/ulogd_filter_IP2HBIN.so"
-plugin="@pkglibdir@/ulogd_filter_PRINTPKT.so"
-plugin="@pkglibdir@/ulogd_filter_HWHDR.so"
-plugin="@pkglibdir@/ulogd_filter_PRINTFLOW.so"
+#plugin="@pkglibdir@/ulogd_filter_PRINTPKT.so"
+#plugin="@pkglibdir@/ulogd_filter_HWHDR.so"
+#plugin="@pkglibdir@/ulogd_filter_PRINTFLOW.so"
 #plugin="@pkglibdir@/ulogd_filter_MARK.so"
-plugin="@pkglibdir@/ulogd_output_LOGEMU.so"
-plugin="@pkglibdir@/ulogd_output_SYSLOG.so"
-plugin="@pkglibdir@/ulogd_output_XML.so"
+#plugin="@pkglibdir@/ulogd_output_LOGEMU.so"
+#plugin="@pkglibdir@/ulogd_output_SYSLOG.so"
+#plugin="@pkglibdir@/ulogd_output_XML.so"
 #plugin="@pkglibdir@/ulogd_output_SQLITE3.so"
-plugin="@pkglibdir@/ulogd_output_GPRINT.so"
+#plugin="@pkglibdir@/ulogd_output_GPRINT.so"
 #plugin="@pkglibdir@/ulogd_output_NACCT.so"
 #plugin="@pkglibdir@/ulogd_output_PCAP.so"
 #plugin="@pkglibdir@/ulogd_output_PGSQL.so"
 #plugin="@pkglibdir@/ulogd_output_MYSQL.so"
 #plugin="@pkglibdir@/ulogd_output_DBI.so"
-plugin="@pkglibdir@/ulogd_raw2packet_BASE.so"
-plugin="@pkglibdir@/ulogd_inpflow_NFACCT.so"
-plugin="@pkglibdir@/ulogd_output_GRAPHITE.so"
+#plugin="@pkglibdir@/ulogd_raw2packet_BASE.so"
+#plugin="@pkglibdir@/ulogd_inpflow_NFACCT.so"
+#plugin="@pkglibdir@/ulogd_output_GRAPHITE.so"
 #plugin="@pkglibdir@/ulogd_output_JSON.so"
 
 # this is a stack for logging packet send by system via LOGEMU