summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDirk Brenken2026-02-18 20:18:23 +0000
committerDirk Brenken2026-02-18 20:22:41 +0000
commit7431a315bacaa28a4e11cbe3501bf5c657d31b12 (patch)
tree0a271dce636b7c4150d70913ee10d5fefb2c3aed
parentb19cb351e21555d2a2d891dc95151c730059fa21 (diff)
downloadpackages-7431a315bacaa28a4e11cbe3501bf5c657d31b12.tar.gz
travelmate: release 2.4.0-1
* rework wlan scanning - drop iw/ip - use ubus/iwinfo calls instead - build a new, central wlan scan function (used in LuCI and during * simplify uci config parsing Signed-off-by: Dirk Brenken <dev@brenken.org>
-rw-r--r--net/travelmate/Makefile6
-rwxr-xr-xnet/travelmate/files/25-travelmate.hotplug2
-rw-r--r--net/travelmate/files/README.md3
-rwxr-xr-xnet/travelmate/files/generic-user-pass.login2
-rwxr-xr-xnet/travelmate/files/mail.template2
-rwxr-xr-xnet/travelmate/files/telekom.login2
-rw-r--r--net/travelmate/files/travelmate-functions.sh257
-rwxr-xr-xnet/travelmate/files/travelmate-service.sh6
-rwxr-xr-xnet/travelmate/files/travelmate.init60
-rwxr-xr-xnet/travelmate/files/travelmate.vpn2
-rwxr-xr-xnet/travelmate/files/vodafone.login2
-rwxr-xr-xnet/travelmate/files/wifibahn.login2
12 files changed, 198 insertions, 148 deletions
diff --git a/net/travelmate/Makefile b/net/travelmate/Makefile
index 5674d77b24..6af8e73b58 100644
--- a/net/travelmate/Makefile
+++ b/net/travelmate/Makefile
@@ -1,12 +1,12 @@
#
-# Copyright (c) 2016-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2016-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=travelmate
-PKG_VERSION:=2.3.0
+PKG_VERSION:=2.4.0
PKG_RELEASE:=1
PKG_LICENSE:=GPL-3.0-or-later
PKG_MAINTAINER:=Dirk Brenken <dev@brenken.org>
@@ -17,7 +17,7 @@ define Package/travelmate
SECTION:=net
CATEGORY:=Network
TITLE:=A wlan connection manager for travel router
- DEPENDS:=+iw +ip +jshn +jsonfilter +curl +ca-bundle +rpcd +rpcd-mod-rpcsys
+ DEPENDS:=+iwinfo +jshn +jsonfilter +curl +ca-bundle +rpcd +rpcd-mod-rpcsys
PKGARCH:=all
endef
diff --git a/net/travelmate/files/25-travelmate.hotplug b/net/travelmate/files/25-travelmate.hotplug
index acdee95f2d..a61ed3e42a 100755
--- a/net/travelmate/files/25-travelmate.hotplug
+++ b/net/travelmate/files/25-travelmate.hotplug
@@ -1,6 +1,6 @@
#!/bin/sh
# ntp hotplug script for travelmate
-# Copyright (c) 2020-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2020-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
diff --git a/net/travelmate/files/README.md b/net/travelmate/files/README.md
index 8242056c65..a934f52189 100644
--- a/net/travelmate/files/README.md
+++ b/net/travelmate/files/README.md
@@ -52,7 +52,7 @@ automatically (re)connnects to configured APs/hotspots as they become available.
* [OpenWrt](https://openwrt.org), tested/compatible with current stable and latest OpenWrt snapshot
* The `luci-app-travelmate` ensures these packages are present:
* 'dnsmasq' as dns backend
- * 'iw' for wlan scanning
+ * 'ubus iwinfo' for wlan scanning
* 'curl' for connection checking and all kinds of captive portal magic,
e.g. cp detection and auto-logins
* a 'wpad' variant to support various WPA encrypted networks
@@ -94,7 +94,6 @@ automatically (re)connnects to configured APs/hotspots as they become available.
| trm_laniface | -, lan | logical LAN network interface, default is 'lan' |
| trm_radio | -, not set | restrict travelmate to certain radio(s) |
| trm_revradio | 0, disabled | change the radio processing order, e.g. 'radio1 radio0' |
-| trm_scanmode | -, active | send active probe requests or passively listen for beacon frames with 'passive' |
| trm_captive | 1, enabled | check the internet availability and handle captive portal redirections |
| trm_netcheck | 0, disabled | treat missing internet availability as an error |
| trm_proactive | 0, disabled | proactively scan and switch to a higher prioritized uplink, despite of an already existing connection |
diff --git a/net/travelmate/files/generic-user-pass.login b/net/travelmate/files/generic-user-pass.login
index 1c646b6249..f605539bda 100755
--- a/net/travelmate/files/generic-user-pass.login
+++ b/net/travelmate/files/generic-user-pass.login
@@ -1,6 +1,6 @@
#!/bin/sh
# captive portal auto-login script template with credentials as parameters
-# Copyright (c) 2020-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2020-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
diff --git a/net/travelmate/files/mail.template b/net/travelmate/files/mail.template
index b023671f44..0f52526da1 100755
--- a/net/travelmate/files/mail.template
+++ b/net/travelmate/files/mail.template
@@ -1,5 +1,5 @@
# travelmate mail template/include - a wlan connection manager for travel router
-# Copyright (c) 2016-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2016-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# info preparation
diff --git a/net/travelmate/files/telekom.login b/net/travelmate/files/telekom.login
index 06ebe44412..124db17256 100755
--- a/net/travelmate/files/telekom.login
+++ b/net/travelmate/files/telekom.login
@@ -1,6 +1,6 @@
#!/bin/sh
# captive portal auto-login script for telekom hotspots (DE)
-# Copyright (c) 2021-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2021-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
diff --git a/net/travelmate/files/travelmate-functions.sh b/net/travelmate/files/travelmate-functions.sh
index 7acc3dc679..6f610b600d 100644
--- a/net/travelmate/files/travelmate-functions.sh
+++ b/net/travelmate/files/travelmate-functions.sh
@@ -1,5 +1,5 @@
# travelmate shared function library/include, a wlan connection manager for travel router
-# Copyright (c) 2016-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2016-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
@@ -28,7 +28,6 @@ trm_maxautoadd="5"
trm_timeout="60"
trm_radio=""
trm_revradio="0"
-trm_scanmode="active"
trm_connection=""
trm_ssidfilter=""
trm_ovpninfolist=""
@@ -44,6 +43,8 @@ trm_vpnfile="/var/state/travelmate.vpn"
trm_mailfile="/var/state/travelmate.mail"
trm_refreshfile="/var/state/travelmate.refresh"
trm_pidfile="/var/run/travelmate.pid"
+trm_scanfile="/var/run/travelmate.scan"
+trm_tmpfile="/var/run/travelmate.tmp"
# gather system information
#
@@ -81,61 +82,44 @@ f_cmd() {
fi
}
-# load travelmate environment
+# load travelmate config
#
f_conf() {
- local device
+ unset trm_stalist trm_radiolist trm_uplinklist trm_vpnifacelist trm_uplinkcfg trm_activesta trm_ssidfilter
- [ "${trm_action}" = "stop" ] && return 0
+ config_cb() {
+ option_cb() {
+ local option="${1}" value="${2//\"/\\\"}"
- unset trm_stalist trm_radiolist trm_uplinklist trm_vpnifacelist trm_uplinkcfg trm_activesta trm_opensta trm_ssidfilter
- config_cb() {
- local name="${1}" type="${2}"
-
- if [ "${name}" = "travelmate" ] && [ "${type}" = "global" ]; then
- option_cb() {
- local option="${1}" value="${2//\"/\\\"}"
-
- case "${option}" in
- *[!a-zA-Z0-9_]*)
- ;;
- *)
- eval "${option}=\"\${value}\""
- ;;
- esac
- }
- list_cb() {
- local option="${1}" value="${2//\"/\\\"}"
-
- case "${option}" in
- trm_vpnifacelist)
- case " ${trm_vpnifacelist} " in
- *" ${value} "*)
- ;;
- *)
- trm_vpnifacelist="${trm_vpnifacelist} ${value}"
- ;;
- esac
+ case "${option}" in
+ *[!a-zA-Z0-9_]*)
;;
- trm_ssidfilter)
- case " ${trm_ssidfilter} " in
- *" ${value} "*)
- ;;
- *)
- trm_ssidfilter="${trm_ssidfilter} ${value}"
- ;;
- esac
+ *)
+ eval "${option}=\"\${value}\""
;;
- esac
- }
- elif [ "${name}" = "uplink" ]; then
- if [ "$(uci_get "travelmate.${type}.opensta")" = "1" ]; then
- trm_opensta="$((${trm_opensta:-0} + 1))"
- fi
- fi
+ esac
+ }
+ list_cb() {
+ local option="${1}" value="${2//\"/\\\"}"
+
+ case "${option}" in
+ *[!a-zA-Z0-9_]*)
+ ;;
+ *)
+ eval "append=\"\${${option}}\""
+ if [ -n "${append}" ]; then
+ eval "${option}=\"${append} ${value}\""
+ else
+ eval "${option}=\"${value}\""
+ fi
+ ;;
+ esac
+ }
}
config_load travelmate
+ [ "${trm_action}" = "stop" ] && return 0
+
if [ "${trm_enabled}" != "1" ]; then
f_log "info" "travelmate is currently disabled, please set 'trm_enabled' to '1' to use this service"
/etc/init.d/travelmate stop
@@ -177,7 +161,7 @@ f_rmpid() {
local ppid pid
if [ -s "${trm_pidfile}" ]; then
- ppid="$("${trm_catcmd}" "${trm_pidfile}" 2>/dev/null)"
+ ppid="$(< "${trm_pidfile}")"
if [ -n "${ppid}" ]; then
pid="$("${trm_pgrepcmd}" -nf "sleep ${trm_timeout} 0" -P ${ppid} 2>/dev/null)"
[ -n "${pid}" ] && "${trm_killcmd}" -INT ${pid} 2>/dev/null
@@ -310,7 +294,7 @@ f_vpn() {
# mac helper function
#
f_mac() {
- local result ifname macaddr action="${1}" section="${2}"
+ local raw result ifname macaddr action="${1}" section="${2}"
if [ "${action}" = "set" ]; then
macaddr="$(f_getval "macaddr")"
@@ -324,14 +308,16 @@ f_mac() {
uci_set "wireless" "${section}" "macaddr" "${result}"
else
uci_remove "wireless" "${section}" "macaddr" 2>/dev/null
- ifname="$("${trm_ubuscmd}" -S call network.wireless status 2>/dev/null | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
- result="$("${trm_iwcmd}" dev "${ifname}" info 2>/dev/null | "${trm_awkcmd}" '/addr /{printf "%s",toupper($2)}')"
+ raw="$("${trm_ubuscmd}" -S call network.wireless status 2>/dev/null)"
+ ifname="$(printf "%s" "${raw}" | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
+ result="$(printf "%s" "${raw}" | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].config.macaddr')"
fi
elif [ "${action}" = "get" ]; then
result="$(uci_get "wireless" "${section}" "macaddr")"
if [ -z "${result}" ]; then
- ifname="$("${trm_ubuscmd}" -S call network.wireless status 2>/dev/null | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
- result="$("${trm_iwcmd}" dev "${ifname}" info 2>/dev/null | "${trm_awkcmd}" '/addr /{printf "%s",toupper($2)}')"
+ raw="$("${trm_ubuscmd}" -S call network.wireless status 2>/dev/null)"
+ ifname="$(printf "%s" "${raw}" | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
+ result="$(printf "%s" "${raw}" | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].config.macaddr')"
fi
fi
printf "%s" "${result}"
@@ -393,7 +379,6 @@ f_ctrack() {
fi
fi
fi
- f_log "debug" "f_ctrack ::: uplink_config: ${trm_uplinkcfg:-"-"}, action: ${action:-"-"}"
}
# get openvpn information
@@ -496,7 +481,6 @@ f_getcfg() {
fi
cnt="$((cnt + 1))"
done
- f_log "debug" "f_getcfg ::: uplink_config: ${trm_uplinkcfg:-"-"}"
}
# get travelmate option value in 'uplink' sections
@@ -508,7 +492,6 @@ f_getval() {
result="$(uci_get "travelmate" "${trm_uplinkcfg}" "${t_option}")"
printf "%s" "${result}"
fi
- f_log "debug" "f_getval ::: uplink_config: ${trm_uplinkcfg:-"-"}, option: ${t_option:-"-"}, result: ${result:-"-"}"
}
# set 'wifi-device' sections
@@ -619,7 +602,7 @@ f_addsta() {
;;
esac
done
- if [ "${trm_maxautoadd}" = "0" ] || [ "${trm_opensta:-0}" -lt "${trm_maxautoadd}" ]; then
+ if [ "${trm_maxautoadd}" = "0" ] || [ "${trm_autoaddcnt:-0}" -lt "${trm_maxautoadd}" ]; then
config_cb() {
local type="${1}" name="${2}"
@@ -668,7 +651,11 @@ f_addsta() {
set travelmate."${trm_cfg}".vpn="1"
EOC
fi
- trm_opensta="$((trm_opensta + 1))"
+
+ cnt="$(uci_get "travelmate" "global" "trm_autoaddcnt" "0")"
+ cnt="$((cnt + 1))"
+ uci_set "travelmate" "global" "trm_autoaddcnt" "${cnt}"
+
[ -n "$(uci -q changes "travelmate")" ] && uci_commit "travelmate"
[ -n "$(uci -q changes "wireless")" ] && uci_commit "wireless"
f_wifi
@@ -678,7 +665,7 @@ f_addsta() {
f_log "info" "open uplink '${radio}/${essid}' added to wireless config"
printf "%s" "${wifi_cfg}-${radio}"
fi
- f_log "debug" "f_addsta ::: radio: ${radio:-"-"}, essid: ${essid}, opensta/maxautoadd: ${trm_opensta:-"-"}/${trm_maxautoadd:-"-"}, new_uplink: ${new_uplink}, offset: ${offset}"
+ f_log "debug" "f_addsta ::: radio: ${radio:-"-"}, essid: ${essid}, autoaddcnt/maxautoadd: ${cnt:-"${trm_autoaddcnt}"}/${trm_maxautoadd:-"-"}, new_uplink: ${new_uplink}, offset: ${offset}"
}
# check net status
@@ -726,7 +713,7 @@ f_net() {
# check interface status
#
f_check() {
- 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}"
+ local raw 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}"
if [ "${mode}" = "initial" ] || [ "${mode}" = "dev" ]; then
json_get_var station_id "station_id"
@@ -775,7 +762,12 @@ f_check() {
else
ifname="$(printf "%s" "${dev_status}" | "${trm_jsoncmd}" -ql1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
if [ -n "${ifname}" ] && [ "${enabled}" = "1" ]; then
- trm_ifquality="$("${trm_iwcmd}" dev "${ifname}" link 2>/dev/null | "${trm_awkcmd}" '/signal:/ {val=2*($2+100); printf "%s", (val>100 ? 100 : val)}')"
+ raw="$("${trm_ubuscmd}" -S call iwinfo info "{\"device\":\"${ifname}\"}" 2>/dev/null | "${trm_jsoncmd}" -ql1 -e '@.signal')"
+ if [ -n "${raw}" ] && [ "${raw}" -ge "-120" ]; then
+ trm_ifquality="$(( 2 * (raw + 100) ))"
+ [ "${trm_ifquality}" -gt "100" ] && trm_ifquality="100"
+ [ "${trm_ifquality}" -lt "0" ] && trm_ifquality="0"
+ fi
if [ -z "${trm_ifquality}" ]; then
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
@@ -897,7 +889,7 @@ f_getstatus() {
#
f_genstatus() {
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"
-#set -x
+
if [ "${status}" = "true" ]; then
status="connected, ${trm_connection:-"-"}"
dev_status="$("${trm_ubuscmd}" -S call network.wireless status 2>/dev/null)"
@@ -940,7 +932,7 @@ f_genstatus() {
json_add_string "station_mac" "${sta_mac:-"-"}"
json_add_string "station_interfaces" "${sta_iface:-"-"}, ${vpn_iface:-"-"}"
json_add_string "station_subnet" "$(f_subnet)"
- json_add_string "run_flags" "scan: ${trm_scanmode}, 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})"
+ 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})"
json_add_string "ext_hooks" "ntp: $(f_char ${ntp_done}), vpn: $(f_char ${vpn_done}), mail: $(f_char ${mail_done})"
json_add_string "last_run" "${last_date}"
json_add_string "system" "${trm_sysver}"
@@ -954,7 +946,7 @@ f_genstatus() {
f_mail
fi
fi
- #set +x
+
f_log "debug" "f_genstatus ::: 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}"
}
@@ -1001,10 +993,100 @@ f_log() {
fi
}
+# wifi scan function
+#
+f_scan() {
+ local result key keylist ssid bssid quality wpa_arr cipher_arr auth_arr radio="${1}" mode="${2}"
+
+ result="$("${trm_ubuscmd}" -S call iwinfo scan "{\"device\":\"${radio}\"}" 2>/dev/null)"
+ [ -z "${result}" ] && return 0
+
+ json_load "${result}" || return 0
+ json_select results 2>/dev/null || return 0
+
+ json_get_keys keylist
+ for key in ${keylist}; do
+ json_select "${key}" 2>/dev/null || continue
+ json_get_var bssid bssid
+ json_get_var ssid ssid
+ json_get_var signal signal
+ json_get_var channel channel
+
+ ssid="$(printf "%s" "${ssid}" | "${trm_awkcmd}" '{
+ gsub(/[\x00-\x1F\x7F]/, ""); # nur Steuerzeichen entfernen
+ sub(/^[ \t]+/, "");
+ sub(/[ \t]+$/, "");
+ print
+ }')"
+ if [ -z "${ssid}" ]; then
+ ssid="hidden"
+ else
+ ssid="${ssid//\"/\\\"}"
+ ssid="\"${ssid}\""
+ fi
+
+ bssid="$(printf "%s" "${bssid}" | "${trm_awkcmd}" '{print toupper($0)}')"
+
+ quality="$(( 2 * (signal + 100) ))"
+ [ "${quality}" -gt "100" ] && quality="100"
+ [ "${quality}" -lt "0" ] && quality="0"
+
+ json_select encryption 2>/dev/null
+ json_get_values wpa_arr wpa 2>/dev/null
+ json_get_values cipher_arr ciphers 2>/dev/null
+ json_get_values auth_arr authentication 2>/dev/null
+ json_select .. 2>/dev/null
+ wpa_versions="$(printf "%s" "${wpa_arr:-"-"}" | "${trm_awkcmd}" '
+ {
+ gsub(/[\[\],]/, "");
+ for (i=1; i<=NF; i++) {
+ if ($i == 1) out = out "WPA1+";
+ if ($i == 2) out = out "WPA2+";
+ if ($i == 3) out = out "WPA3+";
+ }
+ sub(/\+$/, "", out);
+ print (out == "" ? "-" : out);
+ }
+ ')"
+ cipher="$(printf "%s" "${cipher_arr:-"-"}" | "${trm_awkcmd}" '
+ {
+ gsub(/[\[\]"]/, "");
+ gsub(/,/, " ");
+ gsub(/[ \t]+/, " ");
+ $0 = toupper($0);
+ gsub(/ /, "+");
+ print ($0=="" ? "-" : $0)
+ }
+ ')"
+ auth="$(printf "%s" "${auth_arr:-"-"}" | "${trm_awkcmd}" '
+ {
+ gsub(/[\[\]"]/, "");
+ gsub(/,/, " ");
+ gsub(/[ \t]+/, " ");
+ $0 = toupper($0);
+ gsub(/ /, "+");
+ print ($0=="" ? "-" : $0)
+ }
+ ')"
+
+ case "${mode}" in
+ full)
+ printf "%s %s %s %s %s %s %s\n" \
+ "${quality:-"0"}" "${channel:-"0"}" "${bssid:-"-"}" "${wpa_versions:-"-"}" "${cipher:-"-"}" "${auth:-"-"}" "${ssid}"
+ ;;
+ *)
+ printf "%s %s %s %s %s\n" \
+ "${quality:-"0"}" "${wpa_versions:-"-"}" "-" "${bssid:-"-"}" "${ssid}"
+ ;;
+ esac
+ json_select .. 2>/dev/null
+ done
+}
+
# main function for connection handling
#
f_main() {
- local radio radio_num radio_phy cnt retrycnt scan_dev scan_mode scan_list scan_essid scan_bssid scan_rsn scan_wpa scan_open scan_quality
+ local radio radio_num radio_phy cnt retrycnt scan_dev scan_list scan_essid scan_bssid scan_rsn scan_wpa scan_quality scan_open
local station_id section sta sta_essid sta_bssid sta_radio sta_mac open_sta open_essid config_radio config_essid config_bssid
f_check "initial" "false"
@@ -1067,33 +1149,11 @@ f_main() {
f_log "debug" "f_main-5 ::: sta_radio: ${sta_radio}, sta_essid: \"${sta_essid}\", sta_bssid: ${sta_bssid:-"-"}"
fi
if [ -z "${scan_list}" ]; then
- radio_num="${radio//[a-z]/}"
- radio_phy="phy${radio_num}"
- [ "${trm_scanmode}" != "passive" ] && scan_mode=""
-
- scan_dev="$("${trm_iwcmd}" dev | "${trm_awkcmd}" -v phy="${radio_phy}" '/Interface/{iface=$2} /type/{if(($2=="AP"||$2=="managed")&&iface ~ "^"phy"-"){printf"%s",iface;exit}}')"
- if [ -z "${scan_dev}" ]; then
- "${trm_iwcmd}" phy "${radio_phy}" interface add "trmscan${radio_num}" type managed >/dev/null 2>&1
- "${trm_ipcmd}" link set "trmscan${radio_num}" up >/dev/null 2>&1
- scan_dev="trmscan${radio_num}"
- fi
- scan_list="$(printf "%b" "$("${trm_iwcmd}" dev "${scan_dev}" scan ${scan_mode} 2>/dev/null |
- "${trm_awkcmd}" '/^BSS /{if(bssid!=""){if(ssid=="")ssid="unknown";printf "%s %s %s %s %s\n",signal,rsn,wpa,bssid,ssid};bssid=toupper(substr($2,1,17));ssid="";signal="";rsn="-";wpa="-"}
- /signal:/{signal=(2*($2+100)>100 ? 100 : 2*($2+100))}
- /SSID:/{$1="";sub(/^ /,"",$0);ssid="\""$0"\""}
- /WPA:/{wpa="+"}
- /RSN:/{rsn="+"}
- END{if(bssid!=""){if(ssid=="")ssid="unknown";printf "%s %s %s %s %s\n",signal,rsn,wpa,bssid,ssid}}' | "${trm_sortcmd}" -rn)")"
- f_log "debug" "f_main-6 ::: radio: ${radio}, scan_device: ${scan_dev}, scan_mode: ${trm_scanmode:-"active"}, scan_cnt: $(printf "%s" "${scan_list}" | "${trm_grepcmd}" -c "^")"
-
- if [ "${scan_dev}" = "trmscan${radio_num}" ]; then
- "${trm_ipcmd}" link set "trmscan${radio_num}" down >/dev/null 2>&1
- "${trm_iwcmd}" dev "trmscan${radio_num}" del >/dev/null 2>&1
- fi
- if [ -z "${scan_list}" ]; then
- f_log "info" "no scan results on '${radio}'"
- continue 2
- fi
+ scan_list="$(f_scan "${radio}" | "${trm_sortcmd}" -rn)"
+ fi
+ if [ -z "${scan_list}" ]; then
+ f_log "info" "no scan results on '${radio}'"
+ continue 2
fi
# scan loop
@@ -1105,11 +1165,11 @@ f_main() {
scan_open="-"
fi
if [ -n "${scan_quality}" ] && [ -n "${scan_open}" ] && [ -n "${scan_bssid}" ] && [ -n "${scan_essid}" ]; then
- 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}"
+ f_log "debug" "f_main-6 ::: 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}"
if [ "${scan_quality}" -lt "${trm_minquality}" ]; then
continue 2
elif [ "${scan_quality}" -ge "${trm_minquality}" ]; then
- if [ "${trm_autoadd}" = "1" ] && [ "${scan_open}" = "+" ] && [ "${scan_essid}" != "unknown" ]; then
+ if [ "${trm_autoadd}" = "1" ] && [ "${scan_open}" = "+" ] && [ "${scan_essid}" != "hidden" ]; then
open_essid="${scan_essid%?}"
open_essid="${open_essid:1}"
open_sta="$(f_addsta "${radio}" "${open_essid}")"
@@ -1122,7 +1182,7 @@ f_main() {
fi
fi
if { { [ "${scan_essid}" = "\"${sta_essid}\"" ] && { [ -z "${sta_bssid}" ] || [ "${scan_bssid}" = "${sta_bssid}" ]; }; } ||
- { [ "${scan_bssid}" = "${sta_bssid}" ] && [ "${scan_essid}" = "unknown" ]; }; } && [ "${radio}" = "${sta_radio}" ]; then
+ { [ "${scan_bssid}" = "${sta_bssid}" ] && [ "${scan_essid}" = "hidden" ]; }; } && [ "${radio}" = "${sta_radio}" ]; then
if [ -n "${config_radio}" ]; then
f_vpn "disable"
uci_set "wireless" "${trm_activesta}" "disabled" "1"
@@ -1186,12 +1246,10 @@ fi
# reference required system utilities
#
-trm_catcmd="$(f_cmd cat)"
trm_awkcmd="$(f_cmd gawk awk)"
trm_sortcmd="$(f_cmd sort)"
trm_grepcmd="$(f_cmd grep)"
trm_pgrepcmd="$(f_cmd pgrep)"
-trm_sleepcmd="$(f_cmd sleep)"
trm_killcmd="$(f_cmd kill)"
trm_jsoncmd="$(f_cmd jsonfilter)"
trm_lookupcmd="$(f_cmd nslookup)"
@@ -1199,9 +1257,6 @@ trm_ubuscmd="$(f_cmd ubus)"
trm_logcmd="$(f_cmd logger)"
trm_wificmd="$(f_cmd wifi)"
trm_fetchcmd="$(f_cmd curl)"
-trm_ipcmd="$(f_cmd ip)"
-trm_iwcmd="$(f_cmd iw)"
-trm_wpacmd="$(f_cmd wpa_supplicant)"
trm_ifstatuscmd="$(f_cmd ifstatus)"
trm_ipcalccmd="$(f_cmd ipcalc.sh)"
trm_mailcmd="$(f_cmd msmtp optional)"
diff --git a/net/travelmate/files/travelmate-service.sh b/net/travelmate/files/travelmate-service.sh
index 83954451d1..a7571f6456 100755
--- a/net/travelmate/files/travelmate-service.sh
+++ b/net/travelmate/files/travelmate-service.sh
@@ -1,6 +1,6 @@
#!/bin/sh
# travelmate service script, a wlan connection manager for travel router
-# Copyright (c) 2016-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2016-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
@@ -20,7 +20,7 @@ f_conf
while :; do
if [ "${trm_action}" = "stop" ]; then
if [ -s "${trm_pidfile}" ]; then
- f_log "info" "travelmate instance stopped ::: action: ${trm_action}, pid: $(cat ${trm_pidfile} 2>/dev/null)"
+ f_log "info" "travelmate instance stopped ::: action: ${trm_action}, pid: $(< ${trm_pidfile})"
: >"${trm_rtfile}"
: >"${trm_pidfile}"
fi
@@ -31,7 +31,7 @@ while :; do
trm_action=""
fi
while :; do
- "${trm_sleepcmd}" "${trm_timeout}" 0 >/dev/null 2>&1
+ sleep "${trm_timeout}" 0 >/dev/null 2>&1
rc="${?}"
if [ "${rc}" != "0" ]; then
[ "$(f_getgw)" = "false" ] && rc="0"
diff --git a/net/travelmate/files/travelmate.init b/net/travelmate/files/travelmate.init
index 5a10eaa611..de09d14ccc 100755
--- a/net/travelmate/files/travelmate.init
+++ b/net/travelmate/files/travelmate.init
@@ -1,5 +1,5 @@
#!/bin/sh /etc/rc.common
-# Copyright (c) 2016-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2016-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
@@ -14,8 +14,6 @@ extra_command "setup" "[<iface>] [<zone>] [<metric>] Setup the travelmate uplink
trm_init="/etc/init.d/travelmate"
trm_service="/usr/bin/travelmate-service.sh"
trm_funlib="/usr/lib/travelmate-functions.sh"
-trm_pidfile="/var/run/travelmate.pid"
-trm_scanfile="/var/run/travelmate.scan"
if [ -z "${IPKG_INSTROOT}" ]; then
if [ "${action}" = "boot" ] && "${trm_init}" running; then
@@ -61,35 +59,33 @@ status_service() {
}
scan() {
- local result scan_dev scan_mode radio_num radio_phy radio="${1:-"radio0"}"
-
- radio_num="${radio//[a-z]/}"
- radio_phy="phy${radio_num}"
- scan_mode="$(uci_get travelmate global trm_scanmode "active")"
- [ "${scan_mode}" != "passive" ] && scan_mode=""
-
- scan_dev="$(iw dev | awk -v phy="${radio_phy}" '/Interface/{iface=$2} /type/{if(($2=="AP"||$2=="managed")&&iface ~ "^"phy"-"){printf"%s",iface;exit}}')"
- if [ -z "${scan_dev}" ]; then
- iw phy "${radio_phy}" interface add "trmscan${radio_num}" type managed >/dev/null 2>&1
- ip link set "trmscan${radio_num}" up >/dev/null 2>&1
- scan_dev="trmscan${radio_num}"
- fi
- result="$(iw dev "${scan_dev}" scan ${scan_mode} 2>/dev/null |
- awk '/^BSS /{if(bssid!=""){printf "%3s %3s %17s %s %s %10s %30s %s\n",signal,channel,bssid,rsn,wpa,cipher,auth,ssid};signal="";channel="";rsn="-";wpa="-";cipher="-";auth="-";ssid="";bssid=toupper(substr($2,1,17))}
- /signal:/{signal=(2*($2+100)>100 ? 100 : 2*($2+100))}
- /SSID:/{$1="";sub(/^ /,"",$0);ssid=$0}
- /freq:/{channel=int($2);if(channel>=2400&&channel<=2500)channel=int((channel-2407)/5);else if(channel>=4900&&channel<=5900)channel=int((channel-5000)/5);else if(channel>=5925&&channel<=7125)channel=int(((channel-5950)/5)+1)}
- /WPA:/{wpa="+"}
- /RSN:/{rsn="+"}
- /Group cipher:/{cipher=$4}
- /Authentication suites:/{auth="";for(i=4;i<=NF;i++){auth=auth (i==4?"":",")$i}}
- END{if(bssid!=""){printf "%3s %3s %17s %s %s %10s %30s %s\n",signal,channel,bssid,rsn,wpa,cipher,auth,ssid}}' | sort -rn)"
- [ -n "${result}" ] && printf "%b\n" "${result}" > "${trm_scanfile}" || : > "${trm_scanfile}"
-
- if [ "${scan_dev}" = "trmscan${radio_num}" ]; then
- ip link set "trmscan${radio_num}" down >/dev/null 2>&1
- iw dev "trmscan${radio_num}" del >/dev/null 2>&1
+ local result radio="${1:-radio0}"
+
+ result="$(f_scan "${radio}" full)"
+ if [ -z "${result}" ]; then
+ : > "${trm_tmpfile}"
+ mv -f "${trm_tmpfile}" "${trm_scanfile}"
+ return 0
fi
+
+ printf "%s\n" "${result}" | "${trm_awkcmd}" '
+ {
+ quality = $1
+ channel = $2
+ bssid = $3
+ rsn = $4
+ cipher = $5
+ auth = $6
+ ssid = ""
+ for (i=7; i<=NF; i++) {
+ ssid = ssid $i " "
+ }
+ sub(/[ \t]+$/, "", ssid)
+ printf "%3s %3s %17s %-12s %-10s %-10s %s\n",
+ quality, channel, bssid, rsn, cipher, auth, ssid
+ }' | "${trm_sortcmd}" -rn > "${trm_tmpfile}"
+
+ mv -f "${trm_tmpfile}" "${trm_scanfile}"
}
setup() {
@@ -162,7 +158,7 @@ service_triggers() {
local iface delay
iface="$(uci_get travelmate global trm_iface)"
- delay="$(uci_get travelmate global trm_triggerdelay "2")"
+ delay="$(uci_get travelmate global trm_triggerdelay "5")"
PROCD_RELOAD_DELAY=$((delay * 1000))
if [ -n "${iface}" ]; then
diff --git a/net/travelmate/files/travelmate.vpn b/net/travelmate/files/travelmate.vpn
index a97d345a8e..bfeea17e4b 100755
--- a/net/travelmate/files/travelmate.vpn
+++ b/net/travelmate/files/travelmate.vpn
@@ -1,6 +1,6 @@
#!/bin/sh
# vpn handler called by travelmate
-# Copyright (c) 2020-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2020-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
diff --git a/net/travelmate/files/vodafone.login b/net/travelmate/files/vodafone.login
index f07e672b36..f578525f6d 100755
--- a/net/travelmate/files/vodafone.login
+++ b/net/travelmate/files/vodafone.login
@@ -1,6 +1,6 @@
#!/bin/sh
# captive portal auto-login script for vodafone hotspots (DE)
-# Copyright (c) 2021-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2021-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions
diff --git a/net/travelmate/files/wifibahn.login b/net/travelmate/files/wifibahn.login
index 1f7f44e6b8..52e8e951e3 100755
--- a/net/travelmate/files/wifibahn.login
+++ b/net/travelmate/files/wifibahn.login
@@ -1,6 +1,6 @@
#!/bin/sh
# captive portal auto-login script for bahn/ICE hotspots (DE)
-# Copyright (c) 2020-2025 Dirk Brenken (dev@brenken.org)
+# Copyright (c) 2020-2026 Dirk Brenken (dev@brenken.org)
# This is free software, licensed under the GNU General Public License v3.
# set (s)hellcheck exceptions