[syslog-ng] [PATCH (3.4)] tfuuid: New template function to generate UUIDs.

Gergely Nagy algernon at balabit.hu
Mon Jan 2 16:55:44 CET 2012


This patch adds a new template function: $(UUID) (also available as
$(uuid)), which can be used to generate Universally Unique
IDentifiers.

The use case for this is to add an UUID to each message as soon as
they're received, so that they can be identified later, accross
destinations. This allows me to pre-generate an ID for messages going
into mongodb, and send those messages to a different destination too,
with the same ID included.

Use it like this:

rewrite r_add_uuid { set("$(UUID)" value("UUID")); };
log default { source(s_network); rewrite(r_add_uuid);
              destination(d_mongo); destination(d_program); };

The module uses the widely available libuuid library to generate the
UUIDs.

Signed-off-by: Gergely Nagy <algernon at balabit.hu>
---
 configure.in               |   16 ++++++++++-
 modules/Makefile.am        |    2 +-
 modules/tfuuid/Makefile.am |   11 ++++++++
 modules/tfuuid/tfuuid.c    |   62 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 89 insertions(+), 2 deletions(-)
 create mode 100644 modules/tfuuid/Makefile.am
 create mode 100644 modules/tfuuid/tfuuid.c

diff --git a/configure.in b/configure.in
index 734d703..83b81ac 100644
--- a/configure.in
+++ b/configure.in
@@ -182,6 +182,10 @@ AC_ARG_ENABLE(systemd,
               [  --enable-systemd        Enable systemd support (default: auto)]
               ,,enable_systemd="auto")
 
+AC_ARG_ENABLE(uuid,
+              [  --enable-uuid           Enable UUID support (default: auto)]
+              ,,enable_uuid="auto")
+              
 AC_ARG_WITH(compile-date,
 	      [  --without-compile-date  Do not include the compile date in the binary]
 	      ,wcmp_date="${withval}", wcmp_date="yes")
@@ -930,6 +934,14 @@ if test "x$enable_systemd" = "xyes"; then
 	fi
 fi
 
+if test "x$enable_uuid" = "xyes" || test "x$enable_uuid" = "xauto"; then
+	PKG_CHECK_MODULES(UUID, uuid, with_uuid="yes", with_uuid="no")
+        if test "x$with_uuid" = "xno" && test "x$enable_uuid" = "xyes"; then
+        	AC_MSG_ERROR([Could not find libuuid, and uuid support was explicitly enabled.])
+        fi
+        enable_uuid="$with_uuid"
+fi
+
 dnl ***************************************************************************
 dnl default modules to be loaded
 dnl ***************************************************************************
@@ -1087,6 +1099,7 @@ AM_CONDITIONAL(ENABLE_PACCT, [test "$enable_pacct" = "yes"])
 AM_CONDITIONAL(ENABLE_MONGODB, [test "$enable_mongodb" = "yes"])
 AM_CONDITIONAL(ENABLE_JSON_FORMAT, [test "$enable_json_format" = "yes"])
 AM_CONDITIONAL(ENABLE_JSON_PARSE, [test "$enable_json_parse" = "yes"])
+AM_CONDITIONAL(ENABLE_UUID, [test "$enable_uuid" = "yes"])
 AM_CONDITIONAL(WITH_LIBSYSTEMD, [test "$with_libsystemd" = "yes"])
 
 # substitution into manual pages
@@ -1153,6 +1166,7 @@ AC_OUTPUT(dist.conf
           modules/pacctformat/Makefile
           modules/basicfuncs/Makefile
 	  modules/tfjson/Makefile
+          modules/tfuuid/Makefile
 	  modules/jsonparser/Makefile
 	  scripts/Makefile
 	  scripts/update-patterndb
@@ -1204,5 +1218,5 @@ echo "  SQL support (module)        : ${enable_sql:=no}"
 echo "  PACCT module (EXPERIMENTAL) : ${enable_pacct:=no}"
 echo "  MongoDB destination (module): ${enable_mongodb:=no}"
 echo "  JSON support (module)       : parser=${enable_json_parse:=no}, formatter=${enable_json_format:=no} (using ${with_json})"
-
+echo "  UUID support (module)       : ${enable_uuid:=no}"
 
diff --git a/modules/Makefile.am b/modules/Makefile.am
index 0d0594b..72c005f 100644
--- a/modules/Makefile.am
+++ b/modules/Makefile.am
@@ -1 +1 @@
-SUBDIRS = afsocket afsql afstreams affile afprog afuser afmongodb csvparser confgen syslogformat pacctformat basicfuncs dbparser tfjson jsonparser dummy
+SUBDIRS = afsocket afsql afstreams affile afprog afuser afmongodb csvparser confgen syslogformat pacctformat basicfuncs dbparser tfjson tfuuid jsonparser dummy
diff --git a/modules/tfuuid/Makefile.am b/modules/tfuuid/Makefile.am
new file mode 100644
index 0000000..9d96fe1
--- /dev/null
+++ b/modules/tfuuid/Makefile.am
@@ -0,0 +1,11 @@
+moduledir = @moduledir@
+export top_srcdir
+
+#if ENABLE_UUID
+AM_CPPFLAGS = -I$(top_srcdir)/lib -I../../lib $(UUID_CFLAGS)
+module_LTLIBRARIES = libtfuuid.la
+
+libtfuuid_la_SOURCES = tfuuid.c
+libtfuuid_la_LIBADD = $(MODULE_DEPS_LIBS) $(UUID_LIBS)
+libtfuuid_la_LDFLAGS = $(MODULE_LDFLAGS)
+#endif
diff --git a/modules/tfuuid/tfuuid.c b/modules/tfuuid/tfuuid.c
new file mode 100644
index 0000000..c426cb8
--- /dev/null
+++ b/modules/tfuuid/tfuuid.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2012 BalaBit IT Ltd, Budapest, Hungary
+ * Copyright (c) 2012 Gergely Nagy <algernon at balabit.hu>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "plugin.h"
+#include "templates.h"
+#include "cfg.h"
+
+#include "config.h"
+
+#include <uuid/uuid.h>
+
+static void
+tf_uuid(LogMessage *msg, gint argc, GString *argv[], GString *result)
+{
+  uuid_t uuid;
+  gint i;
+
+  uuid_generate (uuid);
+
+  for (i = 0; i < sizeof (uuid); i++)
+    g_string_append_printf (result, "%02x", uuid[i]);
+}
+
+TEMPLATE_FUNCTION_SIMPLE(tf_uuid);
+
+static Plugin tfuuid_plugins[] =
+  {
+    TEMPLATE_FUNCTION_PLUGIN(tf_uuid, "UUID"),
+    TEMPLATE_FUNCTION_PLUGIN(tf_uuid, "uuid"),
+  };
+
+gboolean
+tfuuid_module_init(GlobalConfig *cfg, CfgArgs *args)
+{
+  plugin_register(cfg, tfuuid_plugins, G_N_ELEMENTS(tfuuid_plugins));
+  return TRUE;
+}
+
+const ModuleInfo module_info =
+{
+  .canonical_name = "tfuuid",
+  .version = VERSION,
+  .description = "The tfuuid module provides a template function to generate UUIDs.",
+  .core_revision = SOURCE_REVISION,
+  .plugins = tfuuid_plugins,
+  .plugins_len = G_N_ELEMENTS(tfuuid_plugins),
+};
-- 
1.7.7.3




More information about the syslog-ng mailing list