On Tue, Aug 23, 2011 at 4:58 PM, Lukas Fleischer <[email protected]> wrote: > On Tue, Aug 23, 2011 at 03:32:32PM +0200, Sebastien Luttringer wrote: >> rc.d can now take --started, --stopped, --auto, --noauto as option which >> help user to populate list of daemon for all actions >> >> As a corollary list command can now take a list of dameon to display >> All kind of arguments can be mixed to obtain the proper output. >> >> zsh and bash completion are updated >> >> Note: Output of help command exit 0 and is no more printed on stderr >> >> Signed-off-by: Sebastien Luttringer <[email protected]> >> --- >> bash-completion | 20 +++++----- >> rc.d | 109 >> ++++++++++++++++++++++++++++++++++++++----------------- >> zsh-completion | 5 +-- >> 3 files changed, 86 insertions(+), 48 deletions(-) >> >> diff --git a/bash-completion b/bash-completion >> index d78484e..1df229e 100644 >> --- a/bash-completion >> +++ b/bash-completion >> @@ -3,20 +3,20 @@ >> _rc_d() >> { >> local action cur prev >> - action="help list start stop reload restart" >> + actions='help list start stop reload restart' >> + options='--started --stopped --auto --noauto' >> _get_comp_words_by_ref cur prev >> - if ((COMP_CWORD == 1)); then >> - COMPREPLY=($(compgen -W "${action}" -- "$cur")) >> - elif [[ "$prev" == help ]]; then >> + _get_first_arg >> + if [[ -z "$arg" ]]; then >> + COMPREPLY=($(compgen -W "${actions} ${options}" -- "$cur")) >> + elif [[ "$arg" == help ]]; then >> COMPREPLY=() >> - elif [[ "$prev" == list ]]; then >> - ((COMP_CWORD == 2)) && COMPREPLY=($(compgen -W "started >> stopped" -- "$cur")) || COMPREPLY=() >> - elif [[ "$prev" == start ]]; then >> + elif [[ "$arg" == start ]]; then >> COMPREPLY=($(comm -23 <(cd /etc/rc.d && compgen -f -X >> 'functions*' "$cur"|sort) <(cd /run/daemons/ && compgen -f "$cur"|sort))) >> - elif [[ "$prev" =~ stop|restart|reload ]]; then >> + elif [[ "$arg" =~ stop|restart|reload ]]; then >> COMPREPLY=($(cd /run/daemons/ && compgen -f "$cur"|sort)) >> - elif ((COMP_CWORD > 1)); then >> - COMPREPLY=($(cd /etc/rc.d && compgen -f -X 'functions*' >> "$cur"|sort)) >> + else >> + COMPREPLY=($(compgen -W "${options} $(cd /etc/rc.d && compgen >> -f -X 'functions*')" -- "$cur")) >> fi >> } >> complete -F _rc_d rc.d >> diff --git a/rc.d b/rc.d >> index 9b0f092..907439b 100755 >> --- a/rc.d >> +++ b/rc.d >> @@ -4,74 +4,115 @@ 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 [options] <action> [daemons] > > "usage: $name <action> [options] [daemons]". Although it doesn't really > matter, `rc.d list --started` should be the default way of specifying > arguments, see your examples further below. > >> >> -<daemon> is the name of a script in /etc/rc.d >> +options: >> + --started Append started daemons to the list >> + --stopped Append stopped dameons to the list >> + --auto Append autostarted daemons to the list >> + --noauto Append not autostarted daemons to the list >> + >> +<daemons> is space separated list of script in /etc/rc.d > > ... is *a* space separated list of script*s*. > >> <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} >> } >> >> (( $# < 1 )) && usage >> >> +# parse options >> +argv=$(getopt -l 'started,stopped,auto,noauto' -- '' "$@") >> +(( $? )) && usage > > `argv=$(getopt -l 'started,stopped,auto,noauto' -- '' "$@") || usage`. > >> +eval set -- "$argv" >> + >> +# going into script directory >> +cd /etc/rc.d >> + >> +# create an initial daemon list >> +declare -a daemons=() >> +while [[ "$1" != -- ]]; do >> + case "$1" in >> + --started) >> + for d in *; do have_daemon "$d" && ! ck_daemon "$d" && >> daemons+=("$d"); done >> + ;; >> + --stopped) >> + for d in *; do have_daemon "$d" && ck_daemon "$d" && >> daemons+=("$d"); done >> + ;; >> + --auto) >> + for d in *; do have_daemon "$d" && ! ck_autostart "$d" >> && daemons+=("$d"); done >> + ;; >> + --noauto) >> + for d in *; do have_daemon "$d" && ck_autostart "$d" >> && daemons+=("$d"); done >> + ;; > > Oh. I thought of an implicit conjunction over the single filter options > here. This is advantageous if you want to list running auto-started > daemons (`rc.d list --started --auto`) etc. I would just set some flag > when parsing the options and filter the daemon list in a single loop > later on (which is faster, also). > >> + esac >> + shift >> +done >> + >> +# remove -- >> +shift >> +# get action >> +action=$1 >> +shift >> + >> +# add daemons >> +for daemon; do >> + 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 >> + daemons+=("$daemon") >> +done > > Same here. Explicitly specified daemons should not be added to the list, > but used as input to the filter options (if any). I would suggest > following procedure: > > Iterate over the daemons specified on the command line if any, > "/etc/rc.d/*" otherwise: > > * Set some flag to 1 (indicating whether the daemon will be included in > the list or not). > > * If "--started" or "--stopped" are specified (you stored this in some > other flag earlier), possibly reset the flag to 0, depending on what > ck_daemon() returns. > > * Do the same thing with "--auto" or "--noauto" (and ck_autostart()). > > * Add the daemon to some array if the flag is still set to 1. > > This removes the need for special treatment in any of the action cases > below, also.
What's append if you type rc.d stop with you algo? You stop all your daemon? For the list command, we want no daemon = all daemon. For all others, we don't want. I would escape populate the list of daemons if action is list before being in list context. using --option as a filter is more in tune with pacman. -- Sébastien Luttringer www.seblu.net
