iopsys-feed/netmode/files/sbin/testnet
2018-10-08 15:28:32 +02:00

262 lines
6.8 KiB
Bash
Executable file

#!/bin/sh
. /lib/functions.sh
NETCON=0
TVCON=0
WANIP=0
LASTSTATUS=""
CURSTATUS=""
ETHWAN="$(db -q get hw.board.ethernetWanPort)"
SLEEP_TIME=30
enableCounter=0
AccessPolicy=0
get_wifi_iface_cfgstr() {
get_cfgno() {
config_get ifname "$1" ifname
[ "$ifname" == "$2" ] && echo "wireless.$1"
}
config_load wireless
config_foreach get_cfgno wifi-iface $1
}
ping_uplink()
{
local hasip hasdev hasmode
local ipaddr=""
local device=""
local rready=""
local wetif=""
local assoclist=""
local rv=0
[ -f /tmp/wps_client_mode_active ] && {
ubus call led.internet set '{"state" : "off"}'
return
}
ipaddr="$(ip r | grep default | awk '{print$3}')"
[ -n "$ipaddr" ] && hasip=1 || hasip=0
device="$(ip r | grep default | awk '{print$5}')"
[ -n "$device" ] && hasdev=1 || hasdev=0
rready="$(uci -q get netmode.setup.repeaterready)"
[ "$rready" == "1" ] && hasmode=0 || hasmode=1
if [ "$hasmode" == "1" ] && [ "$hasip" == "0" -o "$hasdev" == "0" ]; then
rv=0
elif [ "$hasmode" == "1" ]; then
arping -f -q -c1 -w3 -I $device $ipaddr
[ $? -eq 1 ] && rv=0 || rv=1
if [ "$rv" == "0" ]; then
ping -c2 -w5 $ipaddr >/dev/null
[ $? -eq 1 ] && rv=0 || rv=1
fi
else
SLEEP_TIME=5
ubus call led.internet set '{"state" : "off"}'
return
fi
if [ $rv -eq 0 ]; then
echo "{ \"online\" : false }" > /tmp/internet_connection_status
SLEEP_TIME=10
wetif="$(uci -q get wireless.$(uci show wireless | grep 'mode=.*wet.*' | cut -d'.' -f2 | head -1).ifname)"
# If there is an uplink IP address but no connection for 5 minutes, reboot
if [ $enableCounter -gt 32 ]; then
logger -s -p user.info -t "testnet" "No uplink connection; reboot" >/dev/console
ubus call led.internet set '{"state" : "error"}'
reboot &
elif [ $((enableCounter % 8)) -eq 0 -a $enableCounter -ge 8 -o $enableCounter -eq 0 ]; then
ps | grep -v grep | grep -q 'wifi reload\|wifi import\|wifi.credentials\|iwpriv' && return
logger -s -p user.info -t "testnet" "No uplink connection; try to re-connect" >/dev/console
if [ -f /usr/sbin/wlctl ]; then
assoclist="$(wlctl -i $wetif assoclist | head -1 | awk '{print$2}')"
wlctl -i $wetif reassoc $assoclsit
elif [ -f /usr/sbin/iwpriv ]; then
wetcfg="$(get_wifi_iface_cfgstr $wetif)"
wetssid="$(uci -q get $wetcfg.ssid)"
wetkey="$(uci -q get $wetcfg.key)"
if [ -n "$wetkey" ]; then
wetauth="WPA2PSK"
wetenc="AES"
else
wetauth="OPEN"
wetenc="NONE"
fi
iwpriv $wetif set ApCliEnable=0
iwpriv $wetif set ApCliSsid="$wetssid"
iwpriv $wetif set ApCliAuthMode="$wetauth"
iwpriv $wetif set ApCliEncrypType="$wetenc"
iwpriv $wetif set ApCliWPAPSK="$wetkey"
iwpriv $wetif set ApCliEnable=1
iwpriv $wetif set ApCliAutoConnect=1
fi
ubus call led.internet set '{"state" : "notice"}'
# touch /tmp/netmodes/repeater_trying_to_connect
# else
# if [ -f /tmp/netmodes/repeater_trying_to_connect ]; then
# rm -f /tmp/netmodes/repeater_trying_to_connect
# else
# ubus call led.internet set '{"state" : "error"}'
# fi
fi
enableCounter=$((enableCounter+1))
if [ $AccessPolicy -eq 1 ]; then
return
fi
AccessPolicy=1
if [ -f /usr/sbin/iwpriv ]; then
grep -q up /sys/class/net/$ETHWAN/operstate 2>/dev/null || {
logger -s -p user.info -t "testnet" "Disconnect all stations and disable WiFi access on downlink wireless interfaces" >/dev/console
# Do not allow clients to connect on 2.4GHz radio
iwpriv ra0 set AccessPolicy=$AccessPolicy
# Do not allow clients to connect on 5GHz radio
iwpriv rai0 set AccessPolicy=$AccessPolicy
# Disconnect clients on 2.4GHz radio
iwpriv ra0 set DisConnectAllSta=2
# Disconnect clients on 5GHz radio
iwpriv rai0 set DisConnectAllSta=2
}
fi
else
grep -q "true" /tmp/internet_connection_status 2>/dev/null || logger -s -p user.info -t "testnet" "Uplink connection is gained" >/dev/console
echo "{ \"online\" : true }" > /tmp/internet_connection_status
ubus call led.internet set '{"state" : "eok"}'
SLEEP_TIME=5
enableCounter=0
if [ $AccessPolicy -eq 0 ]; then
return
fi
# Uplink working, allow clients to connect
AccessPolicy=0
if [ -f /usr/sbin/iwpriv ]; then
logger -s -p user.info -t "testnet" "Enable WiFi access on downlink wireless interfaces" >/dev/console
iwpriv ra0 set AccessPolicy=$AccessPolicy
iwpriv rai0 set AccessPolicy=$AccessPolicy
fi
fi
}
test_connection() {
local addr="$1"
local defroute="$(ip r | grep default | awk '{print$3}' | head -1)"
local def6route="$(ip -f inet6 r | grep default | awk '{print$3}')"
local ping6dev="$(ip -f inet6 r | grep default | awk '{print$5}')"
if [ -n "$addr" ]; then
ping -q -w 5 -c 1 $addr >/dev/null 2>&1 && return 0
elif [ -n "$defroute" ]; then
ping -q -w 5 -c 1 $defroute >/dev/null 2>&1 && return 0
for nmsrv in $(grep nameserver /var/resolv.conf.auto | awk '{print$2}'); do
ping -q -w 5 -c 1 $nmsrv >/dev/null 2>&1 && return 0
done
elif [ -n "$def6route" ] && [ -n "$ping6dev" ]; then
ndisc6 -w 5 -1 $def6route $ping6dev >/dev/null 2>&1 && return 0
fi
return 1
}
wan_have_ip() {
[ -d /sys/class/net/$ETHWAN ] || return
ubus list led.wan >/dev/null 2>&1 || return
local addr=$(ip a show dev $ETHWAN | grep "inet "| awk '{print $2}')
if [ -n "$addr" ]; then
WANIP=1
ubus call led.wan set '{"state" : "ok"}'
else
WANIP=0
fi
# don't set wan here status is set from hotplug, only set when ip is detected.
}
internet_test() {
local link dest
dest="$(uci -q get system.@system[0].netping_addr)"
test_connection $dest
if [ "$?" -eq 0 ]; then
NETCON=1
ubus call led.internet set '{"state" : "ok"}'
echo "{ \"online\" : true }" > /tmp/internet_connection_status
else
NETCON=0
ubus call led.internet set '{"state" : "error"}'
echo "{ \"online\" : false }" > /tmp/internet_connection_status
fi
}
iptvtest() {
ubus list led.ext >/dev/null 2>&1 && TVCON=1 || return
local dest="$(uci -q get system.@system[0].tvping_addr)"
test_connection $dest
if [ "$?" -eq 0 ]; then
TVCON=1
[ -n "$dest" ] && ubus call led.ext set '{"state" : "ok"}'
else
TVCON=0
[ -n "$dest" ] && ubus call led.ext set '{"state" : "off"}'
fi
}
netmode_check() {
local curmode="$(uci -q get netmode.setup.curmode)"
local uplinkband="$(uci -q get netmode.$curmode.uplink_band)"
local rready="$(uci -q get netmode.setup.repeaterready)"
[ "$rready" == "1" ] && uplinkband="a"
echo "$uplinkband"
}
connectivity_test() {
if [ "$(netmode_check)" != "" ]; then
ping_uplink
return
fi
SLEEP_TIME=30
internet_test
if [ $NETCON -eq 1 ]; then
CURSTATUS=1
[ "$CURSTATUS" == "$LASTSTATUS" ] || ubus send internet '{"status" : "online"}'
LASTSTATUS=1
else
CURSTATUS=0
[ "$CURSTATUS" == "$LASTSTATUS" ] || ubus send internet '{"status" : "offline"}'
LASTSTATUS=0
fi
}
if [ "$1" == "once" ]; then
connectivity_test
exit 0
fi
while true; do
connectivity_test
sleep $SLEEP_TIME
done