You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.6 KiB
Bash
110 lines
2.6 KiB
Bash
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
|
|
# uci_ lib works on temporary config files here which are not persistent
|
|
UCI_CONFIG_DIR=/var/run
|
|
CONFIG=plc-standby
|
|
STANDBY_TIMER=${1:-600}
|
|
|
|
SWITCHED_OFF=0
|
|
|
|
if [ -f /lib/ar71xx.sh ]; then
|
|
PLATFORM=ar71xx
|
|
. /lib/ar71xx.sh
|
|
elif [ -f /lib/ipq806x.sh ]; then
|
|
PLATFORM=ipq806x
|
|
. /lib/ipq806x.sh
|
|
fi
|
|
board=$(${PLATFORM}_board_name)
|
|
|
|
uptime_seconds() {
|
|
(IFS="." read a b </proc/uptime; echo "$a")
|
|
}
|
|
|
|
restart_timer() {
|
|
uci_set $CONFIG status timeout "$(( $(uptime_seconds) + $STANDBY_TIMER ))"
|
|
uci_commit $CONFIG
|
|
}
|
|
|
|
get_wlan_devices() {
|
|
uci_get $CONFIG status wlandevs
|
|
}
|
|
|
|
get_timer() {
|
|
uci_get $CONFIG status timeout
|
|
}
|
|
|
|
# we are started with the plc, so restart standby timeout
|
|
restart_timer
|
|
|
|
while :; do
|
|
SLEEP=30
|
|
timeout=$(get_timer)
|
|
devices=$(get_wlan_devices)
|
|
if [ -z "$devices" ]; then
|
|
debug "standby timeout expires at $timeout"
|
|
|
|
swports=
|
|
case "$board" in
|
|
dlan-pro-1200-ac|\
|
|
dlan-pro-1200-n)
|
|
# for 1200+ WiFi ac: does port 3 or 4 have a link?
|
|
swports="(3||4)"
|
|
;;
|
|
dlan-1000-ac)
|
|
# for 1000 ac: does port 2 or 3 have a link?
|
|
swports="(2||3)"
|
|
;;
|
|
dlan-550-wifi)
|
|
# for 550: does port 2 have a link?
|
|
swports="2"
|
|
;;
|
|
# TODO specify link detection for switchless devices supported
|
|
*)
|
|
# current default: never enter standby
|
|
links=true
|
|
;;
|
|
esac
|
|
if [ -n "$swports" ]; then
|
|
# (jsonfilter not documented, but works similar to
|
|
# http://goessner.net/articles/JsonPath/, or look at the jsonfilter grammar)
|
|
# get all the link values of specified ports with link=true, if not empty one eth port has a link
|
|
links=$(ubus call network.swconfig status '{"switch":"switch0"}'|jsonfilter -l 1 -e '$.ports['"$swports"'&&@.link=true].link')
|
|
fi
|
|
if [ -n "$links" ]; then
|
|
# restart timeout if ethernet ports are up
|
|
debug "restart standby timer (eth)"
|
|
restart_timer
|
|
|
|
[ $SWITCHED_OFF = 1 ] && {
|
|
[ -x /etc/init.d/plc ] && /etc/init.d/plc normal
|
|
[ -x /etc/init.d/ghn ] && /etc/init.d/ghn normal
|
|
SWITCHED_OFF=0
|
|
}
|
|
else
|
|
# if down let the timer expire
|
|
[ "$(uptime_seconds)" -ge "$timeout" ] && [ $SWITCHED_OFF = 0 ] && {
|
|
# enter plc standby if timed out
|
|
debug "standby timer expired"
|
|
|
|
[ -x /etc/init.d/plc ] && /etc/init.d/plc standby
|
|
[ -x /etc/init.d/ghn ] && /etc/init.d/ghn standby
|
|
SWITCHED_OFF=1
|
|
}
|
|
|
|
# if timeout active check every few seconds if ports went up again
|
|
SLEEP=5
|
|
fi
|
|
else
|
|
debug "restart standby timer (wifi)"
|
|
restart_timer
|
|
[ $SWITCHED_OFF = 1 ] && {
|
|
[ -x /etc/init.d/plc ] && /etc/init.d/plc normal
|
|
[ -x /etc/init.d/ghn ] && /etc/init.d/ghn normal
|
|
SWITCHED_OFF=0
|
|
}
|
|
fi
|
|
sleep $SLEEP
|
|
done
|