Remove rc-help.sh and replace with a man page for runscript 8.
This commit is contained in:
parent
e4575849be
commit
cbea91cae5
373
man/runscript.8
Normal file
373
man/runscript.8
Normal file
@ -0,0 +1,373 @@
|
|||||||
|
.\" Copyright 2007 Roy Marples
|
||||||
|
.\" All rights reserved
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.Dd Dec 20, 2007
|
||||||
|
.Dt RUNSCRIPT 8 SMM
|
||||||
|
.Os OpenRC
|
||||||
|
.Sh NAME
|
||||||
|
.Nm runscript
|
||||||
|
.Nd a means of hooking shell commands into a service
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Op Fl D , -nodeps
|
||||||
|
.Op Fl d , -debug
|
||||||
|
.Op Fl s , -ifstarted
|
||||||
|
.Op Ar command ...
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
.Nm
|
||||||
|
is basically an interpreter for shell scripts which provide an easy interface
|
||||||
|
to the often complex system commands and daemons.
|
||||||
|
When a service runs a command it first loads it's mulitplexed configuration
|
||||||
|
file, then it's master configuration file, then
|
||||||
|
.Pa /etc/rc.conf
|
||||||
|
and finally the script itself. At this point
|
||||||
|
.Nm
|
||||||
|
then runs the command given.
|
||||||
|
.Pp
|
||||||
|
Commands are defined as shell functions within the script. Here is a list of
|
||||||
|
some functions that all runscripts have by default:
|
||||||
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
|
.It Ar describe
|
||||||
|
Describes what the service does and each command the service defines.
|
||||||
|
.It Ar start
|
||||||
|
First we ensure that any services we depend on are started. If any needed
|
||||||
|
services fail to start then we exit with a suitable error, otherwise call the
|
||||||
|
supplied start function if it exists.
|
||||||
|
.It Ar stop
|
||||||
|
First we ensure that any services that depend on us are stopped. If any
|
||||||
|
services that need us fail to stop then we exit with a suitable error,
|
||||||
|
otherwise call the supplied stop function if it exists.
|
||||||
|
.It Ar restart
|
||||||
|
Stop and start the service, including dependencies.
|
||||||
|
.It Ar status
|
||||||
|
Show the status of the service. The return code matches the status, with the
|
||||||
|
exception of "started" returning 0 to match standard command behaviour.
|
||||||
|
.It Ar zap
|
||||||
|
Resets the service state to stopped and removes all saved data about the
|
||||||
|
service.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The following options affect how the service is run:
|
||||||
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
|
.It Fl d , -debug
|
||||||
|
Set xtrace on in the shell to assist in debugging.
|
||||||
|
.It Fl D , -nodeps
|
||||||
|
Ignore all dependency information the service supplies.
|
||||||
|
.It Fl s , -ifstarted
|
||||||
|
Only run the command if the service has been started.
|
||||||
|
.It Fl q , -quiet
|
||||||
|
Turns off all informational output the service generates.
|
||||||
|
Output from any non OpenRC comands is not affected.
|
||||||
|
.It Fl v , -verbose
|
||||||
|
Turns on any extra informational output the service generates.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
The following variables affect the service script:
|
||||||
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
|
.It Ar extra_commands
|
||||||
|
Space seperated list of extra commands the service defines.
|
||||||
|
.It Ar extra_started_commands
|
||||||
|
Space seperated list of extra commands the service defines. These only work if
|
||||||
|
the service has already been started.
|
||||||
|
.It Ar description
|
||||||
|
String describing the service.
|
||||||
|
.It Ar description_$command
|
||||||
|
String describing the extra command the.
|
||||||
|
.It Ar command
|
||||||
|
Daemon to start or stop via
|
||||||
|
.Nm start-stop-daemon
|
||||||
|
if no start or stop function is defined by the service.
|
||||||
|
.It Ar command_args
|
||||||
|
List of arguments to pass to the daemon when starting.
|
||||||
|
.It Ar pidfile
|
||||||
|
Pidfile to use for the above defined command.
|
||||||
|
.It Ar name
|
||||||
|
Display name used for the above defined command.
|
||||||
|
.El
|
||||||
|
.Sh DEPENDENCIES
|
||||||
|
You should define a
|
||||||
|
.Ic depend
|
||||||
|
function for the service so that
|
||||||
|
.Nm
|
||||||
|
will start and stop it in the right order in relation to other services.
|
||||||
|
As it's a function it can be very flexable, see the example below.
|
||||||
|
Here is a list of the functions you can use in a
|
||||||
|
.Ic depend
|
||||||
|
function. You simply pass the names of the services to it.
|
||||||
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
|
.It Ic need
|
||||||
|
The service will refuse to start until needed services have started and it
|
||||||
|
will refuse to stop until any services that need it have stopped.
|
||||||
|
.It Ic use
|
||||||
|
The service will attempt to start any services we use that have been added
|
||||||
|
to the runlevel.
|
||||||
|
.It Ic after
|
||||||
|
The service will start after thse services and stop before these services.
|
||||||
|
.It Ic before
|
||||||
|
The service will start before these services and stop after these services.
|
||||||
|
.It Ic provide
|
||||||
|
We provide this virtual service. For example, named provides dns.
|
||||||
|
.It Ic config
|
||||||
|
We should recalculate our dependencies if the listed files have changed.
|
||||||
|
.It Ic keywords
|
||||||
|
Tags a service with a keyword. Currently the only keyword is notimeout
|
||||||
|
which means that services do not time out waiting for that service, which only
|
||||||
|
applies when services are enabled to start and stop in parallel.
|
||||||
|
.El
|
||||||
|
.Sh BUILTINS
|
||||||
|
.Nm
|
||||||
|
defines some builtin functions that you can use inside your service scripts:
|
||||||
|
.Bl -tag -width indent
|
||||||
|
.It Ic einfo Op Ar string
|
||||||
|
Output a green asterisk followed by the string.
|
||||||
|
.It Ic ewarn Op Ar string
|
||||||
|
Output a yellow asterisk followed by the string.
|
||||||
|
.It Ic eerror Op Ar string
|
||||||
|
Output a red asterisk followed by the string to stderr.
|
||||||
|
.It Ic ebegin Op Ar string
|
||||||
|
Same as einfo, but append 3 dots to the end.
|
||||||
|
.It Ic eend Ar retval Op Ar string
|
||||||
|
If
|
||||||
|
.Ar retval
|
||||||
|
does not equal 0 then output the string using
|
||||||
|
.Ic eerror
|
||||||
|
and !! in square brackets
|
||||||
|
at the end of the line. Otherwise output ok in square brackets at the end of
|
||||||
|
the line. The value of
|
||||||
|
.Ar retval
|
||||||
|
is returned.
|
||||||
|
.It Ic ewend Ar retval Op Ar string
|
||||||
|
Same as
|
||||||
|
.Ic eend ,
|
||||||
|
but use
|
||||||
|
.Ic ewarn
|
||||||
|
instead of
|
||||||
|
.Ic eerror .
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
You can prefix the above commands with the letter
|
||||||
|
.Ic v ,
|
||||||
|
which means they only
|
||||||
|
output when the environment variable
|
||||||
|
.Va EINFO_VERBOSE
|
||||||
|
is true.
|
||||||
|
.Bl -tag -width indent
|
||||||
|
.It Ic service_set_value Ar name Ar value
|
||||||
|
Saves the
|
||||||
|
.Ar name
|
||||||
|
.Ar value
|
||||||
|
for later retrieval. Saved values are lost when the service stops.
|
||||||
|
.It Ic service_get_value Ar name
|
||||||
|
Returns the saved value called
|
||||||
|
.Ar name .
|
||||||
|
.It Ic service_started Op Ar service
|
||||||
|
If the service is started, return 0 otherwise 1.
|
||||||
|
.It Ic service_starting Op Ar service
|
||||||
|
If the service is starting, return 0 otherwise 1.
|
||||||
|
.It Ic service_inactive Op Ar service
|
||||||
|
If the service is inactive, return 0 otherwise 1.
|
||||||
|
.It Ic service_stopping Op Ar service
|
||||||
|
If the service is stopping, return 0 otherwise 1.
|
||||||
|
.It Ic service_stopped Op Ar service
|
||||||
|
If the service is stopped, return 0 otherwise 1.
|
||||||
|
.It Ic service_coldplugged Op Ar service
|
||||||
|
If the service is coldplugged, return 0 otherwise 1.
|
||||||
|
.It Ic service_wasinactive Op Ar service
|
||||||
|
If the service was inactive, return 0 otherwise 1.
|
||||||
|
.It Xo
|
||||||
|
.Ic service_started_daemon
|
||||||
|
.Op Ar service
|
||||||
|
.Ar daemon
|
||||||
|
.Op Ar index
|
||||||
|
.Xc
|
||||||
|
If the service has started the daemon using
|
||||||
|
.Nm start-stop-daemon ,
|
||||||
|
return 0 otherwise 1.
|
||||||
|
If an index is specified, it has to be the nth daemon started by the service.
|
||||||
|
.It Ic mark_service_started Op Ar service
|
||||||
|
Mark the service as started.
|
||||||
|
.It Ic mark_service_starting Op Ar service
|
||||||
|
Mark the service as starting.
|
||||||
|
.It Ic mark_service_inactive Op Ar service
|
||||||
|
Mark the service as inactive.
|
||||||
|
.It Ic mark_service_stopping Op Ar service
|
||||||
|
Mark the service as stopping.
|
||||||
|
.It Ic mark_service_stopped Op Ar service
|
||||||
|
Mark the service as stopped.
|
||||||
|
.It Ic mark_service_coldplugged Op Ar service
|
||||||
|
Mark the service as coldplugged.
|
||||||
|
.It Ic mark_service_wasinactive Op Ar service
|
||||||
|
Mark the service as inactive.
|
||||||
|
.It Xo
|
||||||
|
.Ic checkpath
|
||||||
|
.Op Fl d , -directory
|
||||||
|
.Op Fl f , -file
|
||||||
|
.Op Fl m , -mode Ar mode
|
||||||
|
.Op Fl o , owner Ar owner
|
||||||
|
.Ar path ...
|
||||||
|
.Xc
|
||||||
|
Checks to see if the path exists, is of the right type, owned by the right
|
||||||
|
people and has the correct access modes. If not, then it corrects the path.
|
||||||
|
.El
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
.Nm
|
||||||
|
sets the following environment variables for use in the service scripts:
|
||||||
|
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||||
|
.It Va SVCNAME
|
||||||
|
Name of the service.
|
||||||
|
.It Va RC_SOFTLEVEL
|
||||||
|
Current runlevel that rc is in.
|
||||||
|
.It Va RC_BOOTLEVEL
|
||||||
|
Boot runlevel chosen. Default is boot.
|
||||||
|
.It Va RC_DEFAULTLEVEL
|
||||||
|
Default runlevel chosen. Default is default.
|
||||||
|
.It Va RC_SYS
|
||||||
|
A special variable to describe the system more.
|
||||||
|
Possible values are XENU, XEN0, UML and VPS.
|
||||||
|
.It Va RC_UNAME
|
||||||
|
The result of `uname -s`.
|
||||||
|
.El
|
||||||
|
.Sh FILES
|
||||||
|
.Pp
|
||||||
|
Configuration files, relative to the location of the service.
|
||||||
|
If a file ending with .${RC_SOFTLEVEL} exists then we use that instead.
|
||||||
|
.Bl -ohang
|
||||||
|
.It Pa ../conf.d/${SVCNAME%%.*}
|
||||||
|
mulitplexed configuration file.
|
||||||
|
Example: if ${SVCNAME} is net.eth1 then look for
|
||||||
|
.Pa ../conf.d/net .
|
||||||
|
.It Pa ../conf.d/${SVCNAME}
|
||||||
|
service configuration file.
|
||||||
|
.It Pa /etc/rc.conf
|
||||||
|
host configuration file.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
With the exception of
|
||||||
|
.Pa /etc/rc.conf ,
|
||||||
|
the configuration files can also influence the dependencies of the service
|
||||||
|
through variables. Simply prefix the name of the dependency with rc_.
|
||||||
|
Example:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
# Whilst most services don't bind to a specific interface, our
|
||||||
|
# openvpn configuration requires a specific interface, namely bge0.
|
||||||
|
rc_need="net.bge0"
|
||||||
|
.Ed
|
||||||
|
.Sh EXAMPLES
|
||||||
|
.Pp
|
||||||
|
An example service script for foo.
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
#!/sbin/runscript
|
||||||
|
command=/usr/bin/foo
|
||||||
|
command_args="${foo_args} --bar"
|
||||||
|
pidfile=/var/run/foo.pid
|
||||||
|
name="FooBar Daemon"
|
||||||
|
|
||||||
|
description="FooBar is a daemon that eats and drinks"
|
||||||
|
extra_commands="show"
|
||||||
|
extra_started_commands="drink eat"
|
||||||
|
description_drink="Opens mouth and reflexively swallows"
|
||||||
|
description_eat="Chews food in mouth"
|
||||||
|
description_show="Shows what's in the tummy"
|
||||||
|
|
||||||
|
_need_dbus() {
|
||||||
|
grep -q dbus /etc/foo/plugins
|
||||||
|
}
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
# We write a pidfile and to /var/cache, so we need localmount.
|
||||||
|
need localmount
|
||||||
|
# We can optionally use the network, but it's not essential.
|
||||||
|
use net
|
||||||
|
# We should be after bootmisc so that /var/run is cleaned before
|
||||||
|
# we put our pidfile there.
|
||||||
|
after bootmisc
|
||||||
|
|
||||||
|
# Foo may use a dbus plugin.
|
||||||
|
# However, if we add the dbus plugin whilst foo is running and
|
||||||
|
# stop dbus, we don't need to stop foo as foo didn't use dbus.
|
||||||
|
config /etc/foo/plugins
|
||||||
|
local _need=
|
||||||
|
if service_started; then
|
||||||
|
_need=`service_get_value need`
|
||||||
|
else
|
||||||
|
if _need_dbus; then
|
||||||
|
_need="${_need} dbus"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
need ${_need}
|
||||||
|
}
|
||||||
|
|
||||||
|
start_pre() {
|
||||||
|
# Ensure that our dirs are correct
|
||||||
|
checkpath --dir --owner foo:foo --mode 0664 \\
|
||||||
|
/var/run/foo /var/cache/foo
|
||||||
|
}
|
||||||
|
|
||||||
|
start_post() {
|
||||||
|
# Save our need
|
||||||
|
if _need_dbus; then
|
||||||
|
service_set_value need dbus
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_post() {
|
||||||
|
# Clean any spills
|
||||||
|
rm -rf /var/cache/foo/*
|
||||||
|
}
|
||||||
|
|
||||||
|
drink() {
|
||||||
|
ebegin "Starting to drink"
|
||||||
|
${command} --drink beer
|
||||||
|
eend $? "Failed to drink any beer :("
|
||||||
|
}
|
||||||
|
|
||||||
|
eat() {
|
||||||
|
local result=0 retval= ate= food=
|
||||||
|
ebegin "Starting to eat"
|
||||||
|
for food in /usr/share/food/*; do
|
||||||
|
veinfo "Eating `basename ${food}`"
|
||||||
|
${command} --eat ${food}
|
||||||
|
retval=$?
|
||||||
|
: $((${result} += ${retval}))
|
||||||
|
[ ${retval} = 0 ] && ate="${ate} `basename ${food}`"
|
||||||
|
done
|
||||||
|
if eend ${result} "Failed to eat all the food"; then
|
||||||
|
service_set_value ate "${ate}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
einfo "Foo has eaten: `service_get_value ate`"
|
||||||
|
}
|
||||||
|
|
||||||
|
.Ed
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr rc 8 ,
|
||||||
|
.Xr rc-status 8 ,
|
||||||
|
.Xr rc-update 8 ,
|
||||||
|
.Xr sh 1p ,
|
||||||
|
.Xr start-stop-daemon 8 ,
|
||||||
|
.Xr uname 1
|
||||||
|
.Sh AUTHORS
|
||||||
|
.An "Roy Marples" Aq roy@marples.name
|
@ -1,6 +1,6 @@
|
|||||||
DIR = $(RC_LIB)/sh
|
DIR = $(RC_LIB)/sh
|
||||||
INC = functions.sh init-common-post.sh rc-functions.sh rc-mount.sh
|
INC = functions.sh init-common-post.sh rc-functions.sh rc-mount.sh
|
||||||
BIN = gendepends.sh net.sh rc-mount.sh rc-help.sh runscript.sh
|
BIN = gendepends.sh net.sh runscript.sh
|
||||||
|
|
||||||
TOPDIR = ..
|
TOPDIR = ..
|
||||||
include $(TOPDIR)/default.mk
|
include $(TOPDIR)/default.mk
|
||||||
|
273
sh/rc-help.sh
273
sh/rc-help.sh
@ -1,273 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Copyright 1999-2007 Gentoo Foundation
|
|
||||||
# Copyright 2007 Roy Marples
|
|
||||||
# All rights reserved
|
|
||||||
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
# 1. Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
# OR SVCNAMES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
# SUCH DAMAGE.
|
|
||||||
|
|
||||||
. /etc/init.d/functions.sh
|
|
||||||
|
|
||||||
myscript=$1
|
|
||||||
if [ -z "${SVCNAME}" -o -z "$myscript" ]; then
|
|
||||||
echo "Please execute an init.d script"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$2" = "help" ]; then
|
|
||||||
BE_VERBOSE="yes"
|
|
||||||
NL="\n"
|
|
||||||
else
|
|
||||||
BE_VERBOSE="no"
|
|
||||||
NL=
|
|
||||||
fi
|
|
||||||
|
|
||||||
default_commands="describe help start status stop restart zap"
|
|
||||||
extra_commands="$(. "${myscript}" 2>/dev/null; echo "${extra_commands:-${opts}}")"
|
|
||||||
|
|
||||||
printf "Usage: ${HILITE}${SVCNAME}${NORMAL} [ ${GOOD}flags${NORMAL} ] < ${GOOD}options${NORMAL} >
|
|
||||||
|
|
||||||
${HILITE}Normal Commands:${NORMAL}"
|
|
||||||
|
|
||||||
if yesno ${BE_VERBOSE}; then
|
|
||||||
printf "
|
|
||||||
${GOOD}describe${NORMAL}
|
|
||||||
Describe what the service and any extra options do.
|
|
||||||
|
|
||||||
${GOOD}help${NORMAL}
|
|
||||||
This screen - duh.
|
|
||||||
|
|
||||||
${GOOD}start${NORMAL}
|
|
||||||
Start service, as well as the services it depends on (if not already
|
|
||||||
started).
|
|
||||||
|
|
||||||
${GOOD}status${NORMAL}
|
|
||||||
Display the current status of the service.
|
|
||||||
|
|
||||||
${GOOD}stop${NORMAL}
|
|
||||||
Stop service, as well as the services that depend on it (if not already
|
|
||||||
stopped).
|
|
||||||
|
|
||||||
${GOOD}restart${NORMAL}
|
|
||||||
Restart service, as well as the services that depend on it.
|
|
||||||
|
|
||||||
Note to developers: If this function is replaced with a custom one,
|
|
||||||
'svc_start' and 'svc_stop' should be used instead of 'start' and
|
|
||||||
'stop' to restart the service. This is so that the dependencies
|
|
||||||
can be handled correctly. Refer to the portmap rc-script for an
|
|
||||||
example.
|
|
||||||
|
|
||||||
${GOOD}zap${NORMAL}
|
|
||||||
Reset a service that is currently stopped, but still marked as started,
|
|
||||||
to the stopped state. Basically for killing zombie services.
|
|
||||||
|
|
||||||
${GOOD}status${NORMAL}
|
|
||||||
Prints \"status: started\" if the service is running, else it
|
|
||||||
prints \"status: stopped\".
|
|
||||||
|
|
||||||
Note that if the '--quiet' flag is given, it will return true if the
|
|
||||||
service is running, else false.
|
|
||||||
|
|
||||||
${GOOD}ineed|iuse${NORMAL}
|
|
||||||
List the services this one depends on. Consult the section about
|
|
||||||
dependencies for more info on the different types of dependencies.
|
|
||||||
|
|
||||||
${GOOD}needsme|usesme${NORMAL}
|
|
||||||
List the services that depend on this one. Consult the section about
|
|
||||||
dependencies for more info on the different types of dependencies.
|
|
||||||
|
|
||||||
${GOOD}broken${NORMAL}
|
|
||||||
List the missing or broken dependencies of type 'need' this service
|
|
||||||
depends on.
|
|
||||||
"
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
printf " ${GOOD}${default_commands}${NORMAL}
|
|
||||||
Default init.d options.
|
|
||||||
"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${extra_commands}" ]; then
|
|
||||||
printf "
|
|
||||||
${HILITE}Additional Options:${NORMAL}${NL}
|
|
||||||
${GOOD}${extra_commands}${NORMAL}
|
|
||||||
Extra options supported by this init.d script.
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf "
|
|
||||||
${HILITE}Flags:${NORMAL}${NL}
|
|
||||||
${GOOD}--ifstarted${NORMAL} Only do actions if service started
|
|
||||||
${GOOD}--nodeps${NORMAL} Don't stop or start any dependencies
|
|
||||||
${GOOD}--quiet${NORMAL}
|
|
||||||
Suppress output to stdout, except if:${NL}
|
|
||||||
1) It is a warning, then output to stdout
|
|
||||||
2) It is an error, then output to stderr${NL}
|
|
||||||
${GOOD}--verbose${NORMAL} Output extra information
|
|
||||||
${GOOD}--debug${NORMAL} Output debug information
|
|
||||||
${GOOD}--nocolor${NORMAL} Suppress the use of colors
|
|
||||||
"
|
|
||||||
|
|
||||||
if yesno ${BE_VERBOSE}; then
|
|
||||||
printf "
|
|
||||||
${HILITE}Dependencies:${NORMAL}
|
|
||||||
|
|
||||||
This is the heart of the OpenRC, as it determines the order
|
|
||||||
in which services gets started, and also to some extend what services
|
|
||||||
get started in the first place.
|
|
||||||
|
|
||||||
The following example demonstrates how to use dependencies in
|
|
||||||
rc-scripts:
|
|
||||||
|
|
||||||
depend() {
|
|
||||||
need foo bar
|
|
||||||
use ray
|
|
||||||
}
|
|
||||||
|
|
||||||
Here we have foo and bar as dependencies of type 'need', and ray of
|
|
||||||
type 'use'. You can have as many dependencies of each type as needed, as
|
|
||||||
long as there is only one entry for each type, listing all its dependencies
|
|
||||||
on one line only.
|
|
||||||
|
|
||||||
${GOOD}need${NORMAL}
|
|
||||||
These are all the services needed for this service to start. If any
|
|
||||||
service in the 'need' line is not started, it will be started even if it
|
|
||||||
is not in the current, or 'boot' runlevel, and then this service will be
|
|
||||||
started. If any services in the 'need' line fails to start or is
|
|
||||||
missing, this service will never be started.
|
|
||||||
|
|
||||||
${GOOD}use${NORMAL}
|
|
||||||
This can be seen as representing optional services this service depends on
|
|
||||||
that are not critical for it to start. For any service in the 'use' line,
|
|
||||||
it must be added to the 'boot' or current runlevel to be considered a
|
|
||||||
valid 'use' dependency. It can also be used to determine startup order.
|
|
||||||
|
|
||||||
${GOOD}before${NORMAL}
|
|
||||||
This, together with the 'after' dependency type, can be used to control
|
|
||||||
startup order. In core, 'before' and 'after' do not denote a dependency,
|
|
||||||
but should be used for order changes that will only be honoured during
|
|
||||||
a change of runlevel. All services listed will get started *after* the
|
|
||||||
current service. In other words, this service will get started *before*
|
|
||||||
all listed services.
|
|
||||||
|
|
||||||
${GOOD}after${NORMAL}
|
|
||||||
All services listed will be started *before* the current service. Have a
|
|
||||||
look at 'before' for more info.
|
|
||||||
|
|
||||||
${GOOD}provide${NORMAL}
|
|
||||||
This is not really a dependency type, rather it will enable you to create
|
|
||||||
virtual services. This is useful if there is more than one version of
|
|
||||||
a specific service type, system loggers or crons for instance. Just
|
|
||||||
have each system logger provide 'logger', and make all services in need
|
|
||||||
of a system logger depend on 'logger'. This should make things much more
|
|
||||||
generic.
|
|
||||||
|
|
||||||
${GOOD}config${NORMAL}
|
|
||||||
This is not really a dependency type, rather it informs the dependency
|
|
||||||
system about config files that may affect the dependencies of the service.
|
|
||||||
One example of this is the netmount service which changes its dependencies
|
|
||||||
depending on the config of /etc/fstab.
|
|
||||||
|
|
||||||
Note that the 'need', 'use', 'before', and 'after' dependency types accept
|
|
||||||
an '*' as an argument. Having:
|
|
||||||
|
|
||||||
depend() {
|
|
||||||
before *
|
|
||||||
}
|
|
||||||
|
|
||||||
will make the service start first in the current runlevel, and:
|
|
||||||
|
|
||||||
depend() {
|
|
||||||
after *
|
|
||||||
}
|
|
||||||
|
|
||||||
will make the service the last to start.
|
|
||||||
|
|
||||||
You should however be careful how you use this, as I really will not
|
|
||||||
recommend using it with the 'need' or 'use' dependency type ... you have
|
|
||||||
been warned!
|
|
||||||
|
|
||||||
${HILITE}'net' Dependency and 'net.*' Services:${NORMAL}
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
depend() {
|
|
||||||
need net
|
|
||||||
}
|
|
||||||
|
|
||||||
This is a special dependency of type 'need'. It represents a state where
|
|
||||||
a network interface or interfaces besides lo is up and active. Any service
|
|
||||||
starting with 'net.' will be treated as a part of the 'net' dependency,
|
|
||||||
if:
|
|
||||||
|
|
||||||
1. It is part of the 'boot' runlevel
|
|
||||||
2. It is part of the current runlevel
|
|
||||||
|
|
||||||
A few examples are the /etc/init.d/net.eth0 and /etc/init.d/net.lo services.
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf "
|
|
||||||
${HILITE}Configuration files:${NORMAL}
|
|
||||||
"
|
|
||||||
|
|
||||||
if yesno ${BE_VERBOSE}; then
|
|
||||||
printf "
|
|
||||||
There are two files which will be sourced for possible configuration by
|
|
||||||
the rc-scripts. They are (sourced from left to right, top to bottom):
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf " /etc/conf.d/${SVCNAME}
|
|
||||||
/etc/conf.d/${SVCNAME}.\${RC_SOFTLEVEL}
|
|
||||||
/etc/rc.conf
|
|
||||||
\${RC_SOFTLEVEL} denotes the name of the runlevel"
|
|
||||||
|
|
||||||
if yesno ${BE_VERBOSE}; then
|
|
||||||
printf "
|
|
||||||
You can add extra dependencies to ${SVCNAME} by adding some variables to
|
|
||||||
/etc/conf.d/${SVCNAME}
|
|
||||||
rc_need=\"openvpn ntpd\"
|
|
||||||
rc_use=\"dns\"
|
|
||||||
|
|
||||||
This makes ${SVCNAME} need openvpn and ntpd, while it just uses dns.
|
|
||||||
|
|
||||||
A good example of this is nfsmount needing openvpn if the nfs mounts in
|
|
||||||
/etc/fstab are over the vpn link.
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if yesno ${BE_VERBOSE}; then
|
|
||||||
printf "\n
|
|
||||||
${HILITE}Management:${NORMAL}
|
|
||||||
|
|
||||||
Services are added and removed via the 'rc-update' tool. Running it without
|
|
||||||
arguments should give sufficient help.
|
|
||||||
"
|
|
||||||
else
|
|
||||||
printf "\n
|
|
||||||
For more info, please run '${myscript} help'.
|
|
||||||
"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
@ -60,7 +60,6 @@
|
|||||||
#include "rc-plugin.h"
|
#include "rc-plugin.h"
|
||||||
#include "strlist.h"
|
#include "strlist.h"
|
||||||
|
|
||||||
#define RCSCRIPT_HELP RC_LIBDIR "/sh/rc-help.sh"
|
|
||||||
#define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so"
|
#define SELINUX_LIB RC_LIBDIR "/runscript_selinux.so"
|
||||||
|
|
||||||
#define PREFIX_LOCK RC_SVCDIR "/prefix.lock"
|
#define PREFIX_LOCK RC_SVCDIR "/prefix.lock"
|
||||||
@ -1221,17 +1220,15 @@ int runscript (int argc, char **argv)
|
|||||||
|
|
||||||
doneone = true;
|
doneone = true;
|
||||||
|
|
||||||
if (strcmp (optarg, "describe") == 0) {
|
if (strcmp (optarg, "describe") == 0 ||
|
||||||
|
strcmp (optarg, "help") == 0)
|
||||||
|
{
|
||||||
char *save = prefix;
|
char *save = prefix;
|
||||||
|
|
||||||
eprefix (NULL);
|
eprefix (NULL);
|
||||||
prefix = NULL;
|
prefix = NULL;
|
||||||
svc_exec (optarg, NULL);
|
svc_exec (optarg, NULL);
|
||||||
eprefix (save);
|
eprefix (save);
|
||||||
} else if (strcmp (optarg, "help") == 0) {
|
|
||||||
execl (RCSCRIPT_HELP, RCSCRIPT_HELP, service, "help", (char *) NULL);
|
|
||||||
eerrorx ("%s: failed to exec `" RCSCRIPT_HELP "': %s",
|
|
||||||
applet, strerror (errno));
|
|
||||||
} else if (strcmp (optarg, "ineed") == 0 ||
|
} else if (strcmp (optarg, "ineed") == 0 ||
|
||||||
strcmp (optarg, "iuse") == 0 ||
|
strcmp (optarg, "iuse") == 0 ||
|
||||||
strcmp (optarg, "needsme") == 0 ||
|
strcmp (optarg, "needsme") == 0 ||
|
||||||
@ -1260,10 +1257,6 @@ int runscript (int argc, char **argv)
|
|||||||
retval = (int) r;
|
retval = (int) r;
|
||||||
if (retval & RC_SERVICE_STARTED)
|
if (retval & RC_SERVICE_STARTED)
|
||||||
retval = 0;
|
retval = 0;
|
||||||
} else if (strcmp (optarg, "help") == 0) {
|
|
||||||
execl (RCSCRIPT_HELP, RCSCRIPT_HELP, service, "help", (char *) NULL);
|
|
||||||
eerrorx ("%s: failed to exec `" RCSCRIPT_HELP "': %s",
|
|
||||||
applet, strerror (errno));
|
|
||||||
} else {
|
} else {
|
||||||
if (geteuid () != 0)
|
if (geteuid () != 0)
|
||||||
eerrorx ("%s: root access required", applet);
|
eerrorx ("%s: root access required", applet);
|
||||||
@ -1310,11 +1303,8 @@ int runscript (int argc, char **argv)
|
|||||||
restart_services = NULL;
|
restart_services = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! doneone) {
|
if (! doneone)
|
||||||
execl (RCSCRIPT_HELP, RCSCRIPT_HELP, service, (char *) NULL);
|
usage (EXIT_FAILURE);
|
||||||
eerrorx ("%s: failed to exec `" RCSCRIPT_HELP "': %s",
|
|
||||||
applet, strerror (errno));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (retval);
|
return (retval);
|
||||||
|
Loading…
Reference in New Issue
Block a user