[*] First commit
This commit is contained in:
132
tools/rc.d
Executable file
132
tools/rc.d
Executable file
@ -0,0 +1,132 @@
|
||||
#!/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:
|
Reference in New Issue
Block a user