Skip to contentSkip to conversation

Fixes for syslog services in systemd

PATCH Superseded Chen Qi 1 participant 6 messages Sep 19, 2014 – Sep 25, 2014

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Chen Qi

author
#0 lore raw

cover Fixes for syslog services in systemd

The following changes since commit f6a39cc957bf85ff43513f0b76afc3b2c9c906b6:

sstatesig: fix overrides behaviour to remove SIGGEN_LOCKEDSIGS_i586 (2014-09-17 22:00:05 +0100)

are available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib ChenQi/systemd-syslog-service
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=ChenQi/systemd-syslog-service

Chen Qi (4):
systemd: enable syslog.socket by default
busybox: fix for syslog service in systemd
sysklogd: add systemd support
sysklog: comment out configuration regarding xconsole

 meta/recipes-core/busybox/busybox.inc              |   9 +-
 .../busybox/files/busybox-klogd.service.in         |   4 +-
 .../busybox/files/busybox-syslog.service.in        |   7 +-
 meta/recipes-core/systemd/systemd_216.bb           |   2 +
 .../files/0001-syslogd.c-add-systemd-support.patch | 207 +++++++++++++++++++++
 meta/recipes-extended/sysklogd/files/klogd.service |   9 +
 .../sysklogd/files/sysklogd.service                |  14 ++
 meta/recipes-extended/sysklogd/files/syslog.conf   |   8 +-
 meta/recipes-extended/sysklogd/sysklogd.inc        |  38 +++-
 9 files changed, 278 insertions(+), 20 deletions(-)
 create mode 100644 meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch
 create mode 100644 meta/recipes-extended/sysklogd/files/klogd.service
 create mode 100644 meta/recipes-extended/sysklogd/files/sysklogd.service
Signature · 1 line
1.9.1
author
#1 lore raw

PATCH 1/4 systemd: enable syslog.socket by default

The syslog daemon behaviour in our systemd system should be like the following
1. If ForwardToSyslog is disabled, no daemon should be started.
2. If ForwardToSyslog is enabled, daemon should be started via socket activation. This is very important for OE based system. Because unlike other distros, OE allows serveral syslog packages installed into one image, using ALTERNATIVE mechanism to manage them. If the syslog service is started regardless of socket activation, things crash. For example, if there's 'WantedBy=multi-user.target' in the '[Install]' section of busybox-syslog.service file, then this service would be started anyway, even if syslog.service doesn't point to it. In this case, /sbin/syslogd in busybox-syslog.service might be from other syslog packages like sysklogd or rsyslog.

This patch is series of patches to implement the above behaviour. The syslog.socket needs to be enabled by default so that other syslog service could correctly be activated via socket activation at runtime.

---
 meta/recipes-core/systemd/systemd_216.bb | 2 ++
 1 file changed, 2 insertions(+)
