Add support for the s6 supervision suite
This commit is contained in:
		@@ -3,7 +3,7 @@ include ../mk/net.mk
 | 
			
		||||
DIR=	${INITDIR}
 | 
			
		||||
SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \
 | 
			
		||||
	netmount.in osclock.in root.in savecache.in swap.in swapfiles.in \
 | 
			
		||||
	tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
 | 
			
		||||
	tmpfiles.setup.in swclock.in sysctl.in urandom.in s6-svscan.in ${SRCS-${OS}}
 | 
			
		||||
BIN=	${OBJS}
 | 
			
		||||
 | 
			
		||||
# Are we installing our network scripts?
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								init.d/s6-svscan.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								init.d/s6-svscan.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
#!@SBINDIR@/openrc-run
 | 
			
		||||
# Copyright (C) 2015 William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
# Released under the 2-clause BSD license.
 | 
			
		||||
 | 
			
		||||
command=/bin/s6-svscan
 | 
			
		||||
command_args="${RC_SVCDIR}"/s6-scan
 | 
			
		||||
command_background=yes
 | 
			
		||||
pidfile=/var/run/s6-svscan.pid
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need localmount
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_pre()
 | 
			
		||||
{
 | 
			
		||||
	einfo "Creating s6 scan directory"
 | 
			
		||||
	checkpath -d -m 0755 "$RC_SVCDIR"/s6-scan
 | 
			
		||||
	return $?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop_post()
 | 
			
		||||
{
 | 
			
		||||
	ebegin "Stopping any remaining s6 services"
 | 
			
		||||
	s6-svc -dx "${RC_SVCDIR}"/s6-scan/* 2>/dev/null || true
 | 
			
		||||
	eend $?
 | 
			
		||||
 | 
			
		||||
	ebegin "Stopping any remaining s6 service loggers"
 | 
			
		||||
	s6-svc -dx "${RC_SVCDIR}"/s6-scan/*/log 2>/dev/null || true
 | 
			
		||||
	eend $?
 | 
			
		||||
}
 | 
			
		||||
@@ -107,6 +107,18 @@ the service has already been stopped.
 | 
			
		||||
String describing the service.
 | 
			
		||||
.It Ar description_$command
 | 
			
		||||
String describing the extra command.
 | 
			
		||||
.It Ar supervisor
 | 
			
		||||
Supervisor to use to monitor this daemon. If this is unset,
 | 
			
		||||
start-stop-daemon will be used. The only alternate supervisor we support
 | 
			
		||||
in this release is S6 from Skarnet software. To use this, set
 | 
			
		||||
supervisor=s6.
 | 
			
		||||
.It Ar s6_service_path
 | 
			
		||||
The path to the s6 service directory if you are monitoring this service
 | 
			
		||||
with S6. The default is /etc/svc.d/${RC_SVCNAME}.
 | 
			
		||||
.It Ar s6_svwait_options_start
 | 
			
		||||
The options to pass to s6-svwait when starting the service via s6.
 | 
			
		||||
.It Ar s6_svwait_options_stop
 | 
			
		||||
The options to pass to s6-svwait when stopping the service via s6.
 | 
			
		||||
.It Ar start_stop_daemon_args
 | 
			
		||||
List of arguments passed to start-stop-daemon when starting the daemon.
 | 
			
		||||
.It Ar command
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										56
									
								
								s6-guide.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								s6-guide.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
# Using S6 with OpenRC
 | 
			
		||||
 | 
			
		||||
Beginning with OpenRC-0.16, we support using the s6 supervision suite
 | 
			
		||||
from Skarmet Software in place of start-stop-daemon for monitoring
 | 
			
		||||
daemons [1].
 | 
			
		||||
 | 
			
		||||
## Setup
 | 
			
		||||
 | 
			
		||||
Documenting s6 in detail is beyond the scope of this guide. It will
 | 
			
		||||
document how to set up OpenRC services to communicate with s6.
 | 
			
		||||
 | 
			
		||||
### Use Default start, stop and status functions
 | 
			
		||||
 | 
			
		||||
If you write your own start, stop and status functions in your service
 | 
			
		||||
script, none of this will work. You must allow OpenRC to use the default
 | 
			
		||||
functions.
 | 
			
		||||
 | 
			
		||||
### Dependencies
 | 
			
		||||
 | 
			
		||||
All OpenRC service scripts that want their daemons monitored by s6
 | 
			
		||||
should have the following line added to their dependencies to make sure
 | 
			
		||||
the s6 scan directory is being monitored.
 | 
			
		||||
 | 
			
		||||
need s6-svscan
 | 
			
		||||
 | 
			
		||||
### Variable Settings
 | 
			
		||||
 | 
			
		||||
The most important setting is the supervisor variable. At the top of
 | 
			
		||||
your service script, you should set this variable as follows:
 | 
			
		||||
 | 
			
		||||
supervisor=s6
 | 
			
		||||
 | 
			
		||||
Several other variables affect s6 services. They are documented on the
 | 
			
		||||
openrc-run man page, but I will list them here for convenience:
 | 
			
		||||
 | 
			
		||||
s6_service_path - the path to the s6 service directory
 | 
			
		||||
s6_svwait_options_start - the options to pass to s6-svwait when starting
 | 
			
		||||
s6_svwait_options_stop - the options to pass to s6-svwait when stopping.
 | 
			
		||||
 | 
			
		||||
The s6_service_path variable defaults to /etc/svc.d/${RC_SVCNAME} if it
 | 
			
		||||
is not set in the service script. For example, if you want a service
 | 
			
		||||
script called /etc/init.d/foobar to use s6 to monitor its daemon, the s6
 | 
			
		||||
service should be the directory /etc/svc.d/foobar.
 | 
			
		||||
 | 
			
		||||
See the documentation for s6 for more information about s6 service
 | 
			
		||||
directories.
 | 
			
		||||
 | 
			
		||||
The s6_svwait_options_* variables set command line options to pass to
 | 
			
		||||
s6-svwait when starting or stopping the s6 service. These can be very
 | 
			
		||||
useful for waiting for s6 services to signal when they are up, timing out
 | 
			
		||||
when an s6 service doesn't come up, etc.
 | 
			
		||||
 | 
			
		||||
This is very early support, so feel free to file bugs if you have
 | 
			
		||||
issues.
 | 
			
		||||
 | 
			
		||||
[1] https://www.skarnet.org/software/s6
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
DIR=	${LIBEXECDIR}/sh
 | 
			
		||||
SRCS=	init.sh.in functions.sh.in gendepends.sh.in \
 | 
			
		||||
	openrc-run.sh.in rc-functions.sh.in tmpfiles.sh.in ${SRCS-${OS}}
 | 
			
		||||
INC=	rc-mount.sh functions.sh rc-functions.sh start-stop-daemon.sh
 | 
			
		||||
INC=	rc-mount.sh functions.sh rc-functions.sh s6.sh start-stop-daemon.sh
 | 
			
		||||
BIN=	gendepends.sh init.sh openrc-run.sh tmpfiles.sh ${BIN-${OS}}
 | 
			
		||||
 | 
			
		||||
INSTALLAFTER=	_installafter
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,7 @@ start()
 | 
			
		||||
{
 | 
			
		||||
	local func=ssd_start
 | 
			
		||||
	case "$supervisor" in
 | 
			
		||||
		s6) func=s6_start ;;
 | 
			
		||||
		?*)
 | 
			
		||||
			ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
 | 
			
		||||
			;;
 | 
			
		||||
