aboutsummaryrefslogtreecommitdiff
path: root/sh/openrc-run.sh.in
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2015-04-26 13:31:49 -0500
committerWilliam Hubbs <w.d.hubbs@gmail.com>2015-04-27 11:21:29 -0500
commit8b9349208696e5caed1a8b34f066cec4ee642194 (patch)
tree0ee1fce0de32aecfcd5c314322067879fc0e73cd /sh/openrc-run.sh.in
parent4b1b457cd15cc1609c101b99a49a5e4c67b62567 (diff)
convert all references from runscript to openrc-run
Diffstat (limited to 'sh/openrc-run.sh.in')
-rw-r--r--sh/openrc-run.sh.in353
1 files changed, 353 insertions, 0 deletions
diff --git a/sh/openrc-run.sh.in b/sh/openrc-run.sh.in
new file mode 100644
index 00000000..a6d2c0b8
--- /dev/null
+++ b/sh/openrc-run.sh.in
@@ -0,0 +1,353 @@
+#!@SHELL@
+# Shell wrapper for openrc-run
+
+# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
+# Released under the 2-clause BSD license.
+
+verify_boot()
+{
+ if [ ! -e ${RC_SVCDIR}/softlevel ]; then
+ eerror "You are attempting to run an openrc service on a"
+ eerror "system which openrc did not boot."
+ eerror "You may be inside a chroot or you may have used"
+ eerror "another initialization system to boot this system."
+ eerror "In this situation, you will get unpredictable results!"
+ eerror
+ eerror "If you really want to do this, issue the following command:"
+ eerror "touch ${RC_SVCDIR}/softlevel"
+ exit 1
+ fi
+ return 0
+}
+
+sourcex()
+{
+ if [ "$1" = "-e" ]; then
+ shift
+ [ -e "$1" ] || return 1
+ fi
+ if ! . "$1"; then
+ eerror "$RC_SVCNAME: error loading $1"
+ exit 1
+ fi
+}
+
+sourcex "@LIBEXECDIR@/sh/functions.sh"
+sourcex "@LIBEXECDIR@/sh/rc-functions.sh"
+[ "$RC_SYS" != "PREFIX" ] && sourcex -e "@LIBEXECDIR@/sh/rc-cgroup.sh"
+
+# Support LiveCD foo
+if sourcex -e "/sbin/livecd-functions.sh"; then
+ livecd_read_commandline
+fi
+
+if [ -z "$1" -o -z "$2" ]; then
+ eerror "$RC_SVCNAME: not enough arguments"
+ exit 1
+fi
+
+# So daemons know where to recall us if needed
+RC_SERVICE="$1" ; export RC_SERVICE
+shift
+
+# Compat
+SVCNAME=$RC_SVCNAME ; export SVCNAME
+
+# Dependency function
+config() {
+ [ -n "$*" ] && echo "config $*"
+}
+need() {
+ [ -n "$*" ] && echo "need $*"
+}
+use() {
+ [ -n "$*" ] && echo "use $*"
+}
+before() {
+ [ -n "$*" ] && echo "before $*"
+}
+after() {
+ [ -n "$*" ] && echo "after $*"
+}
+provide() {
+ [ -n "$*" ] && echo "provide $*"
+}
+keyword() {
+ [ -n "$*" ] && echo "keyword $*"
+}
+
+# Describe the init script to the user
+describe()
+{
+ if [ -n "$description" ]; then
+ einfo "$description"
+ else
+ ewarn "No description for $RC_SVCNAME"
+ fi
+
+ local svc= desc=
+ for svc in ${extra_commands:-$opts} $extra_started_commands \
+ $extra_stopped_commands; do
+ eval desc=\$description_$svc
+ if [ -n "$desc" ]; then
+ einfo "$HILITE$svc$NORMAL: $desc"
+ else
+ ewarn "$HILITE$svc$NORMAL: no description"
+ fi
+ done
+}
+
+# Report status
+_status()
+{
+ if service_stopping; then
+ ewarn "status: stopping"
+ return 4
+ elif service_starting; then
+ ewarn "status: starting"
+ return 8
+ elif service_inactive; then
+ ewarn "status: inactive"
+ return 16
+ elif service_started; then
+ if service_crashed; then
+ eerror "status: crashed"
+ return 32
+ fi
+ einfo "status: started"
+ return 0
+ else
+ einfo "status: stopped"
+ return 3
+ fi
+}
+
+# Template start / stop / status functions
+start()
+{
+ [ -n "$command" ] || return 0
+ local _background=
+ ebegin "Starting ${name:-$RC_SVCNAME}"
+ if yesno "${command_background}"; then
+ if [ -z "${pidfile}" ]; then
+ eend 1 "command_background option used but no pidfile specified"
+ return 1
+ fi
+ _background="--background --make-pidfile"
+ fi
+ if yesno "$start_inactive"; then
+ local _inactive=false
+ service_inactive && _inactive=true
+ mark_service_inactive
+ fi
+ eval start-stop-daemon --start \
+ --exec $command \
+ ${chroot:+--chroot} $chroot \
+ ${procname:+--name} $procname \
+ ${pidfile:+--pidfile} $pidfile \
+ $_background $start_stop_daemon_args \
+ -- $command_args
+ if eend $? "Failed to start $RC_SVCNAME"; then
+ service_set_value "command" "${command}"
+ [ -n "${chroot}" ] && service_set_value "chroot" "${chroot}"
+ [ -n "${pidfile}" ] && service_set_value "pidfile" "${pidfile}"
+ [ -n "${procname}" ] && service_set_value "procname" "${procname}"
+ return 0
+ fi
+ if yesno "$start_inactive"; then
+ if ! $_inactive; then
+ mark_service_stopped
+ fi
+ fi
+ return 1
+}
+
+stop()
+{
+ local startcommand="$(service_get_value "command")"
+ local startchroot="$(service_get_value "chroot")"
+ local startpidfile="$(service_get_value "pidfile")"
+ local startprocname="$(service_get_value "procname")"
+ command="${startcommand:-$command}"
+ chroot="${startchroot:-$chroot}"
+ pidfile="${startpidfile:-$pidfile}"
+ procname="${startprocname:-$procname}"
+ [ -n "$command" -o -n "$procname" -o -n "$pidfile" ] || return 0
+ ebegin "Stopping ${name:-$RC_SVCNAME}"
+ start-stop-daemon --stop \
+ ${retry:+--retry} $retry \
+ ${command:+--exec} $command \
+ ${procname:+--name} $procname \
+ ${pidfile:+--pidfile} $chroot$pidfile \
+ ${stopsig:+--signal} $stopsig
+ eend $? "Failed to stop $RC_SVCNAME"
+}
+
+status()
+{
+ _status
+}
+
+yesno $RC_DEBUG && set -x
+
+_conf_d=${RC_SERVICE%/*}/../conf.d
+# If we're net.eth0 or openvpn.work then load net or openvpn config
+_c=${RC_SVCNAME%%.*}
+if [ -n "$_c" -a "$_c" != "$RC_SVCNAME" ]; then
+ if ! sourcex -e "$_conf_d/$_c.$RC_RUNLEVEL"; then
+ sourcex -e "$_conf_d/$_c"
+ fi
+fi
+unset _c
+
+# Overlay with our specific config
+if ! sourcex -e "$_conf_d/$RC_SVCNAME.$RC_RUNLEVEL"; then
+ sourcex -e "$_conf_d/$RC_SVCNAME"
+fi
+unset _conf_d
+
+# Load any system overrides
+sourcex -e "@SYSCONFDIR@/rc.conf"
+
+# Set verbose mode
+if yesno "${rc_verbose:-$RC_VERBOSE}"; then
+ EINFO_VERBOSE=yes
+ export EINFO_VERBOSE
+fi
+
+for _cmd; do
+ if [ "$_cmd" != status -a "$_cmd" != describe ]; then
+ # Apply any ulimit defined
+ [ -n "${rc_ulimit:-$RC_ULIMIT}" ] && \
+ ulimit ${rc_ulimit:-$RC_ULIMIT}
+ # Apply cgroups settings if defined
+ if [ "$(command -v cgroup_add_service)" = \
+ "cgroup_add_service" ]
+ then
+ if [ -d /sys/fs/cgroup -a ! -w /sys/fs/cgroup ]; then
+ eerror "No permission to apply cgroup settings"
+ break
+ fi
+ cgroup_add_service /sys/fs/cgroup/openrc
+ cgroup_add_service /sys/fs/cgroup/systemd/system
+ fi
+ [ "$(command -v cgroup_set_limits)" = \
+ "cgroup_set_limits" ] && \
+ cgroup_set_limits
+ break
+ fi
+done
+
+# Load our script
+sourcex "$RC_SERVICE"
+
+for _d in $required_dirs; do
+ if [ ! -d $_d ]; then
+ eerror "$RC_SVCNAME: \`$_d' is not a directory"
+ exit 1
+ fi
+done
+unset _d
+
+for _f in $required_files; do
+ if [ ! -r $_f ]; then
+ eerror "$RC_SVCNAME: \`$_f' is not readable"
+ exit 1
+ fi
+done
+unset _f
+
+if [ -n "$opts" ]; then
+ ewarn "Use of the opts variable is deprecated and will be"
+ ewarn "removed in the future."
+ ewarn "Please use extra_commands, extra_started_commands or extra_stopped_commands."
+fi
+
+while [ -n "$1" ]; do
+ # Special case depend
+ if [ "$1" = depend ]; then
+ shift
+
+ # Enter the dir of the init script to fix the globbing
+ # bug 412677
+ cd ${RC_SERVICE%/*}
+ _depend
+ cd /
+ continue
+ fi
+ # See if we have the required function and run it
+ for _cmd in describe start stop status ${extra_commands:-$opts} \
+ $extra_started_commands $extra_stopped_commands
+ do
+ if [ "$_cmd" = "$1" ]; then
+ if [ "$(command -v "$1")" = "$1" ]; then
+ # If we're in the background, we may wish to
+ # fake some commands. We do this so we can
+ # "start" ourselves from inactive which then
+ # triggers other services to start which
+ # depend on us.
+ # A good example of this is openvpn.
+ if yesno $IN_BACKGROUND; then
+ for _cmd in $in_background_fake; do
+ if [ "$_cmd" = "$1" ]; then
+ shift
+ continue 3
+ fi
+ done
+ fi
+ # Check to see if we need to be started before
+ # we can run this command
+ for _cmd in $extra_started_commands; do
+ if [ "$_cmd" = "$1" ]; then
+ if verify_boot && ! service_started; then
+ eerror "$RC_SVCNAME: cannot \`$1' as it has not been started"
+ exit 1
+ fi
+ fi
+ done
+ # Check to see if we need to be stopped before
+ # we can run this command
+ for _cmd in $extra_stopped_commands; do
+ if [ "$_cmd" = "$1" ]; then
+ if verify_boot && ! service_stopped; then
+ eerror "$RC_SVCNAME: cannot \`$1' as it has not been stopped"
+ exit 1
+ fi
+ fi
+ done
+ unset _cmd
+ case $1 in
+ start|stop|status) verify_boot;;
+ esac
+ if [ "$(command -v "$1_pre")" = "$1_pre" ]
+ then
+ "$1"_pre || exit $?
+ fi
+ "$1" || exit $?
+ if [ "$(command -v "$1_post")" = "$1_post" ]
+ then
+ "$1"_post || exit $?
+ fi
+ [ "$(command -v cgroup_cleanup)" = "cgroup_cleanup" -a \
+ "$1" = "stop" ] && \
+ yesno "${rc_cgroup_cleanup}" && \
+ cgroup_cleanup
+ shift
+ continue 2
+ else
+ if [ "$_cmd" = "start" -o "$_cmd" = "stop" ]
+ then
+ shift
+ continue 2
+ else
+ eerror "$RC_SVCNAME: function \`$1' defined but does not exist"
+ exit 1
+ fi
+ fi
+ fi
+ done
+ eerror "$RC_SVCNAME: unknown function \`$1'"
+ exit 1
+done
+
+exit 0