Page MenuHomeFreeBSD

D451.id15556.diff
No OneTemporary

D451.id15556.diff

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

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)

Event Timeline