mirror of
https://github.com/coolsnowwolf/packages
synced 2025-01-08 13:27:39 +08:00
airos-dfs-reset: add airos-dfs-reset
Ubiquitis airmax based gear does not fallback to original port after DFS event is over. This tool triggers the fallback automatically by soft-restarting unconditionally, whenever the configured freq differs from the running. Signed-off-by: Simon Polack <spolack+git@mailbox.org>
This commit is contained in:
parent
0c0530005c
commit
c4274f59c9
46
utils/airos-dfs-reset/Makefile
Normal file
46
utils/airos-dfs-reset/Makefile
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
#
|
||||||
|
# Copyright (C) 2021 Simon Polack <spolack+git@@mailbox.org>
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=airos-dfs-reset
|
||||||
|
PKG_VERSION:=1
|
||||||
|
PKG_RELEASE:=$(AUTORELEASE)
|
||||||
|
|
||||||
|
PKG_MAINTAINER:=Simon Polack <spolack+git@mailbox.org>
|
||||||
|
PKG_LICENSE:=GPL-2.0-only
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/airos-dfs-reset
|
||||||
|
SECTION:=utils
|
||||||
|
CATEGORY:=Utilities
|
||||||
|
TITLE:=Companion app for Ubiquity AirOS to help with DFS
|
||||||
|
PKGARCH:=all
|
||||||
|
EXTRA_DEPENDS:=dropbear
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/airos-dfs-reset/description
|
||||||
|
Companion app for Ubiquity AirOS Gear to enforce fallback to original frequency after DFS event is over.
|
||||||
|
It works by soft-rebooting if running-frequency doesnt match the configured frequency.
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/airos-dfs-reset/conffiles
|
||||||
|
/etc/config/airos-dfs-reset
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/airos-dfs-reset/install
|
||||||
|
$(INSTALL_DIR) $(1)/etc/init.d
|
||||||
|
$(INSTALL_BIN) ./files/airos-dfs-reset.init $(1)/etc/init.d/airos-dfs-reset
|
||||||
|
$(INSTALL_DIR) $(1)/usr/bin
|
||||||
|
$(INSTALL_BIN) ./files/airos-dfs-reset $(1)/usr/bin/airos-dfs-reset
|
||||||
|
$(INSTALL_DIR) $(1)/etc/config
|
||||||
|
$(INSTALL_DATA) ./files/airos-dfs-reset.config $(1)/etc/config/airos-dfs-reset
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,airos-dfs-reset))
|
114
utils/airos-dfs-reset/files/airos-dfs-reset
Normal file
114
utils/airos-dfs-reset/files/airos-dfs-reset
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#!/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
|
15
utils/airos-dfs-reset/files/airos-dfs-reset.config
Normal file
15
utils/airos-dfs-reset/files/airos-dfs-reset.config
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
config airos-dfs-reset general
|
||||||
|
option interval '600' # Check every x seconds
|
||||||
|
option reset_sleep '120' # Sleep after reset to let routing protocols reconverge
|
||||||
|
|
||||||
|
config device 'sample_ap' # make sure to not use dashes in name
|
||||||
|
option target '192.168.1.20'
|
||||||
|
option username 'ubnt'
|
||||||
|
option password 'ubnt'
|
||||||
|
option daytime_limit '2-7' # .. from 2:xx to 7:xx reset is allowed
|
||||||
|
|
||||||
|
#config device 'sample_ap1'
|
||||||
|
# option target '10.31.81.21'
|
||||||
|
# option username 'ubnt'
|
||||||
|
# option password '...'
|
||||||
|
# option daytime_limit '0-23'
|
18
utils/airos-dfs-reset/files/airos-dfs-reset.init
Normal file
18
utils/airos-dfs-reset/files/airos-dfs-reset.init
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
USE_PROCD=1
|
||||||
|
START=95
|
||||||
|
STOP=01
|
||||||
|
|
||||||
|
start_service() {
|
||||||
|
procd_open_instance
|
||||||
|
procd_set_param command /usr/bin/airos-dfs-reset
|
||||||
|
procd_set_param stdout 0
|
||||||
|
procd_set_param stderr 0
|
||||||
|
procd_set_param user nobody
|
||||||
|
procd_close_instance
|
||||||
|
}
|
||||||
|
|
||||||
|
service_stopped() {
|
||||||
|
echo "airos-dfs-reset stopped!"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user