You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

329 lines
10 KiB

#!@l_prefix@/lib/openpkg/bash --norc --noprofile --posix
##
## @l_prefix@/etc/rc -- Run-Command Handling for OpenPKG Hierarchy
## Copyright (c) 2000-2002 Cable & Wireless Deutschland GmbH
## Copyright (c) 2000-2002 The OpenPKG Project <http://www.openpkg.org/>
## Copyright (c) 2000-2002 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"
# helper variables
NL="
"
##
## 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
OIFS="$IFS"; IFS="$NL"
for assign in `egrep '[ ]*[a-zA-Z_][a-zA-Z_0-9]*=' $tmpfile | sort`; do
var=`echo "$assign" | sed -e 's;^[ ]*\([a-zA-Z_][a-zA-Z_0-9]*\)=.*;\1;'`
vars="$vars $var"
eval "${var}_def=\"\$$var\""
done
IFS="$OIFS"
. $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
. $rcconf
case "$openpkg_ignall" in
[Nn][Oo] | [Ff][Aa][Ll][Ss][Ee] | [Oo][Ff][Ff] | 0 ) exit 0 ;;
esac
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