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 # 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] enable|disable|delete|opts" + echo "${0##*/} -e [-n]" echo "${0##*/} [-v] -l | -r" - echo "${0##*/} [-v] start|stop|etc." + echo "${0##*/} -R" + echo "${0##*/} -s" + echo "${0##*/} [-v] 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