@@ -143,6 +144,7 @@ stop()
 | 
			
		||||
{
 | 
			
		||||
	local func=ssd_stop
 | 
			
		||||
	case "$supervisor" in
 | 
			
		||||
		s6) func=s6_stop ;;
 | 
			
		||||
		?*)
 | 
			
		||||
			ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
 | 
			
		||||
			;;
 | 
			
		||||
@@ -154,6 +156,7 @@ status()
 | 
			
		||||
{
 | 
			
		||||
	local func=ssd_status
 | 
			
		||||
	case "$supervisor" in
 | 
			
		||||
		s6) func=s6_status ;;
 | 
			
		||||
		?*)
 | 
			
		||||
			ewarn "Invalid supervisor, \"$supervisor\", using start-stop-daemon"
 | 
			
		||||
			;;
 | 
			
		||||
@@ -183,6 +186,7 @@ unset _conf_d
 | 
			
		||||
sourcex -e "@SYSCONFDIR@/rc.conf"
 | 
			
		||||
 | 
			
		||||
# load service supervisor functions
 | 
			
		||||
sourcex "@LIBEXECDIR@/sh/s6.sh"
 | 
			
		||||
sourcex "@LIBEXECDIR@/sh/start-stop-daemon.sh"
 | 
			
		||||
 | 
			
		||||
# Set verbose mode
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								sh/s6.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								sh/s6.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
# Start / stop / status functions for s6 support
 | 
			
		||||
# Copyright (c) 2015 William Hubbs <w.d.hubbs@gmail.com>
 | 
			
		||||
# Released under the 2-clause BSD license.
 | 
			
		||||
 | 
			
		||||
[ -z "${s6_service_path}" ] && s6_service_path="/etc/svc.d/${RC_SVCNAME}"
 | 
			
		||||
 | 
			
		||||
s6_start()
 | 
			
		||||
{
 | 
			
		||||
	if [ ! -d "${s6_service_path}" ]; then
 | 
			
		||||
		eerror "${s6_service_path} does not exist."
 | 
			
		||||
 	return 1
 | 
			
		||||
 fi
 | 
			
		||||
	local rc
 | 
			
		||||
	ebegin "Starting ${name:-$RC_SVCNAME}"
 | 
			
		||||
	ln -sf "${s6_service_path}" "${RC_SVCDIR}"/s6-scan
 | 
			
		||||
	s6-svscanctl -an "${RC_SVCDIR}"/s6-scan
 | 
			
		||||
	rc=$?
 | 
			
		||||
	if [ -n "$s6_svwait_options_start" ]; then
 | 
			
		||||
		s6-svwait ${s6_svwait_options_start} "${s6_service_path}"
 | 
			
		||||
		rc=$?
 | 
			
		||||
	fi
 | 
			
		||||
	eend $rc "Failed to start $RC_SVCNAME"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
s6_stop()
 | 
			
		||||
{
 | 
			
		||||
	if [ ! -d "${s6_service_path}" ]; then
 | 
			
		||||
		eerror "${s6_service_path} does not exist."
 | 
			
		||||
 	return 1
 | 
			
		||||
 fi
 | 
			
		||||
	local rc
 | 
			
		||||
	ebegin "Stopping ${name:-$RC_SVCNAME}"
 | 
			
		||||
	rm -rf "${RC_SVCDIR}/s6-scan/${s6_service_path##*/}"
 | 
			
		||||
	s6-svscanctl -an "${RC_SVCDIR}"/s6-scan
 | 
			
		||||
	rc=$? 
 | 
			
		||||
	if [ -n "$s6_svwait_options_stop" ]; then
 | 
			
		||||
		s6-svwait ${s6_svwait_options_stop} "${s6_service_path}"
 | 
			
		||||
		rc=$?
 | 
			
		||||
	fi
 | 
			
		||||
	eend $rc "Failed to stop $RC_SVCNAME"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
s6_status()
 | 
			
		||||
{
 | 
			
		||||
	s6-svstat "${s6_service_path}"
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user