STABILITY test script for DilOs 4

#!/bin/bash get_duration() { IFS=':' read -r -a tm <<< "$1" num=${#tm[@]} delta=$((${tm[0]} * 3600)) if [[ $num -gt 1 ]]; then delta1=$((${tm[1]} * 60)) (( delta += $delta1 )) if [[ $num -gt 2 ]]; then (( delta += ${tm[2]} )) fi fi echo $delta } get_time_diff() { local cur_time=$(date +%s) echo $(($cur_time - $1)) } print_time_diff() { local delta=$(get_time_diff $1) local sec=$(($delta % 60)) let "amin = $delta / 60" let "hour = $amin / 60" local min=$(($amin%60)) if [ -n "$2" ]; then printf " Running time: %02d:%02d:%02d\n" $hour $min $sec >> ${ULOG} else printf " Running time: %02d:%02d:%02d\n" $hour $min $sec fi } boot_zone() { echo Shutting down zone $1... sudo zoneadm -z $1 halt echo Cleaning zone $1 dataset... sudo zoneadm -z $1 uninstall -F sudo zfs destroy -fr rpool/zones/$1 echo Booting zone $1... sudo zoneadm -z $1 clone $1-orig && sudo zoneadm -z $1 boot ip="" while [ "${ip}" == "" ] || [ "${ip}" == "0.0.0.0" ] do ip=$(sudo zlogin -l root $1 ifconfig | grep -A 1 "${2}" | sed "/${2}/d; s/^[ \t]*inet[ \t]*//; s/[ \t]*netmask.*$//") done echo "Zone:$1 ------> $2:$ip" } get_random_test() { local tests=(libc elf os util crypto net) local len=${#tests[*]} local idx=$(($RANDOM % $len)) echo "${tests[$idx]}" } log_extra() { echo "---------------- ZPOOL LIST ------------------" >> $1 zpool list >> $1 echo "---------------- ZFS LIST ------------------" >> $1 zfs list >> $1 echo "---------------- PS AX ------------------" >> $1 ps ax >> $1 echo "---------------- TOP -n 10 ------------------" >> $1 top -n 10 >> $1 } test_results() { # $1 - test name # $2 - pass number # $3 - test log # $4 - execution log local percent="$(grep 'Percent passed:' $4 | sed 's/Percent passed:[ \t]*//; s/[ \t]*$//')" local folder="$(grep 'Log directory:' $4 | sed 's/Log directory:[ \t]*//; s/[ \t]*$//')" local rt="$(grep 'Running Time:' $4 | sed 's/Running Time:[ \t]*//; s/[ \t]*$//')" if [[ "${percent}" == "" ]]; then percent="0.0%" fi if [[ "${rt}" == "" ]]; then rt="0 sec" fi echo " Percent passed: ${percent}" >> $3 echo " Running Time: ${rt}" >> $3 sed -n '/Results Summary/,/Log directory:/p' $4 > a.tmp echo "---------------------------------------------------------" >> a.tmp echo "" >> a.tmp cat $4 >> a.tmp mv -f a.tmp $4 if [[ "${percent}" == "100.0%" ]]; then sudo rm -f $4 sudo rm -r -f ${folder} return 0 else cat $4 | grep "\[FAIL\]" >> ${TOTALFAIL} print_time_diff ${GLOB_START_TIME} echo " PASS $2 IS FAILED! (See $4)" >> $3 log_extra $3 echo "Fault on $2 pass! Just ${percent} are successfull. You can find logs in ${folder}." 2>&1 | /usr/bin/tee -a $4 echo "${1^^} test is failed on $2 pass at $(date). Fail information is in ${TOTALFAIL}" >> ${TOTALLOG} return 1 fi } execute_test() { # $1 - test name # $2 - test path # $3 - pass number # $4 - test log # $5 - IP address local percent local folder local rt local LOG="/var/tmp/$1-test.$3.txt" echo "------------------ Pass $3 ---------------------" 2>&1 | /usr/bin/tee -a $4 sudo rm -f ${LOG} uname -a > ${LOG} echo "IP Address : $5" >> ${LOG} $2 2>&1 | /usr/bin/tee -a ${LOG} test_results $1 $3 $4 ${LOG} } i=1 testnm="__ALL__" shuffle=0 mode=0 TOTALLOG="/var/tmp/stability.$(date +%F-%T).txt" TOTALFAIL="/var/tmp/stability-fails.$(date +%F-%T).txt" echo "------------ Stability test started at $(date +%F-%T) --------------" > ${TOTALLOG} if [[ $# < 2 ]]; then echo "Missing parameters in the command" | /usr/bin/tee -a ${TOTALLOG} exit 1 fi case "$1" in -i) mode=1 # number of iterations is provided maxiter=$2 echo "Stability Test : launched for $maxiter iterations at $(date)." | /usr/bin/tee -a ${TOTALLOG} ;; -d) mode=2 # duration of tests is provided delta=$(get_duration $2) echo "Stability Test : launched for $2 interval ($delta seconds) at $(date)." | /usr/bin/tee -a ${TOTALLOG} ;; -t) mode=3 # stop date/time is provided stopdt=$2 ;; *) echo "Stability Test : $1 is a wrong option" | /usr/bin/tee -a ${TOTALLOG} echo "Usage : stability.sh (-i <iterations> | -t <HH:MM[:SS]> | -d <HH:MM[:SS] [DAY-MONTH-YEAR]>]) [-s | <test name>]" exit 1 ;; esac shift shift if [[ $mode -eq 3 ]]; then # stop time/date mode if [[ $# > 0 ]]; then date -d $1 +%s stopat=$? if [[ $stopat -eq 0 ]]; then # stop date is entered after the time # if it is ommited then date is treated as current one stopdt="$stopdt $1" shift fi fi echo "Stability Test : launched until $stopdt at $(date)." | /usr/bin/tee -a ${TOTALLOG} stopat=$(date -d "$stopdt" "+%s") fi if [[ $# > 0 ]]; then # shuffle mode or test name is entered if [[ "$1" == "-s" ]]; then echo "Shuffle mode is turned on." | /usr/bin/tee -a ${TOTALLOG} shuffle=1 else testnm=$1 echo "Only $testnm test will be running." | /usr/bin/tee -a ${TOTALLOG} fi fi LLOG="/var/tmp/libc-stability.$(date +%F-%T).txt" echo "================== Stability libc tests $(date +%F-%T) ==================" > ${LLOG} ELOG="/var/tmp/elf-stability.$(date +%F-%T).txt" echo "================== Stability elf tests $(date +%F-%T) ==================" > ${ELOG} OLOG="/var/tmp/os-stability.$(date +%F-%T).txt" echo "================== Stability os tests $(date +%F-%T) ==================" > ${OLOG} ULOG="/var/tmp/util-stability.$(date +%F-%T).txt" echo "================== Stability util & mdb tests $(date +%F-%T) ==================" > ${ULOG} NLOG="/var/tmp/net-stability.$(date +%F-%T).txt" echo "================== Stability net tests $(date +%F-%T) ==================" > ${NLOG} CLOG="/var/tmp/crypto-stability.$(date +%F-%T).txt" echo "================== Stability crypto tests $(date +%F-%T) ==================" > ${CLOG} ipa=$(sudo ifconfig | grep -A 1 vmxnet3s0 | sed '1d; s/^[ \t]*inet[ \t]*//; s/[ \t]*netmask.*$//') GLOB_START_TIME=$(date +%s) while [[ $mode -gt 0 ]] do case "$mode" in 1) # number of iterations is provided if [[ $i -gt $maxiter ]]; then break fi ;; 2) # duration of tests is provided difftm=$(get_time_diff $GLOB_START_TIME) if [[ $difftm -gt $delta ]]; then break fi ;; 3) # stop date/time is provided tmpat=$(date +%s) if [[ $stopat -le $tmpat ]]; then break fi ;; *) break ;; esac if [[ $shuffle -eq 1 ]]; then testnm=$(get_random_test) fi # ------------------- Tests execution ---------------------------------- if [[ "$testnm" == "libc" ]] || [[ "$testnm" == "__ALL__" ]]; then execute_test "libc" "/opt/libc-tests/bin/libctest" ${i} ${LLOG} ${ipa} fi if [[ "$testnm" == "elf" ]] || [[ "$testnm" == "__ALL__" ]]; then execute_test "elf" "/opt/elf-tests/bin/elftest" ${i} ${ELOG} ${ipa} fi if [[ "$testnm" == "os" ]] || [[ "$testnm" == "__ALL__" ]]; then execute_test "os" "/opt/os-tests/bin/ostest" ${i} ${OLOG} ${ipa} sudo rm -f /tmp/otst* fi if [[ "$testnm" == "util" ]] || [[ "$testnm" == "__ALL__" ]]; then echo "--------------------------------------- Pass ${i} ------------------------------------" 2>&1 | /usr/bin/tee -a ${ULOG} START_TIME=$(date +%s) LOG="/var/tmp/util-test.$i.txt" sudo rm -f ${LOG} uname -a > ${LOG} echo "IP Address : \${ipa}" >> ${LOG} echo "---------------------------------------- UTILS --------------------------------------" 2>&1 | /usr/bin/tee -a ${LOG} /opt/util-tests/bin/utiltest 2>&1 | /usr/bin/tee -a ${LOG} percent="$(grep 'Percent passed:' ${LOG} | sed 's/Percent passed:[ \t]*//; s/[ \t]*$//')" if [[ "${percent}" == "" ]]; then percent="0.0%" fi echo " UTILS percent passed: ${percent}" >> ${ULOG} folder="$(grep 'Log directory:' ${LOG} | sed 's/Log directory:[ \t]*//; s/[ \t]*$//')" if [ "${percent}" != "100.0%" ]; then cat ${LOG} | grep "\[FAIL\]" >> ${TOTALFAIL} print_time_diff ${START_TIME} ${ULOG} print_time_diff ${GLOB_START_TIME} echo " PASS ${i} IS FAILED! (See ${LOG})" >> ${ULOG} log_extra ${ULOG} echo "Fault on ${i} pass! Just ${percent} are successfull. You can find logs in ${folder}." 2>&1 | /usr/bin/tee -a ${LOG} echo "UTIL test is failed on ${i} pass at $(date). Fail information is in ${TOTALFAIL}" >> ${TOTALLOG} exit 1 fi sudo rm -r -f ${folder} echo "---------------------------------------- MDB --------------------------------------" 2>&1 | /usr/bin/tee -a ${LOG} /opt/util-tests/bin/utiltest -c /opt/util-tests/runfiles/mdb.run 2>&1 | /usr/bin/tee -a ${LOG} percent="$(sed '/- UTILS -/,/- MDB -/d' ${LOG} | grep 'Percent passed:' | sed 's/Percent passed:[ \t]*//; s/[ \t]*$//')" if [[ "${percent}" == "" ]]; then percent="0.0%" fi echo " MDB percent passed: ${percent}" >> ${ULOG} folder="$(sed '/- UTILS -/,/- MDB -/d' ${LOG} | grep 'Log directory:' | sed 's/Log directory:[ \t]*//; s/[ \t]*$//')" print_time_diff ${START_TIME} ${ULOG} sed -n '/Results Summary/,/Log directory:/p' ${LOG} > a.tmp echo "---------------------------------------------------------" >> a.tmp echo "" >> a.tmp cat ${LOG} >> a.tmp mv -f a.tmp ${LOG} if [ "${percent}" == "100.0%" ]; then sudo rm -f ${LOG} sudo rm -r -f ${folder} else cat ${LOG} | grep "\[FAIL\]" >> ${TOTALFAIL} print_time_diff ${GLOB_START_TIME} echo " PASS ${i} IS FAILED! (See ${LOG})" >> ${ULOG} log_extra ${ULOG} echo "Fault on ${i} pass! Just ${percent} are successfull. You can find logs in ${folder}." 2>&1 | /usr/bin/tee -a ${LOG} echo "MDB test is failed on ${i} pass at $(date). Fail information is in ${TOTALFAIL}" >> ${TOTALLOG} exit 1 fi fi if [[ "$testnm" == "crypto" ]] || [[ "$testnm" == "__ALL__" ]]; then execute_test "crypto" "/opt/crypto-tests/bin/cryptotest" ${i} ${CLOG} ${ipa} fi if [[ "$testnm" == "net" ]] || [[ "$testnm" == "__ALL__" ]]; then echo "------------------ Pass ${i} ---------------------" 2>&1 | /usr/bin/tee -a ${NLOG} LOG="/var/tmp/net-test.$i.txt" sudo rm -f ${LOG} uname -a > ${LOG} echo "IP Address : ${ipa}" >> ${LOG} echo "" >> ${LOG} echo ----------------------------- IP Address ---------------------- 2>&1 | /usr/bin/tee -a ${LOG} sudo ifconfig | grep -A 1 vmxnet3s0 2>&1 | /usr/bin/tee -a ${LOG} boot_zone cz int1 ${LOG} boot_zone sz int2 ${LOG} boot_zone rz int3 ${LOG} echo ------------------------------- Zones ------------------------- 2>&1 | /usr/bin/tee -a ${LOG} sudo zoneadm list -v 2>&1 | /usr/bin/tee -a ${LOG} echo ---------------------------- DHCP Server ---------------------- 2>&1 | /usr/bin/tee -a ${LOG} sudo svcs -z dhcp isc-dhcp-server 2>&1 | /usr/bin/tee -a ${LOG} echo ------------------------------- Tests ------------------------- 2>&1 | /usr/bin/tee -a ${LOG} sudo /opt/net-tests/bin/nettest /var/tmp 2>&1 | /usr/bin/tee -a /var/tmp/a.tmp test_results "net" ${i} ${NLOG} ${LOG} fi (( i++ )) done echo "Tests are finished successfully at $(date) with ${i} passes." >> ${TOTALLOG} print_time_diff ${GLOB_START_TIME} | /usr/bin/tee -a ${TOTALLOG}