shinyscripts/tools/rc.d

133 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions
# print usage and exit
usage() {
local name=${0##*/}
cat >&2 << EOF
usage: $name <action> [options] [daemons]
options:
-s, --started Filter started daemons
-S, --stopped Filter stopped daemons
-a, --auto Filter auto started daemons
-A, --noauto Filter manually started daemons
<daemons> is a space separated list of script in /etc/rc.d
<action> can be a start, stop, restart, reload, status, ...
WARNING: initscripts are free to implement or not the above actions.
e.g: $name list
$name list sshd gpm
$name list --started gpm
$name start sshd gpm
$name help
EOF
exit ${1:-1}
}
# filter list of daemons
filter_daemons() {
local -a new_daemons=()
for daemon in "${daemons[@]}"; do
# check if daemons is valid
if ! have_daemon "$daemon"; then
exit 2
fi
# check filter
(( ${filter[started]} )) && ck_daemon "$daemon" && continue
(( ${filter[stopped]} )) && ! ck_daemon "$daemon" && continue
(( ${filter[auto]} )) && ck_autostart "$daemon" && continue
(( ${filter[noauto]} )) && ! ck_autostart "$daemon" && continue
new_daemons+=("$daemon")
done
daemons=("${new_daemons[@]}")
}
(( $# < 1 )) && usage
# ret store the return code of rc.d
declare -i ret=0
# daemons store daemons on which action will be executed
declare -a daemons=()
# filter store current filter mode
declare -A filter=([started]=0 [stopped]=0 [auto]=0 [noauto]=0)
# parse options
argv=$(getopt -l 'started,stopped,auto,noauto' -- 'sSaA' "$@") || usage
eval set -- "$argv"
# create an initial daemon list
while [[ "$1" != -- ]]; do
case "$1" in
-s|--started) filter[started]=1 ;;
-S|--stopped) filter[stopped]=1 ;;
-a|--auto) filter[auto]=1 ;;
-A|--noauto) filter[noauto]=1 ;;
esac
shift
done
# remove --
shift
# get action
action=$1
shift
# get initial daemons list
for daemon; do
daemons+=("$daemon")
done
# going into script directory
cd /etc/rc.d
case $action in
help)
usage 0 2>&1
;;
list)
# list take all daemons by default
[[ -z $daemons ]] && for d in *; do [[ -f /etc/rc.d/"$d" && -x /etc/rc.d/"$d" ]] && daemons+=("$d"); done
filter_daemons
for daemon in "${daemons[@]}"; do
# print running / stopped status
if ! ck_daemon "$daemon"; then
s_status="${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
else
s_status="${C_OTHER}[${C_FAIL}STOPPED${C_OTHER}]"
fi
# print auto / manual status
if ! ck_autostart "$daemon"; then
s_auto="${C_OTHER}[${C_DONE}AUTO${C_OTHER}]"
else
s_auto="${C_OTHER}[${C_FAIL} ${C_OTHER}]"
fi
printf "$s_status$s_auto${C_CLEAR} $daemon\n"
done
;;
*)
# other actions need an explicit daemons list
[[ -z $daemons ]] && usage
filter_daemons
# set same environment variables as init
runlevel=$(/usr/bin/runlevel)
ENV=('PATH=/usr/bin'
"PREVLEVEL=${runlevel%% *}"
"RUNLEVEL=${runlevel##* }"
"CONSOLE=${CONSOLE:-/dev/console}"
"TERM=$TERM")
cd /
for daemon in "${daemons[@]}"; do
env -i "${ENV[@]}" "/etc/rc.d/$daemon" "$action"
(( ret += !! $? )) # clamp exit value to 0/1
done
;;
esac
exit $ret
# vim: set ts=2 sw=2 ft=sh noet: