From 9d81e2efef9946f07f0559940790de0bfe4c4183 Mon Sep 17 00:00:00 2001 From: Justin Cormack Date: Mon, 14 Nov 2016 14:42:08 +0000 Subject: [PATCH] Always start vsudd before syslog If we are using vsudd to forward syslog to the host, as on osx, we need to start it before syslog starts, and make sure it has created its socket. Add a pidfile to vsudd to make startup more reliable. Signed-off-by: Justin Cormack --- alpine/etc/init.d/sysklogd | 76 ++++++++++++++++++++++++++ alpine/packages/vsudd/etc/init.d/vsudd | 10 +--- alpine/packages/vsudd/main.go | 14 +++++ 3 files changed, 93 insertions(+), 7 deletions(-) create mode 100755 alpine/etc/init.d/sysklogd diff --git a/alpine/etc/init.d/sysklogd b/alpine/etc/init.d/sysklogd new file mode 100755 index 000000000..1a1d5fcfa --- /dev/null +++ b/alpine/etc/init.d/sysklogd @@ -0,0 +1,76 @@ +#!/sbin/openrc-run +# Copyright 1999-2011 Gentoo Foundation +# Distributed under the terms of the GNU General Public License, v2 or later +# $Header: /var/cvsroot/gentoo-x86/app-admin/sysklogd/files/sysklogd.rc7,v 1.1 2011/09/14 22:22:57 polynomial-c Exp $ + +extra_started_commands="reload" + +depend() { + need clock hostname localmount vsudd + before net + provide logger +} + +start_daemon() { + local retval=0 + local daemon="$1" + local options="$2" + + [ -z "${daemon}" ] && return 1 + + ebegin "sysklogd -> start: ${daemon}" + start-stop-daemon --start --exec /usr/sbin/"${daemon}" \ + --pidfile /var/run/"${daemon}".pid -- ${options} + retval=$? + eend ${retval} "Failed to start ${daemon}" + + return ${retval} +} + +stop_daemon() { + local retval=0 + local daemon="$1" + + [ -z "${daemon}" ] && return 1 + + ebegin "sysklogd -> stop: ${daemon}" + # syslogd can be stubborn some times (--retry 15)... + start-stop-daemon --stop --retry 15 --quiet --pidfile /var/run/"${daemon}".pid + retval=$? + eend ${retval} "Failed to stop ${daemon}" + + return ${retval} +} + +start() { + start_daemon "syslogd" "${SYSLOGD}" || return 1 + + # klogd do not always start proper if started too early + sleep 1 + + if ! start_daemon "klogd" "${KLOGD}" ; then + stop_daemon "syslogd" + return 1 + fi + + return 0 +} + +stop() { + stop_daemon "klogd" || return 1 + stop_daemon "syslogd" || return 1 + return 0 +} + +reload() { + local ret=0 + + ebegin "Reloading configuration" + + start-stop-daemon --signal HUP --pidfile /var/run/syslogd.pid + ret=$((${ret} + $?)) + start-stop-daemon --signal USR1 --pidfile /var/run/klogd.pid + ret=$((${ret} + $?)) + + eend ${ret} +} diff --git a/alpine/packages/vsudd/etc/init.d/vsudd b/alpine/packages/vsudd/etc/init.d/vsudd index 4edc032e2..0093c7b10 100755 --- a/alpine/packages/vsudd/etc/init.d/vsudd +++ b/alpine/packages/vsudd/etc/init.d/vsudd @@ -2,11 +2,6 @@ description="vsock socket proxy client" -depend() -{ - before logger docker -} - start() { [ "$(mobyplatform)" != "mac" ] && [ "$(mobyplatform)" != "windows" ] && exit 0 @@ -31,10 +26,11 @@ start() start-stop-daemon --start --quiet \ --background \ --exec /sbin/vsudd \ - --make-pidfile --pidfile ${PIDFILE} \ -- -inport "${DOCKER_PORT}:unix:/var/run/docker.sock" \ ${SYSLOG_OPT} \ - -detach + -pidfile ${PIDFILE} + + [ -n "${SYSLOG_OPT}" ] && ewaitfile 10 /var/run/syslog.vsock eend $? "Failed to start vsudd" } diff --git a/alpine/packages/vsudd/main.go b/alpine/packages/vsudd/main.go index 94da4faf9..206c530f4 100644 --- a/alpine/packages/vsudd/main.go +++ b/alpine/packages/vsudd/main.go @@ -31,6 +31,7 @@ var ( detach bool useHVsock bool syslogFwd string + pidfile string ) type vConn interface { @@ -60,12 +61,25 @@ func init() { flag.Var(&inForwards, "inport", "incoming port to forward") flag.StringVar(&syslogFwd, "syslog", "", "enable syslog forwarding") flag.BoolVar(&detach, "detach", false, "detach from terminal") + flag.StringVar(&pidfile, "pidfile", "", "pid file") } func main() { log.SetFlags(log.LstdFlags) flag.Parse() + if pidfile != "" { + file, err := os.OpenFile(pidfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + log.Fatalln("Failed to open pidfile", err) + } + _, err = fmt.Fprintf(file, "%d", os.Getpid()) + file.Close() + if err != nil { + log.Fatalln("Failed to write pid", err) + } + } + if detach { syslog, err := syslog.New(syslog.LOG_INFO|syslog.LOG_DAEMON, "vsudd") if err != nil {