2016-10-16 17:54:48 +02:00
#!/bin/sh
# travelmate, a wlan connection manager for travel router
2024-01-09 22:22:57 +01:00
# Copyright (c) 2016-2024 Dirk Brenken (dev@brenken.org)
2016-10-16 17:54:48 +02:00
# This is free software, licensed under the GNU General Public License v3.
2020-04-24 08:28:16 +02:00
# set (s)hellcheck exceptions
2023-10-24 17:27:40 +02:00
# shellcheck disable=all
2019-08-29 14:03:23 +02:00
2020-09-19 06:20:19 +02:00
export LC_ALL = C
export PATH = "/usr/sbin:/usr/bin:/sbin:/bin"
2020-10-03 10:24:28 +02:00
2021-08-11 19:14:56 +02:00
trm_enabled = "0"
trm_debug = "0"
2020-09-19 06:20:19 +02:00
trm_iface = ""
2021-08-11 19:14:56 +02:00
trm_captive = "1"
trm_proactive = "1"
2022-08-20 17:51:01 +02:00
trm_vpn = "1"
2021-08-11 19:14:56 +02:00
trm_netcheck = "0"
trm_autoadd = "0"
trm_randomize = "0"
trm_mail = "0"
2020-09-19 06:20:19 +02:00
trm_mailpgm = "/etc/travelmate/travelmate.mail"
trm_vpnpgm = "/etc/travelmate/travelmate.vpn"
2021-08-11 19:14:56 +02:00
trm_minquality = "35"
trm_maxretry = "3"
trm_maxwait = "30"
trm_maxautoadd = "5"
trm_timeout = "60"
2017-05-17 21:24:07 +02:00
trm_radio = ""
2018-02-19 21:59:03 +01:00
trm_connection = ""
2020-09-19 06:20:19 +02:00
trm_wpaflags = ""
2022-08-20 17:51:01 +02:00
trm_ovpninfolist = ""
trm_vpnifacelist = ""
trm_vpninfolist = ""
2023-10-24 17:27:40 +02:00
trm_stdvpnservice = ""
trm_stdvpniface = ""
2017-04-20 09:22:22 +02:00
trm_rtfile = "/tmp/trm_runtime.json"
2023-10-27 10:48:04 +02:00
trm_ubuscmd = " $( command -v ubus) "
trm_jsoncmd = " $( command -v jsonfilter) "
2019-11-18 19:28:23 +01:00
trm_wifi = " $( command -v wifi) "
2020-09-19 06:20:19 +02:00
trm_fetch = " $( command -v curl) "
2018-02-19 21:59:03 +01:00
trm_iwinfo = " $( command -v iwinfo) "
2019-11-06 21:02:17 +01:00
trm_logger = " $( command -v logger) "
2020-09-19 06:20:19 +02:00
trm_wpa = " $( command -v wpa_supplicant) "
2021-07-25 21:41:58 +02:00
trm_captiveurl = "http://detectportal.firefox.com"
2023-10-24 17:27:40 +02:00
trm_useragent = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0"
2020-09-19 06:20:19 +02:00
trm_ntpfile = "/var/state/travelmate.ntp"
2020-09-27 06:57:44 +02:00
trm_vpnfile = "/var/state/travelmate.vpn"
2020-09-19 06:20:19 +02:00
trm_mailfile = "/var/state/travelmate.mail"
2020-09-27 06:57:44 +02:00
trm_refreshfile = "/var/state/travelmate.refresh"
2018-04-04 14:30:30 +02:00
trm_pidfile = "/var/run/travelmate.pid"
2020-09-19 06:20:19 +02:00
trm_action = " ${ 1 :- "start" } "
2016-10-16 17:54:48 +02:00
2018-01-10 19:42:48 +01:00
# load travelmate environment
2017-03-04 20:30:04 +01:00
#
2021-08-11 19:14:56 +02:00
f_env( ) {
2021-08-21 21:37:01 +02:00
local check wpa_checks result
2020-09-19 06:20:19 +02:00
2021-07-25 21:41:58 +02:00
if [ " ${ trm_action } " = "stop" ] ; then
2020-09-19 06:20:19 +02:00
return
fi
2017-12-09 08:20:29 +01:00
2023-10-24 17:27:40 +02:00
unset trm_stalist trm_radiolist trm_uplinklist trm_vpnifacelist trm_uplinkcfg trm_activesta trm_opensta
2019-02-22 11:59:14 +01:00
2023-10-27 10:48:04 +02:00
trm_sysver = " $( " ${ trm_ubuscmd } " -S call system board 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e '@.model' -e '@.release.description' |
2021-08-11 19:14:56 +02:00
awk 'BEGIN{RS="";FS="\n"}{printf "%s, %s",$1,$2}' ) "
2017-12-09 08:20:29 +01:00
2021-08-11 19:14:56 +02:00
config_cb( ) {
2019-03-19 15:23:11 +01:00
local name = " ${ 1 } " type = " ${ 2 } "
2021-08-11 19:14:56 +02:00
2021-07-25 21:41:58 +02:00
if [ " ${ name } " = "travelmate" ] && [ " ${ type } " = "global" ] ; then
2021-08-11 19:14:56 +02:00
option_cb( ) {
2019-03-19 15:23:11 +01:00
local option = " ${ 1 } " value = " ${ 2 } "
eval " ${ option } =\" ${ value } \" "
}
2022-08-20 17:51:01 +02:00
list_cb( ) {
local option = " ${ 1 } " value = " ${ 2 } "
2023-10-27 10:48:04 +02:00
if [ " ${ option } " = "trm_vpnifacelist" ] && ! printf "%s" " ${ trm_vpnifacelist } " | grep -q " ${ value } " ; then
2022-08-20 17:51:01 +02:00
eval " trm_vpnifacelist=\" $( printf "%s" " ${ trm_vpnifacelist } " ) ${ value } \" "
fi
}
2021-08-11 19:14:56 +02:00
elif [ " ${ name } " = "uplink" ] ; then
if [ " $( uci_get " travelmate. ${ type } .opensta " ) " = "1" ] ; then
eval " trm_opensta=\" $(( ${ trm_opensta :- 0 } + 1 )) \" "
fi
2019-03-19 15:23:11 +01:00
else
2021-08-11 19:14:56 +02:00
option_cb( ) {
2019-03-19 15:23:11 +01:00
return 0
}
2019-03-07 14:24:06 +01:00
fi
2018-09-08 22:28:04 +02:00
}
config_load travelmate
2016-12-31 14:14:29 +01:00
2021-07-25 21:41:58 +02:00
if [ " ${ trm_enabled } " != "1" ] ; then
2018-09-08 22:28:04 +02:00
f_log "info" "travelmate is currently disabled, please set 'trm_enabled' to '1' to use this service"
2020-09-19 06:20:19 +02:00
/etc/init.d/travelmate stop
2021-08-21 21:37:01 +02:00
elif [ -z " ${ trm_iface } " ] ; then
2020-09-19 06:20:19 +02:00
f_log "info" "travelmate is currently not configured, please use the 'Interface Setup' in LuCI or the 'setup' option in CLI"
/etc/init.d/travelmate stop
2023-10-27 10:48:04 +02:00
elif ! " ${ trm_ubuscmd } " -t " ${ trm_maxwait } " wait_for network.wireless network.interface." ${ trm_iface } " >/dev/null 2>& 1; then
2021-08-21 21:37:01 +02:00
f_log "info" " travelmate interface ' ${ trm_iface } ' does not appear on ubus, please check your network setup "
/etc/init.d/travelmate stop
2018-09-08 22:28:04 +02:00
fi
2017-12-15 19:10:17 +01:00
2022-08-20 17:51:01 +02:00
if [ -z " ${ trm_wpaflags } " ] ; then
wpa_checks = "sae owe eap suiteb192"
for check in ${ wpa_checks } ; do
if [ -x " ${ trm_wpa } " ] ; then
if " ${ trm_wpa } " -v" ${ check } " >/dev/null 2>& 1; then
result = " $( f_trim " ${ result } ${ check } : $( f_char 1) " ) "
else
result = " $( f_trim " ${ result } ${ check } : $( f_char 0) " ) "
fi
2020-09-19 06:20:19 +02:00
fi
2022-08-20 17:51:01 +02:00
done
trm_wpaflags = " $( printf "%s" " ${ result } " | awk '{printf "%s %s, %s %s, %s %s, %s %s",$1,$2,$3,$4,$5,$6,$7,$8}' ) "
fi
2019-11-18 19:28:23 +01:00
config_load wireless
2021-08-11 19:14:56 +02:00
config_foreach f_setdev "wifi-device"
2021-07-25 21:41:58 +02:00
if [ -n " $( uci -q changes "wireless" ) " ] ; then
2019-11-18 19:28:23 +01:00
uci_commit "wireless"
2021-08-11 19:14:56 +02:00
f_wifi
2018-09-08 22:28:04 +02:00
fi
2019-03-19 15:23:11 +01:00
json_load_file " ${ trm_rtfile } " >/dev/null 2>& 1
2021-07-25 21:41:58 +02:00
if ! json_select data >/dev/null 2>& 1; then
: >" ${ trm_rtfile } "
2019-03-19 15:23:11 +01:00
json_init
json_add_object "data"
fi
2022-07-06 23:16:20 +02:00
2022-08-20 17:51:01 +02:00
if [ " ${ trm_vpn } " = "1" ] && [ -z " ${ trm_vpninfolist } " ] ; then
config_load network
config_foreach f_getvpn "interface"
fi
f_log "debug" " f_env ::: auto_sta: ${ trm_opensta :- "-" } , wpa_flags: ${ trm_wpaflags } , sys_ver: ${ trm_sysver } "
2019-11-18 19:28:23 +01:00
}
2020-09-19 06:20:19 +02:00
# trim helper function
2019-11-18 19:28:23 +01:00
#
2021-08-11 19:14:56 +02:00
f_trim( ) {
2021-08-15 14:11:27 +02:00
local trim = " ${ 1 } "
2019-11-18 19:28:23 +01:00
trim = " ${ trim # " ${ trim %%[![ : space : ]]* } " } "
trim = " ${ trim % " ${ trim ##*[![ : space : ]] } " } "
2020-09-19 06:20:19 +02:00
printf "%s" " ${ trim } "
}
# status helper function
#
2021-08-11 19:14:56 +02:00
f_char( ) {
2021-08-15 14:11:27 +02:00
local result input = " ${ 1 } "
2020-09-19 06:20:19 +02:00
2021-07-25 21:41:58 +02:00
if [ " ${ input } " = "1" ] ; then
2020-09-19 06:20:19 +02:00
result = "✔"
else
result = "✘"
fi
printf "%s" " ${ result } "
}
2021-08-11 19:14:56 +02:00
# wifi helper function
2020-09-19 06:20:19 +02:00
#
2021-08-11 19:14:56 +02:00
f_wifi( ) {
2021-09-11 18:23:35 +02:00
local status radio radio_up timeout = "0"
2020-09-19 06:20:19 +02:00
2021-09-11 18:23:35 +02:00
" ${ trm_wifi } " reload
2021-07-25 21:41:58 +02:00
for radio in ${ trm_radiolist } ; do
2021-08-21 21:37:01 +02:00
while true; do
if [ " ${ timeout } " -ge " ${ trm_maxwait } " ] ; then
2020-09-19 06:20:19 +02:00
break 2
fi
2021-08-21 21:37:01 +02:00
status = " $( " ${ trm_wifi } " status 2>/dev/null) "
2023-10-27 10:48:04 +02:00
if [ " $( printf "%s" " ${ status } " | " ${ trm_jsoncmd } " -ql1 -e " @. ${ radio } .up " ) " != "true" ] ||
[ " $( printf "%s" " ${ status } " | " ${ trm_jsoncmd } " -ql1 -e " @. ${ radio } .pending " ) " != "false" ] ; then
2021-09-11 18:23:35 +02:00
if [ " ${ radio } " != " ${ radio_up } " ] ; then
" ${ trm_wifi } " up " ${ radio } "
radio_up = " ${ radio } "
fi
2021-08-21 21:37:01 +02:00
timeout = " $(( timeout + 1 )) "
sleep 1
else
continue 2
2021-02-26 19:46:53 +01:00
fi
2020-09-19 06:20:19 +02:00
done
done
2021-09-11 18:23:35 +02:00
if [ " ${ timeout } " -lt " ${ trm_maxwait } " ] ; then
sleep " $(( trm_maxwait / 6 )) "
timeout = " $(( timeout + ( trm_maxwait / 6 )) ) "
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_wifi ::: radio_list: ${ trm_radiolist } , radio: ${ radio } , timeout: ${ timeout } "
2020-09-19 06:20:19 +02:00
}
# vpn helper function
#
2021-08-11 19:14:56 +02:00
f_vpn( ) {
2022-08-20 17:51:01 +02:00
local rc result info iface vpn vpn_service vpn_iface vpn_instance vpn_status vpn_action = " ${ 1 } "
if [ " ${ trm_vpn } " = "1" ] && [ -n " ${ trm_vpninfolist } " ] ; then
vpn = " $( f_getval "vpn" ) "
vpn_service = " $( f_getval "vpnservice" ) "
vpn_iface = " $( f_getval "vpniface" ) "
if [ ! -f " ${ trm_vpnfile } " ] || { [ -f " ${ trm_vpnfile } " ] && [ " ${ vpn_action } " = "enable" ] ; } ; then
for info in ${ trm_vpninfolist } ; do
iface = " ${ info %%&&* } "
2024-02-24 06:58:40 +01:00
if [ " ${ iface } " = " ${ info } " ] ; then
vpn_instance = ""
else
vpn_instance = " ${ info ##*&& } "
fi
2023-10-27 10:48:04 +02:00
vpn_status = " $( ifstatus " ${ iface } " | " ${ trm_jsoncmd } " -ql1 -e '@.up' ) "
2022-08-20 17:51:01 +02:00
if [ " ${ vpn_status } " = "true" ] ; then
2023-10-27 10:48:04 +02:00
/sbin/ifdown " ${ iface } "
" ${ trm_ubuscmd } " -S call network.interface." ${ iface } " remove >/dev/null 2>& 1
2022-08-20 17:51:01 +02:00
f_log "info" " take down vpn interface ' ${ iface } / ${ vpn_instance :- "-" } ' (initial) "
fi
2024-02-24 06:58:40 +01:00
if [ -x "/etc/init.d/openvpn" ] && [ -n " ${ vpn_instance } " ] && /etc/init.d/openvpn running " ${ vpn_instance } " ; then
/etc/init.d/openvpn stop " ${ vpn_instance } "
f_log "info" " take down openvpn instance ' ${ vpn_instance :- "-" } ' (initial) "
fi
2022-08-20 17:51:01 +02:00
done
rm -f " ${ trm_vpnfile } "
elif [ " ${ vpn } " = "1" ] && [ -n " ${ vpn_iface } " ] && [ " ${ vpn_action } " = "enable_keep" ] ; then
for info in ${ trm_vpninfolist } ; do
iface = " ${ info %%&&* } "
2024-02-24 06:58:40 +01:00
if [ " ${ iface } " = " ${ info } " ] ; then
vpn_instance = ""
else
vpn_instance = " ${ info ##*&& } "
fi
2023-10-27 10:48:04 +02:00
vpn_status = " $( ifstatus " ${ iface } " | " ${ trm_jsoncmd } " -ql1 -e '@.up' ) "
2022-08-20 17:51:01 +02:00
if [ " ${ vpn_status } " = "true" ] && [ " ${ iface } " != " ${ vpn_iface } " ] ; then
2024-02-24 06:58:40 +01:00
/sbin/ifdown " ${ iface } "
2022-08-20 17:51:01 +02:00
f_log "info" " take down vpn interface ' ${ iface } / ${ vpn_instance :- "-" } ' (switch) "
2024-02-24 22:39:10 +01:00
rm -f " ${ trm_vpnfile } "
break
2022-08-20 17:51:01 +02:00
fi
2024-02-24 06:58:40 +01:00
if [ -x "/etc/init.d/openvpn" ] && [ -n " ${ vpn_instance } " ] && /etc/init.d/openvpn running " ${ vpn_instance } " ; then
/etc/init.d/openvpn stop " ${ vpn_instance } "
f_log "info" " take down openvpn instance ' ${ vpn_instance :- "-" } ' (switch) "
fi
2022-08-20 17:51:01 +02:00
done
2022-07-06 23:16:20 +02:00
fi
2022-08-20 17:51:01 +02:00
if [ -x " ${ trm_vpnpgm } " ] && [ -n " ${ vpn_service } " ] && [ -n " ${ vpn_iface } " ] ; then
if { [ " ${ vpn_action } " = "disable" ] && [ -f " ${ trm_vpnfile } " ] ; } ||
2024-02-24 06:58:40 +01:00
{ [ -s " ${ trm_ntpfile } " ] && { [ " ${ vpn } " = "1" ] && [ " ${ vpn_action %%_* } " = "enable" ] && [ ! -f " ${ trm_vpnfile } " ] ; } ||
{ [ " ${ vpn } " != "1" ] && [ " ${ vpn_action %%_* } " = "enable" ] && [ -f " ${ trm_vpnfile } " ] ; } ; } ; then
if [ " ${ trm_connection %%/* } " = "net ok" ] || [ " ${ vpn_action } " = "disable" ] ; then
2022-08-20 17:51:01 +02:00
for info in ${ trm_vpninfolist } ; do
iface = " ${ info %%&&* } "
if [ " ${ iface } " = " ${ vpn_iface } " ] ; then
2024-02-24 06:58:40 +01:00
if [ " ${ iface } " = " ${ info } " ] ; then
vpn_instance = ""
else
vpn_instance = " ${ info ##*&& } "
fi
2022-08-20 17:51:01 +02:00
break
fi
done
f_log "debug" " f_vpn ::: vpn: ${ vpn :- "0" } , action: ${ vpn_action } , service: ${ vpn_service } , iface: ${ vpn_iface } , instance: ${ vpn_instance } "
" ${ trm_vpnpgm } " " ${ vpn :- "0" } " " ${ vpn_action } " " ${ vpn_service } " " ${ vpn_iface } " " ${ vpn_instance } " >/dev/null 2>& 1
rc = " ${ ? } "
fi
2022-07-06 23:16:20 +02:00
fi
2022-08-20 17:51:01 +02:00
[ -n " ${ rc } " ] && f_jsnup
2020-09-27 06:57:44 +02:00
fi
2020-09-19 06:20:19 +02:00
fi
2023-10-27 10:48:04 +02:00
f_log "debug" " f_vpn ::: vpn: ${ trm_vpn :- "-" } , enabled: ${ vpn :- "-" } , action: ${ vpn_action } , vpn_service: ${ vpn_service :- "-" } , vpn_iface: ${ vpn_iface :- "-" } , vpn_instance: ${ vpn_instance :- "-" } , vpn_infolist: ${ trm_vpninfolist :- "-" } , result: ${ result } , rc: ${ rc :- "-" } "
2020-09-19 06:20:19 +02:00
}
2021-08-11 19:14:56 +02:00
# mac helper function
2020-09-19 06:20:19 +02:00
#
2021-08-11 19:14:56 +02:00
f_mac( ) {
2021-08-15 14:11:27 +02:00
local result ifname macaddr action = " ${ 1 } " section = " ${ 2 } "
2021-08-11 19:14:56 +02:00
if [ " ${ action } " = "set" ] ; then
macaddr = " $( f_getval "macaddr" ) "
if [ -n " ${ macaddr } " ] ; then
result = " ${ macaddr } "
uci_set "wireless" " ${ section } " "macaddr" " ${ result } "
elif [ " ${ trm_randomize } " = "1" ] ; then
result = " $( hexdump -n6 -ve '/1 "%.02X "' /dev/random 2>/dev/null |
2021-09-11 18:23:35 +02:00
awk -v local = "2,6,A,E" -v seed = " $( date +%s) " ' BEGIN{ srand( seed) } NR = = 1{ split( local,b,"," ) ;
seed = int( rand( ) *4+1) ; printf "%s%s:%s:%s:%s:%s:%s" ,substr( $1 ,0,1) ,b[ seed] ,$2 ,$3 ,$4 ,$5 ,$6 } ' ) "
2021-08-11 19:14:56 +02:00
uci_set "wireless" " ${ section } " "macaddr" " ${ result } "
else
2021-09-11 18:23:35 +02:00
uci_remove "wireless" " ${ section } " "macaddr" 2>/dev/null
2023-10-27 10:48:04 +02:00
ifname = " $( " ${ trm_ubuscmd } " -S call network.wireless status 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname' ) "
2021-09-11 18:23:35 +02:00
result = " $( ${ trm_iwinfo } " ${ ifname } " info 2>/dev/null | awk '/Access Point:/{printf "%s",$3}' ) "
2020-09-19 06:20:19 +02:00
fi
2021-08-11 19:14:56 +02:00
elif [ " ${ action } " = "get" ] ; then
result = " $( uci_get "wireless" " ${ section } " "macaddr" ) "
2021-09-11 18:23:35 +02:00
if [ -z " ${ result } " ] ; then
2023-10-27 10:48:04 +02:00
ifname = " $( " ${ trm_ubuscmd } " -S call network.wireless status 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname' ) "
2021-09-11 18:23:35 +02:00
result = " $( ${ trm_iwinfo } " ${ ifname } " info 2>/dev/null | awk '/Access Point:/{printf "%s",$3}' ) "
fi
2020-09-19 06:20:19 +02:00
fi
printf "%s" " ${ result } "
2022-08-20 17:51:01 +02:00
f_log "debug" " f_mac ::: action: ${ action :- "-" } , section: ${ section :- "-" } , macaddr: ${ macaddr :- "-" } , result: ${ result :- "-" } "
2020-09-19 06:20:19 +02:00
}
2021-08-11 19:14:56 +02:00
# set connection information
2020-09-19 06:20:19 +02:00
#
2021-08-11 19:14:56 +02:00
f_ctrack( ) {
2021-08-15 14:11:27 +02:00
local expiry action = " ${ 1 } "
2021-08-11 19:14:56 +02:00
if [ -n " ${ trm_uplinkcfg } " ] ; then
2020-09-19 06:20:19 +02:00
case " ${ action } " in
"start" )
2021-08-11 19:14:56 +02:00
uci_remove "travelmate" " ${ trm_uplinkcfg } " "con_start" 2>/dev/null
uci_remove "travelmate" " ${ trm_uplinkcfg } " "con_end" 2>/dev/null
2023-10-24 17:27:40 +02:00
if [ -s " ${ trm_ntpfile } " ] ; then
2021-08-11 19:14:56 +02:00
uci_set "travelmate" " ${ trm_uplinkcfg } " "con_start" " $( date "+%Y.%m.%d-%H:%M:%S" ) "
2020-09-19 06:20:19 +02:00
fi
2021-07-25 21:41:58 +02:00
; ;
2020-09-19 06:20:19 +02:00
"refresh" )
2023-10-24 17:27:40 +02:00
if [ -s " ${ trm_ntpfile } " ] && [ -z " $( uci_get "travelmate" " ${ trm_uplinkcfg } " "con_start" ) " ] ; then
2021-08-11 19:14:56 +02:00
uci_set "travelmate" " ${ trm_uplinkcfg } " "con_start" " $( date "+%Y.%m.%d-%H:%M:%S" ) "
2020-09-19 06:20:19 +02:00
fi
2021-07-25 21:41:58 +02:00
; ;
2020-09-19 06:20:19 +02:00
"end" )
2023-10-24 17:27:40 +02:00
if [ -s " ${ trm_ntpfile } " ] ; then
2021-08-11 19:14:56 +02:00
uci_set "travelmate" " ${ trm_uplinkcfg } " "con_end" " $( date "+%Y.%m.%d-%H:%M:%S" ) "
2020-09-19 06:20:19 +02:00
fi
2021-07-25 21:41:58 +02:00
; ;
2020-09-19 06:20:19 +02:00
"start_expiry" )
2023-10-24 17:27:40 +02:00
if [ -s " ${ trm_ntpfile } " ] ; then
2021-08-11 19:14:56 +02:00
expiry = " $( uci_get "travelmate" " ${ trm_uplinkcfg } " "con_start_expiry" ) "
uci_set "travelmate" " ${ trm_uplinkcfg } " "enabled" "0"
uci_set "travelmate" " ${ trm_uplinkcfg } " "con_end" " $( date "+%Y.%m.%d-%H:%M:%S" ) "
2020-09-19 06:20:19 +02:00
f_log "info" " uplink ' ${ radio } / ${ essid } / ${ bssid :- "-" } ' expired after ${ expiry } minutes "
fi
2021-07-25 21:41:58 +02:00
; ;
2020-09-19 06:20:19 +02:00
"end_expiry" )
2023-10-24 17:27:40 +02:00
if [ -s " ${ trm_ntpfile } " ] ; then
2021-08-11 19:14:56 +02:00
expiry = " $( uci_get "travelmate" " ${ trm_uplinkcfg } " "con_end_expiry" ) "
uci_set "travelmate" " ${ trm_uplinkcfg } " "enabled" "1"
uci_remove "travelmate" " ${ trm_uplinkcfg } " "con_start" 2>/dev/null
uci_remove "travelmate" " ${ trm_uplinkcfg } " "con_end" 2>/dev/null
2020-09-19 06:20:19 +02:00
f_log "info" " uplink ' ${ radio } / ${ essid } / ${ bssid :- "-" } ' re-enabled after ${ expiry } minutes "
fi
2021-07-25 21:41:58 +02:00
; ;
2020-09-19 06:20:19 +02:00
"disabled" )
2021-08-11 19:14:56 +02:00
uci_set "travelmate" " ${ trm_uplinkcfg } " "enabled" "0"
2023-10-24 17:27:40 +02:00
if [ -s " ${ trm_ntpfile } " ] ; then
2021-08-11 19:14:56 +02:00
uci_set "travelmate" " ${ trm_uplinkcfg } " "con_end" " $( date "+%Y.%m.%d-%H:%M:%S" ) "
2020-09-19 06:20:19 +02:00
fi
2021-07-25 21:41:58 +02:00
; ;
2020-09-19 06:20:19 +02:00
esac
2021-07-25 21:41:58 +02:00
if [ -n " $( uci -q changes "travelmate" ) " ] ; then
2020-09-19 06:20:19 +02:00
uci_commit "travelmate"
2021-07-25 21:41:58 +02:00
if [ ! -f " ${ trm_refreshfile } " ] ; then
printf "%s" "cfg_reload" >" ${ trm_refreshfile } "
2020-09-19 06:20:19 +02:00
fi
fi
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_ctrack ::: action: ${ action :- "-" } , uplink_config: ${ trm_uplinkcfg :- "-" } "
}
# get openvpn information
#
f_getovpn( ) {
local file instance device
for file in /etc/openvpn/*.conf /etc/openvpn/*.ovpn; do
if [ -f " ${ file } " ] ; then
instance = " ${ file ##*/ } "
instance = " ${ instance %.conf } "
instance = " ${ instance %.ovpn } "
device = " $( awk '/^[[:space:]]*dev /{print $2}' " ${ file } " ) "
[ " ${ device } " = "tun" ] && device = "tun0"
[ " ${ device } " = "tap" ] && device = "tap0"
if [ -n " ${ device } " ] && [ -n " ${ instance } " ] && ! printf "%s" " ${ trm_ovpninfolist } " | grep -q " ${ device } " ; then
trm_ovpninfolist = " ${ trm_ovpninfolist } ${ device } && ${ instance } "
fi
fi
done
uci_config( ) {
local device section = " ${ 1 } "
device = " $( uci_get "openvpn" " ${ section } " "dev" ) "
[ " ${ device } " = "tun" ] && device = "tun0"
[ " ${ device } " = "tap" ] && device = "tap0"
if [ -n " ${ device } " ] && ! printf "%s" " ${ trm_ovpninfolist } " | grep -q " ${ device } " ; then
trm_ovpninfolist = " ${ trm_ovpninfolist } ${ device } && ${ section } "
fi
}
if [ -f "/etc/config/openvpn" ] ; then
config_load openvpn
config_foreach uci_config "openvpn"
fi
2023-10-27 10:48:04 +02:00
f_log "debug" " f_getovpn ::: ovpn_infolist: ${ trm_ovpninfolist :- "-" } "
2020-09-19 06:20:19 +02:00
}
2022-07-06 23:16:20 +02:00
# get logical vpn network interfaces
#
f_getvpn( ) {
2022-08-20 17:51:01 +02:00
local info proto device iface = " ${ 1 } "
2022-07-06 23:16:20 +02:00
proto = " $( uci_get "network" " ${ iface } " "proto" ) "
2022-08-20 17:51:01 +02:00
device = " $( uci_get "network" " ${ iface } " "device" ) "
if [ " ${ proto } " = "wireguard" ] ; then
2023-10-27 10:48:04 +02:00
if [ -z " ${ trm_vpnifacelist } " ] || printf "%s" " ${ trm_vpnifacelist } " | grep -q " ${ iface } " ; then
2022-08-20 17:51:01 +02:00
if ! printf "%s" " ${ trm_vpninfolist } " | grep -q " ${ iface } " ; then
trm_vpninfolist = " $( f_trim " ${ trm_vpninfolist } ${ iface } " ) "
fi
fi
elif [ " ${ proto } " = "none" ] && [ -n " ${ device } " ] ; then
if [ -z " ${ trm_ovpninfolist } " ] ; then
f_getovpn
fi
2023-10-27 10:48:04 +02:00
if [ -z " ${ trm_vpnifacelist } " ] || printf "%s" " ${ trm_vpnifacelist } " | grep -q " ${ iface } " ; then
2022-08-20 17:51:01 +02:00
for info in ${ trm_ovpninfolist } ; do
if [ " ${ info %%&&* } " = " ${ device } " ] ; then
if ! printf "%s" " ${ trm_vpninfolist } " | grep -q " ${ iface } " ; then
trm_vpninfolist = " $( f_trim " ${ trm_vpninfolist } ${ iface } && ${ info ##*&& } " ) "
break
fi
fi
done
fi
2022-07-06 23:16:20 +02:00
fi
2023-10-27 10:48:04 +02:00
f_log "debug" " f_getvpn ::: iface: ${ iface :- "-" } , proto: ${ proto :- "-" } , device: ${ device :- "-" } , vpn_ifacelist: ${ trm_vpnifacelist :- "-" } , vpn_infolist: ${ trm_vpninfolist :- "-" } "
2022-07-06 23:16:20 +02:00
}
2021-08-21 21:37:01 +02:00
# get wan gateway addresses
#
f_getgw( ) {
local result wan4_if wan4_gw wan6_if wan6_gw
network_flush_cache
network_find_wan wan4_if
network_find_wan6 wan6_if
network_get_gateway wan4_gw " ${ wan4_if } "
network_get_gateway6 wan6_gw " ${ wan6_if } "
if [ -n " ${ wan4_gw } " ] || [ -n " ${ wan6_gw } " ] ; then
2024-02-24 06:58:40 +01:00
result = "true"
2021-08-21 21:37:01 +02:00
fi
printf "%s" " ${ result } "
2022-08-20 17:51:01 +02:00
f_log "debug" " f_getgw ::: wan4_gw: ${ wan4_gw :- "-" } , wan6_gw: ${ wan6_gw :- "-" } , result: ${ result :- "-" } "
2021-08-21 21:37:01 +02:00
}
2021-08-11 19:14:56 +02:00
# get uplink config section
2020-09-19 06:20:19 +02:00
#
2021-08-11 19:14:56 +02:00
f_getcfg( ) {
2021-08-15 14:11:27 +02:00
local t_radio t_essid t_bssid radio = " ${ 1 } " essid = " ${ 2 } " bssid = " ${ 3 } " cnt = "0"
2021-08-11 19:14:56 +02:00
while uci_get "travelmate" " @uplink[ ${ cnt } ] " >/dev/null 2>& 1; do
t_radio = " $( uci_get "travelmate" " @uplink[ ${ cnt } ] " "device" ) "
t_essid = " $( uci_get "travelmate" " @uplink[ ${ cnt } ] " "ssid" ) "
t_bssid = " $( uci_get "travelmate" " @uplink[ ${ cnt } ] " "bssid" ) "
if [ -n " ${ radio } " ] && [ -n " ${ essid } " ] &&
[ " ${ t_radio } " = " ${ radio } " ] && [ " ${ t_essid } " = " ${ essid } " ] && [ " ${ t_bssid } " = " ${ bssid } " ] ; then
trm_uplinkcfg = " @uplink[ ${ cnt } ] "
2020-09-19 06:20:19 +02:00
break
fi
2021-07-25 21:41:58 +02:00
cnt = " $(( cnt + 1 )) "
2020-09-19 06:20:19 +02:00
done
2022-08-20 17:51:01 +02:00
f_log "debug" " f_getcfg ::: status: ${ status } , section: ${ section } , uplink_config: ${ trm_uplinkcfg :- "-" } "
2016-10-16 17:54:48 +02:00
}
2021-08-11 19:14:56 +02:00
# get travelmate option value in 'uplink' sections
2016-12-02 21:57:56 +01:00
#
2021-08-11 19:14:56 +02:00
f_getval( ) {
2021-08-15 14:11:27 +02:00
local result t_option = " ${ 1 } "
2021-08-11 19:14:56 +02:00
if [ -n " ${ trm_uplinkcfg } " ] ; then
result = " $( uci_get "travelmate" " ${ trm_uplinkcfg } " " ${ t_option } " ) "
printf "%s" " ${ result } "
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_getval ::: option: ${ t_option :- "-" } , result: ${ result :- "-" } , uplink_config: ${ trm_uplinkcfg :- "-" } "
2021-08-11 19:14:56 +02:00
}
# set 'wifi-device' sections
#
f_setdev( ) {
2021-08-15 14:11:27 +02:00
local disabled radio = " ${ 1 } "
2019-10-21 20:37:08 +02:00
2020-09-19 06:20:19 +02:00
disabled = " $( uci_get "wireless" " ${ radio } " "disabled" ) "
2021-07-25 21:41:58 +02:00
if [ " ${ disabled } " = "1" ] ; then
2021-08-11 19:14:56 +02:00
uci_set wireless " ${ radio } " "disabled" "0"
2020-09-19 06:20:19 +02:00
fi
2021-08-11 19:14:56 +02:00
if [ -n " ${ trm_radio } " ] && [ -z " ${ trm_radiolist } " ] ; then
trm_radiolist = " ${ trm_radio } "
elif [ -z " ${ trm_radio } " ] && ! printf "%s" " ${ trm_radiolist } " | grep -q " ${ radio } " ; then
2020-09-19 06:20:19 +02:00
trm_radiolist = " $( f_trim " ${ trm_radiolist } ${ radio } " ) "
2019-10-21 20:37:08 +02:00
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_setdev ::: radio: ${ radio :- "-" } , radio_list(cnf/cur): ${ trm_radio :- "-" } / ${ trm_radiolist :- "-" } , disabled: ${ disabled :- "-" } "
2019-10-21 20:37:08 +02:00
}
2021-08-11 19:14:56 +02:00
# set 'wifi-iface' sections
2019-10-21 20:37:08 +02:00
#
2021-08-11 19:14:56 +02:00
f_setif( ) {
2021-08-21 21:37:01 +02:00
local mode radio essid bssid enabled disabled con_start con_end con_start_expiry con_end_expiry section = " ${ 1 } " proactive = " ${ 2 } "
2020-09-19 06:20:19 +02:00
mode = " $( uci_get "wireless" " ${ section } " "mode" ) "
radio = " $( uci_get "wireless" " ${ section } " "device" ) "
essid = " $( uci_get "wireless" " ${ section } " "ssid" ) "
bssid = " $( uci_get "wireless" " ${ section } " "bssid" ) "
disabled = " $( uci_get "wireless" " ${ section } " "disabled" ) "
2021-08-11 19:14:56 +02:00
f_getcfg " ${ radio } " " ${ essid } " " ${ bssid } "
2021-08-21 21:37:01 +02:00
enabled = " $( f_getval "enabled" ) "
2021-08-11 19:14:56 +02:00
con_start = " $( f_getval "con_start" ) "
con_end = " $( f_getval "con_end" ) "
con_start_expiry = " $( f_getval "con_start_expiry" ) "
con_end_expiry = " $( f_getval "con_end_expiry" ) "
2020-09-19 06:20:19 +02:00
2021-08-21 21:37:01 +02:00
if [ " ${ enabled } " = "0" ] && [ -n " ${ con_end } " ] && [ -n " ${ con_end_expiry } " ] && [ " ${ con_end_expiry } " != "0" ] ; then
2020-09-19 06:20:19 +02:00
d1 = " $( date -d " ${ con_end } " "+%s" ) "
d2 = " $( date "+%s" ) "
2021-07-25 21:41:58 +02:00
d3 = " $(( ( d2 - d1) / 60 )) "
if [ " ${ d3 } " -ge " ${ con_end_expiry } " ] ; then
2021-08-21 21:37:01 +02:00
enabled = "1"
2021-08-11 19:14:56 +02:00
f_ctrack "end_expiry"
2020-09-19 06:20:19 +02:00
fi
2021-08-21 21:37:01 +02:00
elif [ " ${ enabled } " = "1" ] && [ -n " ${ con_start } " ] && [ -n " ${ con_start_expiry } " ] && [ " ${ con_start_expiry } " != "0" ] ; then
2020-09-19 06:20:19 +02:00
d1 = " $( date -d " ${ con_start } " "+%s" ) "
d2 = " $( date "+%s" ) "
2021-07-25 21:41:58 +02:00
d3 = " $(( d1 + ( con_start_expiry * 60 )) ) "
if [ " ${ d2 } " -gt " ${ d3 } " ] ; then
2021-08-21 21:37:01 +02:00
enabled = "0"
2021-08-11 19:14:56 +02:00
f_ctrack "start_expiry"
2018-09-08 22:28:04 +02:00
fi
2020-09-19 06:20:19 +02:00
fi
2021-07-25 21:41:58 +02:00
if [ " ${ mode } " = "sta" ] ; then
2021-08-21 21:37:01 +02:00
if [ " ${ enabled } " = "0" ] || { { [ -z " ${ disabled } " ] || [ " ${ disabled } " = "0" ] ; } &&
2021-08-11 19:14:56 +02:00
{ [ " ${ proactive } " = "0" ] || [ " ${ trm_ifstatus } " != "true" ] ; } ; } ; then
2020-09-19 06:20:19 +02:00
uci_set "wireless" " ${ section } " "disabled" "1"
2021-08-21 21:37:01 +02:00
elif [ " ${ enabled } " = "1" ] && [ " ${ disabled } " = "0" ] && [ " ${ trm_ifstatus } " = "true" ] && [ " ${ proactive } " = "1" ] ; then
2021-07-25 21:41:58 +02:00
if [ -z " ${ trm_activesta } " ] ; then
2020-09-19 06:20:19 +02:00
trm_activesta = " ${ section } "
else
uci_set "wireless" " ${ section } " "disabled" "1"
2019-02-15 09:29:58 +01:00
fi
2018-09-08 22:28:04 +02:00
fi
2021-08-21 21:37:01 +02:00
if [ " ${ enabled } " = "1" ] ; then
2020-09-19 06:20:19 +02:00
trm_stalist = " $( f_trim " ${ trm_stalist } ${ section } - ${ radio } " ) "
fi
2018-09-08 22:28:04 +02:00
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_setif ::: enabled: ${ enabled } , section: ${ section } , active_sta: ${ trm_activesta :- "-" } , uplink_config: ${ trm_uplinkcfg :- "-" } "
2021-08-11 19:14:56 +02:00
}
# add open uplinks
#
f_addsta( ) {
2023-10-24 17:27:40 +02:00
local wifi_cfg trm_cfg new_uplink = "1" offset = "1" radio = " ${ 1 } " essid = " ${ 2 } "
2021-08-11 19:14:56 +02:00
2021-08-13 08:28:29 +02:00
if [ " ${ trm_maxautoadd } " = "0" ] || [ " ${ trm_opensta :- 0 } " -lt " ${ trm_maxautoadd } " ] ; then
2021-08-11 19:14:56 +02:00
config_cb( ) {
local type = " ${ 1 } " name = " ${ 2 } "
if [ " ${ type } " = "wifi-iface" ] ; then
if [ " $( uci_get " wireless. ${ name } .ssid " ) " = " ${ essid } " ] &&
[ " $( uci_get " wireless. ${ name } .device " ) " = " ${ radio } " ] ; then
new_uplink = "0"
return 0
fi
2021-08-21 21:37:01 +02:00
offset = " $(( offset + 1 )) "
2021-08-11 19:14:56 +02:00
fi
}
config_load wireless
else
new_uplink = "0"
fi
if [ " ${ new_uplink } " = "1" ] ; then
2023-10-24 17:27:40 +02:00
wifi_cfg = " trm_uplink $(( offset + 1 )) "
while [ -n " $( uci_get " wireless. ${ wifi_cfg } " ) " ] ; do
2021-08-11 19:14:56 +02:00
offset = " $(( offset + 1 )) "
2023-10-24 17:27:40 +02:00
wifi_cfg = " trm_uplink ${ offset } "
2021-08-11 19:14:56 +02:00
done
uci -q batch <<-EOC
2023-10-24 17:27:40 +02:00
set wireless." ${ wifi_cfg } " = "wifi-iface"
set wireless." ${ wifi_cfg } " .mode= "sta"
set wireless." ${ wifi_cfg } " .network= " ${ trm_iface } "
set wireless." ${ wifi_cfg } " .device= " ${ radio } "
set wireless." ${ wifi_cfg } " .ssid= " ${ essid } "
set wireless." ${ wifi_cfg } " .encryption= "none"
set wireless." ${ wifi_cfg } " .disabled= "1"
2021-08-11 19:14:56 +02:00
EOC
2023-10-24 17:27:40 +02:00
trm_cfg = " $( uci -q add travelmate uplink) "
2021-08-11 19:14:56 +02:00
uci -q batch <<-EOC
2023-10-24 17:27:40 +02:00
set travelmate." ${ trm_cfg } " .device= " ${ radio } "
set travelmate." ${ trm_cfg } " .ssid= " ${ essid } "
set travelmate." ${ trm_cfg } " .opensta= "1"
set travelmate." ${ trm_cfg } " .con_start_expiry= "0"
set travelmate." ${ trm_cfg } " .con_end_expiry= "0"
set travelmate." ${ trm_cfg } " .enabled= "1"
2021-08-11 19:14:56 +02:00
EOC
2023-10-24 17:27:40 +02:00
if [ -n " ${ trm_stdvpnservice } " ] && [ -n " ${ trm_stdvpniface } " ] ; then
uci -q batch <<-EOC
set travelmate." ${ trm_cfg } " .vpnservice= " ${ trm_stdvpnservice } "
set travelmate." ${ trm_cfg } " .vpniface= " ${ trm_stdvpniface } "
set travelmate." ${ trm_cfg } " .vpn= "1"
EOC
2021-08-11 19:14:56 +02:00
fi
2023-10-24 17:27:40 +02:00
trm_opensta = " $(( trm_opensta + 1 )) "
uci_commit "travelmate"
uci_commit "wireless"
f_wifi
if [ ! -f " ${ trm_refreshfile } " ] ; then
printf "%s" "ui_reload" >" ${ trm_refreshfile } "
fi
f_log "info" " open uplink ' ${ radio } / ${ essid } ' added to wireless config "
printf "%s" " ${ wifi_cfg } - ${ radio } "
2021-08-11 19:14:56 +02:00
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_addsta ::: radio: ${ radio :- "-" } , essid: ${ essid } , opensta/maxautoadd: ${ trm_opensta :- "-" } / ${ trm_maxautoadd :- "-" } , new_uplink: ${ new_uplink } , offset: ${ offset } "
2016-12-02 21:57:56 +01:00
}
2019-08-29 14:03:23 +02:00
# check net status
#
2021-08-11 19:14:56 +02:00
f_net( ) {
2022-07-17 13:12:21 +02:00
local err_msg raw json_raw html_raw html_cp js_cp json_ec json_rc json_cp json_ed result = "net nok"
2019-08-29 14:03:23 +02:00
2021-08-21 21:37:01 +02:00
raw = " $( ${ trm_fetch } --user-agent " ${ trm_useragent } " --referer "http://www.example.com" --header "Cache-Control: no-cache, no-store, must-revalidate, max-age=0" --write-out "%{json}" --silent --max-time $(( trm_maxwait / 6 )) " ${ trm_captiveurl } " ) "
2021-07-25 21:41:58 +02:00
json_raw = " ${ raw #* \{ } "
html_raw = " ${ raw %% \{ * } "
2021-08-11 19:14:56 +02:00
if [ -n " ${ json_raw } " ] ; then
2023-10-27 10:48:04 +02:00
json_ec = " $( printf "%s" " { ${ json_raw } " | " ${ trm_jsoncmd } " -ql1 -e '@.exitcode' ) "
json_rc = " $( printf "%s" " { ${ json_raw } " | " ${ trm_jsoncmd } " -ql1 -e '@.response_code' ) "
json_cp = " $( printf "%s" " { ${ json_raw } " | " ${ trm_jsoncmd } " -ql1 -e '@.redirect_url' | awk 'BEGIN{FS="/"}{printf "%s",tolower($3)}' ) "
2021-08-11 19:14:56 +02:00
if [ " ${ json_ec } " = "0" ] ; then
if [ -n " ${ json_cp } " ] ; then
result = " net cp ' ${ json_cp } ' "
else
if [ " ${ json_rc } " = "200" ] || [ " ${ json_rc } " = "204" ] ; then
2021-10-01 15:17:00 +02:00
html_cp = " $( printf "%s" " ${ html_raw } " | awk 'match(tolower($0),/^.*<meta[ \t]+http-equiv=[' \' '"]*refresh.*[ \t;]url=/){print substr(tolower($0),RLENGTH+1)}' | awk 'BEGIN{FS="[:/]"}{printf "%s",$4;exit}' ) "
2022-07-17 13:12:21 +02:00
js_cp = " $( printf "%s" " ${ html_raw } " | awk 'match(tolower($0),/^.*location\.href=[' \' '"]*/){print substr(tolower($0),RLENGTH+1)}' | awk 'BEGIN{FS="[:/]"}{printf "%s",$4;exit}' ) "
2021-08-11 19:14:56 +02:00
if [ -n " ${ html_cp } " ] ; then
result = " net cp ' ${ html_cp } ' "
2022-07-17 13:12:21 +02:00
elif [ -n " ${ js_cp } " ] ; then
result = " net cp ' ${ js_cp } ' "
2021-08-11 19:14:56 +02:00
else
result = "net ok"
fi
fi
fi
2020-09-19 06:20:19 +02:00
else
2023-10-27 10:48:04 +02:00
err_msg = " $( printf "%s" " { ${ json_raw } " | " ${ trm_jsoncmd } " -ql1 -e '@.errormsg' ) "
2021-08-11 19:14:56 +02:00
json_ed = " $( printf "%s" " { ${ err_msg } " | awk '/([[:alnum:]_-]{1,63}\.)+[[:alpha:]]+$/{printf "%s",tolower($NF)}' ) "
if [ " ${ json_ec } " = "6" ] ; then
if [ -n " ${ json_ed } " ] && [ " ${ json_ed } " != " ${ trm_captiveurl #http* : //* } " ] ; then
result = " net cp ' ${ json_ed } ' "
2021-07-25 21:41:58 +02:00
fi
2020-09-19 06:20:19 +02:00
fi
fi
2020-04-29 14:48:36 +02:00
fi
2019-08-29 14:03:23 +02:00
printf "%s" " ${ result } "
2024-02-24 06:58:40 +01:00
f_log "debug" " f_net ::: fetch: ${ trm_fetch } , timeout: $(( trm_maxwait / 6 )) , cp (json/html/js): ${ json_cp :- "-" } / ${ html_cp :- "-" } / ${ js_cp :- "-" } , result: ${ result } , error (rc/msg): ${ json_ec } / ${ err_msg :- "-" } , url: ${ trm_captiveurl } "
2019-08-29 14:03:23 +02:00
}
2018-01-10 19:42:48 +01:00
# check interface status
2017-03-04 20:30:04 +01:00
#
2021-08-11 19:14:56 +02:00
f_check( ) {
2023-10-24 17:27:40 +02:00
local ifname radio dev_status result login_script login_script_args cp_domain wait_time = "0" enabled = "1" mode = " ${ 1 } " status = " ${ 2 } " sta_radio = " ${ 3 } " sta_essid = " ${ 4 } " sta_bssid = " ${ 5 } "
2016-10-16 17:54:48 +02:00
2021-07-25 21:41:58 +02:00
if [ " ${ mode } " = "initial" ] || [ " ${ mode } " = "dev" ] ; then
2020-09-19 06:20:19 +02:00
json_get_var station_id "station_id"
sta_radio = " ${ station_id %%/* } "
sta_essid = " ${ station_id %/* } "
sta_essid = " ${ sta_essid #*/ } "
sta_bssid = " ${ station_id ##*/ } "
sta_bssid = " ${ sta_bssid //-/ } "
fi
2021-08-11 19:14:56 +02:00
f_getcfg " ${ sta_radio } " " ${ sta_essid } " " ${ sta_bssid } "
2021-07-25 21:41:58 +02:00
if [ " ${ mode } " != "rev" ] && [ -n " ${ sta_radio } " ] && [ " ${ sta_radio } " != "-" ] && [ -n " ${ sta_essid } " ] && [ " ${ sta_essid } " != "-" ] ; then
2021-08-11 19:14:56 +02:00
enabled = " $( f_getval "enabled" ) "
2020-09-19 06:20:19 +02:00
fi
2021-08-11 19:14:56 +02:00
if { [ " ${ mode } " != "initial" ] && [ " ${ mode } " != "dev" ] && [ " ${ status } " = "false" ] ; } ||
2021-08-15 14:11:27 +02:00
{ [ " ${ mode } " = "dev" ] && { [ " ${ status } " = "false" ] || { [ " ${ trm_ifstatus } " != " ${ status } " ] && [ " ${ enabled } " = "0" ] ; } ; } ; } ; then
2021-08-11 19:14:56 +02:00
f_wifi
2018-09-08 22:28:04 +02:00
fi
2021-07-25 21:41:58 +02:00
while [ " ${ wait_time } " -le " ${ trm_maxwait } " ] ; do
2023-10-24 17:27:40 +02:00
[ " ${ wait_time } " -gt "0" ] && sleep 1
wait_time = " $(( wait_time + 1 )) "
2023-10-27 10:48:04 +02:00
dev_status = " $( " ${ trm_ubuscmd } " -S call network.wireless status 2>/dev/null) "
2021-07-25 21:41:58 +02:00
if [ -n " ${ dev_status } " ] ; then
if [ " ${ mode } " = "dev" ] ; then
if [ " ${ trm_ifstatus } " != " ${ status } " ] ; then
2018-09-08 22:28:04 +02:00
trm_ifstatus = " ${ status } "
f_jsnup
fi
2021-07-25 21:41:58 +02:00
if [ " ${ status } " = "false" ] ; then
sleep " $(( trm_maxwait / 5 )) "
2018-09-08 22:28:04 +02:00
fi
2020-09-19 06:20:19 +02:00
break
2021-07-25 21:41:58 +02:00
elif [ " ${ mode } " = "rev" ] ; then
2021-08-21 21:37:01 +02:00
unset trm_connection
trm_ifstatus = " ${ status } "
2018-09-08 22:28:04 +02:00
break
else
2023-10-27 10:48:04 +02:00
ifname = " $( printf "%s" " ${ dev_status } " | " ${ trm_jsoncmd } " -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname' ) "
2021-07-25 21:41:58 +02:00
if [ -n " ${ ifname } " ] && [ " ${ enabled } " = "1" ] ; then
2023-10-24 17:27:40 +02:00
trm_ifquality = " $( ${ trm_iwinfo } " ${ ifname } " info 2>/dev/null | awk -F '[ ]' '/Link Quality: [0-9]+\/[0-9]+/{split($NF,var0,"/");printf "%i\n",(var0[1]*100/var0[2])}' ) "
if [ -z " ${ trm_ifquality } " ] ; then
2024-01-09 22:22:57 +01:00
trm_ifstatus = " $( " ${ trm_ubuscmd } " -S call network.interface dump 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e " @.interface[@.device=\" ${ ifname } \"].up " ) "
if { [ -n " ${ trm_connection } " ] && [ " ${ trm_ifstatus } " = "false" ] ; } || [ " ${ wait_time } " -eq " ${ trm_maxwait } " ] ; then
f_log "info" "no signal from uplink"
f_vpn "disable"
unset trm_connection
trm_ifstatus = " ${ status } "
f_ctrack "end"
f_jsnup
break
fi
2023-10-24 17:27:40 +02:00
continue
elif [ " ${ trm_ifquality } " -ge " ${ trm_minquality } " ] ; then
2023-10-27 10:48:04 +02:00
trm_ifstatus = " $( " ${ trm_ubuscmd } " -S call network.interface dump 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e " @.interface[@.device=\" ${ ifname } \"].up " ) "
2021-07-25 21:41:58 +02:00
if [ " ${ trm_ifstatus } " = "true" ] ; then
2021-08-21 21:37:01 +02:00
result = " $( f_net) "
2021-07-25 21:41:58 +02:00
if [ " ${ trm_captive } " = "1" ] ; then
2022-06-23 09:14:27 +02:00
while true; do
cp_domain = " $( printf "%s" " ${ result } " | awk -F '[' \' '| ]' '/^net cp/{printf "%s",$4}' ) "
if [ -x "/etc/init.d/dnsmasq" ] && [ -f "/etc/config/dhcp" ] &&
[ -n " ${ cp_domain } " ] && ! uci_get "dhcp" "@dnsmasq[0]" "rebind_domain" | grep -q " ${ cp_domain } " ; then
uci_add_list "dhcp" "@dnsmasq[0]" "rebind_domain" " ${ cp_domain } "
uci_commit "dhcp"
/etc/init.d/dnsmasq reload
f_log "info" " captive portal domain ' ${ cp_domain } ' added to to dhcp rebind whitelist "
else
break
fi
result = " $( f_net) "
done
if [ -n " ${ cp_domain } " ] ; then
2020-09-19 06:20:19 +02:00
trm_connection = " ${ result :- "-" } / ${ trm_ifquality } "
f_jsnup
2021-08-11 19:14:56 +02:00
login_script = " $( f_getval "script" ) "
2021-07-25 21:41:58 +02:00
if [ -x " ${ login_script } " ] ; then
2021-08-11 19:14:56 +02:00
login_script_args = " $( f_getval "script_args" ) "
2020-09-19 06:20:19 +02:00
" ${ login_script } " ${ login_script_args } >/dev/null 2>& 1
2020-09-27 06:57:44 +02:00
rc = " ${ ? } "
2024-02-24 06:58:40 +01:00
f_log "info" " captive portal login script for ' ${ cp_domain } ' has been finished with rc ' ${ rc } ' "
if [ " ${ rc } " = "0" ] ; then
result = " $( f_net) "
2020-09-19 06:20:19 +02:00
fi
fi
2019-08-06 15:29:00 +02:00
fi
fi
2022-07-17 13:12:21 +02:00
if [ " ${ result } " = "net nok" ] ; then
2020-09-19 06:20:19 +02:00
f_vpn "disable"
2022-07-17 13:12:21 +02:00
if [ " ${ trm_netcheck } " = "1" ] ; then
f_log "info" "uplink has no internet"
trm_ifstatus = " ${ status } "
f_jsnup
break
fi
2019-04-09 16:53:24 +02:00
fi
2019-05-24 14:21:02 +02:00
trm_connection = " ${ result :- "-" } / ${ trm_ifquality } "
2019-04-09 16:53:24 +02:00
f_jsnup
break
fi
2021-08-21 21:37:01 +02:00
elif [ -n " ${ trm_connection } " ] && { [ " ${ trm_netcheck } " = "1" ] || [ " ${ mode } " = "initial" ] ; } ; then
f_log "info" " uplink is out of range ( ${ trm_ifquality } / ${ trm_minquality } ) "
f_vpn "disable"
unset trm_connection
trm_ifstatus = " ${ status } "
f_ctrack "end"
2018-09-08 22:28:04 +02:00
f_jsnup
2019-04-09 16:53:24 +02:00
break
2021-08-21 21:37:01 +02:00
elif [ " ${ mode } " = "initial" ] || [ " ${ mode } " = "sta" ] ; then
unset trm_connection
2020-09-19 06:20:19 +02:00
trm_ifstatus = " ${ status } "
2019-05-24 14:21:02 +02:00
f_jsnup
break
2018-09-08 22:28:04 +02:00
fi
2021-07-25 21:41:58 +02:00
elif [ -n " ${ trm_connection } " ] ; then
2020-09-19 06:20:19 +02:00
f_vpn "disable"
2019-05-24 14:21:02 +02:00
unset trm_connection
trm_ifstatus = " ${ status } "
f_jsnup
break
2021-07-25 21:41:58 +02:00
elif [ " ${ mode } " = "initial" ] ; then
2020-09-19 06:20:19 +02:00
trm_ifstatus = " ${ status } "
2019-05-24 14:21:02 +02:00
f_jsnup
break
2018-09-08 22:28:04 +02:00
fi
fi
fi
2021-07-25 21:41:58 +02:00
if [ " ${ mode } " = "initial" ] ; then
2020-09-19 06:20:19 +02:00
trm_ifstatus = " ${ status } "
f_jsnup
break
fi
2018-09-08 22:28:04 +02:00
done
2022-08-20 17:51:01 +02:00
f_log "debug" " f_check ::: mode: ${ mode } , name: ${ ifname :- "-" } , status: ${ trm_ifstatus } , enabled: ${ enabled } , connection: ${ trm_connection :- "-" } , wait: ${ wait_time } , max_wait: ${ trm_maxwait } , min_quality: ${ trm_minquality } , captive: ${ trm_captive } , netcheck: ${ trm_netcheck } "
2016-10-16 17:54:48 +02:00
}
2018-01-10 19:42:48 +01:00
# update runtime information
2017-03-04 20:30:04 +01:00
#
2021-08-11 19:14:56 +02:00
f_jsnup( ) {
2023-10-24 17:27:40 +02:00
local vpn vpn_iface section last_date sta_iface sta_radio sta_essid sta_bssid sta_mac dev_status status = " ${ trm_ifstatus } " ntp_done = "0" vpn_done = "0" mail_done = "0"
2018-02-27 14:26:18 +01:00
2021-07-25 21:41:58 +02:00
if [ " ${ status } " = "true" ] ; then
2019-04-09 16:53:24 +02:00
status = " connected ( ${ trm_connection :- "-" } ) "
2023-10-27 10:48:04 +02:00
dev_status = " $( " ${ trm_ubuscmd } " -S call network.wireless status 2>/dev/null) "
section = " $( printf "%s" " ${ dev_status } " | " ${ trm_jsoncmd } " -ql1 -e '@.*.interfaces[@.config.mode="sta"].section' ) "
2021-08-15 14:11:27 +02:00
if [ -n " ${ section } " ] ; then
sta_iface = " $( uci_get "wireless" " ${ section } " "network" ) "
sta_radio = " $( uci_get "wireless" " ${ section } " "device" ) "
sta_essid = " $( uci_get "wireless" " ${ section } " "ssid" ) "
sta_bssid = " $( uci_get "wireless" " ${ section } " "bssid" ) "
sta_mac = " $( f_mac "get" " ${ section } " ) "
2021-08-21 21:37:01 +02:00
f_getcfg " ${ sta_radio } " " ${ sta_essid } " " ${ sta_bssid } "
2020-09-19 06:20:19 +02:00
fi
json_get_var last_date "last_run"
2023-10-24 17:27:40 +02:00
2022-08-20 17:51:01 +02:00
vpn = " $( f_getval "vpn" ) "
if [ " ${ trm_vpn } " = "1" ] && [ -n " ${ trm_vpninfolist } " ] && [ " ${ vpn } " = "1" ] && [ -f " ${ trm_vpnfile } " ] ; then
vpn_iface = " $( f_getval "vpniface" ) "
vpn_done = "1"
fi
2021-07-25 21:41:58 +02:00
elif [ " ${ status } " = "error" ] ; then
2019-05-24 14:21:02 +02:00
unset trm_connection
status = "program error"
2019-04-09 16:53:24 +02:00
else
unset trm_connection
2020-09-19 06:20:19 +02:00
status = "running (not connected)"
2019-04-09 16:53:24 +02:00
fi
2021-07-25 21:41:58 +02:00
if [ -z " ${ last_date } " ] ; then
2019-10-18 12:37:37 +02:00
last_date = " $( date "+%Y.%m.%d-%H:%M:%S" ) "
2019-04-09 16:53:24 +02:00
fi
2021-07-25 21:41:58 +02:00
if [ -s " ${ trm_ntpfile } " ] ; then
2020-09-27 06:57:44 +02:00
ntp_done = "1"
fi
2021-07-25 21:41:58 +02:00
if [ " ${ trm_mail } " = "1" ] && [ -f " ${ trm_mailfile } " ] ; then
2020-09-27 06:57:44 +02:00
mail_done = "1"
2019-04-09 16:53:24 +02:00
fi
2018-09-08 22:28:04 +02:00
json_add_string "travelmate_status" " ${ status } "
json_add_string "travelmate_version" " ${ trm_ver } "
json_add_string "station_id" " ${ sta_radio :- "-" } / ${ sta_essid :- "-" } / ${ sta_bssid :- "-" } "
2020-09-19 06:20:19 +02:00
json_add_string "station_mac" " ${ sta_mac :- "-" } "
2022-08-20 17:51:01 +02:00
json_add_string "station_interfaces" " ${ sta_iface :- "-" } , ${ vpn_iface :- "-" } "
2020-09-19 06:20:19 +02:00
json_add_string "wpa_flags" " ${ trm_wpaflags :- "-" } "
json_add_string "run_flags" " captive: $( f_char ${ trm_captive } ) , proactive: $( f_char ${ trm_proactive } ) , netcheck: $( f_char ${ trm_netcheck } ) , autoadd: $( f_char ${ trm_autoadd } ) , randomize: $( f_char ${ trm_randomize } ) "
2020-09-27 06:57:44 +02:00
json_add_string "ext_hooks" " ntp: $( f_char ${ ntp_done } ) , vpn: $( f_char ${ vpn_done } ) , mail: $( f_char ${ mail_done } ) "
2020-09-19 06:20:19 +02:00
json_add_string "last_run" " ${ last_date } "
2018-09-08 22:28:04 +02:00
json_add_string "system" " ${ trm_sysver } "
2021-07-25 21:41:58 +02:00
json_dump >" ${ trm_rtfile } "
2020-09-19 06:20:19 +02:00
2021-08-21 21:37:01 +02:00
if [ " ${ status %% (net ok/* } " = "connected" ] && [ " ${ trm_mail } " = "1" ] && [ -x " ${ trm_mailpgm } " ] && [ " ${ ntp_done } " = "1" ] && [ " ${ mail_done } " = "0" ] ; then
2022-08-20 17:51:01 +02:00
if [ " ${ trm_vpn } " != "1" ] || [ " ${ vpn } " != "1" ] || [ -z " ${ trm_vpninfolist } " ] || [ " ${ vpn_done } " = "1" ] ; then
2021-08-21 21:37:01 +02:00
: >" ${ trm_mailfile } "
" ${ trm_mailpgm } " >/dev/null 2>& 1
2020-09-19 06:20:19 +02:00
fi
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_jsnup ::: section: ${ section :- "-" } , status: ${ status :- "-" } , sta_iface: ${ sta_iface :- "-" } , sta_radio: ${ sta_radio :- "-" } , sta_essid: ${ sta_essid :- "-" } , sta_bssid: ${ sta_bssid :- "-" } , ntp: ${ ntp_done } , vpn: ${ vpn :- "0" } / ${ vpn_done } , mail: ${ trm_mail } / ${ mail_done } "
2017-04-20 09:22:22 +02:00
}
2018-01-10 19:42:48 +01:00
# write to syslog
2016-10-16 17:54:48 +02:00
#
2021-08-11 19:14:56 +02:00
f_log( ) {
2021-08-15 14:11:27 +02:00
local class = " ${ 1 } " log_msg = " ${ 2 } "
2016-10-16 17:54:48 +02:00
2021-08-11 19:14:56 +02:00
if [ -n " ${ log_msg } " ] && { [ " ${ class } " != "debug" ] || [ " ${ trm_debug } " = "1" ] ; } ; then
2021-07-25 21:41:58 +02:00
if [ -x " ${ trm_logger } " ] ; then
2020-09-19 06:20:19 +02:00
" ${ trm_logger } " -p " ${ class } " -t " trm- ${ trm_ver } [ ${ $} ] " " ${ log_msg } "
2019-11-06 21:02:17 +01:00
else
2021-08-11 19:14:56 +02:00
printf "%s %s %s\n" " ${ class } " " trm- ${ trm_ver } [ ${ $} ] " " ${ log_msg } "
2019-11-06 21:02:17 +01:00
fi
2021-07-25 21:41:58 +02:00
if [ " ${ class } " = "err" ] ; then
2018-09-08 22:28:04 +02:00
trm_ifstatus = "error"
f_jsnup
2021-07-25 21:41:58 +02:00
: >" ${ trm_pidfile } "
2018-09-08 22:28:04 +02:00
exit 1
fi
fi
2016-10-16 17:54:48 +02:00
}
2018-01-10 19:42:48 +01:00
# main function for connection handling
2017-03-04 20:30:04 +01:00
#
2021-08-11 19:14:56 +02:00
f_main( ) {
2023-10-27 10:48:04 +02:00
local radio cnt retrycnt scan_dev scan_list scan_essid scan_bssid scan_open scan_quality station_id section
local sta sta_essid sta_bssid sta_radio sta_mac open_sta open_essid config_radio config_essid config_bssid
2016-10-16 17:54:48 +02:00
2020-09-19 06:20:19 +02:00
f_check "initial" "false"
2022-08-20 17:51:01 +02:00
f_log "debug" " f_main-1 ::: status: ${ trm_ifstatus } , proactive: ${ trm_proactive } "
2021-07-25 21:41:58 +02:00
if [ " ${ trm_ifstatus } " != "true" ] || [ " ${ trm_proactive } " = "1" ] ; then
2019-11-18 19:28:23 +01:00
config_load wireless
2021-08-11 19:14:56 +02:00
config_foreach f_setif wifi-iface " ${ trm_proactive } "
2021-07-25 21:41:58 +02:00
if [ " ${ trm_ifstatus } " = "true" ] && [ -n " ${ trm_activesta } " ] && [ " ${ trm_proactive } " = "1" ] ; then
2018-10-30 15:19:58 +01:00
json_get_var station_id "station_id"
2020-09-19 06:20:19 +02:00
config_radio = " ${ station_id %%/* } "
config_essid = " ${ station_id %/* } "
config_essid = " ${ config_essid #*/ } "
config_bssid = " ${ station_id ##*/ } "
config_bssid = " ${ config_bssid //-/ } "
2018-10-30 15:19:58 +01:00
f_check "dev" "true"
2022-08-20 17:51:01 +02:00
f_log "debug" " f_main-2 ::: config_radio: ${ config_radio } , config_essid: \" ${ config_essid } \", config_bssid: ${ config_bssid :- "-" } "
2018-10-30 15:19:58 +01:00
else
2019-08-29 14:03:23 +02:00
uci_commit "wireless"
2020-09-19 06:20:19 +02:00
f_check "dev" "false"
2018-10-30 15:19:58 +01:00
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_main-3 ::: radio_list: ${ trm_radiolist :- "-" } , sta_list: ${ trm_stalist :- "-" } "
2020-09-19 06:20:19 +02:00
2019-03-19 15:23:11 +01:00
# radio loop
#
2021-07-25 21:41:58 +02:00
for radio in ${ trm_radiolist } ; do
if ! printf "%s" " ${ trm_stalist } " | grep -q " \\- ${ radio } " ; then
2021-08-11 19:14:56 +02:00
if [ " ${ trm_autoadd } " = "0" ] ; then
2021-08-13 08:28:29 +02:00
f_log "info" " no enabled station on radio ' ${ radio } ' "
2021-08-11 19:14:56 +02:00
continue
fi
2018-09-08 22:28:04 +02:00
fi
2021-08-21 21:37:01 +02:00
scan_list = ""
2020-09-19 06:20:19 +02:00
2019-03-19 15:23:11 +01:00
# station loop
#
2021-08-13 08:28:29 +02:00
for sta in ${ trm_stalist :- " ${ radio } " } ; do
if [ " ${ sta } " != " ${ radio } " ] ; then
section = " ${ sta %%-* } "
sta_radio = " $( uci_get "wireless" " ${ section } " "device" ) "
sta_essid = " $( uci_get "wireless" " ${ section } " "ssid" ) "
sta_bssid = " $( uci_get "wireless" " ${ section } " "bssid" ) "
sta_mac = " $( f_mac "get" " ${ section } " ) "
2021-08-21 21:37:01 +02:00
if [ -z " ${ sta_radio } " ] || [ -z " ${ sta_essid } " ] ; then
2021-08-13 08:28:29 +02:00
f_log "info" " invalid wireless section ' ${ section } ' "
continue
fi
2021-08-21 21:37:01 +02:00
if [ -n " ${ trm_connection } " ] && [ " ${ radio } " = " ${ config_radio } " ] && [ " ${ sta_radio } " = " ${ config_radio } " ] &&
2021-08-13 08:28:29 +02:00
[ " ${ sta_essid } " = " ${ config_essid } " ] && [ " ${ sta_bssid } " = " ${ config_bssid } " ] ; then
f_ctrack "refresh"
2022-07-06 23:16:20 +02:00
f_vpn "enable_keep"
2022-08-20 17:51:01 +02:00
f_log "debug" " f_main-4 ::: config_radio: ${ config_radio } , config_essid: ${ config_essid } , config_bssid: ${ config_bssid :- "-" } "
2021-08-21 21:37:01 +02:00
return 0
2021-08-13 08:28:29 +02:00
fi
2022-08-20 17:51:01 +02:00
f_log "debug" " f_main-5 ::: sta_radio: ${ sta_radio } , sta_essid: \" ${ sta_essid } \", sta_bssid: ${ sta_bssid :- "-" } "
2019-03-19 15:23:11 +01:00
fi
2021-07-25 21:41:58 +02:00
if [ -z " ${ scan_list } " ] ; then
2023-10-27 10:48:04 +02:00
scan_dev = " $( " ${ trm_ubuscmd } " -S call network.wireless status 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e " @. ${ radio } .interfaces[0].ifname " ) "
2021-07-25 21:41:58 +02:00
scan_list = " $( " ${ trm_iwinfo } " " ${ scan_dev :- ${ radio } } " scan 2>/dev/null |
2021-08-15 14:11:27 +02:00
awk ' BEGIN{ FS = "[[:space:]]" } /Address:/{ var1 = $NF } /ESSID:/{ var2 = "" ; for ( i = 12; i<= NF; i++) if ( var2 = = "" ) { var2 = $i } else { var2 = var2" " $i } }
/Quality:/{ split( $NF ,var0,"/" ) } /Encryption:/{ if ( $NF = = "none" ) { var3 = "+" } else { var3 = "-" } ;
2024-02-24 06:58:40 +01:00
printf "%i %s %s %s\n" ,( var0[ 1] *100/var0[ 2] ) ,var3,var1,var2} ' | sort -rn) "
f_log "debug" " f_main-6 ::: radio: ${ radio } , scan_device: ${ scan_dev } , scan_cnt: $( printf "%s" " ${ scan_list } " | grep -c "^" ) "
2021-07-25 21:41:58 +02:00
if [ -z " ${ scan_list } " ] ; then
2020-09-19 06:20:19 +02:00
f_log "info" " no scan results on ' ${ radio } ' "
2019-03-19 15:23:11 +01:00
continue 2
2018-10-30 15:19:58 +01:00
fi
2019-03-19 15:23:11 +01:00
fi
2020-09-19 06:20:19 +02:00
2019-03-19 15:23:11 +01:00
# scan loop
#
2021-08-21 21:37:01 +02:00
while read -r scan_quality scan_open scan_bssid scan_essid; do
2021-08-15 14:11:27 +02:00
if [ -n " ${ scan_quality } " ] && [ -n " ${ scan_open } " ] && [ -n " ${ scan_bssid } " ] && [ -n " ${ scan_essid } " ] ; then
2022-08-20 17:51:01 +02:00
f_log "debug" " f_main-7 ::: radio(sta/scan): ${ sta_radio } / ${ radio } , essid(sta/scan): \" ${ sta_essid } \"/ ${ scan_essid } , bssid(sta/scan): ${ sta_bssid } / ${ scan_bssid } , quality(min/scan): ${ trm_minquality } / ${ scan_quality } , open: ${ scan_open } "
2024-02-24 06:58:40 +01:00
if [ " ${ scan_quality } " -lt " ${ trm_minquality } " ] ; then
2024-02-24 22:39:10 +01:00
continue 2
2024-02-24 06:58:40 +01:00
elif [ " ${ scan_quality } " -ge " ${ trm_minquality } " ] ; then
2023-10-24 17:27:40 +02:00
if [ " ${ trm_autoadd } " = "1" ] && [ " ${ scan_open } " = "+" ] && [ " ${ scan_essid } " != "unknown" ] ; then
open_essid = " ${ scan_essid %? } "
open_essid = " ${ open_essid : 1 } "
2023-10-27 10:48:04 +02:00
open_sta = " $( f_addsta " ${ radio } " " ${ open_essid } " ) "
if [ -n " ${ open_sta } " ] ; then
section = " ${ open_sta %%-* } "
2023-10-24 17:27:40 +02:00
sta_radio = " $( uci_get "wireless" " ${ section } " "device" ) "
sta_essid = " $( uci_get "wireless" " ${ section } " "ssid" ) "
sta_bssid = ""
sta_mac = ""
fi
fi
2021-08-15 14:11:27 +02:00
if { { [ " ${ scan_essid } " = " \" ${ sta_essid } \" " ] && { [ -z " ${ sta_bssid } " ] || [ " ${ scan_bssid } " = " ${ sta_bssid } " ] ; } ; } ||
2021-08-11 19:14:56 +02:00
{ [ " ${ scan_bssid } " = " ${ sta_bssid } " ] && [ " ${ scan_essid } " = "unknown" ] ; } ; } && [ " ${ radio } " = " ${ sta_radio } " ] ; then
2021-07-25 21:41:58 +02:00
if [ -n " ${ config_radio } " ] ; then
2021-08-21 21:37:01 +02:00
f_vpn "disable"
2020-09-19 06:20:19 +02:00
uci_set "wireless" " ${ trm_activesta } " "disabled" "1"
2019-08-29 14:03:23 +02:00
uci_commit "wireless"
2021-08-21 21:37:01 +02:00
f_check "rev" "false"
2021-08-11 19:14:56 +02:00
f_ctrack "end"
2020-09-19 06:20:19 +02:00
f_log "info" " uplink connection terminated ' ${ config_radio } / ${ config_essid } / ${ config_bssid :- "-" } ' "
2021-08-21 21:37:01 +02:00
unset config_radio config_essid config_bssid
2019-03-19 15:23:11 +01:00
fi
2020-09-19 06:20:19 +02:00
2019-03-19 15:23:11 +01:00
# retry loop
#
2021-08-11 19:14:56 +02:00
retrycnt = "1"
f_getcfg " ${ sta_radio } " " ${ sta_essid } " " ${ sta_bssid } "
2021-07-25 21:41:58 +02:00
while [ " ${ retrycnt } " -le " ${ trm_maxretry } " ] ; do
2021-08-11 19:14:56 +02:00
sta_mac = " $( f_mac "set" " ${ section } " ) "
2020-09-19 06:20:19 +02:00
uci_set "wireless" " ${ section } " "disabled" "0"
f_check "sta" "false" " ${ sta_radio } " " ${ sta_essid } " " ${ sta_bssid } "
2021-07-25 21:41:58 +02:00
if [ " ${ trm_ifstatus } " = "true" ] ; then
2020-09-19 06:20:19 +02:00
rm -f " ${ trm_mailfile } "
2019-08-29 14:03:23 +02:00
uci_commit "wireless"
2021-08-11 19:14:56 +02:00
f_ctrack "start"
2020-09-19 06:20:19 +02:00
f_log "info" " connected to uplink ' ${ sta_radio } / ${ sta_essid } / ${ sta_bssid :- "-" } ' with mac ' ${ sta_mac :- "-" } ' ( ${ retrycnt } / ${ trm_maxretry } ) "
2021-08-21 21:37:01 +02:00
f_vpn "enable"
2019-03-19 15:23:11 +01:00
return 0
2019-02-15 09:29:58 +01:00
else
2019-08-29 14:03:23 +02:00
uci -q revert "wireless"
2020-09-19 06:20:19 +02:00
f_check "rev" "false"
2021-07-25 21:41:58 +02:00
if [ " ${ retrycnt } " = " ${ trm_maxretry } " ] ; then
2021-08-11 19:14:56 +02:00
f_ctrack "disabled"
2020-09-19 06:20:19 +02:00
f_log "info" " uplink has been disabled ' ${ sta_radio } / ${ sta_essid } / ${ sta_bssid :- "-" } ' ( ${ retrycnt } / ${ trm_maxretry } ) "
2024-02-24 06:58:40 +01:00
continue 2
2019-02-15 09:29:58 +01:00
else
f_jsnup
2020-09-19 06:20:19 +02:00
f_log "info" " can't connect to uplink ' ${ sta_radio } / ${ sta_essid } / ${ sta_bssid :- "-" } ' ( ${ retrycnt } / ${ trm_maxretry } ) "
2018-09-08 22:28:04 +02:00
fi
fi
2021-07-25 21:41:58 +02:00
retrycnt = " $(( retrycnt + 1 )) "
sleep " $(( trm_maxwait / 6 )) "
2019-03-19 15:23:11 +01:00
done
2018-09-08 22:28:04 +02:00
fi
2018-10-30 15:19:58 +01:00
fi
2019-03-19 15:23:11 +01:00
fi
2021-08-21 21:37:01 +02:00
done <<-EOV
${ scan_list }
EOV
2018-09-08 22:28:04 +02:00
done
done
fi
2016-12-31 14:14:29 +01:00
}
2023-10-27 10:48:04 +02:00
# get travelmate version
#
trm_ver = " $( " ${ trm_ubuscmd } " -S call rpc-sys packagelist '{ "all": true }' 2>/dev/null | " ${ trm_jsoncmd } " -ql1 -e '@.packages.travelmate' ) "
2017-07-07 17:02:19 +02:00
# source required system libraries
#
2021-08-21 21:37:01 +02:00
if [ -r "/lib/functions.sh" ] && [ -r "/lib/functions/network.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ] ; then
2018-09-08 22:28:04 +02:00
. "/lib/functions.sh"
2021-08-21 21:37:01 +02:00
. "/lib/functions/network.sh"
2018-09-08 22:28:04 +02:00
. "/usr/share/libubox/jshn.sh"
2017-07-07 17:02:19 +02:00
else
2018-09-08 22:28:04 +02:00
f_log "err" "system libraries not found"
2017-07-07 17:02:19 +02:00
fi
2023-10-24 17:27:40 +02:00
# force ntp restart/sync
#
if [ -f "/etc/init.d/sysntpd" ] && [ ! -s " ${ trm_ntpfile } " ] ; then
/etc/init.d/sysntpd restart >/dev/null 2>& 1
f_log "debug" "ntp time sync requested"
fi
2018-01-10 19:42:48 +01:00
# control travelmate actions
2017-04-20 09:22:22 +02:00
#
2021-07-25 21:41:58 +02:00
while true; do
2021-08-21 21:37:01 +02:00
if [ " ${ trm_action } " = "stop" ] ; then
2021-07-25 21:41:58 +02:00
if [ -s " ${ trm_pidfile } " ] ; then
2020-09-19 06:20:19 +02:00
f_log "info" " travelmate instance stopped ::: action: ${ trm_action } , pid: $( cat ${ trm_pidfile } 2>/dev/null) "
2021-07-25 21:41:58 +02:00
: >" ${ trm_rtfile } "
: >" ${ trm_pidfile } "
2020-09-19 06:20:19 +02:00
fi
break
2021-08-21 21:37:01 +02:00
elif [ -n " ${ trm_action } " ] ; then
2018-09-08 22:28:04 +02:00
f_log "info" " travelmate instance started ::: action: ${ trm_action } , pid: ${ $} "
2021-08-21 21:37:01 +02:00
f_env
f_main
unset trm_action
2018-09-08 22:28:04 +02:00
fi
2021-08-21 21:37:01 +02:00
while true; do
sleep " ${ trm_timeout } " 0
rc = " ${ ? } "
if [ " ${ rc } " != "0" ] ; then
if [ -z " $( f_getgw) " ] ; then
rc = "0"
fi
fi
if [ " ${ rc } " = "0" ] ; then
break
fi
done
2019-03-19 15:23:11 +01:00
json_cleanup
2019-11-18 19:28:23 +01:00
f_env
2018-09-08 22:28:04 +02:00
f_main
2018-01-10 19:42:48 +01:00
done