On Tue, Sep 17, 2013 at 04:12:25PM +0200, Lukas Slebodnik wrote:
On (16/09/13 17:24), Jakub Hrozek wrote:
>On Tue, Sep 10, 2013 at 07:35:05PM +0200, Jakub Hrozek wrote:
>> 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
The patches work fine from functional point of view.
Function sss_log is used very rarely, therefore the patches do not have big
effect. But on the other hand, it is nice as a proof of concept.
>
>Rebased on current master.
Hi,
thank you for the review.
>+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
You can use 4th optional argument of AC_ARG_WITH instead of these 4 lines
AC_ARG_WITH (package, help-string, [action-if-given], [action-if-not-given])
Somethink like:
AC_ARG_WITH([syslog],
[AC_HELP_STRING( <snip /> )],
[], dnl default action-if-given
[with_syslog="syslog"]
)
Done. I think I copied the block from other configure snippets that
don't use this option either.
>+
>+ 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])
I think this line fits better to macro AM_CHECK_JOURNALD
Yes, but AM_CONDITIONAL documentation says that:
Note that you must arrange for every AM_CONDITIONAL to be invoked every
time configure is run. If AM_CONDITIONAL is run conditionally (e.g., in
a shell if statement), then the result will confuse automake
And AM_CHECK_JOURNALD is called in an if condition, so we would confuse
automake :-)
I can move it to configure.ac after the call to AM_CHECK_JOURNALD if you
prefer.
>+ ])
>+
> 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
202915a560e54ba92912ad8f289ae33e1d1a001f..8e0a5b6a79a97f5e77a2b5fb0204dcc815dbe85e 100644
>--- a/src/external/systemd.m4
>+++ b/src/external/systemd.m4
>@@ -6,7 +6,20 @@ AC_DEFUN([AM_CHECK_SYSTEMD],
> [AC_MSG_ERROR([Could not detect systemd presence])]
> )
> ])
>+
> AM_COND_IF([HAVE_SYSTEMD],
> [PKG_CHECK_MODULES([SYSTEMD_LOGIN], [libsystemd-login],
> [AC_DEFINE_UNQUOTED(HAVE_SYSTEMD_LOGIN, 1, [Build with libsystemdlogin
support])],
> [AC_DEFINE_UNQUOTED(HAVE_SYSTEMD_LOGIN, 0, [Build without
libsystemd-login support])])])
Here is a conflict with Sumit's patch
"Do not set HAVE_SYSTEMD_LOGIN if libsystemd-login is not available"
The fix is simple.
Done.
>+
>+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])
>+])
[snip]
>From 32d4415a36da7eaa165dce5073bad4d252814b6c Mon Sep 17 00:00:00
2001
>From: Jakub Hrozek <jhrozek(a)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
a33207b3da8a713d90dbd840475ecdb75f1fff0c..7a05e1b1f19e9f6129277c23dec71b97cfd1b142 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);
Could you write comment why function unsetenv is called.
Added.
Would it be better to have unsetenv and setenv in the one place?
I am not sure about this.
I would prefer it for readability, too, but server_setup() is called for
any SSSD subprocess, not just backends. So I wanted to make sure that
when the subprocess starts, the variable is not set and the backend
would override it itself.
>+
> 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 = "";
New warning is introduced by this line.
src/util/sss_log.c:81:16: error: assigning to 'char *' from 'const char
[1]' discards qualifiers
[-Werror,-Wincompatible-pointer-types-discards-qualifiers]
domain = "";
^ ~~
Grrr, my CFLAGS didn't tell me anything..
I converted the "domain" variable to "const char *".
Thank you for the review. New patches are attached.