| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- #!@l_prefix@/lib/openpkg/bash
- ##
- ## @l_prefix@/etc/rc -- Run-Command Handling for OpenPKG Hierarchy
- ## Copyright (c) 2000-2001 Cable & Wireless Deutschland GmbH
- ## Copyright (c) 2000-2001 Ralf S. Engelschall <rse@engelschall.com>
- ##
- ## Permission to use, copy, modify, and distribute this software for
- ## any purpose with or without fee is hereby granted, provided that
- ## the above copyright notice and this permission notice appear in all
- ## copies.
- ##
- ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
- ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- ## SUCH DAMAGE.
- ##
- # program name, version and date
- progname="rc"
- progvers="1.0.8"
- progdate="02-Nov-2001"
- ##
- ## command line option parsing
- ##
- # default parameters
- verbose=0
- help=0
- print=0
- eval=0
- config=0
- query=0
- raw=0
- rcdir="@l_prefix@/etc/rc.d"
- # iterate over argument line
- while [ $# -gt 0 ]; do
- opt=$1
- case $opt in
- -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
- *) arg='' ;;
- esac
- case $opt in
- -v|--verbose ) verbose=1 ;;
- -h|--help ) help=1 ;;
- -p|--print ) print=1 ;;
- -e|--eval ) eval=1 ;;
- -c|--config ) config=1 ;;
- -q|--query ) query=1 ;;
- -r|--raw ) raw=1 ;;
- --rcdir=* ) rcdir=$arg ;;
- -* ) help="Invalid option \`$opt'"; break ;;
- * ) break ;;
- esac
- shift
- done
- # determine path to rc.conf
- rcconf="`echo $rcdir | sed -e 's;/rc.d$;/rc.conf;'`"
- rcfunc="`echo $rcdir | sed -e 's;/rc.d$;/rc.func;'`"
- # error or usage message
- if [ ".$help" != .0 ]; then
- if [ ".$help" != ".Usage" ]; then
- echo "$progname:ERROR: $help" 1>&2
- fi
- echo "Usage: $progname [-v|--verbose] [-h|--help]" 1>&2
- echo " [-p|--print] [-e|--eval] [-c|--config] [-q|--query] [-r|--raw]" 1>&2
- echo " <package> <command> [<command> ...]" 1>&2
- fi
- # extend run-time environment with our local tools (shtool, rpmtool, etc)
- PATH="@l_prefix@/bin:$PATH"
- PATH="@l_prefix@/sbin:$PATH"
- PATH="@l_prefix@/lib/openpkg:$PATH"
- # find a reasonable temporary location
- if [ ".$TMPDIR" != . ]; then
- tmpdir="$TMPDIR"
- elif [ ".$TEMPDIR" != . ]; then
- tmpdir="$TEMPDIR"
- else
- tmpdir="/tmp"
- fi
- tmpfile="$tmpdir/rc.$$.tmp"
- # handle --query option
- if [ ".$query" = .1 ]; then
- var="$1"
- scripts=`ls $rcdir/rc.* | sed -e "s;^$rcdir/rc\.;;"`
- rm -f $tmpfile
- touch $tmpfile
- for s_name in $scripts; do
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%config/d" -e '/^%.*/,$d'
- done
- . $tmpfile
- . $rcconf
- eval "echo \${$var}"
- exit 0
- fi
- # handle --config option
- if [ ".$config" = .1 ]; then
- scripts=`ls $rcdir/rc.* | sed -e "s;^$rcdir/rc\.;;"`
- rm -f $tmpfile
- touch $tmpfile
- for s_name in $scripts; do
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%config/d" -e '/^%.*/,$d'
- done
- vars=""
- . $tmpfile
- for assign in . `egrep '[ ]*[a-zA-Z_][a-zA-Z_0-9]*=' $tmpfile | sort`; do
- test ".$assign" = .. && continue
- var=`echo "$assign" | sed -e 's;^[ ]*\([a-zA-Z_][a-zA-Z_0-9]*\)=.*;\1;'`
- vars="$vars $var"
- eval "${var}_def=\"\$$var\""
- done
- . $rcconf
- if [ ".$raw" = ".0" ]; then
- begin_bold=`@l_prefix@/lib/openpkg/shtool echo -e '%B'`
- end_bold=`@l_prefix@/lib/openpkg/shtool echo -e '%b'`
- else
- begin_bold=""
- end_bold=""
- fi
- echo "${begin_bold}Configuration Variable Effective Value Default Value${end_bold}"
- echo "------------------------ ------------------------- -- -------------------------"
- for var in . $vars; do
- test ".$var" = .. && continue
- eval "val=\"\$$var\""
- eval "def=\"\$${var}_def\""
- tag="!="
- begin="$begin_bold"
- end="$end_bold"
- if [ ".$val" = ".$def" ]; then
- tag="=="
- begin=""
- end=""
- fi
- echo dummy | awk '{ printf("%s%-24s %-25s %s %-25s%s\n", begin, var, val, tag, def, end); }' \
- begin="$begin" var="$var" tag="$tag" val="\"$val\"" def="\"$def\"" end="$end"
- done
- exit 0
- fi
- # determine script(s) to use
- if [ $# -lt 2 ]; then
- echo "$0:ERROR: no package and command(s) specified" 1>&2
- exit 1
- fi
- scripts=`echo "$1" | sed -e 's;^.*rc\.;;'`
- shift
- if [ ".$scripts" = ".all" ]; then
- scripts=`ls $rcdir/rc.* | sed -e "s;^$rcdir/rc\.;;"`
- else
- if [ ! -f "$rcdir/rc.$scripts" ]; then
- echo "$0:ERROR: script \`$rcdir/rc.$scripts' not found" 1>&2
- exit 1
- fi
- fi
- # determine current run-time user
- user="$LOGNAME"
- if [ ".$user" = . ]; then
- user="$USER"
- if [ ".$user" = . ]; then
- user="`(whoami) 2>/dev/null | awk '{ printf("%s", $1); }'`"
- if [ ".$user" = . ]; then
- user="`(who am i) 2>/dev/null | awk '{ printf("%s", $1); }'`"
- if [ ".$user" = . ]; then
- echo "$0:ERROR: unable to determine current username" 1>&2
- exit 1
- fi
- fi
- fi
- fi
- # iterate over the commands
- cmds="$*"
- for cmd in $cmds; do
- # find scripts which contain the command and determine
- # their individual user/prio settings
- list=''
- for s_name in $scripts; do
- enable=yes
- # check script options
- shebangline=`head -1 $rcdir/rc.$s_name | grep "^#!rc"`
- if [ ".$shebangline" != . ]; then
- shebangopts=`echo "$shebangline" | sed -e "s;^#!rc *;;"`
- set -- $shebangopts;
- prev=''
- for opt
- do
- if [ ".$prev" != . ]; then
- opt="$prev$opt"
- prev=''
- fi
- case $opt in
- -*=* ) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
- -[a-zA-Z]* ) arg=`echo "$opt" | sed 's/^-[a-zA-Z0-9]//'` ;;
- *) arg='' ;;
- esac
- case $opt in
- -e|--enable ) enable=yes ;;
- -d|--disable ) enable=no ;;
- * ) echo "$0:ERROR: invalid option \`$opt' in \`$rcdir/rc.$s_name:#!rc'"; break ;;
- esac
- shift
- done
- fi
- # check whether command exists in script
- cmdline=`grep "^%$cmd" $rcdir/rc.$s_name`
- if [ ".$cmdline" != . ]; then
- cmdopts=`echo "$cmdline" | sed -e "s;^%$cmd *;;"`
- s_user=$user
- s_prio=500
- set -- $cmdopts;
- prev=''
- for opt
- do
- if [ ".$prev" != . ]; then
- opt="$prev$opt"
- prev=''
- fi
- case $opt in
- -*=* ) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
- -[a-zA-Z]* ) arg=`echo "$opt" | sed 's/^-[a-zA-Z0-9]//'` ;;
- *) arg='' ;;
- esac
- case $opt in
- -u|-p ) prev=$opt ;;
- -e|--enable ) enable=yes ;;
- -d|--disable ) enable=no ;;
- -u*|--user=* ) s_user=$arg ;;
- -p*|--prio=* ) s_prio=$arg ;;
- * ) echo "$0:ERROR: invalid option \`$opt' in \`$rcdir/rc.$s_name'"; break ;;
- esac
- shift
- done
- if [ ".$s_user" != ".$user" -a ".$user" != ".root" ]; then
- echo "$0:ERROR: require root priviledges to run \`$rcdir/rc.$s_name:$cmd' as user \`$s_user'" 1>&2
- exit 1
- fi
- # skip script if disabled
- if [ ".$enable" != .yes ]; then
- continue
- fi
- list="$list,$s_prio:$s_name:$s_user"
- fi
- done
- # execute/print the scripts in order
- if [ ".$print" = .1 -o ".$eval" = .1 ]; then
- rm -f $tmpfile
- touch $tmpfile
- if [ ".$verbose" = .1 ]; then
- echo "set -x" >>$tmpfile
- fi
- fi
- for entry in `echo $list | tr ',' '\012' | sort`; do
- test ".$entry" = . && continue
- eval `echo $entry | sed -e 's%^[0-9]*:\(.*\):\(.*\)$%s_name="\1"; s_user="\2"%'`
- if [ ".$verbose" = .1 ]; then
- echo "$0: executing $rcdir/rc.$s_name [%$cmd] as user $s_user" 1>&2
- fi
- if [ ".$print" = .1 -o ".$eval" = .1 ]; then
- echo ". $rcfunc" >>$tmpfile
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%config/d" -e '/^%.*/,$d'
- echo ". $rcconf" >>$tmpfile
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%common/d" -e '/^%.*/,$d'
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%$cmd/d" -e '/^%.*/,$d'
- continue
- fi
- rm -f $tmpfile
- touch $tmpfile
- if [ ".$verbose" = .1 ]; then
- echo "set -x" >>$tmpfile
- fi
- echo ". $rcfunc" >>$tmpfile
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%config/d" -e '/^%.*/,$d'
- echo ". $rcconf" >>$tmpfile
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%common/d" -e '/^%.*/,$d'
- sed <$rcdir/rc.$s_name >>$tmpfile -e "1,/^%$cmd/d" -e '/^%.*/,$d'
- sh='sh'
- if [ ".$user" != ".$s_user" ]; then
- su $s_user -c "sh $tmpfile"
- rc=$?
- else
- sh $tmpfile
- rc=$?
- fi
- if [ $rc -ne 0 ]; then
- echo "$0:WARNING: script \`$rcdir/rc.$s_name:$cmd' returned non-null ($#) return code" 1>&2
- fi
- done
- if [ ".$print" = .1 ]; then
- cat $tmpfile
- elif [ ".$eval" = .1 ]; then
- echo ". $tmpfile; rm -f $tmpfile 2>/dev/null || true"
- fi
- done
- # cleanup
- if [ ".$eval" = .0 ]; then
- rm -f $tmpfile >/dev/null 2>&1 || true
- fi
|