Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137797839
D451.id15556.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D451.id15556.diff
View Options
Index: usr.sbin/service/service.sh
===================================================================
--- usr.sbin/service/service.sh
+++ usr.sbin/service/service.sh
@@ -3,6 +3,8 @@
# $FreeBSD$
# Copyright (c) 2009 Douglas Barton
+# Copyright (c) 2014 Lars Engels
+# Copyright (c) 2016 Allan Jude <allanjude@FreeBSD.org>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -32,16 +34,21 @@
usage () {
echo ''
echo 'Usage:'
- echo "${0##*/} -e"
- echo "${0##*/} -R"
+ echo "${0##*/} [-c /path/to/rc.conf] <name> enable|disable|delete|opts"
+ echo "${0##*/} -e [-n]"
echo "${0##*/} [-v] -l | -r"
- echo "${0##*/} [-v] <rc.d script> start|stop|etc."
+ echo "${0##*/} -R"
+ echo "${0##*/} -s"
+ echo "${0##*/} [-v] <name> start|stop|..."
echo "${0##*/} -h"
echo ''
+ echo '-c Operate on a specific config file'
echo '-e Show services that are enabled'
- echo "-R Stop and start enabled $local_startup services"
echo "-l List all scripts in /etc/rc.d and $local_startup"
+ echo '-n Display service name, rather than path to rc.d script'
echo '-r Show the results of boot time rcorder'
+ echo "-R Stop and start enabled $local_startup services"
+ echo '-s Show status of all services that are enabled'
echo '-v Verbose'
echo ''
}
@@ -61,13 +68,97 @@
' -- "$@" )"
}
-while getopts 'ehlrRv' COMMAND_LINE_ARGUMENT ; do
+do_rc_action () {
+ script=$1
+ action=$2
+
+ cd /
+ _rcd=
+ for dir in /etc/rc.d $local_startup; do
+ if [ -x "$dir/$script" ]; then
+ if grep -q ^rcvar "$dir/$script"; then
+ _rcd="$dir/$script"
+ load_script_vars $file name rcvar
+ if [ -n "$name" -a -n "$rcvar" ]; then
+ load_rc_config_var ${name} ${rcvar}
+ fi
+ fi
+ fi
+ done
+ if [ -z "$rcvar" ]; then
+ if [ -n "$VERBOSE" ]; then
+ echo "Unable to determine rcvar for $script"
+ fi
+ exit 1
+ fi
+
+ _sysrc_flags="-s $name -e"
+ if [ -d "/etc/rc.conf.d" ]; then
+ _conf="${CONFFILE:-/etc/rc.conf.d/$name}"
+ _sysrc_conf="-f $_conf"
+ else
+ _conf="${CONFFILE:-/etc/rc.conf}"
+ fi
+ CONFDIR="$( dirname "$_conf" )"
+ if [ ! -e "$CONFDIR" ]; then
+ mkdir -p "$CONFDIR"
+ fi
+ case "$action" in
+ "enable")
+ /usr/sbin/sysrc $_sysrc_conf $_sysrc_flags $rcvar=YES
+ exitflag=$?
+ ;;
+ "disable")
+ /usr/sbin/sysrc $_sysrc_conf $_sysrc_flags $rcvar=NO
+ exitflag=$?
+ ;;
+ "delete")
+ /usr/sbin/sysrc $_sysrc_conf $_sysrc_flags -x $rcvar
+ exitflag=$?
+ ;;
+ "opts")
+ _rcopts=
+ _oifs=$IFS
+ IFS='
+ '
+ for _l in $(grep '^: ${' $_rcd); do
+ _v=${_l##: \$\{} #strip leading bits
+ _v=${_v%%:*} #strip conditional sets
+ _v=${_v%%=*} #strip unconditional sets
+ if [ -z "$_v" ]; then
+ continue
+ fi
+ _rcopts="$_rcopts $_v"
+ done
+ IFS=$_oifs
+
+ echo "$rcvar"
+ for _v in $_rcopts; do
+ if [ "$_v" = "$rcvar" ]; then
+ continue
+ fi
+ echo $_v
+ done
+ ;;
+ *)
+ echo "Error: unexpected action $action"
+ exit 1
+ ;;
+ esac
+
+ return $exitflag
+}
+
+while getopts 'c:ehlnrRsv' COMMAND_LINE_ARGUMENT ; do
case "${COMMAND_LINE_ARGUMENT}" in
+ c) CONFFILE=$OPTARG ;;
e) ENABLED=eopt ;;
h) usage ; exit 0 ;;
l) LIST=lopt ;;
+ n) NAME=nopt ;;
r) RCORDER=ropt ;;
R) RESTART=Ropt ;;
+ s) ENABLED=sopt ;;
v) VERBOSE=vopt ;;
*) usage ; exit 1 ;;
esac
@@ -88,13 +179,18 @@
if [ -n "$name" -a -n "$rcvar" ]; then
load_rc_config_var ${name} ${rcvar}
fi
- checkyesno $rcvar 2>/dev/null && run_rc_script ${file} stop
+ checkyesno $rcvar 2>/dev/null &&
+ run_rc_script "${file}" stop
fi
done
for file in $files; do
- if grep -q ^rcvar $file; then
+ if grep -q ^rcvar "$file"; then
load_script_vars $file name rcvar
- checkyesno $rcvar 2>/dev/null && run_rc_script ${file} start
+ if [ -n "$name" -a -n "$rcvar" ]; then
+ load_rc_config_var ${name} ${rcvar}
+ fi
+ checkyesno $rcvar 2>/dev/null &&
+ run_rc_script "${file}" start
fi
done
@@ -113,12 +209,32 @@
if [ -n "$ENABLED" ]; then
for file in $files; do
- if grep -q ^rcvar $file; then
+ if grep -q ^rcvar "$file"; then
load_script_vars $file name rcvar
if [ -n "$name" -a -n "$rcvar" ]; then
load_rc_config_var ${name} ${rcvar}
fi
- checkyesno $rcvar 2>/dev/null && echo $file
+ if [ "$ENABLED" = "eopt" ]; then
+ if [ -n "$NAME" -a -n "$name" ]; then
+ checkyesno $rcvar 2>/dev/null &&
+ echo $name
+ else
+ checkyesno $rcvar 2>/dev/null &&
+ echo $file
+ fi
+ elif [ "$ENABLED" = "sopt" ]; then
+ # Not all services have 'status', only those
+ # with a command defined
+ command=
+ load_script_vars $file command
+ if [ -n "$command" -a ]; then
+ load_rc_config_var ${name} command
+ fi
+ if [ -n "$command" ]; then
+ checkyesno $rcvar 2>/dev/null &&
+ run_rc_script "${file}" quietstatus
+ fi
+ fi
fi
done
exit 0
@@ -127,7 +243,7 @@
if [ -n "$LIST" ]; then
for dir in /etc/rc.d $local_startup; do
[ -n "$VERBOSE" ] && echo "From ${dir}:"
- [ -d ${dir} ] && /bin/ls -1 ${dir}
+ [ -d "${dir}" ] && /bin/ls -1 "${dir}"
done
exit 0
fi
@@ -153,11 +269,22 @@
exit 1
fi
+case "$1" in
+ enable | disable | delete | opts)
+ # Special command, further processing required
+ do_rc_action "$script" "$1"
+ exit $?
+ ;;
+ *)
+ # Regular command, fall through to normal processing
+ ;;
+esac
+
cd /
for dir in /etc/rc.d $local_startup; do
if [ -x "$dir/$script" ]; then
[ -n "$VERBOSE" ] && echo "$script is located in $dir"
- exec env -i HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin $dir/$script $*
+ exec env -i HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin "$dir/$script" "$@"
fi
done
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 26, 10:03 PM (2 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26232443
Default Alt Text
D451.id15556.diff (5 KB)
Attached To
Mode
D451: Add new switches to service(8): enable, disable, rcopts and rcdelete
Attached
Detach File
Event Timeline
Log In to Comment