openwrt-packages/utils/airos-dfs-reset/files/airos-dfs-reset

115 lines
2.6 KiB
Bash

#!/bin/sh
. /lib/functions.sh
log() {
local msg="$1"
logger -t airos-dfs-reset -s "$msg"
}
rexec() {
local target="$1"
local username="$2"
local password="$3"
local cmd="$4"
raw=$(DROPBEAR_PASSWORD="$password" ssh -y $username@$target "$cmd")
ssh_result=$?
}
reset_dfs() {
local cmd="/usr/etc/rc.d/rc.softrestart force"
rexec $* "$cmd"
}
get_running_freq() {
local cmd="iwconfig ath0 | grep Frequency | awk -F ':' '{print \$3}' | awk '{print \$1}' | sed 's/\.//'"
rexec $* "$cmd"
# Append zeroes which are then cut to 4, we have to convert GHz into MHz
raw="$raw"000
running_freq=${raw:0:4}
}
get_target_freq() {
local cmd="grep 'radio.1.freq' /tmp/system.cfg | awk -F '=' '{ print \$2}'"
rexec $* "$cmd"
target_freq="$raw"
}
check_dfs() {
local target="$1"
local username="$2"
local password="$3"
get_running_freq $target $username $password
if [ "$ssh_result" != 0 ]; then
return
fi
get_target_freq $target $username $password
if [ "$ssh_result" != 0 ]; then
return
fi
log "Running freq: $running_freq - Target freq: $target_freq"
[ "$running_freq" == "$target_freq" ]
}
reset_allowed() {
local daytime_limit="$1"
local start="$(echo $daytime_limit | awk -F '-' '{print $1'})"
local end="$(echo $daytime_limit | awk -F '-' '{print $2'})"
local cur="$(date +%H)"
[ "$cur" -ge "$start" ] && [ "$cur" -le "$end" ]
}
handle_device() {
local device="$1"
config_get target "$device" target
config_get username "$device" username
config_get password "$device" password
config_get daytime_limit "$device" daytime_limit "0-23"
ssh_result=0
log "Checking Device $device"
check_dfs $target $username $password
freqmatch=$?
if [ "$ssh_result" != 0 ]; then
log "ssh exited non-zero - connect timeout?"
return
elif [ "$freqmatch" == 0 ]; then
log "Frequency is matching. No radar event fired"
else
log "Frequency doesnt match. Looks like DFS activity :("
if reset_allowed $daytime_limit; then
log "Initiating reset"
reset_dfs $target $username $password
log "Waiting $cfg_reset_sleep seconds after reset"
sleep $cfg_reset_sleep
else
log "Resetting is forbidden at this daytime"
fi
fi
}
main() {
log "started!"
config_load airos-dfs-reset
config_get cfg_interval general interval 600
config_get cfg_reset_sleep general reset_sleep 120
while :;
do
config_foreach handle_device device
sleep $cfg_interval
done
}
main