[SSSD] [PATCH] Add journald support
Jakub Hrozek
jhrozek at redhat.com
Tue Sep 10 17:35:05 UTC 2013
Hi,
attached are two small patches I wrote when I was checking whether
Fedora's move to journald affects us or not. Patch #1 adds a new
configure option, that, if enabled, routes logging via journald's API.
No change in logging format is present in this patch. You need to have
systemd-devel installed -- if the patches are accepted I'll amend the
specfile as well, but I didn't want to waste time now.
Patch #2 adds acts as kind of a demonstration of journald's extended
capabilities. The patch adds a new field that contains SSSD domain name
and makes it easy to distinguish log messages coming from different
domains with:
# journalctl SSSD_DOMAIN=foo.example.com
-------------- next part --------------
>From f45291d437b45dac1cc1377226b65d1aa4d94ab6 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Thu, 5 Sep 2013 06:52:15 +0200
Subject: [PATCH 1/2] Add journald support
---
Makefile.am | 6 ++++++
configure.ac | 6 ++++++
src/conf_macros.m4 | 22 ++++++++++++++++++++++
src/external/systemd.m4 | 12 ++++++++++++
src/util/sss_log.c | 35 +++++++++++++++++++++++++++++++++++
5 files changed, 81 insertions(+)
diff --git a/Makefile.am b/Makefile.am
index 25a4cbf83c790b85fab9ccccd611f59704a5b301..32d6d8437e696b2c9c78ff93f8dfd6b48b0f7d2a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -279,6 +279,7 @@ AM_CPPFLAGS = \
$(LIBNL_CFLAGS) \
$(OPENLDAP_CFLAGS) \
$(GLIB2_CFLAGS) \
+ $(JOURNALD_CFLAGS) \
-DLIBDIR=\"$(libdir)\" \
-DVARDIR=\"$(localstatedir)\" \
-DSHLIBEXT=\"$(SHLIBEXT)\" \
@@ -515,6 +516,10 @@ if HAVE_PTHREAD
CLIENT_LIBS += -lpthread
endif
+if WITH_JOURNALD
+SYSLOG_LIBS = $(JOURNALD_LIBS)
+endif
+
#####################
# Utility libraries #
#####################
@@ -523,6 +528,7 @@ libsss_debug_la_SOURCES = \
src/util/debug.c \
src/util/sss_log.c
libsss_debug_la_LDFLAGS = \
+ $(SYSLOG_LIBS) \
-avoid-version
pkglib_LTLIBRARIES += libsss_child.la
diff --git a/configure.ac b/configure.ac
index ebce20254268f2428340825e989263503c7492f5..aea260202215dd5919ab876637a0f9b12f2e11b0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -125,6 +125,7 @@ WITH_SUDO_LIB_PATH
WITH_AUTOFS
WITH_SSH
WITH_CRYPTO
+WITH_SYSLOG
m4_include([src/external/pkg.m4])
m4_include([src/external/libpopt.m4])
@@ -245,6 +246,11 @@ if test x$HAVE_SYSTEMD_UNIT != x; then
AM_CHECK_SYSTEMD
fi
+dnl If journald was selected for logging, configure journald
+if test x$syslog = xjournald; then
+ AM_CHECK_JOURNALD
+fi
+
if test x$cryptolib = xnss; then
AM_CHECK_NSS
fi
diff --git a/src/conf_macros.m4 b/src/conf_macros.m4
index b4db0b4a2b34e69734402f2f4a4c2ccadbf94fb8..7f99cbb870b258ad35a51dbe0e6e044c57fcd11a 100644
--- a/src/conf_macros.m4
+++ b/src/conf_macros.m4
@@ -152,6 +152,28 @@ AC_DEFUN([WITH_INITSCRIPT],
AC_MSG_NOTICE([Will use init script type: $initscript])
])
+AC_DEFUN([WITH_SYSLOG],
+ [ AC_ARG_WITH([syslog],
+ [AC_HELP_STRING([--with-syslog=SYSLOG_TYPE],
+ [Type of your system logger (syslog|journald). [syslog]]
+ )
+ ]
+ )
+ default_syslog=syslog
+ if test x"$with_syslog" = x; then
+ with_syslog=$default_syslog
+ fi
+
+ if test x"$with_syslog" = xsyslog || \
+ test x"$with_syslog" = xjournald; then
+ syslog=$with_syslog
+ else
+ AC_MSG_ERROR([Uknown syslog type, supported types are syslog and journald])
+ fi
+
+ AM_CONDITIONAL([WITH_JOURNALD], [test x"$syslog" = xjournald])
+ ])
+
AC_DEFUN([WITH_ENVIRONMENT_FILE],
[ AC_ARG_WITH([environment_file],
[AC_HELP_STRING([--with-environment-file=PATH], [Path to environment file [/etc/sysconfig/sssd]])
diff --git a/src/external/systemd.m4 b/src/external/systemd.m4
index 2c26dc19b2c0a087cf1af58206b65473c5d250f9..574ea82636a893c916cbec71fa88ea12f32802c0 100644
--- a/src/external/systemd.m4
+++ b/src/external/systemd.m4
@@ -6,3 +6,15 @@ AC_DEFUN([AM_CHECK_SYSTEMD],
[AC_MSG_ERROR([Could not detect systemd presence])]
)
])
+
+dnl A macro to check presence of journald on the system
+AC_DEFUN([AM_CHECK_JOURNALD],
+[
+ PKG_CHECK_MODULES(JOURNALD,
+ libsystemd-journal,
+ [AC_DEFINE_UNQUOTED([WITH_JOURNALD], 1, [journald is available])])
+ dnl Some older versions of pkg-config might not set these automatically
+ dnl while setting CFLAGS and LIBS manually twice doesn't hurt.
+ AC_SUBST([JOURNALD_CFLAGS])
+ AC_SUBST([JOURNALD_LIBS])
+])
diff --git a/src/util/sss_log.c b/src/util/sss_log.c
index 45e883109a0a45a146b62dcedf43113147e78c28..6b78c9d4baa6ee9bc15d461ad8136c7bcfca579a 100644
--- a/src/util/sss_log.c
+++ b/src/util/sss_log.c
@@ -23,7 +23,12 @@
*/
#include "util/util.h"
+
+#ifdef WITH_JOURNALD
+#include <systemd/sd-journal.h>
+#else /* WITH_JOURNALD */
#include <syslog.h>
+#endif /* WITH_JOURNALD */
static int sss_to_syslog(int priority)
{
@@ -52,6 +57,34 @@ static int sss_to_syslog(int priority)
}
}
+#ifdef WITH_JOURNALD
+
+void sss_log(int priority, const char *format, ...)
+{
+ va_list ap;
+ int syslog_priority;
+ int ret;
+ char *message;
+
+ va_start(ap, format);
+ ret = vasprintf(&message, format, ap);
+ va_end(ap);
+
+ if (ret == -1) {
+ /* ENOMEM */
+ return;
+ }
+
+ syslog_priority = sss_to_syslog(priority);
+ sd_journal_send("MESSAGE=%s", message,
+ "PRIORITY=%i", syslog_priority,
+ "SYSLOG_FACILITY=%i", LOG_FAC(LOG_DAEMON),
+ "SYSLOG_IDENTIFIER=%s", debug_prg_name,
+ NULL);
+}
+
+#else /* WITH_JOURNALD */
+
void sss_log(int priority, const char *format, ...)
{
va_list ap;
@@ -67,3 +100,5 @@ void sss_log(int priority, const char *format, ...)
closelog();
}
+
+#endif /* WITH_JOURNALD */
--
1.8.3.1
-------------- next part --------------
>From 24adc1e69f539bf74fc981f17c7c3d0607e15ba6 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 10 Sep 2013 19:16:48 +0200
Subject: [PATCH 2/2] BE: Log domain name to journald if available
If the SSSD is compiled with journald support, then all sss_log()
statements will include a new field called "SSSD_DOMAIN" that includes
the domain name. Filtering only messages from the single domain is then
as easy as:
# journalctl SSSD_DOMAIN=foo.example.com
---
src/providers/data_provider_be.c | 2 ++
src/util/server.c | 2 ++
src/util/sss_log.c | 7 +++++++
src/util/util.h | 2 ++
4 files changed, 13 insertions(+)
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 912b4191c0f6984babf96bb8073db6c01b48afbf..ccd51b45fd9aee25b052f6b7bf7f869dc234c138 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -2891,6 +2891,8 @@ int main(int argc, const char *argv[])
return 2;
}
+ setenv(SSS_DOM_ENV, be_domain, 1);
+
ret = die_if_parent_died();
if (ret != EOK) {
/* This is not fatal, don't return */
diff --git a/src/util/server.c b/src/util/server.c
index 9d3c9cb04dcac2f823982c31cac832fb473b720c..d14669a4baa5948e9cfd20417f74657903abe326 100644
--- a/src/util/server.c
+++ b/src/util/server.c
@@ -423,6 +423,8 @@ int server_setup(const char *name, int flags,
setenv("_SSS_LOOPS", "NO", 0);
+ unsetenv(SSS_DOM_ENV);
+
setup_signals();
/* we want default permissions on created files to be very strict,
diff --git a/src/util/sss_log.c b/src/util/sss_log.c
index 6b78c9d4baa6ee9bc15d461ad8136c7bcfca579a..a865814f8346548af8ba0518e47065cd196dd995 100644
--- a/src/util/sss_log.c
+++ b/src/util/sss_log.c
@@ -65,6 +65,7 @@ void sss_log(int priority, const char *format, ...)
int syslog_priority;
int ret;
char *message;
+ char *domain;
va_start(ap, format);
ret = vasprintf(&message, format, ap);
@@ -75,8 +76,14 @@ void sss_log(int priority, const char *format, ...)
return;
}
+ domain = getenv(SSS_DOM_ENV);
+ if (domain == NULL) {
+ domain = "";
+ }
+
syslog_priority = sss_to_syslog(priority);
sd_journal_send("MESSAGE=%s", message,
+ "SSSD_DOMAIN=%s", domain,
"PRIORITY=%i", syslog_priority,
"SYSLOG_FACILITY=%i", LOG_FAC(LOG_DAEMON),
"SYSLOG_IDENTIFIER=%s", debug_prg_name,
diff --git a/src/util/util.h b/src/util/util.h
index c2c31f5d50e86315a3e751daf49cf594550bc7c6..46d1b7d5326e0a30de68a1f7ea81ef803a1e7312 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -65,6 +65,8 @@ int debug_get_level(int old_level);
int debug_convert_old_level(int old_level);
errno_t set_debug_file_from_fd(const int fd);
+#define SSS_DOM_ENV "_SSS_DOM"
+
#define SSSDBG_FATAL_FAILURE 0x0010 /* level 0 */
#define SSSDBG_CRIT_FAILURE 0x0020 /* level 1 */
#define SSSDBG_OP_FAILURE 0x0040 /* level 2 */
--
1.8.3.1
More information about the sssd-devel
mailing list