[arch-projects] [INITSCRIPTS][PATCH 4/4] rc.d: list [started|stopped|auto|noauto|daemon]
Lukas Fleischer
archlinux at cryptocrack.de
Tue Aug 23 06:19:30 EDT 2011
On Tue, Aug 23, 2011 at 11:05:56AM +0200, Sebastien Luttringer wrote:
> list command can take new arguments auto/noauto.
> list command can take a list of daemon to list.
>
> All kind of arguments can be mixed to obtain the proper output.
>
> zsh and bash completion are updated
>
> /daemon allow to call named dameon like /auto call daemon auto
>
> Signed-off-by: Sebastien Luttringer <seblu at seblu.net>
> ---
> bash-completion | 2 +-
> rc.d | 77 ++++++++++++++++++++++++++++++++++++++----------------
> zsh-completion | 2 +-
> 3 files changed, 56 insertions(+), 25 deletions(-)
>
> diff --git a/bash-completion b/bash-completion
> index d78484e..718df6d 100644
> --- a/bash-completion
> +++ b/bash-completion
> @@ -10,7 +10,7 @@ _rc_d()
> elif [[ "$prev" == help ]]; then
> COMPREPLY=()
> elif [[ "$prev" == list ]]; then
> - ((COMP_CWORD == 2)) && COMPREPLY=($(compgen -W "started stopped" -- "$cur")) || COMPREPLY=()
> + COMPREPLY=($(compgen -W "started stopped auto noauto $(cd /etc/rc.d && compgen -f -X 'functions*')" -- "$cur"))
> elif [[ "$prev" == 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
> diff --git a/rc.d b/rc.d
> index 9b0f092..9417e90 100755
> --- a/rc.d
> +++ b/rc.d
> @@ -4,11 +4,12 @@ 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 list [started|stopped|auto|noauto|daemon]
> $name help
>
> <daemon> is the name of a script in /etc/rc.d
> @@ -16,41 +17,71 @@ usage: $name <action> <daemon> [daemon] ...
> 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 #all started daemons
> + $name list /started #daemon nammed started
Eeeeew. Don't do that.. Please! Three suggestions:
* Just be okay with "started" being ambiguous. There probably won't be
any daemon called {started,stopped,auto,noauto} in the next 100 years.
This is all about doing it "right". If Tom and you are fine with
ambiguity, keep the way you did it in the first submission.
* Do what I suggested in my first reply to the first version of this
patch and introduce a separate keyword.
* Use some separator like "--" to specify that there won't be any
further commands. `rc.d list started` will list all started daemons.
`rc.d list -- started auto` will list daemons called "started" and
"auto".
... but for the sake of god, please don't use "/" as some weird kind of
escape character.
> $name start sshd gpm
> + $name help
> EOF
> exit 1
> }
>
> +# list action
> +list() {
> + local mode s_status s_auto
> + local -a daemons
> + # parse arguments
> + for p; do
> + case "$p" in
> + started) mode=started;;
> + stopped) mode=stopped;;
> + auto) mode=auto;;
> + noauto) mode=noauto;;
> + /*) daemons+=("${p:1}");;
> + *) daemons+=("$p");;
This is still screwed up. Use some tab width != 2 to see what I mean.
> + esac
> + done
> + # if no daemon are specified take all executable file in /etc/rc.d
> + if [[ ! $daemons ]]; then
:)
> + cd /etc/rc.d
> + for d in *; do
> + [[ -x "$d" && ! -d "$d" ]] && daemons+=("$d")
Yeah, this looks way better now.
> + done
> + fi
> + # building string to display
> + for d in "${daemons[@]}"; do
> + # check if d is a valid daemon name
> + have_daemon "$d" || continue
> + # print running / stopped satus
> + if ! ck_daemon "$d"; then
> + [[ $mode == stopped ]] && continue
> + s_status="${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
> + else
> + [[ $mode == started ]] && continue
> + s_status="${C_OTHER}[${C_FAIL}STOPPED${C_OTHER}]"
> + fi
> + # print auto / manual status
> + if ! ck_autostart "$d"; then
> + [[ $mode == noauto ]] && continue
> + s_auto="${C_OTHER}[${C_DONE}AUTO${C_OTHER}]"
> + else
> + [[ $mode == auto ]] && continue
> + s_auto="${C_OTHER}[${C_FAIL} ${C_OTHER}]"
> + fi
> + printf "$s_status$s_auto${C_CLEAR} $d\n"
> + done
> +}
> +
> (( $# < 1 )) && usage
>
> declare -i ret=0
> case $1 in
> help)
> usage
> - ;;
> + ;;
> list)
> shift
> - cd /etc/rc.d/
> - for d in *; do
> - have_daemon "$d" || continue
> - # print running / stopped satus
> - if ! ck_daemon "$d"; then
> - [[ "$1" == stopped ]] && continue
> - printf "${C_OTHER}[${C_DONE}STARTED${C_OTHER}]"
> - else
> - [[ "$1" == started ]] && continue
> - printf "${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}]"
> - else
> - printf "${C_OTHER}[${C_FAIL} ${C_OTHER}]"
> - fi
> - printf " ${C_CLEAR}$d\n"
> - done
> + list "$@"
> ;;
> *)
> # check min args count
> diff --git a/zsh-completion b/zsh-completion
> index e5c2850..27af29c 100644
> --- a/zsh-completion
> +++ b/zsh-completion
> @@ -19,7 +19,7 @@ _rc.d () {
> _arguments "*: :"
> ;;
> list)
> - _arguments "2: :(started stopped)"
> + _arguments "*: :(started stopped auto noauto /etc/rc.d/*(N-*:t))"
> ;;
> start)
> _arguments "*: :($(comm -23 <(echo /etc/rc.d/*(N-*:t)|tr ' ' '\n') <(echo /run/daemons/*(N:t)|tr ' ' '\n')))"
> --
> Sebastien "Seblu" Luttringer
More information about the arch-projects
mailing list