* the application is located in LuCI under 'Services' menu
## Travelmate config options
-* usually the pre-configured travelmate setup works quite well and no manual config overrides are needed, all listed options apply to the 'global' config section:
+* usually the pre-configured travelmate setup works quite well and no manual config overrides are needed, all listed options apply to the 'global' section:
* trm\_enabled => main switch to enable/disable the travelmate service (bool/default: '0', disabled)
* trm\_debug => enable/disable debug logging (bool/default: '0', disabled)
* trm\_automatic => keep travelmate in an active state (bool/default: '1', enabled)
* trm\_captive => enable/disable the captive portal detection (bool/default: '1', enabled)
- * trm\_minquality => minimum signal quality threshold as percent for conditional uplink (dis-) connections (int/default: '30')
- * trm\_maxwait => how long (in seconds) should travelmate wait for a successful wlan interface reload action (int/default: '30')
- * trm\_maxretry => how many times should travelmate try to connect to an uplink, '0' means unlimited retries. (int/default: '3')
- * trm\_timeout => timeout in seconds for "automatic mode" (int/default: '60')
+ * trm\_minquality => minimum signal quality threshold as percent for conditional uplink (dis-) connections (int/default: '35', valid range: 20-80)
+ * trm\_maxwait => how long (in seconds) should travelmate wait for a successful wlan interface reload action (int/default: '30', valid range: 20-40)
+ * trm\_maxretry => how many times should travelmate try to connect to an uplink (int/default: '3', valid range: 1-10)
+ * trm\_timeout => timeout in seconds for "automatic mode" (int/default: '60', valid range: 30-300)
* trm\_radio => limit travelmate to a dedicated radio, e.g. 'radio0' (default: not set, use all radios)
* trm\_iface => main uplink / procd trigger network interface (default: trm_wwan)
* trm\_triggerdelay => additional trigger delay in seconds before travelmate processing starts (int/default: '2')
**A:** In "trigger" mode travelmate will be triggered solely by procd interface down events, whenever an uplink disappears travelmate tries n times (default 3) to find a new uplink or reconnect to the old one. The 'automatic' mode keeps travelmate in an active state and checks every n seconds the connection status / the uplink availability regardless of procd event trigger.
**Q:** What happen with misconfigured uplinks, e.g. due to outdated wlan passwords?
-**A:** Travelmate tries n times (default 3) to connect, then the respective uplink SSID will be marked / renamed to '_SSID_\_err'. In this case use the builtin wireless station manager to update your wireless credentials. To disable this functionality at all set the Connection Limit ('trm\_maxretry') to '0', which means unlimited retries.
+**A:** Travelmate tries n times (default 3) to connect, then the respective uplink SSID will be marked / renamed to '_SSID_\_err'. In this case use the builtin wireless station manager to update your wireless credentials.
## Support
Please join the travelmate discussion in this [forum thread](https://forum.lede-project.org/t/travelmate-support-thread/5155) or contact me by [mail](mailto:dev@brenken.org)
#
LC_ALL=C
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
-trm_ver="1.1.1"
+trm_ver="1.1.2"
trm_sysver="unknown"
trm_enabled=0
trm_debug=0
exit 0
fi
- # check eap capabilities
+ # validate input ranges
#
- trm_eap="$("${trm_wpa}" -veap >/dev/null 2>&1; printf "%u" ${?})"
+ if [ ${trm_minquality} -lt 20 ] || [ ${trm_minquality} -gt 80 ]
+ then
+ trm_minquality=35
+ fi
+ if [ ${trm_maxretry} -lt 1 ] || [ ${trm_maxretry} -gt 10 ]
+ then
+ trm_maxretry=3
+ fi
+ if [ ${trm_maxwait} -lt 20 ] || [ ${trm_maxwait} -gt 40 ] || [ ${trm_maxwait} -ge ${trm_timeout} ]
+ then
+ trm_maxwait=30
+ fi
+ if [ ${trm_timeout} -lt 30 ] || [ ${trm_timeout} -gt 300 ] || [ ${trm_timeout} -le ${trm_maxwait} ]
+ then
+ trm_timeout=60
+ fi
}
# gather radio information & bring down all STA interfaces
#
f_prep()
{
- local config="${1}"
+ local eap_rc=0 config="${1}"
local mode="$(uci_get wireless "${config}" mode)"
local network="$(uci_get wireless "${config}" network)"
local radio="$(uci_get wireless "${config}" device)"
then
uci_set wireless "${config}" disabled 1
fi
- if [ -z "${eaptype}" ] || [ ${trm_eap} -eq 0 ]
+ if [ -n "${eaptype}" ]
+ then
+ eap_rc="$("${trm_wpa}" -veap >/dev/null 2>&1; printf "%u" ${?})"
+ fi
+ if [ -z "${eaptype}" ] || [ ${eap_rc} -eq 0 ]
then
trm_stalist="${trm_stalist} ${config}_${radio}"
fi
fi
- f_log "debug" "f_prep ::: config: ${config}, mode: ${mode}, network: ${network}, radio: ${radio}, disabled: ${disabled}"
+ f_log "debug" "f_prep ::: config: ${config}, mode: ${mode}, network: ${network}, eap_rc: ${eap_rc}, radio: ${radio}, trm_radio: ${trm_radio:-"-"}, disabled: ${disabled}"
}
# check interface status
#
f_check()
{
- local ifname radio dev_status config sta_iface sta_radio sta_essid sta_bssid result cnt=1 mode="${1}" status="${2:-"false"}" IFS=" "
+ local ifname radio dev_status config sta_essid sta_bssid result wait=1 mode="${1}" status="${2:-"false"}" IFS=" "
trm_ifquality=0
trm_ifstatus="false"
then
ubus call network reload
fi
- while [ ${cnt} -le ${trm_maxwait} ]
+ while [ ${wait} -le ${trm_maxwait} ]
do
dev_status="$(ubus -S call network.wireless status 2>/dev/null)"
if [ -n "${dev_status}" ]
fi
for radio in ${trm_radiolist}
do
- status="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e "@.${radio}.up")"
- if [ "${status}" = "true" ] && [ -z "$(printf "%s" "${trm_devlist}" | grep -Fo " ${radio}")" ]
+ result="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e "@.${radio}.up")"
+ if [ "${result}" = "true" ] && [ -z "$(printf "%s" "${trm_devlist}" | grep -Fo " ${radio}")" ]
then
trm_devlist="${trm_devlist} ${radio}"
fi
done
- if [ "${trm_radiolist}" = "${trm_devlist}" ] || [ ${cnt} -eq ${trm_maxwait} ] || [ "${status}" = "false" ]
+ if [ "${trm_devlist}" = "${trm_radiolist}" ] || [ ${wait} -eq ${trm_maxwait} ]
then
ifname="${trm_devlist}"
break
+ else
+ trm_devlist=""
fi
+ elif [ "${mode}" = "rev" ]
+ then
+ wait=$((${trm_maxwait}/3))
+ sleep ${wait}
+ break
else
ifname="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
- config="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].section')"
- if [ -n "${ifname}" ] && [ -n "${config}" ]
+ if [ -n "${ifname}" ]
then
- sta_iface="$(uci_get wireless "${config}" network)"
- sta_radio="$(uci_get wireless "${config}" device)"
- sta_essid="$(uci_get wireless "${config}" ssid)"
- sta_bssid="$(uci_get wireless "${config}" bssid)"
trm_ifquality="$(${trm_iwinfo} ${ifname} info 2>/dev/null | awk -F "[\/| ]" '/Link Quality:/{printf "%i\n", (100 / $NF * $(NF-1)) }')"
if [ ${trm_ifquality} -ge ${trm_minquality} ]
then
elif [ "${mode}" = "initial" ] && [ ${trm_ifquality} -lt ${trm_minquality} ]
then
trm_connection=""
+ sta_essid="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].*.ssid')"
+ sta_bssid="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].*.bssid')"
f_log "info" "uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' is out of range (${trm_ifquality}/${trm_minquality}), uplink disconnected (${trm_sysver})"
fi
fi
fi
if [ "${mode}" = "initial" ] && [ "${trm_captive}" -eq 1 ] && [ "${trm_ifstatus}" = "true" ]
then
- result="$(${trm_fetch} --timeout=1 --spider "${trm_captiveurl}" 2>&1 | awk '/^Redirected/{printf "%s" "cp \047"$NF"\047";exit}/^Download completed/{printf "%s" "net ok";exit}/^Failed/{printf "%s" "net nok";exit}')"
- if ([ -n "${result}" ] && [ -z "${trm_connection}" ]) || [ "${trm_connection%/*}" != "${result}" ]
+ result="$(${trm_fetch} --timeout=$((${trm_maxwait}/3)) --spider "${trm_captiveurl}" 2>&1 | awk '/^Redirected/{printf "%s" "net cp \047"$NF"\047";exit}/^Download completed/{printf "%s" "net ok";exit}/^Failed|^Connection error/{printf "%s" "net nok";exit}')"
+ if [ -n "${result}" ] && ([ -z "${trm_connection}" ] || [ "${result}" != "${trm_connection%/*}" ])
then
trm_connection="${result}/${trm_ifquality}"
- f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+ f_jsnup
fi
fi
break
fi
fi
- cnt=$((cnt+1))
+ wait=$((wait+1))
sleep 1
done
- f_log "debug" "f_check::: mode: ${mode}, name: ${ifname:-"-"}, status: ${trm_ifstatus}, quality: ${trm_ifquality}, connection: ${trm_connection:-"-"}, cnt: ${cnt}, max_wait: ${trm_maxwait}, min_quality: ${trm_minquality}, captive: ${trm_captive}, automatic: ${trm_automatic}"
+ f_log "debug" "f_check::: mode: ${mode}, name: ${ifname:-"-"}, status: ${trm_ifstatus}, quality: ${trm_ifquality}, connection: ${trm_connection:-"-"}, wait: ${wait}, max_wait: ${trm_maxwait}, min_quality: ${trm_minquality}, captive: ${trm_captive}, automatic: ${trm_automatic}"
}
# update runtime information
#
f_jsnup()
{
- local status="${trm_ifstatus}" iface="${1}" radio="${2}" essid="${3}" bssid="${4}"
+ local config sta_iface sta_radio sta_essid sta_bssid dev_status status="${trm_ifstatus}"
if [ "${status}" = "true" ]
then
status="connected (${trm_connection:-"-"})"
elif [ "${status}" = "false" ]
then
+ trm_connection=""
status="not connected"
fi
+ dev_status="$(ubus -S call network.wireless status 2>/dev/null)"
+ if [ -n "${dev_status}" ]
+ then
+ config="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].section')"
+ if [ -n "${config}" ]
+ then
+ sta_iface="$(uci_get wireless "${config}" network)"
+ sta_radio="$(uci_get wireless "${config}" device)"
+ sta_essid="$(uci_get wireless "${config}" ssid)"
+ sta_bssid="$(uci_get wireless "${config}" bssid)"
+ fi
+ fi
+
json_init
json_add_object "data"
json_add_string "travelmate_status" "${status}"
json_add_string "travelmate_version" "${trm_ver}"
- json_add_string "station_id" "${essid:-"-"}/${bssid:-"-"}"
- json_add_string "station_interface" "${iface:-"-"}"
- json_add_string "station_radio" "${radio:-"-"}"
+ json_add_string "station_id" "${sta_essid:-"-"}/${sta_bssid:-"-"}"
+ json_add_string "station_interface" "${sta_iface:-"-"}"
+ json_add_string "station_radio" "${sta_radio:-"-"}"
json_add_string "last_rundate" "$(/bin/date "+%d.%m.%Y %H:%M:%S")"
json_add_string "system" "${trm_sysver}"
json_close_object
json_dump > "${trm_rtfile}"
+ f_log "debug" "f_jsnup::: config: ${config:-"-"}, status: ${status:-"-"}, sta_iface: ${sta_iface:-"-"}, sta_radio: ${sta_radio:-"-"}, sta_essid: ${sta_essid:-"-"}, sta_bssid: ${sta_bssid:-"-"}"
}
# write to syslog
config_foreach f_prep wifi-iface
uci_commit wireless
f_check "dev" "running"
- f_log "debug" "f_main ::: iwinfo: ${trm_iwinfo}, eap_rc: ${trm_eap}, dev_list: ${trm_devlist}, sta_list: ${trm_stalist:0:800}"
+ f_log "debug" "f_main ::: iwinfo: ${trm_iwinfo}, dev_list: ${trm_devlist}, sta_list: ${trm_stalist:0:800}"
for dev in ${trm_devlist}
do
if [ -z "$(printf "%s" "${trm_stalist}" | grep -Fo "_${dev}")" ]
if (([ "${scan_essid}" = "\"${sta_essid}\"" ] && ([ -z "${sta_bssid}" ] || [ "${scan_bssid}" = "${sta_bssid}" ])) || \
([ "${scan_bssid}" = "${sta_bssid}" ] && [ "${scan_essid}" = "unknown" ])) && [ "${dev}" = "${sta_radio}" ]
then
+ f_log "debug" "f_main ::: scan_quality: ${scan_quality}, scan_bssid: ${scan_bssid}, scan_essid: ${scan_essid}"
uci_set wireless "${config}" disabled 0
f_check "sta"
if [ "${trm_ifstatus}" = "true" ]
f_log "info" "interface '${sta_iface}' on '${sta_radio}' connected to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${trm_sysver})"
f_check "initial"
return 0
- elif [ ${trm_maxretry} -ne 0 ] && [ ${cnt} -eq ${trm_maxretry} ]
+ elif [ ${cnt} -eq ${trm_maxretry} ]
then
uci_set wireless "${config}" disabled 1
if [ -n "${sta_essid}" ]
fi
uci_commit wireless
f_log "info" "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}', uplink disabled (${trm_sysver})"
- f_check "dev"
+ f_check "rev"
else
- if [ ${trm_maxretry} -eq 0 ]
- then
- cnt=0
- fi
uci -q revert wireless
f_log "info" "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${trm_sysver})"
- f_check "dev"
+ f_check "rev"
fi
fi
fi
done
fi
cnt=$((cnt+1))
- sleep 5
+ sleep $((${trm_maxwait}/6))
done
done
if [ ! -s "${trm_rtfile}" ]
trm_ifstatus="false"
f_jsnup
fi
- else
- if [ ! -s "${trm_rtfile}" ]
- then
- config="$(ubus -S call network.wireless status | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].section')"
- sta_radio="$(uci_get wireless "${config}" device)"
- sta_essid="$(uci_get wireless "${config}" ssid)"
- sta_bssid="$(uci_get wireless "${config}" bssid)"
- sta_iface="$(uci_get wireless "${config}" network)"
- f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
- fi
+ elif [ ! -s "${trm_rtfile}" ]
+ then
+ f_jsnup
fi
}