|
|
@@ -0,0 +1,319 @@
|
|
|
+#!@l_prefix@/lib/rpm/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.7"
|
|
|
+progdate="17-Oct-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/rpm:$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/rpm/shtool echo -e '%B'`
|
|
|
+ end_bold=`@l_prefix@/lib/rpm/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 "source $tmpfile; rm -f $tmpfile 2>/dev/null || true"
|
|
|
+ fi
|
|
|
+done
|
|
|
+
|
|
|
+# cleanup
|
|
|
+if [ ".$eval" = .0 ]; then
|
|
|
+ rm -f $tmpfile >/dev/null 2>&1 || true
|
|
|
+fi
|
|
|
+
|