meta/recipes-core/systemd/systemd_216.bb +2 -0
index 331da99..e3a0760 100644
@@ -148,6 +148,8 @@ do_install() {
 
 	# Enable journal to forward message to syslog daemon
 	sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf
+	# Enable syslog.socket by default, this is specific to our system
+	ln -sf ../syslog.socket ${D}${systemd_unitdir}/system/sockets.target.wants/syslog.socket
 }
 
 do_install_ptest () {
Signature · 1 line
1.9.1
author
#2 lore raw

PATCH 2/4 busybox: fix for syslog service in systemd

In reply to Chen Qi

This patch includes the following changes:
1. Explicitly set StandardOutput of the log daemon to null. This would avoid creating a feedback loop of the syslog service. See link below for more information.
http://www.freedesktop.org/wiki/Software/systemd/syslog/

2. Use ALTERNATIVE machanism to manage the syslog service file. This is because that other package may also provide a syslog implementation.

3. Make the syslog daemon socket activated only. Otherwise, things would crash if we install busybox-syslog and other syslog packages together in one image.

---
 meta/recipes-core/busybox/busybox.inc                     | 9 +++++++--
 meta/recipes-core/busybox/files/busybox-klogd.service.in  | 4 +---
 meta/recipes-core/busybox/files/busybox-syslog.service.in | 7 +++----
 3 files changed, 11 insertions(+), 9 deletions(-)
meta/recipes-core/busybox/busybox.inc +7 -2
index bd66e4f..a6b205a 100644
@@ -274,13 +274,12 @@ do_install () {
     if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
         if grep -q "CONFIG_SYSLOGD=y" ${B}/.config; then
             install -d ${D}${systemd_unitdir}/system
-            sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-syslog.service.in \
+            sed -e 's,@base_sbindir@,${base_sbindir},g' -e 's,@SYSCONFDIR@,${sysconfdir},g' < ${WORKDIR}/busybox-syslog.service.in \
 		> ${D}${systemd_unitdir}/system/busybox-syslog.service
             if [ -f ${WORKDIR}/busybox-syslog.default ] ; then
 		install -d ${D}${sysconfdir}/default
 		install -m 0644 ${WORKDIR}/busybox-syslog.default ${D}${sysconfdir}/default/busybox-syslog
             fi
-            ln -sf /dev/null ${D}${systemd_unitdir}/system/syslog.service
         fi
         if grep -q "CONFIG_KLOGD=y" ${B}/.config; then
             install -d ${D}${systemd_unitdir}/system
@@ -311,6 +310,12 @@ python () {
         d.appendVar('ALTERNATIVE_%s-syslog' % (pn), ' syslog-startup-conf')
         d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-startup-conf', '%s/syslog-startup.conf' % (d.getVar('sysconfdir', True)))
         d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-startup-conf', '%s/syslog-startup.conf.%s' % (d.getVar('sysconfdir', True), d.getVar('BPN', True)))
+
+    if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d):
+        pn = d.getVar('PN', True)
+        d.appendVar('ALTERNATIVE_%s-syslog' % (pn), ' syslog-service')
+        d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-service', '%s/systemd/system/syslog.service' % (d.getVar('sysconfdir', True)))
+        d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-service', '%s/system/busybox-syslog.service' % (d.getVar('systemd_unitdir', True)))
 }
 
 python do_package_prepend () {
meta/recipes-core/busybox/files/busybox-klogd.service.in +1 -3
index d7c7755..90cfc50 100644
@@ -3,6 +3,4 @@ Description=Kernel Logging Service
 
 [Service]
 ExecStart=@base_sbindir@/klogd -n
-
-[Install]
-WantedBy=multi-user.target
+StandardOutput=null
meta/recipes-core/busybox/files/busybox-syslog.service.in +3 -4
index 2e04321..c84edaf 100644
@@ -1,13 +1,12 @@
 [Unit]
 Description=System Logging Service
 Wants=busybox-klogd.service
+Requires=syslog.socket
 
 [Service]
-EnvironmentFile=-/etc/default/busybox-syslog
+EnvironmentFile=-@SYSCONFDIR@/default/busybox-syslog
 ExecStart=@base_sbindir@/syslogd -n $OPTIONS
-Sockets=syslog.socket
+StandardOutput=null
 
 [Install]
-WantedBy=multi-user.target
 Also=busybox-klogd.service
-Alias=syslog.service
Signature · 1 line
1.9.1
author
#3 lore raw

PATCH 3/4 sysklogd: add systemd support

In reply to Chen Qi

This patch includes the following changes:
1. Add socket activation support for sysklogd.
2. Add systemd service file.
3. Use ALTERNATIVE mechanism in OE to manage the syslog service.
4. Set ALTERNATIVE_PRIORITY to "100" regardless of whether 'systemd' is in DISTRO_FEATURE or not because sysklogd now has systemd support.

---
 .../files/0001-syslogd.c-add-systemd-support.patch | 207 +++++++++++++++++++++
 meta/recipes-extended/sysklogd/files/klogd.service |   9 +
 .../sysklogd/files/sysklogd.service                |  14 ++
 meta/recipes-extended/sysklogd/sysklogd.inc        |  38 +++-
 4 files changed, 261 insertions(+), 7 deletions(-)
 create mode 100644 meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch
 create mode 100644 meta/recipes-extended/sysklogd/files/klogd.service
 create mode 100644 meta/recipes-extended/sysklogd/files/sysklogd.service
meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch new file +207 -0
new file mode 100644
index 0000000..8f08e0b
@@ -0,0 +1,207 @@
+Upstream-Status: Pending
+
+Subject: syslogd.c: add systemd support
+
+Add socket activation support for sysklogd.
+
+Signed-off-by: Chen Qi <[email protected]>
+---
+ syslogd.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 119 insertions(+), 18 deletions(-)
+
+diff --git a/syslogd.c b/syslogd.c
+index acfd8f1..d87b024 100644
+--- a/syslogd.c
++++ b/syslogd.c
+@@ -602,6 +602,9 @@ static char sccsid[] = "@(#)syslogd.c	5.27 (Berkeley) 10/10/88";
+ #define _PATH_LOG	"/dev/log"
+ #endif
+ 
++/* systemd support */
++#define SD_LISTEN_FDS_START 3
++
+ char	*ConfFile = _PATH_LOGCONF;
+ char	*PidFile = _PATH_LOGPID;
+ char	ctty[] = _PATH_CONSOLE;
+@@ -822,6 +825,8 @@ int decode(char *name, struct code *codetab);
+ static void dprintf(char *, ...);
+ static void allocate_log(void);
+ void sighup_handler();
++/* systemd support */
++int sd_listen_fds(void);
+ 
+ #ifdef SYSLOG_UNIXAF
+ static int create_unix_socket(const char *path);
+@@ -1248,28 +1253,36 @@ static int create_unix_socket(const char *path)
+ {
+ 	struct sockaddr_un sunx;
+ 	int fd;
++	int n;
+ 	char line[MAXLINE +1];
+ 
+-	if (path[0] == '\0')
++	n = sd_listen_fds();
++	if (n > 1) {
+ 		return -1;
+-
+-	(void) unlink(path);
+-
+-	memset(&sunx, 0, sizeof(sunx));
+-	sunx.sun_family = AF_UNIX;
+-	(void) strncpy(sunx.sun_path, path, sizeof(sunx.sun_path));
+-	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+-	if (fd < 0 || bind(fd, (struct sockaddr *) &sunx,
+-			   sizeof(sunx.sun_family)+strlen(sunx.sun_path)) < 0 ||
+-	    chmod(path, 0666) < 0) {
+-		(void) snprintf(line, sizeof(line), "cannot create %s", path);
+-		logerror(line);
+-		dprintf("cannot create %s (%d).\n", path, errno);
+-		close(fd);
++	} else if (n == 1) {
++		fd = SD_LISTEN_FDS_START + 0;
++	} else {
++		if (path[0] == '\0')
++			return -1;
++
++		(void) unlink(path);
++
++		memset(&sunx, 0, sizeof(sunx));
++		sunx.sun_family = AF_UNIX;
++		(void) strncpy(sunx.sun_path, path, sizeof(sunx.sun_path));
++		fd = socket(AF_UNIX, SOCK_DGRAM, 0);
++		if (fd < 0 || bind(fd, (struct sockaddr *) &sunx,
++				   sizeof(sunx.sun_family)+strlen(sunx.sun_path)) < 0 ||
++		    chmod(path, 0666) < 0) {
++			(void) snprintf(line, sizeof(line), "cannot create %s", path);
++			logerror(line);
++			dprintf("cannot create %s (%d).\n", path, errno);
++			close(fd);
+ #ifndef SYSV
+-		die(0);
++			die(0);
+ #endif
+-		return -1;
++			return -1;
++		}
+ 	}
+ 	return fd;
+ }
+@@ -1998,12 +2011,27 @@ void wallmsg(f, iov)
+ 	/* open the user login file */
+ 	setutent();
+ 
+-
+ 	/*
+ 	 * Might as well fork instead of using nonblocking I/O
+ 	 * and doing notty().
+ 	 */
+ 	if (fork() == 0) {
++		/* Trying to pass on the LISTEN_PID with appropriate value */
++		const char *e;
++		unsigned long l;
++		char buf[24] = { '\0' };
++
++		if ( (e = getenv("LISTEN_PID")) ) {
++			errno = 0;
++			l = strtoul(e, NULL, 10);
++			if (errno == 0) {
++				if (getppid() == (pid_t)l) {
++					snprintf(buf,sizeof(buf), "%d", (int)getpid());
++					setenv("LISTEN_PID", buf, 1);
++				}
++			} 
++		}
++
+ 		(void) signal(SIGTERM, SIG_DFL);
+ 		(void) alarm(0);
+ #ifndef SYSV
+@@ -2429,6 +2457,22 @@ void init()
+ 	/* close the configuration file */
+ 	(void) fclose(cf);
+ 
++	/* Trying to pass on LISTEN_PID with appropriate value */
++	const char *e;
++	unsigned long l;
++	char buf[24] = { '\0' };
++
++	if ( (e = getenv("LISTEN_PID")) ) {
++		errno = 0;
++		l = strtoul(e, NULL, 10);
++		if (errno == 0) {
++			if (getppid() == (pid_t)l) {
++				snprintf(buf,sizeof(buf), "%d", (int)getpid());
++				setenv("LISTEN_PID", buf, 1);
++			} 
++		}
++	}
++
+ #ifdef SYSLOG_UNIXAF
+ 	for (i = 0; i < nfunix; i++) {
+ 		if (funix[i] != -1)
+@@ -2896,6 +2940,63 @@ void sighup_handler()
+ 	return;
+ }
+ 
++int sd_listen_fds() {
++	int r, fd;
++	const char *e;
++	unsigned long l;
++
++	e = getenv("LISTEN_PID");
++	if (!e) {
++		return 0;
++	}
++
++	errno = 0;
++	l = strtoul(e, NULL, 10);
++
++	if (errno !=0) {
++		r = -errno;
++		return r;
++	}
++
++	if (getpid() != (pid_t)l) {
++		return 0;
++	}
++
++	e = getenv("LISTEN_FDS");
++	if (!e) {
++		return 0;
++	}
++
++	errno = 0;
++	l = strtoul(e, NULL, 10);
++
++	if (errno != 0) {
++		r = -errno;
++		return r;
++	}
++
++	for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int)l; fd++) {
++		int flags;
++
++		flags = fcntl(fd, F_GETFD);
++		if (flags < 0) {
++			r = -errno;
++			return r;
++		}
++
++		if (flags & FD_CLOEXEC)
++			continue;
++
++		if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
++			r = -errno;
++			return r;
++		}
++	}
++
++	r = (int)l;
++
++	return r;
++}
+ /*
+  * Local variables:
+  *  c-indent-level: 8
+-- 
+1.9.1
+
meta/recipes-extended/sysklogd/files/klogd.service new file +9 -0
new file mode 100644
index 0000000..cf97e9c
@@ -0,0 +1,9 @@
+[Unit]
+Description=sysklogd Kernel Logging Service
+
+[Service]
+Type=forking
+EnvironmentFile=-@SYSCONFDIR@/default/klogd
+PIDFile=/var/run/klogd.pid
+ExecStart=@BASE_SBINDIR@/klogd $KLOGD
+StandardOutput=null
meta/recipes-extended/sysklogd/files/sysklogd.service new file +14 -0
new file mode 100644
index 0000000..7806320
@@ -0,0 +1,14 @@
+[Unit]
+Description=System Logging Service
+Wants=klogd.service
+Requires=syslog.socket
+
+[Service]
+Type=forking
+EnvironmentFile=-@SYSCONFDIR@/default/sysklogd
+PIDFile=/var/run/syslogd.pid
+ExecStart=@BASE_SBINDIR@/syslogd $SYSLOGD
+StandardOutput=null
+
+[Install]
+Also=klogd.service
meta/recipes-extended/sysklogd/sysklogd.inc +31 -7
index bcf8aa7..294eb4f 100644
@@ -11,12 +11,15 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b \
                     file://klogd.c;beginline=2;endline=19;md5=7e87ed0ae6142de079bce738c10c899d \
                    "
 
-inherit update-rc.d update-alternatives
+inherit update-rc.d systemd update-alternatives
 
 SRC_URI = "http://www.infodrom.org/projects/sysklogd/download/sysklogd-${PV}.tar.gz \
            file://no-strip-install.patch \
+           file://0001-syslogd.c-add-systemd-support.patch \
            file://sysklogd \
            file://syslog.conf \
+           file://sysklogd.service \
+           file://klogd.service \
            "
 
 SRC_URI_append_e500v2 = " file://no-vectorization.patch"
@@ -24,6 +27,8 @@ SRC_URI_append_e500v2 = " file://no-vectorization.patch"
 INITSCRIPT_NAME = "syslog"
 CONFFILES_${PN} = "${sysconfdir}/syslog.conf.${BPN}"
 
+SYSTEMD_SERVICE_${PN} = "sysklogd.service"
+
 CFLAGS_append = " -DSYSV"
 
 do_install () {
@@ -35,20 +40,39 @@ do_install () {
 	install -d ${D}${sysconfdir}
 	install -m 644 ${WORKDIR}/syslog.conf ${D}${sysconfdir}/syslog.conf
 	install -d ${D}${sysconfdir}/init.d
-	install -m 755 ${WORKDIR}/sysklogd ${D}${sysconfdir}/init.d/syslog
+	install -m 755 ${WORKDIR}/sysklogd ${D}${sysconfdir}/init.d/syslog.${BPN}
+
+        install -d ${D}${systemd_unitdir}/system
+        install -m 0644 ${WORKDIR}/sysklogd.service ${D}${systemd_unitdir}/system
+        install -m 0644 ${WORKDIR}/klogd.service ${D}${systemd_unitdir}/system
+	sed -i -e 's,@BASE_SBINDIR@,${base_sbindir},g' \
+		-e 's,@SYSCONFDIR@,${sysconfdir},g' \
+		${D}${systemd_unitdir}/system/*.service
 }
 
-# sysklogd package has no internal systemd support, so we weigh busybox's
-# sysklogd utility over it in case of systemd
-ALTERNATIVE_PRIORITY = "${@bb.utils.contains('DISTRO_FEATURES','systemd','10','100',d)}"
+ALTERNATIVE_PRIORITY = '100'
 
-ALTERNATIVE_${PN} = "syslogd klogd syslog-init syslog-conf"
+ALTERNATIVE_${PN} = "syslogd klogd syslog-conf"
 
 ALTERNATIVE_LINK_NAME[syslogd] = "${base_sbindir}/syslogd"
 ALTERNATIVE_LINK_NAME[klogd] = "${base_sbindir}/klogd"
-ALTERNATIVE_LINK_NAME[syslog-init] = "${sysconfdir}/init.d/syslog"
 ALTERNATIVE_LINK_NAME[syslog-conf] = "${sysconfdir}/syslog.conf"
 
+python () {
+    if bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d):
+        pn = d.getVar('PN', True)
+        sysconfdir = d.getVar('sysconfdir', True)
+        d.appendVar('ALTERNATIVE_%s' % (pn), ' syslog-init')
+        d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-init', '%s/init.d/syslog' % (sysconfdir))
+        d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-init', '%s/init.d/syslog.%s' % (d.getVar('sysconfdir', True), d.getVar('BPN', True)))
+
+    if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d):
+        pn = d.getVar('PN', True)
+        d.appendVar('ALTERNATIVE_%s' % (pn), ' syslog-service')
+        d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-service', '%s/systemd/system/syslog.service' % (d.getVar('sysconfdir', True)))
+        d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-service', '%s/system/sysklogd.service' % (d.getVar('systemd_unitdir', True)))
+}
+
 pkg_prerm_${PN} () {
 	if test "x$D" = "x"; then
 	if test "$1" = "upgrade" -o "$1" = "remove"; then
Signature · 1 line
1.9.1
author
#4 lore raw

PATCH 4/4 sysklog: comment out configuration regarding xconsole

In reply to Chen Qi

I commented out these configurations for the following reasons:
We don't have xconsole utility in OE. These configurations are useless for us.

Besides, the /dev/xconsole device is created in the init script which means if these configuration are enabled, we need to add a script in sysklogd which creates /dev/xconsole and is invoked in ExecStartPre in the sysklogd's service file.

I think it's better that we just comment these lines out.

---
 meta/recipes-extended/sysklogd/files/syslog.conf | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
meta/recipes-extended/sysklogd/files/syslog.conf +4 -4
index 0849de1..46a734c 100644
@@ -64,8 +64,8 @@ mail,news.none		-/var/log/messages
 # NOTE: adjust the list below, or you'll go crazy if you have a reasonably
 #      busy site..
 #
-daemon.*;mail.*;\
-news.err;\
-*.=debug;*.=info;\
-*.=notice;*.=warn	|/dev/xconsole
+#daemon.*;mail.*;\
+#news.err;\
+#*.=debug;*.=info;\
+#*.=notice;*.=warn	|/dev/xconsole
 
Signature · 1 line
1.9.1
author
#5 lore raw
In reply to Chen Qi

Please drop this one.

V2 has been sent to fix a problem in the patch for sysklogd.

//Chen Qi

Quoted 29 lines · Chen Qi

The following changes since commit f6a39cc957bf85ff43513f0b76afc3b2c9c906b6:

sstatesig: fix overrides behaviour to remove SIGGEN_LOCKEDSIGS_i586 (2014-09-17 22:00:05 +0100)

are available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib ChenQi/systemd-syslog-service
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=ChenQi/systemd-syslog-service

Chen Qi (4):
systemd: enable syslog.socket by default
busybox: fix for syslog service in systemd
sysklogd: add systemd support
sysklog: comment out configuration regarding xconsole

  meta/recipes-core/busybox/busybox.inc              |   9 +-
  .../busybox/files/busybox-klogd.service.in         |   4 +-
  .../busybox/files/busybox-syslog.service.in        |   7 +-
  meta/recipes-core/systemd/systemd_216.bb           |   2 +
  .../files/0001-syslogd.c-add-systemd-support.patch | 207 +++++++++++++++++++++
  meta/recipes-extended/sysklogd/files/klogd.service |   9 +
  .../sysklogd/files/sysklogd.service                |  14 ++
  meta/recipes-extended/sysklogd/files/syslog.conf   |   8 +-
  meta/recipes-extended/sysklogd/sysklogd.inc        |  38 +++-
  9 files changed, 278 insertions(+), 20 deletions(-)

create mode 100644 meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patch create mode 100644 meta/recipes-extended/sysklogd/files/klogd.service
create mode 100644 meta/recipes-extended/sysklogd/files/sysklogd.service