[arch-projects] [INITSCRIPTS][PATCH] rc.d: list [started|stopped|auto|noauto|daemon]

Lukas Fleischer archlinux at cryptocrack.de
Tue Aug 23 04:01:05 EDT 2011


On Mon, Aug 22, 2011 at 08:21:07PM +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
> 
> Signed-off-by: Sebastien Luttringer <seblu at seblu.net>
> ---
>  bash-completion |    2 +-
>  rc.d            |   71 ++++++++++++++++++++++++++++++++++++++----------------
>  zsh-completion  |    2 +-
>  3 files changed, 52 insertions(+), 23 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 3d34edf..81a07eb 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
> @@ -17,40 +18,68 @@ WARNING: initscripts are free to implement or not the above actions.
>  
>  e.g: $name list
>       $name list started
> +     $name list sshd gpm
>       $name help
>       $name start sshd gpm
>  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=(${daemons[@]} "$p");;

Hm, wouldn't that mean we would never be able to explicitly list daemons
called "started", "stopped", "auto" and "noauto"? I know that this is
nit-picking, but I would prefer another argument "daemons" or "all",
followed by a list of daemons, so we could use:

* `rc.d list daemons` to list all daemons (or just `rc.d list`).
* `rc.d list started` to list all running daemons.
* `rc.d list daemons sshd gpm` to list specific daemons only.
* `rc.d list started sshd gpm` to list specific running daemons only.

Also, you should not indent mixing tabs and spaces. This breaks
indentation for everyone using a different tab width.

> +		esac
> +	done
> +	# if no daemon are specified take all executable file in /etc/rc.d
> +	if ! [[ $daemons ]]; then

"[[ ! $daemons ]]". Or any reason to do the negation outside the
conditional expression here?

> +		cd /etc/rc.d
> +		for d in *; do
> +			[[ -x "$d" && ! -d "$d" ]] && daemons=(${daemons[@]} "$d")

'daemons=("${daemons[@]}" "$d")'. Just to be sure we don't fail here if
a daemon ever contains a space (and since you used proper quoting
everywhere else).

> +		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..b324e5c 100644
> --- a/zsh-completion
> +++ b/zsh-completion
> @@ -19,7 +19,7 @@ _rc.d () {
>  					_arguments "*: :"
>  					;;
>  				list)
> -					_arguments "2: :(started stopped)"
> +					_arguments "*: :(started stopped auto noauto $(echo /etc/rc.d/*(N-*:t)))"

Whey, another winner of the "Useless use of echo" award [1]! :)

>  					;;
>  				start)
>  					_arguments "*: :($(comm -23 <(echo /etc/rc.d/*(N-*:t)|tr ' ' '\n') <(echo /run/daemons/*(N:t)|tr ' ' '\n')))"
> -- 
> Sebastien "Seblu" Luttringer

[1] http://partmaps.org/era/unix/award.html#echo


More information about the arch-projects mailing list