[arch-projects] [INITSCRIPTS][PATCH] rc.d: handle a set of options

Lukas Fleischer archlinux at cryptocrack.de
Tue Aug 23 11:49:49 EDT 2011


On Tue, Aug 23, 2011 at 05:35:47PM +0200, Seblu wrote:
> On Tue, Aug 23, 2011 at 4:58 PM, Lukas Fleischer
> <archlinux at cryptocrack.de> wrote:
> > On Tue, Aug 23, 2011 at 03:32:32PM +0200, Sebastien Luttringer wrote:
> [...]
> >> +# 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?

Yes, why not? There currently isn't any other simple way to stop all
running daemons, so `rc.d stop` (or `rc.d stop --started`) should be
perfectly fine. I don't see any reason to use a different logic here.
Anyway, even if you don't want to support that, just add a simple
oneliner that checks if no options and daemons are specified and the
action is != "list". No need for using separate loops that can be
refactored into a single location.


More information about the arch-projects mailing list