insserv/tests/run-testsuite

2504 lines
56 KiB
Bash
Executable File

#!/bin/bash
basedir=$(dirname $0)
# . $basedir/../tests/suite
. suite
# Run tests without trying to talk to systemd
#if [ Linux = $(uname -s) ] ; then
# insopts="-y /non-existing"
#fi
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
}
##########################################################################
test_normal_sequence() {
echo
echo "info: test normal boot sequence scripts, and their order"
echo
insertscript mountkernfs.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountkernfs
# Required-Start:
# Required-Stop:
# Should-Start: glibc
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript mountdevsubfs.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountdevsubfs mountvirtfs
# Required-Start: mountkernfs
# Required-Stop:
# Should-Start: udev
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript checkroot.sh <<'EOF'
### BEGIN INIT INFO
# Provides: checkroot
# Required-Start: mountdevsubfs
# Required-Stop:
# Should-Start: keymap hwclockfirst
# Should-stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript ifupdown-clean <<'EOF'
### BEGIN INIT INFO
# Provides: ifupdown-clean
# Required-Start: checkroot
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript ifupdown <<'EOF'
### BEGIN INIT INFO
# Provides: ifupdown
# Required-Start: ifupdown-clean
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript checkfs.sh <<'EOF'
### BEGIN INIT INFO
# Provides: checkfs
# Required-Start: checkroot
# Required-Stop:
# Should-Start: lvm cryptdisks
# Should-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript mountall.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountall
# Required-Start: checkfs
# Required-Stop:
# Should-Start: lvm
# Should-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript mountnfs.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountnfs
# Required-Start: $local_fs
# Required-Stop:
# Should-Start: $network
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript beforenfs <<'EOF'
### BEGIN INIT INFO
# Provides: beforenfs
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mountnfs
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript hwclock.sh <<'EOF'
### BEGIN INIT INFO
# Provides: hwclock
# Required-Start: mountdevsubfs
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript killprocs <<'EOF'
### BEGIN INIT INFO
# Provides: killprocs
# Required-Start: $local_fs
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
insertscript single <<'EOF'
### BEGIN INIT INFO
# Provides: single
# Required-Start: $local_fs killprocs $all
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
insertscript needlocalfs <<'EOF'
### BEGIN INIT INFO
# Provides: needlocalfs
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insertscript needallfs <<'EOF'
### BEGIN INIT INFO
# Provides: needallfs
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insertscript sysklogd <<'EOF'
### BEGIN INIT INFO
# Provides: syslog
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insertscript reboot <<'EOF'
### BEGIN INIT INFO
# Provides: reboot
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 6
### END INIT INFO
EOF
insertscript halt <<'EOF'
### BEGIN INIT INFO
# Provides: halt
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0
### END INIT INFO
EOF
insertscript umountroot <<'EOF'
### BEGIN INIT INFO
# Provides: umountroot
# Required-Start:
# Required-Stop:
# Should-Stop: halt reboot
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript umountfs <<'EOF'
### BEGIN INIT INFO
# Provides: umountfs
# Required-Start:
# Required-Stop: umountroot
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript umountnfs <<'EOF'
### BEGIN INIT INFO
# Provides: umountnfs
# Required-Start:
# Required-Stop: umountfs
# Should-Stop: $network $portmap nfs-common
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript needallfs2 <<'EOF'
### BEGIN INIT INFO
# Provides: needallfs2
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# X-Start-Before: needallfs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insertscript kexec <<'EOF'
### BEGIN INIT INFO
# Provides: kexec
# Required-Start:
# Required-Stop: reboot
# X-Stop-After: umountroot
# Default-Start:
# Default-Stop: 6
### END INIT INFO
EOF
insertscript networking <<'EOF'
### BEGIN INIT INFO
# Provides: networking
# Required-Start: mountkernfs ifupdown $local_fs
# Required-Stop: ifupdown $local_fs
# Default-Start: S
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript nolsbheader <<'EOF'
EOF
list_rclinks
check_order S mountkernfs.sh mountdevsubfs.sh
check_order S ifupdown-clean ifupdown
check_order S ifupdown-clean ifupdown
check_order S mountall.sh mountnfs.sh
check_order S mountall.sh beforenfs
check_order S beforenfs mountnfs.sh
check_order 0 needallfs umountnfs
check_order 0 umountroot halt
check_order 1 killprocs single
check_order 1 needallfs killprocs
check_order 2 needlocalfs needallfs
# check_order 2 needlocalfs nolsbheader
# check_order 2 sysklogd nolsbheader
check_order 2 needallfs2 needallfs
check_order 6 needallfs umountnfs
# check_order 6 nolsbheader umountnfs
check_order 6 umountfs umountroot
check_order 6 umountnfs networking
check_order 6 networking ifupdown
check_order 6 umountnfs umountfs
check_order 6 umountroot reboot
check_order 6 umountroot kexec
check_order 6 kexec reboot
}
##########################################################################
test_override_files() {
echo
echo "info: test if override files replace headers in the file"
echo
initdir_purge
# Two scripts with a loop between them
insertscript base <<'EOF' || true
### BEGIN INIT INFO
# Provides: base
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript mover <<'EOF' || true
### BEGIN INIT INFO
# Provides: mover
# Required-Start: base
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
check_order S base mover
mkdir -p $overridedir
cat <<'EOF' > $overridedir/mover
### BEGIN INIT INFO
# Provides: mover
# Required-Start:
# Required-Stop:
# X-Start-Before: base
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insserv_reg mover
list_rclinks
# Make sure the override file moved mover before base
check_order S mover base
rm -rf $overridedir
}
##########################################################################
test_override_loop() {
echo
echo "info: testing to insert scripts with a loop, and the effect of an override file"
echo
initdir_purge
# Two scripts with a loop between them
if insertscript loop1 <<'EOF' ; then
### BEGIN INIT INFO
# Provides: loop1
# Required-Start: loop2
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
error "inserting script with missing dependencies did not fail"
fi
insertscript loop2 <<'EOF' || true
### BEGIN INIT INFO
# Provides: loop2
# Required-Start: loop1
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
# Test if override file can be used to break the loop
mkdir -p $overridedir
cat <<'EOF' > $overridedir/loop1
### BEGIN INIT INFO
# Provides: loop1
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
check_script_not_present S loop1
check_script_not_present S loop2
insserv_reg loop1 || true
insserv_reg loop2 || true
check_order S loop1 loop2
rm -rf $overridedir
}
##########################################################################
test_override_remove() {
echo
echo "info: Try to reproduce BTS #540866"
echo
initdir_purge
addscript testscript <<'EOF'
### BEGIN INIT INFO
# Provides: testscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
mkdir -p ${overridedir}/.
cat >${overridedir}/testscript <<'EOF'
### BEGIN INIT INFO
# Provides: testscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insserv_reg testscript
list_rclinks
check_script_not_present 3 testscript
echo info: Trying to remove the script
insserv_del testscript
list_rclinks
check_script_not_present 3 testscript
}
##########################################################################
test_long_loop() {
echo
echo "info: testing to insert scripts with a longer loop, making sure it fail"
echo
initdir_purge
# Three scripts with a loop between them, make sure introducing the
# loop fail, as it will make insserv generate a unstable and broken
# boot and shutdown sequence.
insertscript loop1 <<'EOF'
### BEGIN INIT INFO
# Provides: loop1
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript loop2 <<'EOF' || true
### BEGIN INIT INFO
# Provides: loop2
# Required-Start: loop1
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
if insertscript loop3 <<'EOF' ; then
### BEGIN INIT INFO
# Provides: loop3
# Required-Start: loop2
# Required-Stop:
# X-Start-Before: loop1
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
error "inserting script causing a loop did not fail"
fi
}
##########################################################################
test_combined_loop() {
# Test real loop in the combined start and stop sequence. There is no
# loop in the start sequence, and no loop in the stop sequence, but in
# the combined graph insserv is creating internally, there is a loop.
# This make sense, as scripts need to be installed in dependency
# order, and there is no way to install these scripts that make sure
# both start and stop dependencies are fulfilled.
echo
echo "info: test handling of loops in the combination of start and stop sequences"
echo
initdir_purge
insertscript startfirst <<'EOF' || true
### BEGIN INIT INFO
# Provides: startfirst
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
insertscript startsecond <<'EOF' || true
### BEGIN INIT INFO
# Provides: startsecond
# Required-Start: startfirst
# Required-Stop: startfirst
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
list_rclinks
check_order S startfirst startsecond
check_order 6 startsecond startfirst
}
##########################################################################
test_fake_loop() {
# Test another fake loop. This one should work, as it is possible to
# install the two scripts in sequence because one of the dependencies
# are optional. It does not with insserv today.
echo
echo "info: test handling of 'fake' loops in the combination of start and stop sequences"
echo
initdir_purge
insertscript startfirst_stopfirst <<'EOF' || true
### BEGIN INIT INFO
# Provides: startfirst_stopfirst
# Required-Start:
# Required-Stop:
# Should-Stop: startsecond_stoplast
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
insertscript startsecond_stoplast <<'EOF' || true
### BEGIN INIT INFO
# Provides: startsecond_stoplast
# Required-Start: startfirst_stopfirst
# Required-Stop:
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
list_rclinks
check_order S startfirst_stopfirst startsecond_stoplast
check_order 6 startfirst_stopfirst startsecond_stoplast
}
##########################################################################
test_fake_loop_reverse() {
# Test another fake loop using reverse dependencies to document that
# it can happen based on information provided in one package only.
# This should work, as it is possible to install the two scripts in
# sequence because one of the dependencies are optional. It does not
# with insserv today. Note thought that the generated order is
# different from the one above.
echo
echo "info: test handling of 'fake' loops using reverse depends"
echo
initdir_purge
insertscript startfirst_stopfirst <<'EOF' || true
### BEGIN INIT INFO
# Provides: startfirst_stopfirst
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
insertscript startsecond_stoplast <<'EOF' || true
### BEGIN INIT INFO
# Provides: startsecond_stoplast
# Required-Start: startfirst_stopfirst
# Required-Stop:
# X-Stop-After: startfirst_stopfirst
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
list_rclinks
# #458582
check_order S startfirst_stopfirst startsecond_stoplast
check_order 6 startfirst_stopfirst startsecond_stoplast
}
##########################################################################
test_badscript() {
echo
echo "info: test if bad script in init.d/ with no symlinks in rc*.d/ make problems"
echo
initdir_purge
addscript sitelocal <<'EOF' || true
### BEGIN INIT INFO
# Provides: duplicate
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
insertscript distroglobal <<'EOF' || true
### BEGIN INIT INFO
# Provides: dublicate
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
list_rclinks
check_script_present S distroglobal
}
##########################################################################
test_onlystart() {
echo
echo "info: check that it work to insert scripts with only start runlevels"
echo
initdir_purge
insertscript onlystart <<'EOF' || true
### BEGIN INIT INFO
# Provides: onlystart
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_present 2 onlystart
check_script_present 3 onlystart
check_script_present 4 onlystart
check_script_present 5 onlystart
check_script_not_present 0 onlystart
check_script_not_present 1 onlystart
check_script_not_present 6 onlystart
}
##########################################################################
test_onlystop() {
echo
echo "info: check that it work to insert scripts with only stop runlevels"
echo
# This test check that the common way to update the runlevels used by
# a given script is working. It simulates these calls to update-rc.d:
# update-rc.d oldscript default
# update-rc.d -f oldscript remove
# update-rc.d oldscript start 20 2 3 4 5 . stop 20 1 .
initdir_purge
insertscript onlystop <<'EOF' || true
### BEGIN INIT INFO
# Provides: onlystop
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
list_rclinks
check_script_present 0 onlystop
check_script_present 6 onlystop
check_script_not_present 1 onlystop
check_script_not_present 2 onlystop
check_script_not_present 3 onlystop
check_script_not_present 4 onlystop
check_script_not_present 5 onlystop
check_script_not_present S onlystop
}
##########################################################################
test_removal() {
echo
echo "info: test if script removal removes all symlinks."
echo
# This test check that the common way to update the runlevels used by
# a given script is working. It simulates these calls to update-rc.d:
# update-rc.d oldscript default
# update-rc.d -f oldscript remove
# update-rc.d oldscript start 20 2 3 4 5 . stop 20 1 .
initdir_purge
insertscript oldscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: oldscript
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
# Check that the problematic symlinks are presend, as well as one that
# is OK.
check_script_present 0 oldscript
check_script_present 1 oldscript
check_script_present 3 oldscript
check_script_present 6 oldscript
set +C
addscript oldscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: oldscript
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 4 5
# Default-Stop: 1
### END INIT INFO
EOF
set -C
# Remove old symlinks
insserv_del oldscript
# Insert new ones, this time without runlevel 0 and 6
insserv_reg oldscript
list_rclinks
check_script_not_present 0 oldscript
check_script_present 1 oldscript
check_script_present 2 oldscript
check_script_not_present 3 oldscript
check_script_not_present 6 oldscript
}
##########################################################################
test_segfault_virtfac() {
echo
echo "info: detect segfault caused by script providing virtual facility."
echo
initdir_purge
insertscript badheaderscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: $syslog
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
# Problem is only triggered if there are start or stop symlinks for
# the script present.
mkdir -p $initddir/../rc2.d
ln -s ../init.d/badheaderscript $initddir/../rc2.d/S02badheaderscript
# This one segfaults
insertscript okscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: okscript
# Required-Start: $syslog
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
list_rclinks
check_script_present 2 okscript
}
##########################################################################
test_incorrect_startscripts() {
echo
echo "info: Check if insserv add start symlinks for scripts that"
echo "info: currently do not have them. #492526"
echo
initdir_purge
insertscript disablestartscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: disablestartscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
list_rclinks
check_script_present 2 disablestartscript
check_script_present 5 disablestartscript
check_script_not_present S disablestartscript
check_script_present 1 disablestartscript
rm $initddir/../rc{2,3,4,5}.d/S??disablestartscript
# Update symlinks, see if it add start symlinks
insserv_reg .
list_rclinks
check_script_not_present 2 disablestartscript
check_script_not_present 3 disablestartscript
check_script_not_present 4 disablestartscript
check_script_not_present 5 disablestartscript
check_script_not_present S disablestartscript
check_script_present 0 disablestartscript
check_script_present 1 disablestartscript
}
##########################################################################
test_incorrect_stopscripts() {
echo
echo "info: Check if insserv add stop symlinks for scripts that"
echo "info: currently do not have them."
echo
initdir_purge
insertscript disablestopscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: disablestopscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
list_rclinks
check_script_present 2 disablestopscript
check_script_present 5 disablestopscript
check_script_not_present S disablestopscript
check_script_present 1 disablestopscript
rm $initddir/../rc{0,1}.d/K??disablestopscript
# Update symlinks, see if it add stop symlinks
insserv_reg .
list_rclinks
check_script_present 2 disablestopscript
check_script_present 5 disablestopscript
check_script_not_present S disablestopscript
check_script_not_present 0 disablestopscript
check_script_not_present 1 disablestopscript
}
##########################################################################
test_newbug_keepoldorder() {
echo
echo "info: Verify that introducing a loop in a working system do"
echo "info: not change the order of the scripts currently on disk."
echo
initdir_purge
insertscript mountall <<'EOF' || true
### BEGIN INIT INFO
# Provides: mountall
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript needlocal <<'EOF' || true
### BEGIN INIT INFO
# Provides: needlocal
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
insertscript needremote <<'EOF' || true
### BEGIN INIT INFO
# Provides: needremote
# Required-Start: $remote_fs needlocal
# Required-Stop: $remote_fs needlocal
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
insertscript needboth <<'EOF' || true
### BEGIN INIT INFO
# Provides: needboth
# Required-Start: needlocal needremote
# Required-Stop: needlocal needremote
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
list_rclinks
check_order S mountall needlocal
check_order S mountall needremote
check_order S mountall needboth
check_order S needlocal needremote
check_order S needlocal needboth
check_order S needremote needboth
# Then introduce buggy dependencies in an existing script
set +C
addscript needboth <<'EOF' || true
### BEGIN INIT INFO
# Provides: needboth
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# X-Start-Before: $local_fs
# Default-Start: S
# Default-Stop: 6
### END INIT INFO
EOF
set -C
echo "info: calling insserv after introducing a bug in script needboth"
insserv_reg needboth || true
list_rclinks
# The severity of this test should be fatal, below is explanation about how
# new (1.11.10) and old (1.11.0) insserv version behaviour changed in this
# test.
#
# Hmm ... with this I've found out that the old insserv will
# run on a loop and therefore exit. This loop was caused
# by the system facility $local_fs make the old insserv
# to do an exit ... now the problem is that the new insserv
# expands all system facility to their real requirements.
# This leads to the new behaviour as there is no node during
# the sorting algorithm which would cause such a loop.
#
# In other words: that the old insserv hasn't changed the
# order was simply a side effect of having a ghost node
# whereas the new insserv does not use such nodes anymore.
#
# If you would remove the `X-Start-Before: $local_fs' the
# old insserv will also change the boot order.
${severity}_order S mountall needlocal
${severity}_order S mountall needremote
${severity}_order S mountall needboth
${severity}_order S needlocal needremote
${severity}_order S needlocal needboth
${severity}_order S needremote needboth
}
##########################################################################
test_start_before() {
echo
echo "info: Verify that X-start-before work as it should."
echo
initdir_purge
insertscript startlast <<'EOF' || true
### BEGIN INIT INFO
# Provides: startlast
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript startfirst <<'EOF' || true
### BEGIN INIT INFO
# Provides: startfirst
# Required-Start:
# Required-Stop:
# X-Start-Before: startlast
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_order S startfirst startlast
}
##########################################################################
test_stop_after() {
echo
echo "info: Verify that X-stop-after work as it should."
echo
initdir_purge
insertscript stopfirst <<'EOF' || true
### BEGIN INIT INFO
# Provides: stopfirst
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
insertscript stopafter <<'EOF' || true
### BEGIN INIT INFO
# Provides: stopafter
# Required-Start:
# Required-Stop:
# X-Stop-After: stopfirst
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
list_rclinks
check_order 0 stopfirst stopafter
}
##########################################################################
test_adding_start() {
echo
echo "info: Make sure that adding start levels do not change an existing installation."
echo
initdir_purge
insertscript addstartscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: addstartscript
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 1
### END INIT INFO
EOF
check_script_present 1 addstartscript
check_script_not_present S addstartscript
check_script_not_present 0 addstartscript
check_script_not_present 2 addstartscript
check_script_not_present 3 addstartscript
check_script_not_present 4 addstartscript
check_script_not_present 5 addstartscript
check_script_not_present 6 addstartscript
# Then change runlevel in existing script
set +C
addscript addstartscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: addstartscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
### END INIT INFO
EOF
set -C
# Update script after changing the header
insserv_reg addstartscript || true
list_rclinks
check_script_present 1 addstartscript
check_script_not_present S addstartscript
check_script_not_present 0 addstartscript
check_script_not_present 2 addstartscript
check_script_not_present 3 addstartscript
check_script_not_present 4 addstartscript
check_script_not_present 5 addstartscript
check_script_not_present 6 addstartscript
}
##########################################################################
test_removing_start() {
echo
echo "info: Make sure that removing start levels do not change an existing installation."
echo
initdir_purge
insertscript remstartscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: remstartscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
check_script_present 0 remstartscript
check_script_present 1 remstartscript
check_script_present 2 remstartscript
check_script_present 3 remstartscript
check_script_present 4 remstartscript
check_script_present 5 remstartscript
check_script_present 6 remstartscript
# Then change runlevel in existing script
set +C
addscript remstartscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: remstartscript
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0 1 6
### END INIT INFO
EOF
set -C
# Update script after changing the header
insserv_reg remstartscript || true
list_rclinks
check_script_present 2 remstartscript
check_script_present 3 remstartscript
check_script_present 4 remstartscript
check_script_present 5 remstartscript
}
##########################################################################
test_adding_stop() {
echo
echo "info: Make sure that adding stop levels do not change an existing installation."
echo
initdir_purge
insertscript addstopscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: addstopscript
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
check_script_present S addstopscript
check_script_not_present 0 addstopscript
check_script_not_present 1 addstopscript
check_script_not_present 2 addstopscript
check_script_not_present 3 addstopscript
check_script_not_present 4 addstopscript
check_script_not_present 5 addstopscript
check_script_not_present 6 addstopscript
# Then change runlevel in existing script
set +C
addscript addstopscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: addstopscript
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 0
### END INIT INFO
EOF
set -C
# Update script after changing the header
insserv_reg addstopscript || true
list_rclinks
check_script_present S addstopscript
check_script_not_present 0 addstopscript
check_script_not_present 1 addstopscript
check_script_not_present 2 addstopscript
check_script_not_present 3 addstopscript
check_script_not_present 4 addstopscript
check_script_not_present 5 addstopscript
check_script_not_present 6 addstopscript
}
##########################################################################
test_removing_stop() {
echo
echo "info: Make sure that removing stop levels do not change an existing installation."
echo
initdir_purge
insertscript remstopscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: remstopscript
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop: 0 6
### END INIT INFO
EOF
check_script_present S remstopscript
check_script_present 0 remstopscript
check_script_present 6 remstopscript
check_script_not_present 1 remstopscript
check_script_not_present 2 remstopscript
check_script_not_present 3 remstopscript
check_script_not_present 4 remstopscript
check_script_not_present 5 remstopscript
# Then change runlevel in existing script
set +C
addscript remstopscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: remstopscript
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
set -C
# Update script after changing the header
insserv_reg remstopscript || true
list_rclinks
check_script_present 0 remstopscript
check_script_present 6 remstopscript
}
##########################################################################
test_duplicate_provides() {
echo
echo "info: test two initscripts providing same facility."
echo "info: Not sure if this should fail or not."
echo
initdir_purge
addscript one <<'EOF' || true
### BEGIN INIT INFO
# Provides: samefac
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
addscript two <<'EOF' || true
### BEGIN INIT INFO
# Provides: samefac
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insserv_reg one || true
insserv_reg two || true
list_rclinks
check_script_present S one
${severity}_script_not_present S two
}
##########################################################################
test_bogus_facility() {
echo
echo "info: test insertion of script requiring a virtual facility that doesn't exist"
echo
initdir_purge
addscript needbogusvirtual <<'EOF'
### BEGIN INIT INFO
# Provides: needbogusvirtual
# Required-Start: $bogusvirtualfacility
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insserv_reg needbogusvirtual || true
list_rclinks
# This check is no longer needed as insserv will display a warning
# for unmet dependencies/services.
# check_script_not_present S needbogusvirtual
}
##########################################################################
test_insserv_conf_d() {
echo
echo "info: test that /etc/insserv.conf.d/ is used"
echo
initdir_purge
rm -rf ${insconf}.d
mkdir -p ${insconf}.d
# add a base service, to ensure check_order() is accurate
insertscript dummy <<'EOF'
### BEGIN INIT INFO
# Provides: dummy
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
cat <<'EOF' > ${insconf}.d/facone
$commvirtfac +facone
EOF
insertscript facone <<'EOF' || true
### BEGIN INIT INFO
# Provides: facone
# Required-Start: dummy
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
cat <<'EOF' > ${insconf}.d/factwo
$commvirtfac +factwo
EOF
insertscript factwo <<'EOF' || true
### BEGIN INIT INFO
# Provides: factwo
# Required-Start: dummy
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
addscript service <<'EOF' || true
### BEGIN INIT INFO
# Provides: service
# Required-Start: $commvirtfac
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insserv_reg service || true
list_rclinks
check_script_present S service
check_order S facone service
check_order S factwo service
rm -rf ${insconf}.d
}
##########################################################################
test_broken_header() {
echo
echo "info: test insertion of script missing Required-{Start,Stop} fields"
echo
initdir_purge
addscript badheader <<'EOF'
### BEGIN INIT INFO
# Provides: badheader
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insserv_reg badheader || true
list_rclinks
test_script_present 0 badheader
test_script_present 1 badheader
test_script_present 2 badheader
test_script_present 3 badheader
test_script_present 4 badheader
test_script_present 5 badheader
test_script_present 6 badheader
}
##########################################################################
test_noprovides_header() {
echo
echo "info: test insertion of script missing Provides fields"
echo
initdir_purge
addscript badheader <<'EOF'
### BEGIN INIT INFO
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insserv_reg badheader || true
list_rclinks
test_script_present 0 badheader
test_script_present 1 badheader
test_script_present 2 badheader
test_script_present 3 badheader
test_script_present 4 badheader
test_script_present 5 badheader
test_script_present 6 badheader
}
##########################################################################
test_no_default_start() {
echo
echo "info: test insertion of script missing Default-Start field"
echo
initdir_purge
addscript nodefstart <<'EOF'
### BEGIN INIT INFO
# Provides: nodefstart
# Required-Start:
# Required-Stop:
# Default-Stop: 0 6
### END INIT INFO
EOF
insserv_reg nodefstart || true
list_rclinks
check_script_present 0 nodefstart
check_script_present 6 nodefstart
check_script_not_present 2 nodefstart
check_script_not_present 3 nodefstart
check_script_not_present 4 nodefstart
check_script_not_present 5 nodefstart
}
##########################################################################
test_no_default_stop() {
echo
echo "info: test insertion of script missing Default-Stop field"
echo
initdir_purge
addscript nodefstop <<'EOF'
### BEGIN INIT INFO
# Provides: nodefstop
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
### END INIT INFO
EOF
insserv_reg nodefstop || true
list_rclinks
check_script_present 2 nodefstop
check_script_present 3 nodefstop
check_script_present 4 nodefstop
check_script_present 5 nodefstop
check_script_not_present 0 nodefstop
check_script_not_present 1 nodefstop
check_script_not_present 6 nodefstop
}
##########################################################################
test_initd_symlink() {
echo
echo "info: test that a symlink in /etc/init.d/ to another script does not cause problems"
echo
initdir_purge
addscript symlinked <<'EOF'
### BEGIN INIT INFO
# Provides: symlinked
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
### END INIT INFO
EOF
addscript outsider <<'EOF'
### BEGIN INIT INFO
# Provides: outsider
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 1
### END INIT INFO
EOF
#addscript halt <<'EOF'
### BEGIN INIT INFO
# Provides: halt
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
#EOF
# Now make an illegal symlink to see if it causes problems, #485045
ln -s symlinked ${initddir}/symlink
insserv_reg symlinked || true
insserv_reg symlink || true
check_script_present 1 symlinked
check_script_present 2 symlinked
check_script_present 3 symlinked
check_script_present 4 symlinked
check_script_present 5 symlinked
check_script_not_present 1 symlink
check_script_not_present 2 symlink
check_script_not_present 3 symlink
check_script_not_present 4 symlink
check_script_not_present 5 symlink
# Add a /etc/init.d/reboot -> halt symlink, to make sure the SUSE case
# is not broken with stricter symlink sanity checking
#ln -s halt ${initddir}/reboot
#insserv_reg reboot || true
#check_script_present 0 reboot
#check_script_present 6 reboot
# Move outsider to a location other than /etc/init.d/ and create a symlink
# to it. insserv should register it without problems.
mv ${initddir}/outsider ${initddir}/../
ln -s ../outsider ${initddir}/outsidelink
insserv_reg outsidelink || true
list_rclinks
check_script_present 1 outsidelink
check_script_present 2 outsidelink
check_script_present 3 outsidelink
check_script_present 4 outsidelink
check_script_present 5 outsidelink
rm -f ${initddir}/../outsider
}
##########################################################################
test_deterministic_order() {
echo
echo "info: test two or more initscripts providing same facility, making sure"
echo "info: that the first script can be registered with insserv, but others fail."
echo
initdir_purge
addscript abc <<'EOF' || true
### BEGIN INIT INFO
# Provides: service
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
addscript xyz <<'EOF' || true
### BEGIN INIT INFO
# Provides: service
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
addscript hjk <<'EOF' || true
### BEGIN INIT INFO
# Provides: service
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insserv_reg xyz || true
insserv_reg hjk || true
insserv_reg abc || true
list_rclinks
# #494514
check_script_present S xyz
check_script_not_present S abc
check_script_not_present S hjk
}
##########################################################################
test_all_keyword() {
echo
echo "info: test behaviour of a script depending on another with the \$all keyword"
echo "info: #491391"
echo
initdir_purge
# Insert a few scripts to flesh out $initdir
for script in one two three
do
insertscript $script <<EOF || true
### BEGIN INIT INFO
# Provides: $script
# Required-Start: \$remote_fs
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
done
insertscript four <<'EOF' || true
### BEGIN INIT INFO
# Provides: four
# Required-Start: $remote_fs
# Required-Stop:
# Should-Start: one two three
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
insertscript rmnologin <<'EOF' || true
### BEGIN INIT INFO
# Provides: rmnologin
# Required-Start: $remote_fs $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
# This version of bootchart LSB info is not the best, but it does reveal
# an interesting and unexpected behaviour.
insertscript bootchart <<'EOF' || true
### BEGIN INIT INFO
# Provides: bootchart
# Required-Start: $remote_fs rmnologin
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_present 5 rmnologin
check_script_present 5 bootchart
check_order 5 bootchart rmnologin
echo
echo "info: now add \$all keyword to bootchart script and reinsert"
echo
remscript bootchart
# This information looks correct, but due to the way all_links() works two or
# more scripts with keyword $all in Required-Start start at same sequence, but
# do start after all other scripts
addscript bootchart <<'EOF' || true
### BEGIN INIT INFO
# Provides: bootchart
# Required-Start: $all rmnologin
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
insserv_reg bootchart || true
list_rclinks
check_script_present 5 bootchart
check_order 5 rmnologin bootchart
echo
echo "info: add yet another script depending on \$all"
echo
insertscript all <<'EOF' || true
### BEGIN INIT INFO
# Provides: all
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_present 5 all
}
##########################################################################
test_early_all() {
echo
echo "info: Check that start dependency on \$all only affect the start"
echo "sequence. BTS #485307"
echo
initdir_purge
# Insert a few scripts to flesh out $initdir
insertscript early <<EOF || true
### BEGIN INIT INFO
# Provides: early
# Required-Start:
# Required-Stop:
# Default-Start: 2
# Default-Stop: 0
### END INIT INFO
EOF
insertscript center <<'EOF' || true
### BEGIN INIT INFO
# Provides: center
# Required-Start: early
# Required-Stop: early
# Default-Start: 2
# Default-Stop: 0
### END INIT INFO
EOF
insertscript late <<'EOF' || true
### BEGIN INIT INFO
# Provides: late
# Required-Start: center
# Required-Stop: center
# Default-Start: 2
# Default-Stop: 0
### END INIT INFO
EOF
# This script should start early and stop before all other scripts
insertscript zcomplex <<'EOF' || true
### BEGIN INIT INFO
# Provides: zcompex
# Required-Start: early
# X-Start-Before: center
# Required-Stop: $all
# Default-Start: 2
# Default-Stop: 0
### END INIT INFO
EOF
list_rclinks
check_script_present 2 early
check_script_present 2 zcomplex
check_order 2 early zcomplex
check_order 2 zcomplex center
check_order 0 zcomplex late
check_order 0 zcomplex early
}
##########################################################################
test_script_in_runlevel() {
echo
echo "info: add a regular file where only symlinks are expected (#493202)"
echo
initdir_purge
# Create a regular file in runlevel directory where only symlinks are expected
mkdir $initddir/../rcS.d
touch $initddir/../rcS.d/S06badboy
insertscript goodboy <<'EOF'
### BEGIN INIT INFO
# Provides: goodboy
# Required-Start: $remote_fs
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_present S goodboy
rm $initddir/../rcS.d/S06badboy
}
##########################################################################
test_x_interactive() {
echo
echo "info: Check if X-Interactive header work"
echo "BTS #458224, #580564"
echo
initdir_purge
# Insert a few scripts to flesh out $initdir
insertscript first <<EOF || true
### BEGIN INIT INFO
# Provides: first
# Required-Start:
# Required-Stop:
# Default-Start: 2
# Default-Stop: 0
### END INIT INFO
EOF
# This test if X-Interactive work with existing scripts when a new
# script is inserted.
insertscript alone1 <<'EOF' || true
### BEGIN INIT INFO
# Provides: alone1
# Required-Start: first
# Required-Stop: first
# Default-Start: 2
# Default-Stop: 0
# X-Interactive: true
### END INIT INFO
EOF
insertscript after <<'EOF' || true
### BEGIN INIT INFO
# Provides: after
# Required-Start: first
# Required-Stop: first
# Default-Start: 2
# Default-Stop: 0
### END INIT INFO
EOF
# This test if X-Interactive work with new scripts too. The code
# paths in insserv are different for the two cases.
insertscript alone2 <<'EOF' || true
### BEGIN INIT INFO
# Provides: alone2
# Required-Start: first
# Required-Stop: first
# Default-Start: 2
# Default-Stop: 0
# X-Interactive: true
### END INIT INFO
EOF
list_rclinks
check_script_present 2 first
check_script_present 2 after
check_script_present 2 alone1
check_script_present 2 alone2
check_order 2 first after
check_order 2 first alone1
check_order 2 first alone2
# This ordering is not guaranteed, but currently interactive scripts
# are put after the others on the same level.
check_order 2 alone1 after
check_order 2 alone2 after
if grep INTERACTIVE ${insservdir}/.depend.start | grep -q alone1 &&
grep INTERACTIVE ${insservdir}/.depend.start | grep -q alone1 ; then
counttest
else
error "scripts alone1 and alone2 are not flagged as interactive"
fi
}
##########################################################################
test_insserv_conf_makefile() {
echo
echo "info: test how recursive /etc/insserv.conf settings show up"
echo "info: in .depend.boot. BTS #534526."
echo
initdir_purge
list_rclinks
# If $local_fs only depend on the mountall script, the test work.
# Only the last script in $local_fs make it to the dependency file.
set +C
cat <<'EOF' > $insconf
$local_fs +mountall +nonexisting
$remote_fs $local_fs
EOF
set -C
insertscript mountall <<'EOF'
### BEGIN INIT INFO
# Provides: mountall
# Required-Start:
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
insertscript dbus <<'EOF'
### BEGIN INIT INFO
# Provides: dbus
# Required-Start:
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
insertscript hal <<'EOF'
### BEGIN INIT INFO
# Provides: hal
# Required-Start: $remote_fs dbus
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
if ! grep -q "^hal: mountall dbus" ${insservdir}/.depend.start ; then
msg="hal should depend on dbus and mountall in .depend.start:"
error "$msg"
grep "^hal: " ${insservdir}/.depend.start | sed 's/^/ /'
fi
update_conf
}
#########################
test_insserv_virt_loop() {
echo
echo "info: test insserv handle virtual facilities depending on itself."
echo
initdir_purge
list_rclinks
# If $local_fs depend on itself, the error is triggered.
set +C
cat <<'EOF' > $insconf
$local_fs +mountall $local_fs
EOF
set -C
# This used to hang and use unlimited amount of memory. Now return
# error instead.
insertscript testscript <<'EOF' || true
### BEGIN INIT INFO
# Provides: testscript
# Required-Start: $local_fs
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
update_conf
}
##########################################################################
test_local_virtual() {
echo
echo "info: Test if home made virtual facilities work as they should."
echo
initdir_purge
mkdir $insconf.d
insertscript test1 <<'EOF' || true
### BEGIN INIT INFO
# Provides: test1
# Required-Start: $mail-transport-agent
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
insertscript test2 <<'EOF' || true
### BEGIN INIT INFO
# Provides: test2
# Required-Start: $mail-transport-agent
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
set +C
cat <<'EOF' > $insconf.d/test3
$mail-transport-agent test3
EOF
insertscript test3 <<'EOF' || true
### BEGIN INIT INFO
# Provides: test3
# Required-Start:
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
cat <<'EOF' > $insconf.d/test4
$mail-transport-agent +test4
EOF
set -C
insertscript test4 <<'EOF' || true
### BEGIN INIT INFO
# Provides: test4
# Required-Start: test3
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_order 1 test3 test1
check_order 1 test3 test2
check_order 1 test4 test1
check_order 1 test4 test2
rm -f $insconf.d/test3 $insconf.d/test4
}
##########################################################################
test_insserv_upstart() {
echo
echo "info: test if insserv handle upstart jobs properly."
echo
initdir_purge
list_rclinks
# This used to hang and use unlimited amount of memory. Now return
# error instead.
upstartdir=${tmpdir}/etc/init
upstartjob="${tmpdir}/lib/init/upstart-job"
# Add upstart config
oldconf="$insconf"
insconf="$insconf -u $upstartjob"
# Dummy entry
mkdir -p $(dirname $upstartjob)
cat > $upstartjob <<EOF
#!/bin/sh
cat <<END
### BEGIN INIT INFO
# Provides: upstart-test
# Required-Start:
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
END
EOF
chmod a+x $upstartjob
insert_upstart_job() {
name=$1
mkdir -p $upstartdir
cat > $upstartdir/$name
ln -s $upstartjob $initddir/$name
insserv_reg $name
}
remove_upstart_jobs() {
rm -rf $upstartdir
}
# XXX Someone that understand upstart need to fill in sensible stuff
# here
insert_upstart_job upstart-test <<EOF || true
exec /bin/foo --opt -xyz foo bar
EOF
insertscript test <<'EOF' || true
### BEGIN INIT INFO
# Provides: test
# Required-Start: upstart-test
# Required-Stop:
# Default-Start: 1
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
# Undo upstart config
insconf="$oldconf"
remove_upstart_jobs
}
##########################################################################
test_undetected_loop() {
echo
echo "info: test if insserv detect loop involving virtual facility,"
echo "info: x-start-before and should-start. Issue detected in BTS"
echo "info: report #554905."
echo
initdir_purge
set +C
cat <<'EOF' > $insconf
$local_fs mountall
EOF
set -C
insertscript hibernate <<'EOF'
### BEGIN INIT INFO
# Provides: hibernate-cleanup
# Default-Start: S
# Default-Stop:
# Required-Start:
# Required-Stop:
# Should-Start: udev devfsd raid2 mdadm lvm evms cryptdisks
# X-Start-Before: mountall
### END INIT INFO
EOF
insertscript mountall.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountall
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Mount all filesystems.
### END INIT INFO
EOF
# Inserting this script should fail, as it introduces a loop
insertscript mdadm <<'EOF' || true
### BEGIN INIT INFO
# Provides: mdadm
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
# Inserting this script should definitely fail, as it depend on a loop
insertscript test <<'EOF' || true
### BEGIN INIT INFO
# Provides: test
# Required-Start: $local_fs mdadm
# Required-Stop: $local_fs mdadm
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_not_present S mdadm
check_script_not_present S test
}
##########################################################################
test_invalid_core_string() {
echo
echo "info: test if insserv accepts 'corekeeper' but rejects core dumps"
echo "info: named '*.core' or 'core'"
echo "info: See bug report #554905."
echo
initdir_purge
set +C
cat <<'EOF' > $insconf
$local_fs mountall
EOF
set -C
# should be accepted - valid name
insertscript corekeeper <<'EOF'
### BEGIN INIT INFO
# Provides: corekeeper
# Default-Start: S
# Default-Stop:
# Required-Start:
# Required-Stop:
### END INIT INFO
EOF
# should be rejected - invalid name
insertscript somescript.core <<'EOF'
### BEGIN INIT INFO
# Provides: somescript
# Default-Start: S
# Default-Stop:
# Required-Start:
# Required-Stop:
### END INIT INFO
EOF
# should be rejected - invalid name
insertscript core <<'EOF'
### BEGIN INIT INFO
# Provides: someotherscript
# Default-Start: S
# Default-Stop:
# Required-Start:
# Required-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_not_present S core
check_script_not_present S somescript
check_script_present S corekeeper
}
##########################################################################
insserv_show()
{
$insserv $debug -c $insconf -p $initddir -o $overridedir -s
}
test_show_all() {
echo
echo "info: test if -s|--show-all option works as it should"
echo
initdir_purge
insertscript bootscript <<'EOF'
### BEGIN INIT INFO
# Provides: bootscript
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript localscript <<'EOF'
### BEGIN INIT INFO
# Provides: localscript
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
EOF
insertscript shutdownscript <<'EOF'
### BEGIN INIT INFO
# Provides: shutdownscript
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0 6
### END INIT INFO
EOF
check_script_present S bootscript
check_script_present 2 localscript
check_script_present 0 shutdownscript
OLDIFS="$IFS"
IFS=":"
insserv_show | sort -t: -k2 -k1 | while read IN_ACTION IN_SEQUENCE IN_LEVELS IN_BASENAME
do
IN_LEVELS="$(echo "$IN_LEVELS" | sed -e 's; ;,;g')"
if [ "$IN_ACTION" = "S" ]; then
echo "$IN_SEQUENCE - $IN_LEVELS /etc/init.d/$IN_BASENAME"
elif [ "$IN_ACTION" = "K" ]; then
echo "$IN_SEQUENCE $IN_LEVELS - /etc/init.d/$IN_BASENAME"
fi
done > ${tmpdir}/rc.conf
IFS="$OLDIFS"
cat ${tmpdir}/rc.conf
if grep -qE '[[:digit:]]{2}[[:space:]]+-[[:space:]]+S[[:space:]]+/etc/init.d/bootscript' ${tmpdir}/rc.conf; then
counttest
else
error "bootscript configuration error in rc.conf"
fi
if grep -qE '[[:digit:]]{2}[[:space:]]+-[[:space:]]+2,3,4,5[[:space:]]+/etc/init.d/localscript' ${tmpdir}/rc.conf && \
grep -qE '[[:digit:]]{2}[[:space:]]+0,1,6[[:space:]]+-[[:space:]]+/etc/init.d/localscript' ${tmpdir}/rc.conf; then
counttest
else
error "localscript configuration error in rc.conf"
fi
if grep -qE '[[:digit:]]{2}[[:space:]]+0,6[[:space:]]+-[[:space:]]+/etc/init.d/shutdownscript' ${tmpdir}/rc.conf; then
counttest
else
error "shutdownscript configuration error in rc.conf"
fi
rm -f ${tmpdir}/rc.conf
}
##########################################################################
test_bootmisc_order() {
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677097
echo
echo "info: mountall-bootclean.sh must start before bootmisc.sh"
echo
initdir_purge
set +C
cat <<'EOF' > $insconf
$local_fs +mountall +mountall-bootclean
$remote_fs $local_fs
EOF
set -C
insertscript mountall.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountall
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript mountall-bootclean.sh <<'EOF'
### BEGIN INIT INFO
# Provides: mountall-bootclean
# Required-Start: mountall
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript bootmisc.sh <<'EOF'
### BEGIN INIT INFO
# Provides: bootmisc
# Required-Start: $remote_fs
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_order S mountall.sh mountall-bootclean.sh
check_order S mountall-bootclean.sh bootmisc.sh
update_conf
}
##########################################################################
# Trying to reproduce <URL: http://bugs.debian.org/738775 >
test_cross_runlevel_dep() {
initdir_purge
#if [ Linux = $(uname -s) ] ; then
# insopts="-y /bin/true"
#fi
insertscript rpcbind <<'EOF'
### BEGIN INIT INFO
# Provides: rpcbind
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
### END INIT INFO
EOF
insertscript nfs-common <<'EOF'
### BEGIN INIT INFO
# Provides: nfs-common
# Required-Start: rpcbind
# Required-Stop:
# Default-Start: 2
# Default-Stop:
### END INIT INFO
EOF
insertscript nfs-server <<'EOF'
### BEGIN INIT INFO
# Provides: nfs-server
# Required-Start: nfs-common
# Required-Stop:
# Default-Start: 2
# Default-Stop:
### END INIT INFO
EOF
list_rclinks
check_script_present S rpcbind
check_script_present 2 nfs-common
check_script_present 2 nfs-server
check_order 2 nfs-common nfs-server
#if [ Linux = $(uname -s) ] ; then
# insopts="-y /non-existing"
#fi
}
##########################################################################
test_normal_sequence
test_override_files
test_override_loop
test_override_remove
test_long_loop
test_combined_loop # 1 non-fatal test failing
test_fake_loop
test_fake_loop_reverse
test_badscript
test_onlystart
test_onlystop
test_removal
test_segfault_virtfac
test_incorrect_startscripts
test_incorrect_stopscripts
test_newbug_keepoldorder # 3 non-fatal tests failing
test_start_before
test_stop_after
test_adding_start
test_removing_start
test_adding_stop
test_removing_stop
test_duplicate_provides
test_bogus_facility # 1 non-fatal test failing
test_insserv_conf_d
test_broken_header
test_noprovides_header
test_no_default_start
test_no_default_stop
test_initd_symlink
test_deterministic_order
test_all_keyword
test_early_all
test_script_in_runlevel
test_x_interactive
test_insserv_conf_makefile
test_insserv_virt_loop
test_local_virtual
test_insserv_upstart
test_undetected_loop # 2 non-fatal tests failing
test_invalid_core_string
test_show_all
test_bootmisc_order
test_cross_runlevel_dep