Fixes for systemd services in systemd
v3 cover Fixes for systemd services in systemd
Changes since V2:
sysklogd: Unlink /dev/log only if it's not from 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 | 246 +++++++++++++++++++++ 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, 317 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
PATCH v3 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
@@ -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
PATCH v3 2/4 busybox: fix for syslog service in systemd
In reply to Chen QiThis 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
@@ -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
@@ -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
@@ -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
PATCH v3 3/4 sysklogd: add systemd support
In reply to Chen QiThis 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_FEATURES or not because sysklogd now has systemd support.
--- .../files/0001-syslogd.c-add-systemd-support.patch | 246 +++++++++++++++++++++ meta/recipes-extended/sysklogd/files/klogd.service | 9 + .../sysklogd/files/sysklogd.service | 14 ++ meta/recipes-extended/sysklogd/sysklogd.inc | 38 +++- 4 files changed, 300 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 +246 -0
@@ -0,0 +1,246 @@ +Upstream-Status: Pending + +Subject: syslogd.c: add systemd support + +1. add socket activation support +2. unlink /dev/log if it's not provided by systemd + +Signed-off-by: Chen Qi <[email protected]> +--- + syslogd.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 137 insertions(+), 20 deletions(-) + +diff --git a/syslogd.c b/syslogd.c +index acfd8f1..81e45e6 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; +@@ -612,6 +615,7 @@ int inetm = 0; + static int debugging_on = 0; + static int nlogs = -1; + static int restart = 0; ++static int socket_from_systemd = 0; + + #define MAXFUNIX 20 + +@@ -822,6 +826,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); +@@ -963,9 +969,37 @@ int main(argc, argv) + */ + exit(1); + } ++ ++ /* We keep stdout and stderr open in case we have to emit something */ ++ close(0); ++ i = 3; ++ ++ /* Trying to pass on LISTEN_PID with appropriate value */ ++ const char *e; ++ unsigned long l; ++ char buf[24] = { '\0' }; ++ int sd_fds; ++ ++ 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); ++ } ++ } ++ } ++ + signal (SIGTERM, SIG_DFL); + num_fds = getdtablesize(); +- for (i= 0; i < num_fds; i++) ++ ++ /* close all further fds except of the fds provided by systemd */ ++ sd_fds = sd_listen_fds(); ++ if (sd_fds > 0) { ++ i = SD_LISTEN_FDS_START + sd_fds; ++ } ++ for ( ; i < num_fds; i++) + (void) close(i); + untty(); + } +@@ -1248,28 +1282,37 @@ 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) { ++ socket_from_systemd = 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 +2041,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 +@@ -2254,9 +2312,15 @@ void die(sig) + if (InetInuse) close(inetm); + + /* Clean-up files. */ +- for (i = 0; i < nfunix; i++) ++ if (socket_from_systemd) { ++ i = 1; ++ } else { ++ i = 0; ++ } ++ for (; i < nfunix; i++) + if (funixn[i] && funix[i] != -1) + (void)unlink(funixn[i]); ++ + #ifndef TESTING + (void) remove_pid(PidFile); + #endif +@@ -2896,6 +2960,59 @@ 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) { ++ return -errno; ++ } ++ ++ 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) { ++ return -errno; ++ } ++ ++ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int)l; fd++) { ++ int flags; ++ ++ flags = fcntl(fd, F_GETFD); ++ if (flags < 0) { ++ return -errno; ++ } ++ ++ if (flags & FD_CLOEXEC) ++ continue; ++ ++ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { ++ return -errno; ++ } ++ } ++ ++ 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
@@ -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
@@ -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
@@ -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
Re: [PATCH V3 3/4] sysklogd: add systemd support
Hello Chen,
May I know why your patch series is still pending merge?
Noor
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Chen Qi
Sent: Sunday, September 28, 2014 8:00 AM
To: [email protected]
Subject: [OE-core] [PATCH V3 3/4] sysklogd: add systemd support
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_FEATURES or not because sysklogd now has systemd support.
--- .../files/0001-syslogd.c-add-systemd-support.patch | 246 +++++++++++++++++++++ meta/recipes-extended/sysklogd/files/klogd.service | 9 + .../sysklogd/files/sysklogd.service | 14 ++ meta/recipes-extended/sysklogd/sysklogd.inc | 38 +++- 4 files changed, 300 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-su new file +0 -0
+++ pport.patch
@@ -0,0 +1,246 @@
+Upstream-Status: Pending
+
+Subject: syslogd.c: add systemd support
+
+1. add socket activation support
+2. unlink /dev/log if it's not provided by systemd +
+Signed-off-by: Chen Qi <[email protected]>
+--- + syslogd.c | 157
+++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
+ 1 file changed, 137 insertions(+), 20 deletions(-)
+
+diff --git a/syslogd.c b/syslogd.c
+index acfd8f1..81e45e6 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;
+@@ -612,6 +615,7 @@ int inetm = 0;
+ static int debugging_on = 0;
+ static int nlogs = -1;
+ static int restart = 0;
++static int socket_from_systemd = 0;
+
+ #define MAXFUNIX 20
+
+@@ -822,6 +826,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); @@ -963,9 +969,37 @@ +int main(argc, argv)
+ */
+ exit(1);
+ }
++
++ /* We keep stdout and stderr open in case we have to emit something */
++ close(0);
++ i = 3;
++
++ /* Trying to pass on LISTEN_PID with appropriate value */
++ const char *e;
++ unsigned long l;
++ char buf[24] = { '\0' };
++ int sd_fds;
++
++ 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);
++ }
++ }
++ }
++
+ signal (SIGTERM, SIG_DFL);
+ num_fds = getdtablesize();
+- for (i= 0; i < num_fds; i++)
++
++ /* close all further fds except of the fds provided by systemd */
++ sd_fds = sd_listen_fds();
++ if (sd_fds > 0) {
++ i = SD_LISTEN_FDS_START + sd_fds;
++ }
++ for ( ; i < num_fds; i++)
+ (void) close(i);
+ untty();
+ }
+@@ -1248,28 +1282,37 @@ 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) {
++ socket_from_systemd = 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 +2041,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
+@@ -2254,9 +2312,15 @@ void die(sig)
+ if (InetInuse) close(inetm);
+
+ /* Clean-up files. */
+- for (i = 0; i < nfunix; i++)
++ if (socket_from_systemd) {
++ i = 1;
++ } else {
++ i = 0;
++ }
++ for (; i < nfunix; i++)
+ if (funixn[i] && funix[i] != -1)
+ (void)unlink(funixn[i]);
++
+ #ifndef TESTING
+ (void) remove_pid(PidFile);
+ #endif
+@@ -2896,6 +2960,59 @@ 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) {
++ return -errno;
++ }
++
++ 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) {
++ return -errno;
++ }
++
++ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int)l; fd++) {
++ int flags;
++
++ flags = fcntl(fd, F_GETFD);
++ if (flags < 0) {
++ return -errno;
++ }
++
++ if (flags & FD_CLOEXEC)
++ continue;
++
++ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
++ return -errno;
++ }
++ }
++
++ 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
@@ -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 +13 -0
@@ -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 +34 -5
@@ -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
--
1.9.1
--
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core
PATCH v3 4/4 sysklog: comment out configuration regarding xconsole
In reply to Chen QiI 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
@@ -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
ping
Any comment is welcome.
If these patches look OK, I'll rebase them and send out a new version.
Best Regards,
Chen Qi
Quoted 32 lines · Chen Qi
Changes since V2:
sysklogd: Unlink/dev/logonly if it's not from systemdThe 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-contribChenQi/systemd-syslog-service
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=ChenQi/systemd-syslog-serviceChen Qi (4):
systemd: enable syslog.socket by default
busybox: fix for syslog service in systemd
sysklogd: add systemd support
sysklog: comment out configuration regarding xconsolemeta/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 | 246 +++++++++++++++++++++ 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, 317 insertions(+), 20 deletions(-)create mode 100644
meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patchcreate mode 100644 meta/recipes-extended/sysklogd/files/klogd.service
create mode 100644 meta/recipes-extended/sysklogd/files/sysklogd.service
Hello Chen,
We are holding our patch for the warning message
sysklogd-1.5.1: sysklogd rdepends on initscripts-functions, but it isn't a build dependency? [build-deps]
see attached email. Either we need your fix to be merged or allow us to send the patch again.
Thanks.
Noor
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of ChenQi
Sent: Tuesday, July 28, 2015 6:34 AM
To: [email protected]
Subject: Re: [OE-core] [PATCH V3 0/4] Fixes for systemd services in systemd
ping
Any comment is welcome.
If these patches look OK, I'll rebase them and send out a new version.
Best Regards,
Chen Qi
Quoted 32 lines · Chen Qi
Changes since V2:
sysklogd: Unlink/dev/logonly if it's not from systemdThe 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-contribChenQi/systemd-syslog-service
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=ChenQi/systemd-syslog-serviceChen Qi (4):
systemd: enable syslog.socket by default
busybox: fix for syslog service in systemd
sysklogd: add systemd support
sysklog: comment out configuration regarding xconsolemeta/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 | 246 +++++++++++++++++++++ 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, 317 insertions(+), 20 deletions(-)create mode 100644
meta/recipes-extended/sysklogd/files/0001-syslogd.c-add-systemd-support.patchcreate mode 100644 meta/recipes-extended/sysklogd/files/klogd.service
create mode 100644 meta/recipes-extended/sysklogd/files/sysklogd.service
Signature · 4 lines
_______________________________________________ Openembedded-core mailing list [email protected] http://lists.openembedded.org/mailman/listinfo/openembedded-core
Quoted 14 lines · Fahad Usman
We need to set
INHIBIT_UPDATERCD_BBCLASSto "1" if 'sysvinit' is not present inDISTRO_FEATURESso that any un-necessary package dependencies are not added by update-rc.d.bbclassSigned-off-by Fahad Usman <[email protected]>--- meta/recipes-extended/sysklogd/sysklogd.inc | 5 +++++ 1 file changed, 5 insertions(+)meta/recipes-extended/sysklogd/sysklogd.inc +0
-0
meta/recipes-extended/sysklogd/sysklogd.inc pkg_prerm_${PN} () { · line 63
Quoted 8 lines
meta/recipes-extended/sysklogd/sysklogd.inc +5
-0@@ -56,3 +56,8 @@ pkg_prerm_${PN} () { fi fi } + +python __anonymous() { + if not bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d): + d.setVar("INHIBIT_UPDATERCD_BBCLASS", "1") +}
I'm now adding systemd support for sysklogd.
This recipe will then inherit systemd.bbclass.
And the task of setting INHIBIT_UPDATERCD_BBCLASS is automatically done.
The patches will be sent out in one day or two.
Best Regards,
Chen Qi
--
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core