service.sh revision 293728
1#!/bin/sh
2
3# $FreeBSD: stable/10/usr.sbin/service/service.sh 293728 2016-01-12 05:55:28Z allanjude $
4
5#  Copyright (c) 2009 Douglas Barton
6#  All rights reserved.
7#
8#  Redistribution and use in source and binary forms, with or without
9#  modification, are permitted provided that the following conditions
10#  are met:
11#  1. Redistributions of source code must retain the above copyright
12#     notice, this list of conditions and the following disclaimer.
13#  2. Redistributions in binary form must reproduce the above copyright
14#     notice, this list of conditions and the following disclaimer in the
15#     documentation and/or other materials provided with the distribution.
16#
17#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18#  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20#  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23#  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24#  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26#  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27#  SUCH DAMAGE.
28
29. /etc/rc.subr
30load_rc_config 'XXX'
31
32usage () {
33	echo ''
34	echo 'Usage:'
35	echo "${0##*/} -e"
36	echo "${0##*/} -R"
37	echo "${0##*/} [-v] -l | -r"
38	echo "${0##*/} [-v] <rc.d script> start|stop|etc."
39	echo "${0##*/} -h"
40	echo ''
41	echo '-e	Show services that are enabled'
42	echo "-R	Stop and start enabled $local_startup services"
43	echo "-l	List all scripts in /etc/rc.d and $local_startup"
44	echo '-r	Show the results of boot time rcorder'
45	echo '-v	Verbose'
46	echo ''
47}
48
49while getopts 'ehlrRv' COMMAND_LINE_ARGUMENT ; do
50	case "${COMMAND_LINE_ARGUMENT}" in
51	e)	ENABLED=eopt ;;
52	h)	usage ; exit 0 ;;
53	l)	LIST=lopt ;;
54	r)	RCORDER=ropt ;;
55	R)	RESTART=Ropt ;;
56	v)	VERBOSE=vopt ;;
57	*)	usage ; exit 1 ;;
58	esac
59done
60shift $(( $OPTIND - 1 ))
61
62if [ -n "$RESTART" ]; then
63	skip="-s nostart"
64	if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then
65		skip="$skip -s nojail"
66	fi
67	[ -n "$local_startup" ] && find_local_scripts_new
68	files=`rcorder ${skip} ${local_rc} 2>/dev/null`
69
70	for file in `reverse_list ${files}`; do
71		if grep -q ^rcvar $file; then
72			eval `grep ^name= $file`
73			eval `grep ^rcvar $file`
74			load_rc_config_var ${name} ${rcvar}
75			checkyesno $rcvar 2>/dev/null && run_rc_script ${file} stop
76		fi
77	done
78	for file in $files; do
79		if grep -q ^rcvar $file; then
80			eval `grep ^name= $file`
81			eval `grep ^rcvar $file`
82			checkyesno $rcvar 2>/dev/null && run_rc_script ${file} start
83		fi
84	done
85
86	exit 0
87fi
88
89if [ -n "$ENABLED" -o -n "$RCORDER" ]; then
90	# Copied from /etc/rc
91	skip="-s nostart"
92	if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then
93		skip="$skip -s nojail"
94	fi
95	[ -n "$local_startup" ] && find_local_scripts_new
96	files=`rcorder ${skip} /etc/rc.d/* ${local_rc} 2>/dev/null`
97fi
98
99if [ -n "$ENABLED" ]; then
100	for file in $files; do
101		if grep -q ^rcvar $file; then
102			eval `grep ^name= $file`
103			eval `grep ^rcvar $file`
104			load_rc_config_var ${name} ${rcvar}
105			checkyesno $rcvar 2>/dev/null && echo $file
106		fi
107	done
108	exit 0
109fi
110
111if [ -n "$LIST" ]; then
112	for dir in /etc/rc.d $local_startup; do
113		[ -n "$VERBOSE" ] && echo "From ${dir}:"
114		[ -d ${dir} ] && /bin/ls -1 ${dir}
115	done
116	exit 0
117fi
118
119if [ -n "$RCORDER" ]; then
120	for file in $files; do
121		echo $file
122		if [ -n "$VERBOSE" ]; then
123			case "$file" in
124			*/${early_late_divider})
125				echo '========= Early/Late Divider =========' ;;
126			esac
127		fi
128	done
129	exit 0
130fi
131
132if [ $# -gt 1 ]; then
133	script=$1
134	shift
135else
136	usage
137	exit 1
138fi
139
140cd /
141for dir in /etc/rc.d $local_startup; do
142	if [ -x "$dir/$script" ]; then
143		[ -n "$VERBOSE" ] && echo "$script is located in $dir"
144		exec env -i HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin $dir/$script $*
145	fi
146done
147
148# If the script was not found
149echo "$script does not exist in /etc/rc.d or the local startup"
150echo "directories (${local_startup})"
151exit 1
152