#!/bin/sh
# DO NOT RUN ON A DEVICE IN SERVICE OR A DEVICE WHERE YOU CARE ABOUT THE CURRENT CONFIG
#
# Tyre Kick
# this is a proof of concept and may lack the desired robustness
#
# this is a script to perform tests on a fresh OpenWrt install
# assumes standard image like rc# or formal release for current config.
# snapshot or a already modified device may not work well
# assumes some things like eth0 exists radio names like radio0 radio1, etc
# not intended for device in use, config will get stomped
# you may want to change the country code or some other settings within the script
help_menu() {
echo "Usage:
${0##*/} [-y] [-h] [-s medium]
Options:
-h, --help
display this help and exit
-s size
small or medium
-d delay in seconds for radio before moving to next config
-y Confirm Yes that script is intended for fresh install and may change elements of existing config
Examples:
Show help:
${0##*/} -h
Run default:
${0##*/} -y
Run small size
${0##*/} -y -s small
Run medium size
${0##*/} -y -s medium -d 180
"
}
TKVERSION="v1"
TSIZE="small"
TYES=""
# parse args
while [ "$#" -gt 0 ]; do
case "$1" in
-h) help_menu; exit 0;;
-s) TSIZE="$2"; shift 2;;
-d) TDELAY="$2"; shift 2;;
-y) TYES="yes"; shift 1;;
-*) echo "unknown option: $1" >&2; exit 1;;
*) handle_argument "$1"; shift 1;;
esac
done
#echo the size is $TSIZE
if [[ "$TSIZE" != "small" && "$TSIZE" != "medium" ]] ; then
echo "invalid size, only small and medium allowed"
exit 1
fi
if [[ "$TYES" != "yes" ]] ; then
echo "you must include the -y parameter to acknowledge that script is intended for fresh install and may change elements of existing config"
exit 1
fi
SLEEPX=1
# SLEEPNO below 160 may not be enouch time for DFS channels to come up, ymmv
SLEEPNO=160
# for small size shorten SLEEPNO to run faster
if [[ "$TSIZE" == "small" ]];then
SLEEPNO=25
fi
if [[ -n "${TDELAY}" ]]; then
SLEEPNO=${TDELAY}
fi
#echo TDELAY $TDELAY
#echo sleepno $SLEEPNO
RUNID=$(date '+%Y-%m-%d-%H-%M-%S')
OUTDIR="/tmp/tk-$RUNID"
mkdir $OUTDIR
tar -czf /tmp/config-${RUNID}.tgz -C /etc config/
ubus call system board > $OUTDIR/ubus-system-board.out
cp /proc/cpuinfo $OUTDIR/
cp /proc/meminfo $OUTDIR/
cp /etc/openwrt_release $OUTDIR/
cp /etc/os-release $OUTDIR/
iw list > $OUTDIR/iwlist.out
ifconfig > $OUTDIR/ifconfig.out
ip rule list > $OUTDIR/ip-rule.out
ip route show table all > $OUTDIR/ip-route.out
ip addr show > $OUTDIR/ip-addr.out
top -b -n 3 > $OUTDIR/top.out
MODEL="$(cat /proc/cpuinfo | grep machine | head -n 1 | awk -F: '{ print $2}' | sed 's/ //' | sed 's/ /-/g')"
MACRAW="$(cat /sys/class/net/eth0/address | sed 's/://g')"
OUI="$(echo "${MACRAW}" | cut -c1-6)"
RELVAL="$(cat /etc/openwrt_release | grep DISTRIB_RELEASE | awk -F= '{ print $2 }' | sed "s/'//g")"
OUTLOG=$OUTDIR/tk-${MODEL}-${RELVAL}-${RUNID}.log
DATA=$OUTDIR/tk-${MODEL}-${RELVAL}-${RUNID}.csv
echo "model,OUI,testID,result-${TKVERSION}" > $DATA
echo Running Test on model:${MODEL} with eth0 MAC of ${MACRAW} and log file of $OUTLOG | tee -a $OUTLOG
logread > $OUTDIR/logread-initial
sleep 5
#/etc/init.d/log restart
logger -p daemon.notice -t tyrekick Running Test on model:${MODEL} with eth0 MAC of ${MACRAW} and log file of $OUTLOG
cat /etc/openwrt_release | grep DISTRIB_RELEASE >> $OUTLOG
cat /etc/openwrt_release | grep DISTRIB_TARGET >> $OUTLOG
WIFIKEY="$(cat /proc/sys/kernel/random/uuid | sed 's/[-]//g' | head -c 12 )"
echo Key for WIFI test is: ${WIFIKEY} | tee -a $OUTLOG
if grep -sq DEVTYPE=dsa /sys/class/net/*/uevent; then
TDEVTYPE=dsa
else
TDEVTYPE=nondsa
fi
echo TDEVTYPE=$TDEVTYPE
NETLIST="$(ls /sys/class/net | grep ^lan | wc -l)"
if [ "$NETLIST" -gt "0" ]; then
echo one or more lan devices found
fi
test_init() {
echo "init "| tee -a $OUTLOG
uci set system.@system[0].log_size='512'
return 0
}
test_opkg() {
echo "test opkg " | tee -a $OUTLOG
opkg update
opkg install unzip
UNZIPH="$(unzip -h | grep UnZip | head -n 1)"
if [[ -n "$UNZIPH" ]]
then
RESULT=pass
else
RESULT=fail
fi
echo "$MODEL,$OUI,opkg-unzip-000001,$RESULT"
echo "$MODEL,$OUI,opkg-unzip-000001,$RESULT" >> $DATA
return 0
}
test_iperf3() {
opkg update
opkg install iperf3
iperf3 -s -D && sleep 2 && iperf3 -c 127.0.0.1 > ${OUTDIR}/iperf3.out
IPERFD=""
IPERFD="$(cat ${OUTDIR}/iperf3.out | grep 'iperf Done.')"
IPERFCOUNT="$(wc -l ${OUTDIR}/iperf3.out | awk '{print $1}')"
#echo IPERFD $IPERFD
#echo IPERFCOUNT $IPERFCOUNT
if [[ "$IPERFD" == "iperf Done." && "$IPERFCOUNT" -gt "16" ]]
then
RESULT=pass
else
RESULT=fail
fi
echo "$MODEL,$OUI,iperf3-000001,$RESULT"
echo "$MODEL,$OUI,iperf3-000001,$RESULT" >> $DATA
return 0
}
test_extraoptions() {
echo "test wireless extra options " | tee -a $OUTLOG
logger -p daemon.notice -t tyrekick test_extraoptions start
for radio in 'radio0' 'radio1' 'radio2' 'radio3'
do
echo "check for $radio" | tee -a $OUTLOG
TRADIO="$(uci -q get wireless."$radio")"
#echo TRADIO = $TRADIO
if [ "$TRADIO" == "wifi-device" ]
then
echo testing $radio | tee -a $OUTLOG
uci -q set wireless.${radio}.disabled='0'
BAND="$(uci get wireless.$radio.band)"
#echo BAND $BAND
tencr="psk2"
# 2g ----------------------------------------------------------
if [ "$BAND" == "2g" ]
then
tchan=11
tpow=10
uci -q set wireless.test_${radio}.txpower="$tpow"
uci -q set wireless.test_${radio}.encryption="${tencr}"
uci -q set wireless.${radio}.channel="$tchan"
uci -q set wireless.default_${radio}.disabled='1'
uci -q set wireless.test_${radio}=wifi-iface
uci -q set wireless.test_${radio}.device="$radio"
uci -q set wireless.test_${radio}.mode="ap"
uci -q set wireless.test_${radio}.network="lan"
uci -q set wireless.test_${radio}.key="${WIFIKEY}"
uci -q set wireless.test_${radio}.disabled='0'
uci -q del wireless.${radio}.disabled
uci -q set wireless.test_${radio}.ssid='${radio}-max2'
uci -q set wireless.test_${radio}.ieee80211r='1'
uci -q set wireless.test_${radio}.mobility_domain='BEEF'
uci -q set wireless.test_${radio}.reassociation_deadline='55555'
uci -q set wireless.test_${radio}.ft_over_ds='0'
uci -q set wireless.test_${radio}.ft_psk_generate_local='0'
uci -q set wireless.test_${radio}.r0_key_lifetime='4444'
uci -q set wireless.test_${radio}.r1_key_holder='ACEED00CEE77'
uci -q set wireless.test_${radio}.pmk_r1_push='1'
uci -q set wireless.test_${radio}.ieee80211w='1'
uci -q set wireless.test_${radio}.ieee80211w_max_timeout='456'
uci -q set wireless.test_${radio}.ieee80211w_retry_timeout='123'
uci -q set wireless.${radio}.cell_density='0'
uci -q set wireless.test_${radio}.ssid="--EX-${radio}-${BAND}-${tchan}-${tpow}-${tencr}"
echo ${radio}-${BAND}-${tchan}-${tpow}-${tencr} | tee -a $OUTLOG
# 5g ---------------------------------------------------------
elif [ "$BAND" == "5g" ]; then
tchan=36
tpow=10
tencr="psk2+ccmp"
uci set wireless.${radio}.country='US'
#uci set wireless.${radio}.htmode='VHT20'
uci -q set wireless.test_${radio}.txpower="$tpow"
uci -q set wireless.${radio}.channel="$tchan"
uci -q set wireless.default_${radio}.disabled='1'
uci -q set wireless.test_${radio}=wifi-iface
uci -q set wireless.test_${radio}.device="$radio"
uci -q set wireless.test_${radio}.mode="ap"
uci -q set wireless.test_${radio}.network="lan"
uci -q set wireless.test_${radio}.key="${WIFIKEY}"
uci -q set wireless.test_${radio}.disabled='0'
uci -q set wireless.test_${radio}.encryption="${tencr}"
uci -q set wireless.test_${radio}.macfilter='deny'
uci -q add_list wireless.test_${radio}.maclist='FA:1F:D0:6C:A7:AE'
uci -q set wireless.test_${radio}.isolate='1'
uci -q set wireless.test_${radio}.short_preamble='0'
uci -q set wireless.test_${radio}.wpa_group_rekey='300'
uci -q set wireless.test_${radio}.skip_inactivity_poll='1'
uci -q set wireless.test_${radio}.max_inactivity='600'
uci -q set wireless.test_${radio}.max_listen_interval='32768'
uci -q set wireless.test_${radio}.disassoc_low_ack='0'
uci -q set wireless.test_${radio}.wpa_disable_eapol_key_retries='1'
uci -q set wireless.${radio}.htmode='VHT80'
uci -q set wireless.${radio}.cell_density='0'
uci -q set wireless.${radio}.frag='256'
uci -q set wireless.${radio}.rts='100'
uci -q set wireless.${radio}.beacon_int='50'
uci -q set wireless.test_${radio}.ssid="--EX-${radio}-${BAND}-${tchan}-${tpow}-${tencr}"
echo ${radio}-${BAND}-${tchan}-${tpow}-${tencr} | tee -a $OUTLOG
else
echo unknown band | tee -a $OUTLOG
fi
# make sure no old message are included in success check
logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn
logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn
logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn
logger -p daemon.notice -t netifd dngn
uci commit wireless
wifi reload
let SLEEPTIME=SLEEPX*SLEEPNO
sleep $SLEEPTIME
#check test result
NETPASS=""; WRESFAIL=""; WRESPASS=""
NETPASS="$(logread | grep netifd | tail -n 10 | grep Network | grep 'link is up' | head -n 1)"
WRESFAIL="$(logread | grep netifd | tail -n 10 | grep Wireless | grep ${radio} | grep fail | head -n 1)"
#echo FAIL GREP $WRESFAIL
WRESPASS="$(logread | grep netifd | tail -n 10 | grep Wireless | grep ${radio} | grep 'is now up' | head -n 1)"
#echo PASS GREP $WRESPASS
if [ -n "$WRESFAIL" ]
then
RESULT=fail
elif [[ -n "$WRESPASS" && -n "$NETPASS" ]]
then
RESULT=pass
else
RESULT=unknown
fi
echo "$MODEL,$OUI,wireless-extra-options-${radio}-${BAND}-${tchan}-${tpow}-${tencr},$RESULT"
echo "$MODEL,$OUI,wireless-extra-options-${radio}-${BAND}-${tchan}-${tpow}-${tencr},$RESULT" >> $DATA
logger -p daemon.notice -t tyrekick test_extraoptions ${radio} end
uci -q set wireless.test_${radio}.disabled='1'
else
echo ${radio} does not exist skip | tee -a $OUTLOG
fi
#echo "tradio $TRADIO"
done
uci commit wireless
wifi down
wifi up
logger -p daemon.notice -t tyrekick test_extraoptions end
return 0
}
test_allradioon() {
echo "test all radios on " | tee -a $OUTLOG
logger -p daemon.notice -t tyrekick test_allradioon start
RADIOCOUNT=0
for radio in 'radio0' 'radio1' 'radio2' 'radio3'
do
echo "check for $radio" | tee -a $OUTLOG
TRADIO="$(uci -q get wireless."$radio")"
#echo TRADIO = $TRADIO
if [ "$TRADIO" == "wifi-device" ]
then
let "RADIOCOUNT+=1"
echo testing $radio | tee -a $OUTLOG
uci -q set wireless.${radio}.disabled='0'
BAND="$(uci get wireless.$radio.band)"
#echo BAND $BAND
# 2g ----------------------------------------------------------
if [ "$BAND" == "2g" ]
then
tchan=1
tpow=20
# 5g ---------------------------------------------------------
elif [ "$BAND" == "5g" ]; then
tchan=36
tpow=20
uci set wireless.${radio}.country='US'
uci set wireless.${radio}.htmode='VHT20'
else
echo unknown band | tee -a $OUTLOG
fi
# set encryption values
tencr="psk2"
uci -q set wireless.${radio}.channel="$tchan"
uci -q set wireless.default_${radio}.disabled='1'
uci -q set wireless.test_${radio}=wifi-iface
uci -q set wireless.test_${radio}.device="$radio"
uci -q set wireless.test_${radio}.mode="ap"
uci -q set wireless.test_${radio}.network="lan"
uci -q set wireless.test_${radio}.key="${WIFIKEY}"
uci -q set wireless.test_${radio}.disabled='0'
uci -q set wireless.test_${radio}.txpower="$tpow"
uci -q set wireless.test_${radio}.encryption="${tencr}"
uci -q set wireless.test_${radio}.ssid="--AR-${radio}-${BAND}-${tchan}-${tpow}-${tencr}"
echo ${radio}-${BAND}-${tchan}-${tpow}-${tencr} | tee -a $OUTLOG
else
echo ${radio} does not exist skip | tee -a $OUTLOG
fi
done
echo RADIOCOUNT $RADIOCOUNT
# make sure no old message are included in success check
logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn
logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn
logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn; logger -p daemon.notice -t netifd dngn
logger -p daemon.notice -t netifd dngn
uci commit wireless
wifi reload
let SLEEPTIME=SLEEPX*SLEEPNO
sleep $SLEEPTIME
#check test result
NETPASS=""; WRESFAIL=""; WRESPASS=""
NETPASS="$(logread | grep netifd | tail -n 10 | grep Network | grep 'link is up' | head -n 1)"
#WRESFAIL="$(logread | grep netifd | tail -n 10 | grep Wireless | grep ${radio} | grep fail | head -n 1)"
WRESFAIL="$(logread | grep netifd | tail -n 10 | grep Wireless | grep radio | grep fail | head -n 1)"
#echo FAIL GREP $WRESFAIL
WRESPASS="$(logread | grep netifd | tail -n 10 | grep Wireless | grep radio | grep 'is now up' | wc -l | awk '{print $1}' )"
#echo PASS GREP $WRESPASS
if [ -n "$WRESFAIL" ]
then
RESULT=fail
elif [[ "${RADIOCOUNT}" -eq "${WRESPASS}" && -n "$NETPASS" ]]
then
RESULT=pass
else
RESULT=unknown
fi
echo "$MODEL,$OUI,all-radio-on-000001,$RESULT"
echo "$MODEL,$OUI,all-radio-on-000001,$RESULT" >> $DATA
#disable radios
for radio in 'radio0' 'radio1' 'radio2' 'radio3'
do
echo "check for $radio" | tee -a $OUTLOG
TRADIO="$(uci -q get wireless."$radio")"
if [ "$TRADIO" == "wifi-device" ]
then
echo disable test_ ${radio} | tee -a $OUTLOG
uci -q set wireless.test_${radio}.disabled='1'
fi
done
uci commit wireless
wifi down
wifi up
logger -p daemon.notice -t tyrekick test_allradioon end
return 0
}
test_inet(){
echo "test for internet connectivty" | tee -a $OUTLOG
wget --quiet -O /tmp/ffdetect http://detectportal.firefox.com
wget --quiet -O /tmp/httpbinip http://httpbin.org/ip
wget --quiet -O /tmp/apple http://www.apple.com/library/test/success.html
wget --quiet -O /tmp/ncsi http://www.msftncsi.com/ncsi.txt
T1="$(cat /tmp/httpbinip | grep origin | head -n 1 )"
T2="$(cat /tmp/ffdetect | grep success | head -n 1 )"
T3="$(cat /tmp/ncsi | grep NCSI | head -n 1 )"
T4="$(cat /tmp/apple | grep Success | head -n 1 )"
if [[ -n "$T1" && -n "$T2" && -n "$T3" && -n "$T4" ]]
then
RESULT=pass
else
RESULT=fail
fi
echo "$MODEL,$OUI,inet-dns-000001,$RESULT"
echo "$MODEL,$OUI,inet-dns-000001,$RESULT" >> $DATA
return 0
}
test_http(){
echo "test http"| tee -a $OUTLOG
rm -f /www2/*
rmdir /www2
mkdir /www2
HCREATE=$(date '+%Y-%m-%d-%H-%M-%S')
cat << ENDHERE >> /www2/index.html