On Tue, Aug 23, 2011 at 4:58 PM, Lukas Fleischer <archlinux@cryptocrack.de> 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 <seblu@seblu.net> --- 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