aboutsummaryrefslogtreecommitdiff
path: root/rc.d
diff options
context:
space:
mode:
Diffstat (limited to 'rc.d')
-rwxr-xr-xrc.d124
1 files changed, 89 insertions, 35 deletions
diff --git a/rc.d b/rc.d
index 9b0f092..3f2835e 100755
--- a/rc.d
+++ b/rc.d
@@ -4,74 +4,128 @@ NEED_ROOT=0 # this script can be run without be root
. /etc/rc.conf
. /etc/rc.d/functions
+# print usage and exit
usage() {
local name=${0##*/}
cat >&2 << EOF
-usage: $name <action> <daemon> [daemon] ...
- $name list [started|stopped]
- $name help
+usage: $name <action> [options] [daemons]
-<daemon> is the name of a script in /etc/rc.d
+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 started
- $name help
+ $name list sshd gpm
+ $name list --started gpm
$name start sshd gpm
+ $name stop --noauto
+ $name help
EOF
- exit 1
+ 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
+ printf "${C_FAIL}:: ${C_DONE}Dameon script ${C_FAIL}${daemon}${C_DONE} does \
+not exist or is not executable.${C_CLEAR}\n" >&2
+ exit 2
+ fi
+ # check filter
+ ((${filter[started]} == 1)) && ck_daemon "$daemon" && continue
+ ((${filter[stopped]} == 1)) && ! ck_daemon "$daemon" && continue
+ ((${filter[auto]} == 1)) && ck_autostart "$daemon" && continue
+ ((${filter[noauto]} == 1)) && ! 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
-case $1 in
+# 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
- ;;
+ usage 0 2>&1
+ ;;
list)
- shift
- cd /etc/rc.d/
- for d in *; do
- have_daemon "$d" || continue
+ # list take all daemons by default
+ [[ -z $daemons ]] && for d in *; do have_daemon "$d" && daemons+=("$d"); done
+ filter_daemons
+ for daemon in "${daemons[@]}"; do
# print running / stopped satus
- if ! ck_daemon "$d"; then
- [[ "$1" == stopped ]] && continue
- printf "${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
+ if ! ck_daemon "$daemon"; then
+ s_status="${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
else
- [[ "$1" == started ]] && continue
- printf "${C_OTHER}[${C_FAIL}STOPPED${C_OTHER}]"
+ s_status="${C_OTHER}[${C_FAIL}STOPPED${C_OTHER}]"
fi
# print auto / manual status
- if ! ck_autostart "$d"; then
- printf "${C_OTHER}[${C_DONE}AUTO${C_OTHER}]"
+ if ! ck_autostart "$daemon"; then
+ s_auto="${C_OTHER}[${C_DONE}AUTO${C_OTHER}]"
else
- printf "${C_OTHER}[${C_FAIL} ${C_OTHER}]"
+ s_auto="${C_OTHER}[${C_FAIL} ${C_OTHER}]"
fi
- printf " ${C_CLEAR}$d\n"
+ printf "$s_status$s_auto${C_CLEAR} $daemon\n"
done
;;
*)
- # check min args count
- (( $# < 2 )) && usage
- action=$1
- shift
+ # other actions need an explicit daemons list
+ [[ -z $daemons ]] && usage
+ filter_daemons
# set same environment variables as init
runlevel=$(/sbin/runlevel)
- ENV=("PATH=/bin:/usr/bin:/sbin:/usr/sbin"
+ ENV=('PATH=/bin:/usr/bin:/sbin:/usr/sbin'
"PREVLEVEL=${runlevel%% *}"
"RUNLEVEL=${runlevel##* }"
"CONSOLE=${CONSOLE:-/dev/console}"
"TERM=$TERM")
cd /
- for i; do
- if [[ -x "/etc/rc.d/$i" ]]; then
- env -i "${ENV[@]}" "/etc/rc.d/$i" "$action"
- else
- printf "${C_FAIL}:: ${C_DONE}Daemon ${C_FAIL}$i${C_DONE} does not exist \
-or is not executable${C_CLEAR}\n"
- fi
+ for daemon in "${daemons[@]}"; do
+ env -i "${ENV[@]}" "/etc/rc.d/$daemon" "$action"
(( ret += !! $? )) # clamp exit value to 0/1
done
;;