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.
283 lines
6.3 KiB
283 lines
6.3 KiB
#!/bin/sh -xe
|
|
|
|
SetupCrontab ()
|
|
{
|
|
echo "Setup crontab."
|
|
|
|
set +e
|
|
crontab -r
|
|
set -e
|
|
|
|
# crontab in some distros will not read from STDIN.
|
|
|
|
cat <<EOF >kdump.cron
|
|
SHELL=/bin/sh
|
|
PATH=/usr/bin:/usr/sbin:/sbin:/bin
|
|
MAILTO=root
|
|
@reboot cd "$(pwd)"; cd ..; ${0} >>/tmp/kdump-$(date +%F-%T).log 2>&1
|
|
EOF
|
|
|
|
crontab kdump.cron
|
|
|
|
echo "Enable cron daemon by default."
|
|
|
|
if [ -f /etc/init.d/crond ]; then
|
|
cron=crond
|
|
else
|
|
# SUSE
|
|
cron=cron
|
|
fi
|
|
|
|
# Red Hat and SUSE.
|
|
if [ -x "/sbin/chkconfig" ]; then
|
|
/sbin/chkconfig "${cron}" on
|
|
|
|
# Debian and Ubuntu.
|
|
elif [ -x "/sbin/update-rc.d" ]; then
|
|
/sbin/update-rc.d "${cron}" defaults
|
|
fi
|
|
}
|
|
|
|
SetupKdump ()
|
|
{
|
|
echo "Start kdump daemon."
|
|
/etc/init.d/kdump restart
|
|
|
|
echo "Enable kdump daemon by default."
|
|
# Red Hat and SUSE.
|
|
if [ -x "/sbin/chkconfig" ]; then
|
|
/sbin/chkconfig kdump on
|
|
|
|
# Debian and Ubuntu.
|
|
elif [ -x "/sbin/update-rc.d" ]; then
|
|
/sbin/update-rc.d kdump defaults
|
|
fi
|
|
}
|
|
|
|
|
|
PrepareVerify ()
|
|
{
|
|
if [ "${last}" = "KLEXT" ]; then
|
|
# If not mountable, skip it, and continue doing the test.
|
|
set +e
|
|
mount "${EXT3_PART}" /mnt
|
|
set -e
|
|
|
|
COREDIR=/mnt"${COREDIR}"
|
|
|
|
elif [ "${last}" = "KLLBL" ]; then
|
|
# If not mountable, skip it, and continue doing the test.
|
|
set +e
|
|
mount -L "${EXT3_LABEL}" /mnt
|
|
set -e
|
|
|
|
COREDIR=/mnt"${COREDIR}"
|
|
|
|
elif [ "${last}" = "KLUID" ]; then
|
|
# If not mountable, skip it, and continue doing the test.
|
|
set +e
|
|
mount "/dev/disk/by-uuid/${EXT3_UID}" /mnt
|
|
set -e
|
|
|
|
COREDIR=/mnt"${COREDIR}"
|
|
|
|
elif [ "${last}" = "KLRAW" ]; then
|
|
mkdir -p "${COREDIR}/${last}"
|
|
|
|
# If not dumpable, skip it, and continue doing the test.
|
|
set +e
|
|
dd if="${RAW_PART}" of="${COREDIR}/${last}/vmcore" bs=1024
|
|
set -e
|
|
|
|
elif [ "${last}" = "KNSCP" ]; then
|
|
if [ -z "${SCP_PATH}" ]; then
|
|
echo "Fail: network destination not defined."
|
|
exit 1
|
|
fi
|
|
|
|
file=$(ssh -i ~/.ssh/kdump_id_rsa "${SCP_PATH}" "ls -t ${COREDIR}/*/vmcore* \
|
|
2>/dev/null | head -1")
|
|
|
|
mkdir -p "${COREDIR}/${last}"
|
|
|
|
if [ "${file}" ]; then
|
|
# Not fatal error.
|
|
set +e
|
|
scp -i ~/.ssh/kdump_id_rsa "${SCP_PATH}:${file}" "${COREDIR}/${last}"
|
|
set -e
|
|
fi
|
|
|
|
elif [ "${last}" = "KNNFS" ]; then
|
|
# Not fatal error.
|
|
set +e
|
|
mount "${NFS_PATH}" /mnt
|
|
set -e
|
|
|
|
COREDIR=/mnt"${COREDIR}"
|
|
fi
|
|
|
|
vmcore=$(ls -t "${COREDIR}"/*/vmcore* 2>/dev/null | head -1)
|
|
}
|
|
|
|
VerifyTest ()
|
|
{
|
|
# Should not be here.
|
|
if [ -z "${last}" ]; then
|
|
echo "Should not be here!"
|
|
echo "There must be something wrong with the test setup."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Verifying the result of previous test ${last}."
|
|
ldir=$(ls -td "../${log}/$(hostname)."* | head -1)
|
|
|
|
if [ -f "${vmcore}" ]; then
|
|
echo "$(date +%F-%T): verification of test ${last} passed." \
|
|
>>"${ldir}/status"
|
|
|
|
./verify.sh "../${conf}" "${vmcore}" "${CRASH}" \
|
|
>>"${ldir}/${ITERATION}.${last}.$(date +%F-%T)"
|
|
|
|
# Be careful to define COREDIR.
|
|
rm -rf "${COREDIR}"/*
|
|
|
|
else
|
|
echo "$(date +%F-%T): verification of test ${last} failed:\
|
|
vmcore NOT FOUND." >>"${ldir}/status"
|
|
echo "vmcore NOT FOUND." \
|
|
>>"${ldir}/${ITERATION}.${last}.$(date +%F-%T)"
|
|
fi
|
|
}
|
|
|
|
RunTest ()
|
|
{
|
|
|
|
sed -i "s/\(^REBOOT\)=.*/\1=$((count + 1))/" \
|
|
"../${conf}"
|
|
|
|
echo "Running current test ${i}."
|
|
|
|
echo "$(date +%F-%T): running current test ${i}." \
|
|
>> "${ldir}/status"
|
|
|
|
# Save STDIO buffers.
|
|
sync
|
|
./test.sh "../${conf}" "${i}" "../${log}"
|
|
}
|
|
|
|
# Start test.
|
|
conf="./runkdump.conf"
|
|
lib="lib"
|
|
log="log"
|
|
|
|
# Read test configuration file.
|
|
. "${conf}"
|
|
|
|
# Check mandatory variables.
|
|
if [ -z "${ITERATION}" ] || [ -z "${REBOOT}" ] || [ -z "${COREDIR}" ]
|
|
then
|
|
echo "Fail: some mandatory variables are missing from\
|
|
configuration file."
|
|
exit 1
|
|
fi
|
|
|
|
cd "${lib}"
|
|
|
|
while [ "${ITERATION}" -ge 1 ]; do
|
|
|
|
# Reboot the machine first to take advantage of boot parameter
|
|
# changes.
|
|
if [ -z "${REBOOT}" ] || [ "${REBOOT}" -eq 0 ]; then
|
|
echo "Setup test environment."
|
|
|
|
SetupCrontab
|
|
|
|
./setup.sh "../${conf}"
|
|
|
|
sed -i 's/\(^REBOOT\)=.*/\1=1/' "../${conf}"
|
|
|
|
echo "System is going to reboot."
|
|
/sbin/shutdown -r now
|
|
sleep 60
|
|
|
|
else
|
|
count=1
|
|
|
|
for i in ${CRASHER} ${BASIC_LKDTM} ${EXTRA_LKDTM} ${EXTRA_DUMP} \
|
|
END; do
|
|
|
|
if [ "${count}" -eq "${REBOOT}" ]; then
|
|
# Wait for machine fully booted.
|
|
sleep 60
|
|
|
|
# First Test.
|
|
if [ "${REBOOT}" -eq 1 ]; then
|
|
echo "First test..."
|
|
echo "Verify Boot Loader."
|
|
if ! grep 'crashkernel=' /proc/cmdline; then
|
|
echo "Fail: error changing Boot Loader, no crashkernel=."
|
|
exit 1
|
|
fi
|
|
|
|
SetupKdump
|
|
|
|
# Creat log directory.
|
|
mkdir -p "../${log}/$(hostname).$(date +%F-%T)"
|
|
|
|
echo "Gather system information."
|
|
|
|
ldir=$(ls -td "../${log}/$(hostname)."* | head -1)
|
|
./sysinfo.sh >"${ldir}/system.info"
|
|
|
|
else
|
|
PrepareVerify
|
|
|
|
VerifyTest
|
|
|
|
if [ "${i}" = END ]; then
|
|
# We are done.
|
|
break
|
|
fi
|
|
|
|
fi
|
|
|
|
RunTest
|
|
|
|
# Some tests could not reboot target. They can hung up
|
|
# machine or leave it working. But we need to do all
|
|
# tests. So we are going to reboot if we are in wrong
|
|
# place.
|
|
|
|
sleep 3600
|
|
echo "$(date +%F-%T): manually reboot for test ${i}." >>"${ldir}/status"
|
|
/sbin/shutdown -r now
|
|
sleep 60
|
|
fi
|
|
|
|
# No test is scheduled to run.
|
|
count=$((count + 1))
|
|
last=${i}
|
|
done
|
|
fi
|
|
|
|
if [ "${ITERATION}" -eq 1 ]; then
|
|
# We are done.
|
|
break
|
|
|
|
else
|
|
# Run the next iteration.
|
|
sed -i "s/\(^ITERATION\)=.*/\1=$((ITERATION - 1))/" \
|
|
"../${conf}"
|
|
fi
|
|
|
|
done
|
|
|
|
# We are done.
|
|
# Reset.
|
|
sed -i "s/\(^REBOOT\)=.*/\1=0/" "../${conf}"
|
|
crontab -r
|
|
ldir=$(ls -td "../${log}/$(hostname)."* | head -1)
|
|
echo "$(date +%F-%T): test run complete." >>"${ldir}/status"
|
|
|
|
exit 0
|