#!/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