1#!/bin/sh -xe 2 3SetupCrontab () 4{ 5 echo "Setup crontab." 6 7 set +e 8 crontab -r 9 set -e 10 11 # crontab in some distros will not read from STDIN. 12 13 cat <<EOF >kdump.cron 14SHELL=/bin/sh 15PATH=/usr/bin:/usr/sbin:/sbin:/bin 16MAILTO=root 17@reboot cd "$(pwd)"; cd ..; ${0} >>/tmp/kdump-$(date +%F-%T).log 2>&1 18EOF 19 20 crontab kdump.cron 21 22 echo "Enable cron daemon by default." 23 24 if [ -f /etc/init.d/crond ]; then 25 cron=crond 26 else 27 # SUSE 28 cron=cron 29 fi 30 31 # Red Hat and SUSE. 32 if [ -x "/sbin/chkconfig" ]; then 33 /sbin/chkconfig "${cron}" on 34 35 # Debian and Ubuntu. 36 elif [ -x "/sbin/update-rc.d" ]; then 37 /sbin/update-rc.d "${cron}" defaults 38 fi 39} 40 41SetupKdump () 42{ 43 echo "Start kdump daemon." 44 /etc/init.d/kdump restart 45 46 echo "Enable kdump daemon by default." 47 # Red Hat and SUSE. 48 if [ -x "/sbin/chkconfig" ]; then 49 /sbin/chkconfig kdump on 50 51 # Debian and Ubuntu. 52 elif [ -x "/sbin/update-rc.d" ]; then 53 /sbin/update-rc.d kdump defaults 54 fi 55} 56 57 58PrepareVerify () 59{ 60 if [ "${last}" = "KLEXT" ]; then 61 # If not mountable, skip it, and continue doing the test. 62 set +e 63 mount "${EXT3_PART}" /mnt 64 set -e 65 66 COREDIR=/mnt"${COREDIR}" 67 68 elif [ "${last}" = "KLLBL" ]; then 69 # If not mountable, skip it, and continue doing the test. 70 set +e 71 mount -L "${EXT3_LABEL}" /mnt 72 set -e 73 74 COREDIR=/mnt"${COREDIR}" 75 76 elif [ "${last}" = "KLUID" ]; then 77 # If not mountable, skip it, and continue doing the test. 78 set +e 79 mount "/dev/disk/by-uuid/${EXT3_UID}" /mnt 80 set -e 81 82 COREDIR=/mnt"${COREDIR}" 83 84 elif [ "${last}" = "KLRAW" ]; then 85 mkdir -p "${COREDIR}/${last}" 86 87 # If not dumpable, skip it, and continue doing the test. 88 set +e 89 dd if="${RAW_PART}" of="${COREDIR}/${last}/vmcore" bs=1024 90 set -e 91 92 elif [ "${last}" = "KNSCP" ]; then 93 if [ -z "${SCP_PATH}" ]; then 94 echo "Fail: network destination not defined." 95 exit 1 96 fi 97 98 file=$(ssh -i ~/.ssh/kdump_id_rsa "${SCP_PATH}" "ls -t ${COREDIR}/*/vmcore* \ 99 2>/dev/null | head -1") 100 101 mkdir -p "${COREDIR}/${last}" 102 103 if [ "${file}" ]; then 104 # Not fatal error. 105 set +e 106 scp -i ~/.ssh/kdump_id_rsa "${SCP_PATH}:${file}" "${COREDIR}/${last}" 107 set -e 108 fi 109 110 elif [ "${last}" = "KNNFS" ]; then 111 # Not fatal error. 112 set +e 113 mount "${NFS_PATH}" /mnt 114 set -e 115 116 COREDIR=/mnt"${COREDIR}" 117 fi 118 119 vmcore=$(ls -t "${COREDIR}"/*/vmcore* 2>/dev/null | head -1) 120} 121 122VerifyTest () 123{ 124 # Should not be here. 125 if [ -z "${last}" ]; then 126 echo "Should not be here!" 127 echo "There must be something wrong with the test setup." 128 exit 1 129 fi 130 131 echo "Verifying the result of previous test ${last}." 132 ldir=$(ls -td "../${log}/$(hostname)."* | head -1) 133 134 if [ -f "${vmcore}" ]; then 135 echo "$(date +%F-%T): verification of test ${last} passed." \ 136 >>"${ldir}/status" 137 138 ./verify.sh "../${conf}" "${vmcore}" "${CRASH}" \ 139 >>"${ldir}/${ITERATION}.${last}.$(date +%F-%T)" 140 141 # Be careful to define COREDIR. 142 rm -rf "${COREDIR}"/* 143 144 else 145 echo "$(date +%F-%T): verification of test ${last} failed:\ 146 vmcore NOT FOUND." >>"${ldir}/status" 147 echo "vmcore NOT FOUND." \ 148 >>"${ldir}/${ITERATION}.${last}.$(date +%F-%T)" 149 fi 150} 151 152RunTest () 153{ 154 155 sed -i "s/\(^REBOOT\)=.*/\1=$((count + 1))/" \ 156 "../${conf}" 157 158 echo "Running current test ${i}." 159 160 echo "$(date +%F-%T): running current test ${i}." \ 161 >> "${ldir}/status" 162 163 # Save STDIO buffers. 164 sync 165 ./test.sh "../${conf}" "${i}" "../${log}" 166} 167 168# Start test. 169conf="./runkdump.conf" 170lib="lib" 171log="log" 172 173# Read test configuration file. 174. "${conf}" 175 176# Check mandatory variables. 177if [ -z "${ITERATION}" ] || [ -z "${REBOOT}" ] || [ -z "${COREDIR}" ] 178then 179 echo "Fail: some mandatory variables are missing from\ 180 configuration file." 181 exit 1 182fi 183 184cd "${lib}" 185 186while [ "${ITERATION}" -ge 1 ]; do 187 188# Reboot the machine first to take advantage of boot parameter 189# changes. 190if [ -z "${REBOOT}" ] || [ "${REBOOT}" -eq 0 ]; then 191 echo "Setup test environment." 192 193 SetupCrontab 194 195 ./setup.sh "../${conf}" 196 197 sed -i 's/\(^REBOOT\)=.*/\1=1/' "../${conf}" 198 199 echo "System is going to reboot." 200 /sbin/shutdown -r now 201 sleep 60 202 203else 204 count=1 205 206 for i in ${CRASHER} ${BASIC_LKDTM} ${EXTRA_LKDTM} ${EXTRA_DUMP} \ 207 END; do 208 209 if [ "${count}" -eq "${REBOOT}" ]; then 210 # Wait for machine fully booted. 211 sleep 60 212 213 # First Test. 214 if [ "${REBOOT}" -eq 1 ]; then 215 echo "First test..." 216 echo "Verify Boot Loader." 217 if ! grep 'crashkernel=' /proc/cmdline; then 218 echo "Fail: error changing Boot Loader, no crashkernel=." 219 exit 1 220 fi 221 222 SetupKdump 223 224 # Creat log directory. 225 mkdir -p "../${log}/$(hostname).$(date +%F-%T)" 226 227 echo "Gather system information." 228 229 ldir=$(ls -td "../${log}/$(hostname)."* | head -1) 230 ./sysinfo.sh >"${ldir}/system.info" 231 232 else 233 PrepareVerify 234 235 VerifyTest 236 237 if [ "${i}" = END ]; then 238 # We are done. 239 break 240 fi 241 242 fi 243 244 RunTest 245 246 # Some tests could not reboot target. They can hung up 247 # machine or leave it working. But we need to do all 248 # tests. So we are going to reboot if we are in wrong 249 # place. 250 251 sleep 3600 252 echo "$(date +%F-%T): manually reboot for test ${i}." >>"${ldir}/status" 253 /sbin/shutdown -r now 254 sleep 60 255 fi 256 257 # No test is scheduled to run. 258 count=$((count + 1)) 259 last=${i} 260 done 261fi 262 263if [ "${ITERATION}" -eq 1 ]; then 264 # We are done. 265 break 266 267else 268 # Run the next iteration. 269 sed -i "s/\(^ITERATION\)=.*/\1=$((ITERATION - 1))/" \ 270 "../${conf}" 271fi 272 273done 274 275# We are done. 276# Reset. 277sed -i "s/\(^REBOOT\)=.*/\1=0/" "../${conf}" 278crontab -r 279ldir=$(ls -td "../${log}/$(hostname)."* | head -1) 280echo "$(date +%F-%T): test run complete." >>"${ldir}/status" 281 282exit 0 283