mirror of https://github.com/slicer69/insserv.git
346 lines
7.2 KiB
Plaintext
346 lines
7.2 KiB
Plaintext
#
|
|
# Common test suite definitions, declarations, and functions
|
|
#
|
|
set -eC
|
|
set +o posix
|
|
unset ${!LC@}
|
|
export LANG=POSIX
|
|
|
|
: ${insserv:=${PWD}/../insserv}
|
|
: ${tmpdir:=${PWD}/root}
|
|
: ${initddir:=${tmpdir}/etc/init.d}
|
|
: ${insservdir:=${tmpdir}/etc/init.d}
|
|
: ${insconf:=${tmpdir}/etc/insserv.conf}
|
|
: ${overridedir:=${tmpdir}/etc/insserv/override}
|
|
: ${issuse=""}
|
|
: ${debug:=""}
|
|
|
|
declare -i retval=0
|
|
declare -i checkfailed=0
|
|
declare -i testcount=0
|
|
declare -i testfailed=0
|
|
finish_test ()
|
|
{
|
|
if test 0 -ne $retval ; then
|
|
echo "error: $testcount test executed, $checkfailed fatal tests failed, $testfailed nonfatal test failed."
|
|
else
|
|
echo "success: $testcount test executed, $testfailed nonfatal tests failed."
|
|
rm -rf ${tmpdir}
|
|
fi
|
|
return $retval
|
|
}
|
|
trap 'finish_test' EXIT
|
|
|
|
mkdir -p $initddir
|
|
mkdir -p $insservdir
|
|
|
|
if test -n "${issuse}" ; then
|
|
runlevel_path ()
|
|
{
|
|
local -a level=($@)
|
|
level=(${level[@]/%s/S})
|
|
level=(${level[@]/#/rc})
|
|
level=(${level[@]/rc[bB]*/boot})
|
|
printf "${initddir}/%s.d\n" ${level[@]}
|
|
}
|
|
list_rclinks()
|
|
{
|
|
pushd $initddir/ &> /dev/null
|
|
echo ${initddir##*/}:
|
|
ls ${1+"$@"} *
|
|
popd &> /dev/null
|
|
}
|
|
cat <<-'EOF' > $insconf
|
|
$local_fs boot.localfs +boot.crypto
|
|
$network network
|
|
$named +named +dnsmasq +lwresd $network
|
|
$remote_fs $local_fs +nfs +smbfs
|
|
$syslog syslog
|
|
$portmap portmap
|
|
$time boot.clock +ntp
|
|
<interactive> boot.crypto boot.clock boot.localfs boot.rootfsck apache apache2 kdump ntp
|
|
EOF
|
|
else
|
|
runlevel_path ()
|
|
{
|
|
printf "${initddir}/../rc%s.d\n" ${1+"$@"}
|
|
}
|
|
list_rclinks()
|
|
{
|
|
pushd $initddir/../ &> /dev/null
|
|
ls ${1+"$@"} *
|
|
popd &> /dev/null
|
|
}
|
|
cat <<-'EOF' > $insconf
|
|
$local_fs +mountall +umountfs
|
|
$network +networking +ifupdown
|
|
$named +named +dnsmasq +lwresd +bind9 $network
|
|
$remote_fs $local_fs +mountnfs +mountnfs-bootclean +umountnfs +sendsigs
|
|
$syslog +syslog +sysklogd
|
|
$portmap portmap
|
|
$time hwclock
|
|
<interactive> udev mountdevsubfs checkroot checkfs console-screen
|
|
EOF
|
|
update_conf ()
|
|
{
|
|
set +C
|
|
cat <<-'EOF' > $insconf
|
|
$local_fs +mountall +umountfs
|
|
$network +networking +ifupdown
|
|
$named +named +dnsmasq +lwresd +bind9 $network
|
|
$remote_fs $local_fs +mountnfs +mountnfs-bootclean +umountnfs +sendsigs
|
|
$syslog +syslog +sysklogd
|
|
$portmap portmap
|
|
$time hwclock
|
|
<interactive> udev mountdevsubfs checkroot checkfs console-screen
|
|
EOF
|
|
set -C
|
|
}
|
|
|
|
fi
|
|
chmod u+w,a+r $insconf
|
|
|
|
insserv_reg ()
|
|
{
|
|
script=$(printf "${initddir}/%s\n" ${1+"$@"})
|
|
$insserv $debug -c $insconf -i $insservdir -p $initddir -o $overridedir $script
|
|
}
|
|
|
|
insserv_del ()
|
|
{
|
|
script=$(printf "${initddir}/%s\n" ${1+"$@"})
|
|
$insserv $debug -c $insconf -i $insservdir -p $initddir -o $overridedir -r $script
|
|
}
|
|
|
|
initdir_purge ()
|
|
{
|
|
rm -rf ${initddir}/../rc*.d ${initddir}
|
|
rm -rf ${insservdir}
|
|
mkdir -p ${initddir}
|
|
mkdir -p ${insservdir}
|
|
}
|
|
|
|
relpath ()
|
|
{
|
|
local OLDIFS IFS
|
|
local -a orgwords
|
|
local -a locwords
|
|
local -i relp=0
|
|
local -i deep=0
|
|
local p l
|
|
local path=""
|
|
|
|
OLDIFS="$IFS"; IFS=/
|
|
eval orgwords=(${1// /\\\\ }) ; shift
|
|
eval locwords=(${1// /\\\\ }) ; shift
|
|
IFS="$OLDIFS"
|
|
unset OLDIFS
|
|
|
|
deep=0
|
|
relp=0
|
|
for l in "${locwords[@]}" ; do
|
|
if test "$l" = ".." ; then
|
|
((deep++))
|
|
continue
|
|
elif test $deep -gt 0 ; then
|
|
while ((deep-- > 0)) ; do
|
|
unset locwords[$((relp+deep))]
|
|
(((relp-1)-deep < 0)) || unset locwords[$(((relp-1)-deep))]
|
|
done
|
|
continue
|
|
fi
|
|
((relp++))
|
|
done
|
|
locwords=(${locwords[@]})
|
|
|
|
deep=0
|
|
relp=0
|
|
for p in "${orgwords[@]}" ; do
|
|
if test "$p" = ".." ; then
|
|
((deep++))
|
|
continue
|
|
elif test $deep -gt 0 ; then
|
|
while ((deep-- > 0)) ; do
|
|
unset orgwords[$((relp+deep))]
|
|
(((relp-1)-deep < 0)) || unset orgwords[$(((relp-1)-deep))]
|
|
done
|
|
continue
|
|
fi
|
|
((relp++))
|
|
done
|
|
orgwords=(${orgwords[@]})
|
|
|
|
deep=0
|
|
relp=0
|
|
for p in "${orgwords[@]}" ; do
|
|
eval l="\${locwords[$((deep++))]}"
|
|
if test "$l" != "$p" -o $relp -ne 0 ; then
|
|
((relp++))
|
|
path="${path}/$p"
|
|
test -n "$l" || continue
|
|
if test $relp -eq 1 ; then
|
|
path="..${path}"
|
|
else
|
|
path="../${path}"
|
|
fi
|
|
fi
|
|
done
|
|
unset orgwords p l
|
|
|
|
if test $deep -lt ${#locwords[@]} ; then
|
|
relp=0
|
|
while test $relp -lt $deep; do
|
|
unset locwords[$((relp++))]
|
|
done
|
|
while test ${#locwords[@]} -gt 0 ; do
|
|
path="../${path}"
|
|
unset locwords[$((relp++))]
|
|
done
|
|
fi
|
|
|
|
echo "$path"
|
|
}
|
|
|
|
counttest ()
|
|
{
|
|
testcount=$(expr $testcount + 1)
|
|
}
|
|
|
|
error ()
|
|
{
|
|
echo error: $@
|
|
checkfailed=$(expr $checkfailed + 1)
|
|
retval=1
|
|
exit 1
|
|
}
|
|
|
|
warning ()
|
|
{
|
|
echo warning: $@
|
|
testfailed=$(expr $testfailed + 1)
|
|
exit 1
|
|
}
|
|
|
|
addscript ()
|
|
{
|
|
local scriptname=$1
|
|
local script=${initddir}/$scriptname
|
|
cat > $script
|
|
chmod u+w,a+rx $script
|
|
}
|
|
|
|
remscript ()
|
|
{
|
|
local scriptname=$1
|
|
local script=${initddir}/$scriptname
|
|
rm -f $script
|
|
}
|
|
|
|
insertscript ()
|
|
{
|
|
local scriptname=$1
|
|
addscript $scriptname
|
|
insserv_reg $scriptname
|
|
}
|
|
|
|
present_ok ()
|
|
{
|
|
local rcdpath=$(runlevel_path $1); shift
|
|
local script=$1; shift
|
|
local ret=1
|
|
for f in ${rcdpath}/[KS][0-9][0-9]$script ; do
|
|
if [ -L $f ] ; then
|
|
ret=0
|
|
fi
|
|
done
|
|
counttest
|
|
return $ret
|
|
}
|
|
|
|
check_script_present ()
|
|
{
|
|
local runlevel=$1; shift
|
|
local script=$1; shift
|
|
present_ok $runlevel $script && return 0
|
|
error "script $script not present in runlevel $runlevel"
|
|
}
|
|
|
|
test_script_present ()
|
|
{
|
|
local runlevel=$1; shift
|
|
local script=$1; shift
|
|
present_ok $runlevel $script && return 0
|
|
warning "script $script not present in runlevel $runlevel"
|
|
}
|
|
|
|
check_script_not_present ()
|
|
{
|
|
local runlevel=$1; shift
|
|
local script=$1; shift
|
|
if present_ok $runlevel $script ; then
|
|
error "script $script present in runlevel $runlevel"
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
test_script_not_present ()
|
|
{
|
|
local runlevel=$1; shift
|
|
local script=$1; shift
|
|
if present_ok $runlevel $script ; then
|
|
warning "script $script present in runlevel $runlevel"
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
order_ok ()
|
|
{
|
|
local rcdpath=$(runlevel_path $1); shift
|
|
local script1=$1; shift
|
|
local script2=$1; shift
|
|
local ret=0 scr order=""
|
|
pushd $rcdpath &> /dev/null
|
|
if test -n "${issuse}" ; then
|
|
for scr in S[0-9][0-9]* ; do
|
|
test -e "${scr}" || continue
|
|
test -L "${scr}" || continue
|
|
case "${scr#S[0-9][0-9]}" in
|
|
${script1}) order="${order:+$order }${script1}" ;;
|
|
${script2}) order="${order:+$order }${script2}" ;;
|
|
esac
|
|
done
|
|
else
|
|
for scr in [SK][0-9][0-9]* ; do
|
|
test -e "${scr}" || continue
|
|
test -L "${scr}" || continue
|
|
case "${scr#[SK][0-9][0-9]}" in
|
|
${script1}) order="${order:+$order }${script1}" ;;
|
|
${script2}) order="${order:+$order }${script2}" ;;
|
|
esac
|
|
done
|
|
fi
|
|
popd &> /dev/null
|
|
test "$order" = "$script1 $script2" || ret=1
|
|
counttest
|
|
return $ret
|
|
}
|
|
|
|
# Fatal check
|
|
check_order ()
|
|
{
|
|
local runlevel=$1
|
|
local script1=$2
|
|
local script2=$3
|
|
order_ok ${1+"$@"} || error "incorrect $runlevel sequence $script1 not before $script2" || true
|
|
}
|
|
|
|
# Non-fatal check
|
|
test_order ()
|
|
{
|
|
local runlevel=$1
|
|
local script1=$2
|
|
local script2=$3
|
|
order_ok ${1+"$@"} || warning "incorrect $runlevel sequence $script1 not before $script2" || true
|
|
}
|
|
|