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