From 380a5110b4d8df56c2a66c78657ee84bbcd611d3 Mon Sep 17 00:00:00 2001 From: Dirk Brenken Date: Sun, 25 Jul 2021 21:41:58 +0200 Subject: [PATCH] travelmate: update to 2.0.4 * code cleanup * add auto login script for Julianahoeve beach resort (NL) * add auto login script for Vodafone hotspots (DE) * add auto login script for telekom hotspots (DE) * enhance captive portal detection to support html redirects as well * change default captive portal detection url to 'detectportal.firefox.com' Signed-off-by: Dirk Brenken --- net/travelmate/Makefile | 4 +- net/travelmate/files/chs-hotel.login | 41 +- net/travelmate/files/db-bahn.login | 62 +- net/travelmate/files/generic-user-pass.login | 27 +- net/travelmate/files/h-hotels.login | 43 +- net/travelmate/files/julianahoeve.login | 46 ++ net/travelmate/files/telekom.login | 64 ++ net/travelmate/files/travelmate.init | 86 ++- net/travelmate/files/travelmate.mail | 38 +- net/travelmate/files/travelmate.sh | 580 ++++++++----------- net/travelmate/files/travelmate.vpn | 127 ++-- net/travelmate/files/travelmate_ntp.hotplug | 25 +- net/travelmate/files/vodafone.login | 49 ++ net/travelmate/files/wifionice.login | 39 +- 14 files changed, 594 insertions(+), 637 deletions(-) create mode 100755 net/travelmate/files/julianahoeve.login create mode 100755 net/travelmate/files/telekom.login create mode 100755 net/travelmate/files/vodafone.login diff --git a/net/travelmate/Makefile b/net/travelmate/Makefile index 8a31e5e167..00caaf467b 100644 --- a/net/travelmate/Makefile +++ b/net/travelmate/Makefile @@ -6,8 +6,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=travelmate -PKG_VERSION:=2.0.3 -PKG_RELEASE:=2 +PKG_VERSION:=2.0.4 +PKG_RELEASE:=1 PKG_LICENSE:=GPL-3.0-or-later PKG_MAINTAINER:=Dirk Brenken diff --git a/net/travelmate/files/chs-hotel.login b/net/travelmate/files/chs-hotel.login index 3b23f467c5..905824ad79 100755 --- a/net/travelmate/files/chs-hotel.login +++ b/net/travelmate/files/chs-hotel.login @@ -1,43 +1,40 @@ #!/bin/sh -# captive portal auto-login script for german chs hotels -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# captive portal auto-login script for chs hotels (DE) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,2181,3040 export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then +# source function library if necessary +# +if [ -z "${_C}" ]; then . "/lib/functions.sh" fi trm_domain="hotspot.internet-for-guests.com" -trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0")" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" trm_fetch="$(command -v curl)" -# initial get request to receive & extract valid security tokens +# get security tokens # -"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait/6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "https://${trm_domain}/logon/cgi/index.cgi" -if [ -r "/tmp/${trm_domain}.cookie" ] -then - lg_id="$(awk '/LGNSID/{print $7}' "/tmp/${trm_domain}.cookie")" - ta_id="$(awk '/ta_id/{print $7}' "/tmp/${trm_domain}.cookie")" - cl_id="$(awk '/cl_id/{print $7}' "/tmp/${trm_domain}.cookie")" - rm -f "/tmp/${trm_domain}.cookie" -else - exit 2 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait / 6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "https://${trm_domain}/logon/cgi/index.cgi" +lg_id="$(awk '/LGNSID/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +ta_id="$(awk '/ta_id/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +cl_id="$(awk '/cl_id/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +rm -f "/tmp/${trm_domain}.cookie" +if [ -z "${lg_id}" ] || [ -z "${ta_id}" ] || [ -z "${cl_id}" ]; then + exit 1 fi -# final post request/login with valid session cookie/security token +# final login request # -if [ -n "${lg_id}" ] && [ -n "${ta_id}" ] && [ -n "${cl_id}" ] -then - "${trm_fetch}" --user-agent "${trm_useragent}" --referer "https://${trm_domain}/logon/cgi/index.cgi" --silent --connect-timeout $((trm_maxwait/6)) --header "Cookie: LGNSID=${lg_id}; lang=en_US; use_mobile_interface=0; ta_id=${ta_id}; cl_id=${cl_id}" --data "accept_termsofuse=&freeperperiod=1&device_infos=1125:2048:1152:2048" --output /dev/null "https://${trm_domain}/logon/cgi/index.cgi" -else - exit 3 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "https://${trm_domain}/logon/cgi/index.cgi" --silent --connect-timeout $((trm_maxwait / 6)) --header "Cookie: LGNSID=${lg_id}; lang=en_US; use_mobile_interface=0; ta_id=${ta_id}; cl_id=${cl_id}" --data "accept_termsofuse=&freeperperiod=1&device_infos=1125:2048:1152:2048" --output /dev/null "https://${trm_domain}/logon/cgi/index.cgi" +if [ "${?}" != "0" ]; then + exit 2 fi diff --git a/net/travelmate/files/db-bahn.login b/net/travelmate/files/db-bahn.login index a0ab505b50..2b4bf30f52 100755 --- a/net/travelmate/files/db-bahn.login +++ b/net/travelmate/files/db-bahn.login @@ -1,65 +1,49 @@ #!/bin/sh -# captive portal auto-login script for german DB hotspots via portal login API -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# captive portal auto-login script for DB hotspots (DE) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,2181,3040 export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then +# source function library if necessary +# +if [ -z "${_C}" ]; then . "/lib/functions.sh" fi trm_domain="wifi.bahn.de" -trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0")" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" trm_fetch="$(command -v curl)" -# initial get request to receive all header information +# get all header information # -"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait/6)) --include --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "http://${trm_domain}" - -# extract the session cookie and the hotspot location -# -if [ -s "/tmp/${trm_domain}.cookie" ] -then - sec_token="$(awk 'BEGIN{FS="[ ;]"}/^Set-Cookie:/{print $2}' "/tmp/${trm_domain}.cookie")" - location="$(awk '/^Location:/{print $2}' "/tmp/${trm_domain}.cookie")" - rm -f "/tmp/${trm_domain}.cookie" -else - exit 2 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait / 6)) --include --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "http://${trm_domain}" +sec_token="$(awk 'BEGIN{FS="[ ;]"}/^Set-Cookie:/{print $2}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +location="$(awk '/^Location:/{print $2}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +rm -f "/tmp/${trm_domain}.cookie" +if [ -z "${sec_token}" ] || [ -z "${location}" ]; then + exit 1 fi # post request to subscribe to the portal API # -if [ -n "${sec_token}" ] && [ -n "${location}" ] -then - "${trm_fetch}" --user-agent "${trm_useragent}" --referer "${location}" --silent --connect-timeout $((trm_maxwait/6)) --include --cookie-jar "/tmp/${trm_domain}.cookie" --header "Cookie: ${sec_token}" --data "action=subscribe&type=one&connect_policy_accept=false&user_login=&user_password=&user_password_confirm=&email_address=&prefix=&phone=&policy_accept=false&gender=&interests=" --output /dev/null "https://${trm_domain}/portal_api.php" -else - exit 3 -fi - -# extract additional login and password information from the portal API -# -if [ -s "/tmp/${trm_domain}.cookie" ] -then - login="$(awk 'BEGIN{FS="[\"]"}/^\{\"info/{print $12}' "/tmp/${trm_domain}.cookie")" - password="$(awk 'BEGIN{FS="[\"]"}/^\{\"info/{print $16}' "/tmp/${trm_domain}.cookie")" - rm -f "/tmp/${trm_domain}.cookie" -else - exit 4 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "${location}" --silent --connect-timeout $((trm_maxwait / 6)) --include --cookie-jar "/tmp/${trm_domain}.cookie" --header "Cookie: ${sec_token}" --data "action=subscribe&type=one&connect_policy_accept=false&user_login=&user_password=&user_password_confirm=&email_address=&prefix=&phone=&policy_accept=false&gender=&interests=" --output /dev/null "https://${trm_domain}/portal_api.php" +login="$(awk 'BEGIN{FS="[\"]"}/^\{\"info/{print $12}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +password="$(awk 'BEGIN{FS="[\"]"}/^\{\"info/{print $16}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +rm -f "/tmp/${trm_domain}.cookie" +if [ -z "${login}" ] && [ -z "${password}" ]; then + exit 2 fi # final post request to authenticate to the portal API # -if [ -n "${login}" ] && [ -n "${password}" ] -then - "${trm_fetch}" --user-agent "${trm_useragent}" --referer "${location}" --silent --connect-timeout $((trm_maxwait/6)) --header "Cookie: ${sec_token}" --data "action=authenticate&login=${login}&password=${password}&policy_accept=false&from_ajax=true&wispr_mode=false" "https://${trm_domain}/portal_api.php" -else - exit 5 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "${location}" --silent --connect-timeout $((trm_maxwait / 6)) --header "Cookie: ${sec_token}" --data "action=authenticate&login=${login}&password=${password}&policy_accept=false&from_ajax=true&wispr_mode=false" "https://${trm_domain}/portal_api.php" +if [ "${?}" != "0" ]; then + exit 3 fi diff --git a/net/travelmate/files/generic-user-pass.login b/net/travelmate/files/generic-user-pass.login index 60c3b5a92c..687a183589 100755 --- a/net/travelmate/files/generic-user-pass.login +++ b/net/travelmate/files/generic-user-pass.login @@ -1,35 +1,32 @@ #!/bin/sh # captive portal auto-login script template with credentials as parameters -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,2039,3040 export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then +# source function library if necessary +# +if [ -z "${_C}" ]; then . "/lib/functions.sh" fi -trm_domain="example.com" -trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0")" -trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" -trm_fetch="$(command -v curl)" - user="${1}" password="${2}" success="Thank you!" +trm_domain="example.com" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" +trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" +trm_fetch="$(command -v curl)" # login with credentials # -response="$("${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait/6)) --data "username=${user}&password=${password}" --header "Content-Type:application/x-www-form-urlencoded" "http://${trm_domain}")" -if [ -n "$(printf "%s" "${response}" | grep "${success}")" ] -then - exit 0 -else - exit 2 +raw_html="$("${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --connect-timeout $((trm_maxwait / 6)) --silent --show-error --header "Content-Type:application/x-www-form-urlencoded" --data "username=${user}&password=${password}" "http://${trm_domain}")" +if [ -n "${raw_html##*${success}*}" ]; then + exit 1 fi diff --git a/net/travelmate/files/h-hotels.login b/net/travelmate/files/h-hotels.login index a72e217f73..fa55f7d36e 100755 --- a/net/travelmate/files/h-hotels.login +++ b/net/travelmate/files/h-hotels.login @@ -1,43 +1,40 @@ #!/bin/sh -# captive portal auto-login script for Telekom hotspots in german h+hotels -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# captive portal auto-login script for Telekom hotspots in h+hotels (DE) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,2181,3040 export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then - . "/lib/functions.sh" +# source function library if necessary +# +if [ -z "${_C}" ]; then + . "/lib/functions.sh" fi trm_domain="hotspot.t-mobile.net" -trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0")" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" trm_fetch="$(command -v curl)" -# initial get request to receive & extract valid security tokens +# get security tokens # -"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait/6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "https://${trm_domain}/wlan/rest/freeLogin" -if [ -r "/tmp/${trm_domain}.cookie" ] -then - ses_id="$(awk '/JSESSIONID/{print $7}' "/tmp/${trm_domain}.cookie")" - sec_id="$(awk '/DT_H/{print $7}' "/tmp/${trm_domain}.cookie")" - dev_id="$(sha256sum /etc/config/wireless | awk '{printf "%s",substr($1,1,13)}')" - rm -f "/tmp/${trm_domain}.cookie" -else - exit 2 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait / 6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "https://${trm_domain}/wlan/rest/freeLogin" +ses_id="$(awk '/JSESSIONID/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +sec_id="$(awk '/DT_H/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +dev_id="$(sha256sum /etc/config/wireless 2>/dev/null | awk '{printf "%s",substr($1,1,13)}' 2>/dev/null)" +rm -f "/tmp/${trm_domain}.cookie" +if [ -z "${ses_id}" ] || [ -z "${sec_id}" ] || [ -z "${dev_id}" ]; then + exit 1 fi -# final post request/login with valid session cookie/security token +# final post request # -if [ -n "${ses_id}" ] && [ -n "${sec_id}" ] && [ -n "${dev_id}" ] -then - "${trm_fetch}" --user-agent "${trm_useragent}" --referer "https://${trm_domain}/TD/hotspot/H_Hotels/en_GB/index.html" --silent --connect-timeout $((trm_maxwait/6)) --header "Cookie: JSESSIONID=${ses_id}; DT_DEV_ID=${dev_id}; DT_H=${sec_id}" --data "rememberMe=true" --output /dev/null "https://${trm_domain}/wlan/rest/freeLogin" -else - exit 3 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "https://${trm_domain}/TD/hotspot/H_Hotels/en_GB/index.html" --silent --connect-timeout $((trm_maxwait / 6)) --header "Cookie: JSESSIONID=${ses_id}; DT_DEV_ID=${dev_id}; DT_H=${sec_id}" --data "rememberMe=true" --output /dev/null "https://${trm_domain}/wlan/rest/freeLogin" +if [ "${?}" != "0" ]; then + exit 2 fi diff --git a/net/travelmate/files/julianahoeve.login b/net/travelmate/files/julianahoeve.login new file mode 100755 index 0000000000..f4927c3360 --- /dev/null +++ b/net/travelmate/files/julianahoeve.login @@ -0,0 +1,46 @@ +#!/bin/sh +# captive portal auto-login script for Julianahoeve beach resort (NL) +# Copyright (c) 2021 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +# set (s)hellcheck exceptions +# shellcheck disable=1091,2039,2181,3040 + +export LC_ALL=C +export PATH="/usr/sbin:/usr/bin:/sbin:/bin" +set -o pipefail + +# source function library if necessary +# +if [ -z "${_C}" ]; then + . "/lib/functions.sh" +fi + +trm_domain="n23.network-auth.com" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" +trm_captiveurl="$(uci_get travelmate global trm_captiveurl "http://detectportal.firefox.com")" +trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" +trm_fetch="$(command -v curl)" + +# get redirect url +# +redirect_url="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --connect-timeout $((trm_maxwait / 6)) --write-out "%{redirect_url}" --silent --show-error --output /dev/null "${trm_captiveurl}")" +if [ -z "${redirect_url}" ]; then + exit 1 +fi + +# get session cookie +# +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://${trm_domain}" --silent --connect-timeout $((trm_maxwait / 6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "${redirect_url}" +session_id="$(awk '/p_splash_session/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +rm -f "/tmp/${trm_domain}.cookie" +if [ -z "${session_id}" ]; then + exit 2 +fi + +# final login request +# +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "${redirect_url}" --silent --connect-timeout $((trm_maxwait / 6)) --header "Cookie: p_splash_session=${session_id};" --output /dev/null "https://${trm_domain}/Camping-Julianah/hi/IHYW9cx/grant" +if [ "${?}" != "0" ]; then + exit 3 +fi diff --git a/net/travelmate/files/telekom.login b/net/travelmate/files/telekom.login new file mode 100755 index 0000000000..060bce7ff9 --- /dev/null +++ b/net/travelmate/files/telekom.login @@ -0,0 +1,64 @@ +#!/bin/sh +# captive portal auto-login script for telekom hotspots (DE) +# Copyright (c) 2021 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +# set (s)hellcheck exceptions +# shellcheck disable=1091,3040,3043,3057 + +export LC_ALL=C +export PATH="/usr/sbin:/usr/bin:/sbin:/bin" +set -o pipefail + +# source function library if necessary +# +if [ -z "${_C}" ]; then + . "/lib/functions.sh" +fi + +# url encoding function +# +urlencode() +{ + local chr str="${1}" len="${#1}" pos=0 + + while [ "${pos}" -lt "${len}" ]; do + chr="${str:pos:1}" + case "${chr}" in + [a-zA-Z0-9.~_-]) + printf "%s" "${chr}" + ;; + " ") + printf "%%20" + ;; + *) + printf "%%%02X" "'${chr}" + ;; + esac + pos=$((pos + 1)) + done +} + +username="$(urlencode "${1}")" +password="$(urlencode "${2}")" +trm_domain="telekom.portal.fon.com" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" +trm_captiveurl="$(uci_get travelmate global trm_captiveurl "http://detectportal.firefox.com")" +trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" +trm_fetch="$(command -v curl)" + +# get redirect url +# +raw_html="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --connect-timeout $((trm_maxwait / 6)) --location --silent --show-error "${trm_captiveurl}")" +redirect_url="$(printf "%s" "${raw_html}" | awk 'match(tolower($0),/.*<\/loginurl>/){printf "%s",substr($0,RSTART+10,RLENGTH-21)}' 2>/dev/null | awk '{gsub("&","\\&");printf "%s",$0}' 2>/dev/null)" +if [ -z "${redirect_url}" ]; then + exit 1 +fi + +# final login request +# +raw_html="$("${trm_fetch}" --user-agent "${trm_useragent}" --referer "https://${trm_domain}" --connect-timeout $((trm_maxwait / 6)) --header "content-type: application/x-www-form-urlencoded" --location --silent --show-error --data "UserName=${username}&Password=${password}&FNAME=0&button=Login&OriginatingServer=http%3A%2F%2F${trm_captiveurl}" "${redirect_url}")" +login_url="$(printf "%s" "${raw_html}" | awk 'match(tolower($0),/.*<\/logoffurl>/){printf "%s",substr($0,RSTART+11,RLENGTH-23)}' 2>/dev/null)" +if [ -z "${login_url}" ]; then + exit 2 +fi diff --git a/net/travelmate/files/travelmate.init b/net/travelmate/files/travelmate.init index 1346bc6dcc..2017ba9331 100755 --- a/net/travelmate/files/travelmate.init +++ b/net/travelmate/files/travelmate.init @@ -3,7 +3,7 @@ # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2034,2039,2059,2086,2143,2154,2181,2188 +# shellcheck disable=2034,2086,2154,3043,3060 START=25 USE_PROCD=1 @@ -17,19 +17,16 @@ trm_pidfile="/var/run/travelmate.pid" boot() { - if [ -s "${trm_pidfile}" ] - then - > "${trm_pidfile}" + if [ -s "${trm_pidfile}" ]; then + : >"${trm_pidfile}" fi rc_procd start_service } start_service() { - if [ "$("${trm_init}" enabled; printf "%u" ${?})" = "0" ] - then - if [ "${action}" = "boot" ] - then + if "${trm_init}" enabled; then + if [ "${action}" = "boot" ]; then return 0 fi procd_open_instance "travelmate" @@ -45,17 +42,14 @@ start_service() reload_service() { local ppid pid timeout - + timeout="$(uci_get travelmate global trm_timeout)" - if [ -s "${trm_pidfile}" ] - then + if [ -s "${trm_pidfile}" ]; then ppid="$(cat "${trm_pidfile}" 2>/dev/null)" - if [ -n "${ppid}" ] - then + if [ -n "${ppid}" ]; then pid="$(pgrep -xnf "sleep ${timeout:-60} 0" -P ${ppid} 2>/dev/null)" - if [ -n "${pid}" ] - then + if [ -n "${pid}" ]; then kill -INT ${pid} 2>/dev/null fi fi @@ -73,13 +67,10 @@ status_service() rtfile="$(uci_get travelmate global trm_rtfile "/tmp/trm_runtime.json")" json_load_file "${rtfile}" >/dev/null 2>&1 - json_select data >/dev/null 2>&1 - if [ "${?}" = "0" ] - then + if json_select data >/dev/null 2>&1; then printf "%s\n" "::: travelmate runtime information" json_get_keys keylist - for key in ${keylist} - do + for key in ${keylist}; do json_get_var value "${key}" printf " + %-18s : %s\n" "${key}" "${value}" done @@ -92,21 +83,20 @@ scan() { local result scan_dev radio="${1:-"radio0"}" - scan_dev="$(ubus -S call network.wireless status 2>/dev/null | jsonfilter -l1 -e "@.${radio}.interfaces[0].ifname")" - result="$(iwinfo "${scan_dev:-${radio}}" scan 2>/dev/null | \ + scan_dev="$(ubus -S call network.wireless status 2>/dev/null | jsonfilter -q -l1 -e "@.${radio}.interfaces[0].ifname")" + result="$(iwinfo "${scan_dev:-${radio}}" scan 2>/dev/null | awk 'BEGIN{FS="[[:space:]]"}/Address:/{var1=$NF}/ESSID:/{var2=""; for(i=12;i<=NF;i++)if(var2==""){var2=$i}else{var2=var2" "$i}}/Channel:/{var3=$NF}/Quality:/{split($NF,var0,"/")}/Encryption:/{var4=""; - for(j=12;j<=NF;j++)if(var4==""){var4=$j}else{var4=var4" "$j};printf " %-11i%-10s%-35s%-20s%s\n",(var0[1]*100/var0[2]),var3,var2,var1,var4}' | \ + for(j=12;j<=NF;j++)if(var4==""){var4=$j}else{var4=var4" "$j};printf " %-11i%-10s%-35s%-20s%s\n",(var0[1]*100/var0[2]),var3,var2,var1,var4}' | sort -rn)" - printf "%s\\n" "::: Available nearby uplinks on '${scan_dev:-${radio}}'" - printf "%s\\n" ":::" - if [ -n "${result}" ] - then - printf "%-15s%-10s%-35s%-20s%s\\n" " Strength" "Channel" "ESSID" "BSSID" "Encryption" - printf "%s\\n" " --------------------------------------------------------------------------------------" - printf "%s\\n" "${result}" + printf '%s\n' "::: Available nearby uplinks on '${scan_dev:-${radio}}'" + printf '%s\n' ":::" + if [ -n "${result}" ]; then + printf '%-15s%-10s%-35s%-20s%s\n' " Strength" "Channel" "ESSID" "BSSID" "Encryption" + printf '%s\n' " --------------------------------------------------------------------------------------" + printf '%s\n' "${result}" else - printf "%s\\n" "::: No scan results" + printf '%s\n' "::: No scan results" fi } @@ -119,13 +109,10 @@ setup() zone="${zone//[+*~%&\$@\"\' ]/}" metric="${metric//[^0-9]/}" - if [ -n "${iface}" ] && [ "${iface}" = "${input}" ] - then + if [ -n "${iface}" ] && [ "${iface}" = "${input}" ]; then printf "%s\n" "The uplink interface '${input}' has been already configured" - elif [ -n "${input}" ] - then - if [ -n "${iface}" ] - then + elif [ -n "${input}" ]; then + if [ -n "${iface}" ]; then uci -q batch <<-EOC del network."${iface}" del network."${iface}6" @@ -144,12 +131,9 @@ setup() commit network EOC - while [ -n "$(uci -q get firewall.@zone["${cnt}"].name)" ] - do - if [ "$(uci -q get firewall.@zone["${cnt}"].name)" = "${zone}" ] - then - if [ -n "${iface}" ] - then + while [ -n "$(uci -q get firewall.@zone["${cnt}"].name)" ]; do + if [ "$(uci -q get firewall.@zone["${cnt}"].name)" = "${zone}" ]; then + if [ -n "${iface}" ]; then uci -q batch <<-EOC del_list firewall.@zone["${cnt}"].network="${iface}" del_list firewall.@zone["${cnt}"].network="${iface}6" @@ -162,19 +146,16 @@ setup() EOC break fi - cnt=$((cnt+1)) + cnt=$((cnt + 1)) done - if [ -n "${iface}" ] - then + if [ -n "${iface}" ]; then cnt=0 - while [ -n "$(uci -q get wireless.@wifi-iface["${cnt}"].network)" ] - do - if [ "$(uci -q get wireless.@wifi-iface["${cnt}"].network)" = "${iface}" ] - then + while [ -n "$(uci -q get wireless.@wifi-iface["${cnt}"].network)" ]; do + if [ "$(uci -q get wireless.@wifi-iface["${cnt}"].network)" = "${iface}" ]; then uci -q set wireless.@wifi-iface["${cnt}"].network="${input}" fi - cnt=$((cnt+1)) + cnt=$((cnt + 1)) done uci -q commit wireless fi @@ -192,8 +173,7 @@ service_triggers() delay="$(uci_get travelmate global trm_triggerdelay "2")" PROCD_RELOAD_DELAY=$((delay * 1000)) - if [ -n "${iface}" ] - then + if [ -n "${iface}" ]; then procd_add_interface_trigger "interface.*.down" "${iface}" "${trm_init}" reload fi procd_add_raw_trigger "interface.*.up" "${PROCD_RELOAD_DELAY}" "${trm_init}" start diff --git a/net/travelmate/files/travelmate.mail b/net/travelmate/files/travelmate.mail index 42da3ccf33..ec789625aa 100755 --- a/net/travelmate/files/travelmate.mail +++ b/net/travelmate/files/travelmate.mail @@ -1,10 +1,10 @@ #!/bin/sh # send mail script for travelmate notifications -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,3040 # Please note: you have to setup the package 'msmtp' before using this script @@ -12,8 +12,9 @@ export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then +# source function library if necessary +# +if [ -z "${_C}" ]; then . "/lib/functions.sh" fi @@ -25,32 +26,21 @@ trm_rtfile="$(uci_get travelmate global trm_rtfile "/tmp/trm_runtime.json")" trm_mailpgm="$(command -v msmtp)" trm_logger="$(command -v logger)" -f_log() -{ - local class="${1}" log_msg="${2}" - - if [ -x "${trm_logger}" ] - then - "${trm_logger}" -p "${class}" -t "trm-mail [${$}]" "${log_msg}" - else - printf "%s %s %s\\n" "${class}" "trm-mail [${$}]" "${log_msg}" - fi -} - -if [ -z "${trm_mailreceiver}" ] -then - f_log "err" "please set the mail receiver with the 'trm_mailreceiver' option" +if [ -z "${trm_mailreceiver}" ]; then + "${trm_logger}" -p "err" -t "trm-mail [${$}]" "please set the mail receiver with the 'trm_mailreceiver' option" 2>/dev/null exit 1 fi -if [ "${trm_debug}" = "1" ] -then +if [ "${trm_debug}" = "1" ]; then debug="--debug" fi # info preparation # -sys_info="$(strings /etc/banner 2>/dev/null; ubus call system board | sed -e 's/\"release\": {//' | sed -e 's/^[ \t]*//' | sed -e 's/[{}\",]//g' | sed -e 's/[ ]/ \t/' | sed '/^$/d' 2>/dev/null)" +sys_info="$( + strings /etc/banner 2>/dev/null + ubus call system board | sed -e 's/\"release\": {//' | sed -e 's/^[ \t]*//' | sed -e 's/[{}\",]//g' | sed -e 's/[ ]/ \t/' | sed '/^$/d' 2>/dev/null +)" trm_info="$(/etc/init.d/travelmate status 2>/dev/null)" sta_info="$(jsonfilter -i "${trm_rtfile}" -l1 -e '@.data.station_id')" trm_mailtopic="$(uci_get travelmate global trm_mailtopic "travelmate connection to '${sta_info}'")" @@ -66,6 +56,4 @@ trm_mailtext="${trm_mailtext}" # send mail # printf "%b" "${trm_mailhead}${trm_mailtext}" 2>/dev/null | "${trm_mailpgm}" ${debug} -a "${trm_mailprofile}" "${trm_mailreceiver}" >/dev/null 2>&1 -mail_rc="${?}" -f_log "info" "mail sent to '${trm_mailreceiver}' with rc '${mail_rc}'" -exit ${mail_rc} +"${trm_logger}" -p "info" -t "trm-mail [${$}]" "mail sent to '${trm_mailreceiver}' with rc '${?}'" 2>/dev/null diff --git a/net/travelmate/files/travelmate.sh b/net/travelmate/files/travelmate.sh index 37dacfce33..cd4313989e 100755 --- a/net/travelmate/files/travelmate.sh +++ b/net/travelmate/files/travelmate.sh @@ -4,13 +4,13 @@ # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,2086,3040,3043,3057,3060 export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -trm_ver="2.0.3" +trm_ver="2.0.4" trm_enabled=0 trm_debug=0 trm_iface="" @@ -38,8 +38,8 @@ trm_fetch="$(command -v curl)" trm_iwinfo="$(command -v iwinfo)" trm_logger="$(command -v logger)" trm_wpa="$(command -v wpa_supplicant)" -trm_captiveurl="http://captive.apple.com" -trm_useragent="Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0" +trm_captiveurl="http://detectportal.firefox.com" +trm_useragent="Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0" trm_ntpfile="/var/state/travelmate.ntp" trm_vpnfile="/var/state/travelmate.vpn" trm_mailfile="/var/state/travelmate.mail" @@ -55,8 +55,7 @@ f_env() # do nothing on stop # - if [ "${trm_action}" = "stop" ] - then + if [ "${trm_action}" = "stop" ]; then return fi @@ -66,13 +65,12 @@ f_env() # get system information # - trm_sysver="$(ubus -S call system board 2>/dev/null | jsonfilter -e '@.model' -e '@.release.description' | \ + trm_sysver="$(ubus -S call system board 2>/dev/null | jsonfilter -q -e '@.model' -e '@.release.description' | awk 'BEGIN{ORS=", "}{print $0}' | awk '{print substr($0,1,length($0)-2)}')" # check travelmate config # - if [ ! -r "/etc/config/travelmate" ] || [ -z "$(uci -q show travelmate.global.trm_vpn)" ] - then + if [ ! -r "/etc/config/travelmate" ] || [ -z "$(uci -q show travelmate.global.trm_vpn)" ]; then f_log "err" "invalid travelmate config, please re-install the package via opkg with the '--force-reinstall --force-maintainer' options" fi @@ -81,8 +79,7 @@ f_env() config_cb() { local name="${1}" type="${2}" - if [ "${name}" = "travelmate" ] && [ "${type}" = "global" ] - then + if [ "${name}" = "travelmate" ] && [ "${type}" = "global" ]; then option_cb() { local option="${1}" value="${2}" @@ -99,19 +96,16 @@ f_env() # check 'enabled' option # - if [ "${trm_enabled}" != "1" ] - then + 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 fi # check ubus network interface # - if [ -n "${trm_iface}" ] - then + if [ -n "${trm_iface}" ]; then ubus_check="$(ubus -t "${trm_maxwait}" wait_for network.wireless network.interface."${trm_iface}" 2>&1)" - if [ -n "${ubus_check}" ] - then + if [ -n "${ubus_check}" ]; then f_log "info" "travelmate interface '${trm_iface}' does not appear on ubus, please check your network setup" /etc/init.d/travelmate stop fi @@ -123,22 +117,20 @@ f_env() # check wpa capabilities # wpa_checks="sae owe eap suiteb192" - for check in ${wpa_checks} - do - if [ -x "${trm_wpa}" ] - then - result="$("${trm_wpa}" -v${check} >/dev/null 2>&1; printf "%u" "${?}")" - if [ -z "${trm_wpaflags}" ] - then - if [ "${result}" = "0" ] - then + for check in ${wpa_checks}; do + if [ -x "${trm_wpa}" ]; then + result="$( + "${trm_wpa}" -v${check} >/dev/null 2>&1 + printf "%u" "${?}" + )" + if [ -z "${trm_wpaflags}" ]; then + if [ "${result}" = "0" ]; then trm_wpaflags="${check}: $(f_char 1)" else trm_wpaflags="${check}: $(f_char 0)" fi else - if [ "${result}" = "0" ] - then + if [ "${result}" = "0" ]; then trm_wpaflags="$(f_trim "${trm_wpaflags}, ${check}: $(f_char 1)")" else trm_wpaflags="$(f_trim "${trm_wpaflags}, ${check}: $(f_char 0)")" @@ -151,8 +143,7 @@ f_env() # config_load wireless config_foreach f_prepdev wifi-device - if [ -n "$(uci -q changes "wireless")" ] - then + if [ -n "$(uci -q changes "wireless")" ]; then uci_commit "wireless" f_reconf fi @@ -160,10 +151,9 @@ f_env() # load json runtime file # json_load_file "${trm_rtfile}" >/dev/null 2>&1 - json_select data >/dev/null 2>&1 - if [ "${?}" != "0" ] - then - > "${trm_rtfile}" + + if ! json_select data >/dev/null 2>&1; then + : >"${trm_rtfile}" json_init json_add_object "data" fi @@ -187,8 +177,7 @@ f_char() { local result input="${1}" - if [ "${input}" = "1" ] - then + if [ "${input}" = "1" ]; then result="✔" else result="✘" @@ -203,20 +192,16 @@ f_reconf() local radio tmp_radio cnt="0" "${trm_wifi}" reconf - for radio in ${trm_radiolist} - do - while [ "$(ubus -S call network.wireless status | jsonfilter -l1 -e "@.${radio}.up")" != "true" ] - do - if [ "${cnt}" -ge "${trm_maxwait}" ] - then + for radio in ${trm_radiolist}; do + while [ "$(ubus -S call network.wireless status | jsonfilter -q -l1 -e "@.${radio}.up")" != "true" ]; do + if [ "${cnt}" -ge "${trm_maxwait}" ]; then break 2 fi - if [ "${radio}" != "${tmp_radio}" ] - then + if [ "${radio}" != "${tmp_radio}" ]; then "${trm_wifi}" up "${radio}" tmp_radio="${radio}" fi - cnt="$((cnt+1))" + cnt="$((cnt + 1))" sleep 1 done done @@ -229,18 +214,16 @@ f_vpn() { local IFS rc action="${1}" - if [ "${trm_vpn}" = "1" ] && [ -x "${trm_vpnpgm}" ] - then - if [ "${action}" = "disable" ] || { [ "${action}" = "enable" ] && [ ! -f "${trm_vpnfile}" ]; } - then + if [ "${trm_vpn}" = "1" ] && [ -x "${trm_vpnpgm}" ]; then + if [ "${action}" = "disable" ] || { + [ "${action}" = "enable" ] && [ ! -f "${trm_vpnfile}" ] + }; then "${trm_vpnpgm}" "${action}" >/dev/null 2>&1 rc="${?}" fi - if [ "${action}" = "enable" ] && [ "${rc}" = "0" ] - then - > "${trm_vpnfile}" - elif [ "${action}" = "disable" ] && [ -f "${trm_vpnfile}" ] - then + if [ "${action}" = "enable" ] && [ "${rc}" = "0" ]; then + : >"${trm_vpnfile}" + elif [ "${action}" = "disable" ] && [ -f "${trm_vpnfile}" ]; then rm -f "${trm_vpnfile}" fi fi @@ -253,16 +236,14 @@ f_mac() { local result ifname action="${1}" section="${2}" - if [ "${trm_randomize}" = "1" ] && [ "${action}" = "set" ] - then - result="$(hexdump -n6 -ve '/1 "%.02X "' /dev/random 2>/dev/null | \ + if [ "${trm_randomize}" = "1" ] && [ "${action}" = "set" ]; then + result="$(hexdump -n6 -ve '/1 "%.02X "' /dev/random 2>/dev/null | 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}')" uci_set "wireless" "${section}" "macaddr" "${result}" else result="$(uci_get "wireless" "${section}" "macaddr")" - if [ -z "${result}" ] - then - ifname="$(ubus -S call network.wireless status 2>/dev/null | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')" + if [ -z "${result}" ]; then + ifname="$(ubus -S call network.wireless status 2>/dev/null | jsonfilter -q -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')" result="$(${trm_iwinfo} "${ifname}" info 2>/dev/null | awk '/Access Point:/{printf "%s",$3}')" fi fi @@ -276,73 +257,65 @@ f_contrack() { local uplink_config radio_config essid_config bssid_config expiry action="${1}" radio="${2}" essid="${3}" bssid="${4}" cnt=0 - while [ "$(uci_get "travelmate" "@uplink[$cnt]" >/dev/null 2>&1; echo $?)" = "0" ] - do + while [ "$( + uci_get "travelmate" "@uplink[$cnt]" >/dev/null 2>&1 + echo $? + )" = "0" ]; do radio_config="$(uci_get "travelmate" "@uplink[$cnt]" "device")" essid_config="$(uci_get "travelmate" "@uplink[$cnt]" "ssid")" bssid_config="$(uci_get "travelmate" "@uplink[$cnt]" "bssid")" - if [ "${radio_config}" = "${radio}" ] && [ "${essid_config}" = "${essid}" ] && [ "${bssid_config}" = "${bssid}" ] - then + if [ "${radio_config}" = "${radio}" ] && [ "${essid_config}" = "${essid}" ] && [ "${bssid_config}" = "${bssid}" ]; then uplink_config="@uplink[$cnt]" fi - cnt="$((cnt+1))" + cnt="$((cnt + 1))" done - if [ -n "${uplink_config}" ] - then + if [ -n "${uplink_config}" ]; then case "${action}" in "start") uci_remove "travelmate" "${uplink_config}" "con_start" 2>/dev/null uci_remove "travelmate" "${uplink_config}" "con_end" 2>/dev/null - if [ -f "${trm_ntpfile}" ] - then + if [ -f "${trm_ntpfile}" ]; then uci_set "travelmate" "${uplink_config}" "con_start" "$(date "+%Y.%m.%d-%H:%M:%S")" fi - ;; + ;; "refresh") - if [ -f "${trm_ntpfile}" ] && [ -z "$(uci_get "travelmate" "${uplink_config}" "con_start")" ] - then + if [ -f "${trm_ntpfile}" ] && [ -z "$(uci_get "travelmate" "${uplink_config}" "con_start")" ]; then uci_set "travelmate" "${uplink_config}" "con_start" "$(date "+%Y.%m.%d-%H:%M:%S")" fi - ;; + ;; "end") - if [ -f "${trm_ntpfile}" ] - then + if [ -f "${trm_ntpfile}" ]; then uci_set "travelmate" "${uplink_config}" "con_end" "$(date "+%Y.%m.%d-%H:%M:%S")" fi - ;; + ;; "start_expiry") - if [ -f "${trm_ntpfile}" ] - then + if [ -f "${trm_ntpfile}" ]; then expiry="$(uci_get "travelmate" "${uplink_config}" "con_start_expiry")" uci_set "travelmate" "${uplink_config}" "enabled" "0" uci_set "travelmate" "${uplink_config}" "con_end" "$(date "+%Y.%m.%d-%H:%M:%S")" f_log "info" "uplink '${radio}/${essid}/${bssid:-"-"}' expired after ${expiry} minutes" fi - ;; + ;; "end_expiry") - if [ -f "${trm_ntpfile}" ] - then + if [ -f "${trm_ntpfile}" ]; then expiry="$(uci_get "travelmate" "${uplink_config}" "con_end_expiry")" uci_set "travelmate" "${uplink_config}" "enabled" "1" uci_remove "travelmate" "${uplink_config}" "con_start" 2>/dev/null uci_remove "travelmate" "${uplink_config}" "con_end" 2>/dev/null f_log "info" "uplink '${radio}/${essid}/${bssid:-"-"}' re-enabled after ${expiry} minutes" fi - ;; + ;; "disabled") uci_set "travelmate" "${uplink_config}" "enabled" "0" - if [ -f "${trm_ntpfile}" ] - then + if [ -f "${trm_ntpfile}" ]; then uci_set "travelmate" "${uplink_config}" "con_end" "$(date "+%Y.%m.%d-%H:%M:%S")" fi - ;; + ;; esac - if [ -n "$(uci -q changes "travelmate")" ] - then + if [ -n "$(uci -q changes "travelmate")" ]; then uci_commit "travelmate" - if [ ! -f "${trm_refreshfile}" ] - then - printf "%s" "cfg_reload" > "${trm_refreshfile}" + if [ ! -f "${trm_refreshfile}" ]; then + printf "%s" "cfg_reload" >"${trm_refreshfile}" fi fi fi @@ -354,18 +327,19 @@ f_uplink() { local IFS result t_radio t_essid t_bssid t_option="${1}" w_radio="${2}" w_essid="${3}" w_bssid="${4}" cnt=0 - while [ "$(uci_get "travelmate" "@uplink[$cnt]" >/dev/null 2>&1; echo $?)" = "0" ] - do + while [ "$( + uci_get "travelmate" "@uplink[$cnt]" >/dev/null 2>&1 + echo $? + )" = "0" ]; 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 "${w_radio}" ] && [ -n "${w_essid}" ] && \ - [ "${t_radio}" = "${w_radio}" ] && [ "${t_essid}" = "${w_essid}" ] && [ "${t_bssid}" = "${w_bssid}" ] - then + if [ -n "${w_radio}" ] && [ -n "${w_essid}" ] && + [ "${t_radio}" = "${w_radio}" ] && [ "${t_essid}" = "${w_essid}" ] && [ "${t_bssid}" = "${w_bssid}" ]; then result="$(uci_get "travelmate" "@uplink[$cnt]" "${t_option}")" break fi - cnt="$((cnt+1))" + cnt="$((cnt + 1))" done printf "%s" "${result}" f_log "debug" "f_uplink ::: option: ${t_option}, result: ${result}" @@ -378,17 +352,14 @@ f_prepdev() local IFS disabled radio="${1}" disabled="$(uci_get "wireless" "${radio}" "disabled")" - if [ "${disabled}" = "1" ] - then + if [ "${disabled}" = "1" ]; then uci_set wireless "${radio}" disabled 0 fi - if [ -z "${trm_radio}" ] && [ -z "$(printf "%s" "${trm_radiolist}" | grep -Fo "${radio}")" ] - then + if [ -z "${trm_radio}" ] && ! printf "%s" "${trm_radiolist}" | grep -q "${radio}"; then trm_radiolist="$(f_trim "${trm_radiolist} ${radio}")" - elif [ -n "${trm_radio}" ] && [ -z "${trm_radiolist}" ] - then - trm_radiolist="$(f_trim "$(printf "%s" "${trm_radio}" | \ + elif [ -n "${trm_radio}" ] && [ -z "${trm_radiolist}" ]; then + trm_radiolist="$(f_trim "$(printf "%s" "${trm_radio}" | awk '{while(match(tolower($0),/[a-z0-9_]+/)){ORS=" ";print substr(tolower($0),RSTART,RLENGTH);$0=substr($0,RSTART+RLENGTH)}}')")" fi f_log "debug" "f_prepdev ::: trm_radio: ${trm_radio:-"-"}, radio: ${radio}, radio_list: ${trm_radiolist:-"-"}, disabled: ${disabled:-"-"}" @@ -403,26 +374,21 @@ f_addif() config_cb() { local type="${1}" name="${2}" - if [ "${type}" = "wifi-iface" ] - then - if [ "$(uci -q get "wireless.${name}.ssid")" = "${essid}" ] - then + if [ "${type}" = "wifi-iface" ]; then + if [ "$(uci -q get "wireless.${name}.ssid")" = "${essid}" ]; then offset=0 - elif [ "${offset}" != "0" ] - then - offset="$((offset+1))" + elif [ "${offset}" != "0" ]; then + offset="$((offset + 1))" fi fi return "${offset}" } config_load wireless - if [ "${offset}" != "0" ] - then + if [ "${offset}" != "0" ]; then uci_cfg="trm_uplink${offset}" - while [ -n "$(uci -q get "wireless.${uci_cfg}")" ] - do - offset="$((offset+1))" + while [ -n "$(uci -q get "wireless.${uci_cfg}")" ]; do + offset="$((offset + 1))" uci_cfg="trm_uplink${offset}" done uci -q batch <<-EOC @@ -442,14 +408,12 @@ f_addif() set travelmate."${uci_cfg}".con_end_expiry="0" set travelmate."${uci_cfg}".enabled="1" EOC - if [ -n "$(uci -q changes "travelmate")" ] || [ -n "$(uci -q changes "wireless")" ] - then + if [ -n "$(uci -q changes "travelmate")" ] || [ -n "$(uci -q changes "wireless")" ]; then uci_commit "travelmate" uci_commit "wireless" f_reconf - if [ ! -f "${trm_refreshfile}" ] - then - printf "%s" "ui_reload" > "${trm_refreshfile}" + if [ ! -f "${trm_refreshfile}" ]; then + printf "%s" "ui_reload" >"${trm_refreshfile}" fi f_log "info" "open uplink '${radio}/${essid}' added to wireless config" fi @@ -474,45 +438,42 @@ f_prepif() con_start_expiry="$(f_uplink "con_start_expiry" "${radio}" "${essid}" "${bssid}")" con_end_expiry="$(f_uplink "con_end_expiry" "${radio}" "${essid}" "${bssid}")" - if [ "${status}" = "0" ] && [ -n "${con_end}" ] && [ -n "${con_end_expiry}" ] && [ "${con_end_expiry}" != "0" ] - then + if [ "${status}" = "0" ] && [ -n "${con_end}" ] && [ -n "${con_end_expiry}" ] && [ "${con_end_expiry}" != "0" ]; then d1="$(date -d "${con_end}" "+%s")" d2="$(date "+%s")" - d3="$(((d2-d1)/60))" - if [ "${d3}" -ge "${con_end_expiry}" ] - then + d3="$(((d2 - d1) / 60))" + if [ "${d3}" -ge "${con_end_expiry}" ]; then status="1" f_contrack "end_expiry" "${radio}" "${essid}" "${bssid}" fi - elif [ "${status}" = "1" ] && [ -n "${con_start}" ] && [ -n "${con_start_expiry}" ] && [ "${con_start_expiry}" != "0" ] - then + elif [ "${status}" = "1" ] && [ -n "${con_start}" ] && [ -n "${con_start_expiry}" ] && [ "${con_start_expiry}" != "0" ]; then d1="$(date -d "${con_start}" "+%s")" d2="$(date "+%s")" - d3="$((d1+(con_start_expiry*60)))" - if [ "${d2}" -gt "${d3}" ] - then + d3="$((d1 + (con_start_expiry * 60)))" + if [ "${d2}" -gt "${d3}" ]; then status="0" f_contrack "start_expiry" "${radio}" "${essid}" "${bssid}" fi fi - if [ "${mode}" = "sta" ] - then - if [ "${status}" = "0" ] || \ - { { [ -z "${disabled}" ] || [ "${disabled}" = "0" ]; } && { [ "${proactive}" = "0" ] || [ "${trm_ifstatus}" != "true" ]; } } - then + if [ "${mode}" = "sta" ]; then + if [ "${status}" = "0" ] || + { + { + [ -z "${disabled}" ] || [ "${disabled}" = "0" ] + } && { + [ "${proactive}" = "0" ] || [ "${trm_ifstatus}" != "true" ] + } + }; then uci_set "wireless" "${section}" "disabled" "1" - elif [ "${disabled}" = "0" ] && [ "${trm_ifstatus}" = "true" ] && [ "${proactive}" = "1" ] - then - if [ -z "${trm_activesta}" ] - then + elif [ "${disabled}" = "0" ] && [ "${trm_ifstatus}" = "true" ] && [ "${proactive}" = "1" ]; then + if [ -z "${trm_activesta}" ]; then trm_activesta="${section}" else uci_set "wireless" "${section}" "disabled" "1" fi fi - if [ "${status}" = "1" ] - then + if [ "${status}" = "1" ]; then trm_stalist="$(f_trim "${trm_stalist} ${section}-${radio}")" fi fi @@ -523,41 +484,39 @@ f_prepif() # f_net() { - local IFS err err_rc err_domain json_raw json_cp json_rc cp_domain result="net nok" + local IFS err err_rc err_domain raw html_raw html_cp json_raw json_cp json_rc result="net nok" - json_raw="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --write-out "%{json}" --silent --show-error --connect-timeout $((trm_maxwait/10)) "${trm_captiveurl}" 2>/tmp/trm_fetch.err)" - json_raw="${json_raw#*\{}" - if [ -s "/tmp/trm_fetch.err" ] - then + raw="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --header "Cache-Control: no-cache, no-store, must-revalidate" --header "Pragma: no-cache" --header "Expires: 0" --write-out "%{json}" --silent --show-error --connect-timeout $((trm_maxwait / 10)) "${trm_captiveurl}" 2>/tmp/trm_fetch.err)" + json_raw="${raw#*\{}" + html_raw="${raw%%\{*}" + if [ -s "/tmp/trm_fetch.err" ]; then err="$(awk 'BEGIN{FS="[()'\'' ]"}{printf "%s %s",$3,$(NF-1)}' "/tmp/trm_fetch.err")" err_rc="${err% *}" err_domain="${err#* }" - if [ "${err_rc}" = "6" ] - then - if [ -n "${err_domain}" ] && [ "${err_domain}" != "timed" ] && [ "${err_domain}" != "${trm_captiveurl#http*://*}" ] - then + if [ "${err_rc}" = "6" ]; then + if [ -n "${err_domain}" ] && [ "${err_domain}" != "timed" ] && [ "${err_domain}" != "${trm_captiveurl#http*://*}" ]; then result="net cp '${err_domain}'" fi fi - elif [ -n "${json_raw}" ] - then - json_cp="$(printf "%s" "{${json_raw}" | jsonfilter -l1 -e '@.redirect_url' 2>/dev/null)" - json_rc="$(printf "%s" "{${json_raw}" | jsonfilter -l1 -e '@.response_code' 2>/dev/null)" - if [ -n "${json_cp}" ] - then - cp_domain="${json_cp#http*://*}" - cp_domain="${cp_domain%%/*}" - result="net cp '${cp_domain}'" + elif [ -n "${json_raw}" ]; then + json_cp="$(printf "%s" "{${json_raw}" | jsonfilter -q -l1 -e '@.redirect_url' | awk 'BEGIN{FS="/"}{printf "%s",$3}')" + json_rc="$(printf "%s" "{${json_raw}" | jsonfilter -q -l1 -e '@.response_code')" + if [ -n "${json_cp}" ]; then + result="net cp '${json_cp}'" else - if [ "${json_rc}" = "200" ] || [ "${json_rc}" = "204" ] - then - result="net ok" + if [ "${json_rc}" = "200" ] || [ "${json_rc}" = "204" ]; then + html_cp="$(printf "%s" "${html_raw}" | awk 'match(tolower($0),/^.*/dev/null | awk -F '[ ]' '/Link Quality:/{split($NF,var0,"/");printf "%i\n",(var0[1]*100/var0[2])}')" - if [ "${trm_ifquality}" -ge "${trm_minquality}" ] - then - trm_ifstatus="$(ubus -S call network.interface dump 2>/dev/null | jsonfilter -l1 -e "@.interface[@.device=\"${ifname}\"].up")" - if [ "${trm_ifstatus}" = "true" ] - then - if [ "${trm_captive}" = "1" ] - then + if [ "${trm_ifquality}" -ge "${trm_minquality}" ]; then + trm_ifstatus="$(ubus -S call network.interface dump 2>/dev/null | jsonfilter -q -l1 -e "@.interface[@.device=\"${ifname}\"].up")" + if [ "${trm_ifstatus}" = "true" ]; then + if [ "${trm_captive}" = "1" ]; then 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}" ] && [ -z "$(uci_get "dhcp" "@dnsmasq[0]" "rebind_domain" | grep -Fo "${cp_domain}")" ] - then + 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" fi - if [ -n "${cp_domain}" ] && [ "${trm_captive}" = "1" ] - then + if [ -n "${cp_domain}" ] && [ "${trm_captive}" = "1" ]; then trm_connection="${result:-"-"}/${trm_ifquality}" f_jsnup login_script="$(f_uplink "script" "${sta_radio}" "${sta_essid}" "${sta_bssid}")" - if [ -x "${login_script}" ] - then + if [ -x "${login_script}" ]; then login_script_args="$(f_uplink "script_args" "${sta_radio}" "${sta_essid}" "${sta_bssid}")" "${login_script}" ${login_script_args} >/dev/null 2>&1 rc="${?}" - f_log "info" "captive portal login '${login_script:0:40} ${login_script_args:0:20}' for '${cp_domain}' has been executed with rc '${rc}'" - if [ "${rc}" = "0" ] - then + f_log "info" "captive portal login for '${cp_domain}' has been executed with rc '${rc}'" + if [ "${rc}" = "0" ]; then result="$(f_net)" fi fi fi fi - if [ "${trm_netcheck}" = "1" ] && [ "${result}" = "net nok" ] - then + if [ "${trm_netcheck}" = "1" ] && [ "${result}" = "net nok" ]; then f_log "info" "uplink has no internet (new connection)" f_vpn "disable" trm_ifstatus="${status}" @@ -656,17 +605,14 @@ f_check() f_jsnup break fi - elif [ -n "${trm_connection}" ] - then - if [ "${trm_ifquality}" -lt "${trm_minquality}" ] - then + elif [ -n "${trm_connection}" ]; then + if [ "${trm_ifquality}" -lt "${trm_minquality}" ]; then f_log "info" "uplink is out of range (${trm_ifquality}/${trm_minquality})" f_vpn "disable" unset trm_connection trm_ifstatus="${status}" f_contrack "end" "${sta_radio}" "${sta_essid}" "${sta_bssid}" - elif [ "${trm_netcheck}" = "1" ] && [ "${result}" = "net nok" ] - then + elif [ "${trm_netcheck}" = "1" ] && [ "${result}" = "net nok" ]; then f_log "info" "uplink has no internet (existing connection)" f_vpn "disable" unset trm_connection @@ -674,34 +620,30 @@ f_check() fi f_jsnup break - elif [ "${mode}" = "initial" ] - then + elif [ "${mode}" = "initial" ]; then trm_ifstatus="${status}" f_jsnup break fi - elif [ -n "${trm_connection}" ] - then + elif [ -n "${trm_connection}" ]; then f_vpn "disable" unset trm_connection trm_ifstatus="${status}" f_jsnup break - elif [ "${mode}" = "initial" ] - then + elif [ "${mode}" = "initial" ]; then trm_ifstatus="${status}" f_jsnup break fi fi fi - if [ "${mode}" = "initial" ] - then + if [ "${mode}" = "initial" ]; then trm_ifstatus="${status}" f_jsnup break fi - wait_time="$((wait_time+1))" + wait_time="$((wait_time + 1))" sleep 1 done 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}" @@ -713,15 +655,12 @@ f_jsnup() { local IFS section last_date last_station sta_iface sta_radio sta_essid sta_bssid sta_mac dev_status last_status status="${trm_ifstatus}" ntp_done="0" vpn_done="0" mail_done="0" - if [ "${status}" = "true" ] - then + if [ "${status}" = "true" ]; then status="connected (${trm_connection:-"-"})" dev_status="$(ubus -S call network.wireless status 2>/dev/null)" - if [ -n "${dev_status}" ] - then - section="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].section')" - if [ -n "${section}" ] - then + if [ -n "${dev_status}" ]; then + section="$(printf "%s" "${dev_status}" | jsonfilter -q -l1 -e '@.*.interfaces[@.config.mode="sta"].section')" + 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")" @@ -733,17 +672,18 @@ f_jsnup() json_get_var last_station "station_id" json_get_var last_status "travelmate_status" - if { [ -f "${trm_ntpfile}" ] && [ ! -s "${trm_ntpfile}" ]; } || [ "${last_status}" = "running (not connected)" ] || \ - { [ -n "${last_station}" ] && [ "${last_station}" != "${sta_radio:-"-"}/${sta_essid:-"-"}/${sta_bssid:-"-"}" ]; } - then + if { + [ -f "${trm_ntpfile}" ] && [ ! -s "${trm_ntpfile}" ] + } || [ "${last_status}" = "running (not connected)" ] || + { + [ -n "${last_station}" ] && [ "${last_station}" != "${sta_radio:-"-"}/${sta_essid:-"-"}/${sta_bssid:-"-"}" ] + }; then last_date="$(date "+%Y.%m.%d-%H:%M:%S")" - if [ -f "${trm_ntpfile}" ] && [ ! -s "${trm_ntpfile}" ] - then - printf "%s" "${last_date}" > "${trm_ntpfile}" + if [ -f "${trm_ntpfile}" ] && [ ! -s "${trm_ntpfile}" ]; then + printf "%s" "${last_date}" >"${trm_ntpfile}" fi fi - elif [ "${status}" = "error" ] - then + elif [ "${status}" = "error" ]; then unset trm_connection status="program error" else @@ -751,20 +691,16 @@ f_jsnup() status="running (not connected)" fi - if [ -z "${last_date}" ] - then + if [ -z "${last_date}" ]; then last_date="$(date "+%Y.%m.%d-%H:%M:%S")" fi - if [ -s "${trm_ntpfile}" ] - then + if [ -s "${trm_ntpfile}" ]; then ntp_done="1" fi - if [ "${trm_vpn}" = "1" ] && [ -f "${trm_vpnfile}" ] - then + if [ "${trm_vpn}" = "1" ] && [ -f "${trm_vpnfile}" ]; then vpn_done="1" fi - if [ "${trm_mail}" = "1" ] && [ -f "${trm_mailfile}" ] - then + if [ "${trm_mail}" = "1" ] && [ -f "${trm_mailfile}" ]; then mail_done="1" fi json_add_string "travelmate_status" "${status}" @@ -777,16 +713,13 @@ f_jsnup() 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}" - json_dump > "${trm_rtfile}" + json_dump >"${trm_rtfile}" - if [ "${status%% (net ok/*}" = "connected" ] - then + if [ "${status%% (net ok/*}" = "connected" ]; then f_vpn "enable" - if [ "${trm_mail}" = "1" ] && [ -x "${trm_mailpgm}" ] && [ "${ntp_done}" = "1" ] && [ "${mail_done}" = "0" ] - then - if [ "${trm_vpn}" = "0" ] || [ "${vpn_done}" = "1" ] - then - > "${trm_mailfile}" + if [ "${trm_mail}" = "1" ] && [ -x "${trm_mailpgm}" ] && [ "${ntp_done}" = "1" ] && [ "${mail_done}" = "0" ]; then + if [ "${trm_vpn}" = "0" ] || [ "${vpn_done}" = "1" ]; then + : >"${trm_mailfile}" "${trm_mailpgm}" >/dev/null 2>&1 fi fi @@ -802,19 +735,18 @@ f_log() { local IFS class="${1}" log_msg="${2}" - if [ -n "${log_msg}" ] && { [ "${class}" != "debug" ] || [ "${trm_debug}" = "1" ]; } - then - if [ -x "${trm_logger}" ] - then + if [ -n "${log_msg}" ] && { + [ "${class}" != "debug" ] || [ "${trm_debug}" = "1" ] + }; then + if [ -x "${trm_logger}" ]; then "${trm_logger}" -p "${class}" -t "trm-${trm_ver}[${$}]" "${log_msg}" else - printf "%s %s %s\\n" "${class}" "trm-${trm_ver}[${$}]" "${log_msg}" + printf '%s %s %s\n' "${class}" "trm-${trm_ver}[${$}]" "${log_msg}" fi - if [ "${class}" = "err" ] - then + if [ "${class}" = "err" ]; then trm_ifstatus="error" f_jsnup - > "${trm_pidfile}" + : >"${trm_pidfile}" exit 1 fi fi @@ -829,12 +761,10 @@ f_main() f_check "initial" "false" f_log "debug" "f_main ::: status: ${trm_ifstatus}, proactive: ${trm_proactive}" - if [ "${trm_ifstatus}" != "true" ] || [ "${trm_proactive}" = "1" ] - then + if [ "${trm_ifstatus}" != "true" ] || [ "${trm_proactive}" = "1" ]; then config_load wireless config_foreach f_prepif wifi-iface ${trm_proactive} - if [ "${trm_ifstatus}" = "true" ] && [ -n "${trm_activesta}" ] && [ "${trm_proactive}" = "1" ] - then + if [ "${trm_ifstatus}" = "true" ] && [ -n "${trm_activesta}" ] && [ "${trm_proactive}" = "1" ]; then json_get_var station_id "station_id" config_radio="${station_id%%/*}" config_essid="${station_id%/*}" @@ -847,50 +777,43 @@ f_main() uci_commit "wireless" f_check "dev" "false" fi - f_log "debug" "f_main ::: radio_list: ${trm_radiolist}, sta_list: ${trm_stalist:0:${trm_scanbuffer}}" + f_log "debug" "f_main ::: radio_list: ${trm_radiolist}, sta_list: ${trm_stalist:0:trm_scanbuffer}" # radio loop # - for radio in ${trm_radiolist} - do - if [ -z "$(printf "%s" "${trm_stalist}" | grep -o "\\-${radio}")" ] - then + for radio in ${trm_radiolist}; do + if ! printf "%s" "${trm_stalist}" | grep -q "\\-${radio}"; then f_log "info" "no station on radio '${radio}'" continue fi # station loop # - for sta in ${trm_stalist} - do + for sta in ${trm_stalist}; do section="${sta%%-*}" sta_radio="$(uci_get "wireless" "${section}" "device")" sta_essid="$(uci_get "wireless" "${section}" "ssid")" sta_bssid="$(uci_get "wireless" "${section}" "bssid")" sta_iface="$(uci_get "wireless" "${section}" "network")" sta_mac="$(f_mac "get" "${section}")" - if [ -z "${sta_radio}" ] || [ -z "${sta_essid}" ] || [ -z "${sta_iface}" ] - then + if [ -z "${sta_radio}" ] || [ -z "${sta_essid}" ] || [ -z "${sta_iface}" ]; then f_log "info" "invalid wireless section '${section}'" continue fi - if [ "${sta_radio}" = "${config_radio}" ] && [ "${sta_essid}" = "${config_essid}" ] && [ "${sta_bssid}" = "${config_bssid}" ] - then + if [ "${sta_radio}" = "${config_radio}" ] && [ "${sta_essid}" = "${config_essid}" ] && [ "${sta_bssid}" = "${config_bssid}" ]; then f_contrack "refresh" "${config_radio}" "${config_essid}" "${config_bssid}" f_log "info" "uplink still in range '${config_radio}/${config_essid}/${config_bssid:-"-"}' with mac '${sta_mac:-"-"}'" break 2 fi f_log "debug" "f_main ::: sta_radio: ${sta_radio}, sta_essid: \"${sta_essid}\", sta_bssid: ${sta_bssid:-"-"}" - if [ -z "${scan_list}" ] - then - scan_dev="$(ubus -S call network.wireless status 2>/dev/null | jsonfilter -l1 -e "@.${radio}.interfaces[0].ifname")" - scan_list="$("${trm_iwinfo}" "${scan_dev:-${radio}}" scan 2>/dev/null | \ + if [ -z "${scan_list}" ]; then + scan_dev="$(ubus -S call network.wireless status 2>/dev/null | jsonfilter -q -l1 -e "@.${radio}.interfaces[0].ifname")" + scan_list="$("${trm_iwinfo}" "${scan_dev:-${radio}}" scan 2>/dev/null | awk 'BEGIN{FS="[[:space:]]"}/Address:/{var1=$NF}/ESSID:/{var2="";for(i=12;i<=NF;i++)if(var2==""){var2=$i}else{var2=var2" "$i}; - gsub(/,/,".",var2)}/Quality:/{split($NF,var0,"/")}/Encryption:/{if($NF=="none"){var3="+"}else{var3="-"};printf "%i,%s,%s,%s\n",(var0[1]*100/var0[2]),var1,var2,var3}' | \ + gsub(/,/,".",var2)}/Quality:/{split($NF,var0,"/")}/Encryption:/{if($NF=="none"){var3="+"}else{var3="-"};printf "%i,%s,%s,%s\n",(var0[1]*100/var0[2]),var1,var2,var3}' | sort -rn | awk -v buf="${trm_scanbuffer}" 'BEGIN{ORS=","}{print substr($0,1,buf)}')" f_log "debug" "f_main ::: radio: ${radio}, scan_device: ${scan_dev}, scan_buffer: ${trm_scanbuffer}, scan_list: ${scan_list:-"-"}" - if [ -z "${scan_list}" ] - then + if [ -z "${scan_list}" ]; then f_log "info" "no scan results on '${radio}'" continue 2 fi @@ -899,32 +822,31 @@ f_main() # scan loop # IFS="," - for spec in ${scan_list} - do - if [ -z "${scan_quality}" ] - then + for spec in ${scan_list}; do + if [ -z "${scan_quality}" ]; then scan_quality="${spec}" - elif [ -z "${scan_bssid}" ] - then + elif [ -z "${scan_bssid}" ]; then scan_bssid="${spec}" - elif [ -z "${scan_essid}" ] - then + elif [ -z "${scan_essid}" ]; then scan_essid="${spec}" - elif [ -z "${scan_open}" ] - then + elif [ -z "${scan_open}" ]; then scan_open="${spec}" fi - if [ -n "${scan_quality}" ] && [ -n "${scan_bssid}" ] && [ -n "${scan_essid}" ] && [ -n "${scan_open}" ] - then - if [ "${scan_quality}" -ge "${trm_minquality}" ] - then - if { { [ "${scan_essid}" = "\"${sta_essid//,/.}\"" ] && { [ -z "${sta_bssid}" ] || [ "${scan_bssid}" = "${sta_bssid}" ]; } } || \ - { [ "${scan_bssid}" = "${sta_bssid}" ] && [ "${scan_essid}" = "unknown" ]; } } && [ "${radio}" = "${sta_radio}" ] - then + if [ -n "${scan_quality}" ] && [ -n "${scan_bssid}" ] && [ -n "${scan_essid}" ] && [ -n "${scan_open}" ]; then + if [ "${scan_quality}" -ge "${trm_minquality}" ]; then + if { + { + [ "${scan_essid}" = "\"${sta_essid//,/.}\"" ] && { + [ -z "${sta_bssid}" ] || [ "${scan_bssid}" = "${sta_bssid}" ] + } + } || + { + [ "${scan_bssid}" = "${sta_bssid}" ] && [ "${scan_essid}" = "unknown" ] + } + } && [ "${radio}" = "${sta_radio}" ]; then f_vpn "disable" f_log "debug" "f_main ::: scan_quality: ${scan_quality}, scan_essid: ${scan_essid}, scan_bssid: ${scan_bssid:-"-"}, scan_open: ${scan_open}" - if [ -n "${config_radio}" ] - then + if [ -n "${config_radio}" ]; then uci_set "wireless" "${trm_activesta}" "disabled" "1" uci_commit "wireless" f_contrack "end" "${config_radio}" "${config_essid}" "${config_bssid}" @@ -936,22 +858,18 @@ f_main() # retrycnt=1 trm_radio="${sta_radio}" - while [ "${retrycnt}" -le "${trm_maxretry}" ] - do - if [ "${trm_randomize}" = "1" ] - then + while [ "${retrycnt}" -le "${trm_maxretry}" ]; do + if [ "${trm_randomize}" = "1" ]; then sta_mac="$(f_mac "set" "${section}")" fi uci_set "wireless" "${section}" "disabled" "0" f_check "sta" "false" "${sta_radio}" "${sta_essid}" "${sta_bssid}" - if [ "${trm_ifstatus}" = "true" ] - then + if [ "${trm_ifstatus}" = "true" ]; then unset IFS scan_list rm -f "${trm_mailfile}" uci_commit "wireless" f_contrack "start" "${sta_radio}" "${sta_essid}" "${sta_bssid}" - if [ "${trm_randomize}" = "0" ] - then + if [ "${trm_randomize}" = "0" ]; then sta_mac="$(f_mac "get" "${section}")" fi f_log "info" "connected to uplink '${sta_radio}/${sta_essid}/${sta_bssid:-"-"}' with mac '${sta_mac:-"-"}' (${retrycnt}/${trm_maxretry})" @@ -959,8 +877,7 @@ f_main() else uci -q revert "wireless" f_check "rev" "false" - if [ "${retrycnt}" = "${trm_maxretry}" ] - then + if [ "${retrycnt}" = "${trm_maxretry}" ]; then f_contrack "disabled" "${sta_radio}" "${sta_essid}" "${sta_bssid}" f_log "info" "uplink has been disabled '${sta_radio}/${sta_essid}/${sta_bssid:-"-"}' (${retrycnt}/${trm_maxretry})" break 2 @@ -969,11 +886,10 @@ f_main() f_log "info" "can't connect to uplink '${sta_radio}/${sta_essid}/${sta_bssid:-"-"}' (${retrycnt}/${trm_maxretry})" fi fi - retrycnt="$((retrycnt+1))" - sleep "$((trm_maxwait/6))" + retrycnt="$((retrycnt + 1))" + sleep "$((trm_maxwait / 6))" done - elif [ "${trm_autoadd}" = "1" ] && [ "${scan_open}" = "+" ] && [ "${scan_essid}" != "unknown" ] - then + elif [ "${trm_autoadd}" = "1" ] && [ "${scan_open}" = "+" ] && [ "${scan_essid}" != "unknown" ]; then scan_essid="${scan_essid%?}" scan_essid="${scan_essid:1}" f_addif "${sta_radio}" "${scan_essid}" @@ -995,8 +911,7 @@ f_main() # source required system libraries # -if [ -r "/lib/functions.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ] -then +if [ -r "/lib/functions.sh" ] && [ -r "/usr/share/libubox/jshn.sh" ]; then . "/lib/functions.sh" . "/usr/share/libubox/jshn.sh" else @@ -1005,39 +920,32 @@ fi # control travelmate actions # -if [ "${trm_action}" != "stop" ] -then +if [ "${trm_action}" != "stop" ]; then f_env fi -while true -do - if [ -z "${trm_action}" ] - then +while true; do + if [ -z "${trm_action}" ]; then rc=0 - while true - do - if [ "${rc}" = "0" ] - then + while true; do + if [ "${rc}" = "0" ]; then f_check "initial" "false" fi sleep "${trm_timeout}" 0 rc=${?} - if [ "${rc}" != "0" ] - then + if [ "${rc}" != "0" ]; then f_check "initial" "false" fi - if [ "${rc}" = "0" ] || { [ "${rc}" != "0" ] && [ "${trm_ifstatus}" = "false" ]; } - then + if [ "${rc}" = "0" ] || { + [ "${rc}" != "0" ] && [ "${trm_ifstatus}" = "false" ] + }; then break fi done - elif [ "${trm_action}" = "stop" ] - then - if [ -s "${trm_pidfile}" ] - then + elif [ "${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)" - > "${trm_rtfile}" - > "${trm_pidfile}" + : >"${trm_rtfile}" + : >"${trm_pidfile}" fi break else diff --git a/net/travelmate/files/travelmate.vpn b/net/travelmate/files/travelmate.vpn index 94da997a13..3ee18fea7f 100755 --- a/net/travelmate/files/travelmate.vpn +++ b/net/travelmate/files/travelmate.vpn @@ -1,10 +1,10 @@ #!/bin/sh # vpn switch for travelmate -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,3040,3043 # Please note: you have to setup the package 'wireguard' or 'openvpn' before using this script @@ -12,9 +12,10 @@ export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then - . "/lib/functions.sh" +# source function library if necessary +# +if [ -z "${_C}" ]; then + . "/lib/functions.sh" fi vpn_action="${1}" @@ -22,129 +23,93 @@ trm_vpnservice="$(uci_get travelmate global trm_vpnservice)" trm_vpniface="$(uci_get travelmate global trm_vpniface)" trm_landevice="$(uci_get travelmate global trm_landevice)" trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" -trm_captiveurl="$(uci_get travelmate global trm_captiveurl "http://captive.apple.com")" -trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0")" +trm_captiveurl="$(uci_get travelmate global trm_captiveurl "http://detectportal.firefox.com")" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" trm_iptrule_accept="FORWARD -i ${trm_landevice} -p tcp --match multiport --dports 80,443 -j ACCEPT" trm_iptrule_drop="FORWARD -i ${trm_landevice} -j DROP" trm_iptables="$(command -v iptables)" trm_logger="$(command -v logger)" trm_fetch="$(command -v curl)" -f_log() -{ - local class="${1}" log_msg="${2}" - - if [ -x "${trm_logger}" ] - then - "${trm_logger}" -p "${class}" -t "trm-vpn [${$}]" "${log_msg}" - else - printf "%s %s %s\\n" "${class}" "trm-vpn [${$}]" "${log_msg}" - fi -} - f_net() { - local IFS json_raw json_rc result="net nok" + local IFS json_rc result="net nok" - json_raw="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --write-out "%{json}" --silent --show-error --connect-timeout $((trm_maxwait/10)) "${trm_captiveurl}" 2>/dev/null)" - json_raw="${json_raw#*\{}" - if [ -n "${json_raw}" ] - then - json_rc="$(printf "%s" "{${json_raw}" | jsonfilter -l1 -e '@.response_code' 2>/dev/null)" - if [ "${json_rc}" = "200" ] || [ "${json_rc}" = "204" ] - then - result="net ok" - fi + json_rc="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --connect-timeout $((trm_maxwait / 10)) --header "Cache-Control: no-cache, no-store, must-revalidate" --header "Pragma: no-cache" --header "Expires: 0" --write-out "%{response_code}" --silent --show-error --output /dev/null "${trm_captiveurl}")" + if [ "${json_rc}" = "200" ] || [ "${json_rc}" = "204" ]; then + result="net ok" fi printf "%s" "${result}" } -if [ -n "${trm_vpnservice}" ] && [ -n "${trm_vpniface}" ] && [ -n "${trm_landevice}" ] && [ -f "/tmp/trm_runtime.json" ] -then +if [ -n "${trm_vpnservice}" ] && [ -n "${trm_vpniface}" ] && [ -n "${trm_landevice}" ] && [ -f "/tmp/trm_runtime.json" ]; then status="$(jsonfilter -i "/tmp/trm_runtime.json" -l1 -e '@.data.travelmate_status' 2>/dev/null)" vpn_status="$(ubus -S call network.interface."${trm_vpniface}" status 2>/dev/null | jsonfilter -l1 -e '@.up')" - if [ "${vpn_action}" = "disable" ] && [ "${vpn_status}" = "true" ] - then - if [ -n "$("${trm_iptables}" "-w $((trm_maxwait/6))" -C ${trm_iptrule_drop} 2>&1)" ] && \ - [ -n "$("${trm_iptables}" "-w $((trm_maxwait/6))" -C ${trm_iptrule_accept} 2>&1)" ] - then - "${trm_iptables}" "-w $((trm_maxwait/6))" -I ${trm_iptrule_drop} 2>&1 - f_log "info" "lan forward blocked for device '${trm_landevice}'" + if [ "${vpn_action}" = "disable" ] && [ "${vpn_status}" = "true" ]; then + if [ -n "$("${trm_iptables}" "-w $((trm_maxwait / 6))" -C "${trm_iptrule_drop}" 2>&1)" ] && + [ -n "$("${trm_iptables}" "-w $((trm_maxwait / 6))" -C "${trm_iptrule_accept}" 2>&1)" ]; then + "${trm_iptables}" "-w $((trm_maxwait / 6))" -I "${trm_iptrule_drop}" 2>&1 + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "lan forward blocked for device '${trm_landevice}'" 2>/dev/null fi fi - if [ "${vpn_action}" = "disable" ] && [ "${status%% (net cp *}" = "connected" ] - then - if [ -n "$("${trm_iptables}" "-w $((trm_maxwait/6))" -C ${trm_iptrule_accept} 2>&1)" ] && \ - [ -z "$("${trm_iptables}" "-w $((trm_maxwait/6))" -C ${trm_iptrule_drop} 2>&1)" ] - then - "${trm_iptables}" "-w $((trm_maxwait/6))" -I ${trm_iptrule_accept} 2>&1 - f_log "info" "lan forward on ports 80/443 freed for device '${trm_landevice}'" + if [ "${vpn_action}" = "disable" ] && [ "${status%% (net cp *}" = "connected" ]; then + if [ -n "$("${trm_iptables}" "-w $((trm_maxwait / 6))" -C "${trm_iptrule_accept}" 2>&1)" ] && + [ -z "$("${trm_iptables}" "-w $((trm_maxwait / 6))" -C "${trm_iptrule_drop}" 2>&1)" ]; then + "${trm_iptables}" "-w $((trm_maxwait / 6))" -I "${trm_iptrule_accept}" 2>&1 + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "lan forward on ports 80/443 freed for device '${trm_landevice}'" 2>/dev/null fi fi case "${trm_vpnservice}" in "wireguard") - if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" != "true" ] - then + if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" != "true" ]; then ubus call network.interface."${trm_vpniface}" up - elif [ "${vpn_action}" = "disable" ] && [ "${vpn_status}" = "true" ] - then + elif [ "${vpn_action}" = "disable" ] && [ "${vpn_status}" = "true" ]; then ubus call network.interface."${trm_vpniface}" down - f_log "info" "${trm_vpnservice} client connection disabled" + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "${trm_vpnservice} client connection disabled" 2>/dev/null fi - ;; + ;; "openvpn") - if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" != "true" ] - then + if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" != "true" ]; then ubus call network.interface."${trm_vpniface}" up /etc/init.d/openvpn restart >/dev/null 2>&1 - elif [ "${vpn_action}" = "disable" ] && [ "${vpn_status}" = "true" ] - then + elif [ "${vpn_action}" = "disable" ] && [ "${vpn_status}" = "true" ]; then ubus call network.interface."${trm_vpniface}" down /etc/init.d/openvpn stop >/dev/null 2>&1 - f_log "info" "${trm_vpnservice} client connection disabled" + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "${trm_vpnservice} client connection disabled" 2>/dev/null fi - ;; + ;; esac - if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" != "true" ] - then + if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" != "true" ]; then cnt=0 - while true - do + while true; do vpn_status="$(ubus -S call network.interface."${trm_vpniface}" status 2>/dev/null | jsonfilter -l1 -e '@.up')" - if [ "${vpn_status}" = "true" ] - then + if [ "${vpn_status}" = "true" ]; then net_status="$(f_net)" - if [ "${net_status}" = "net ok" ] - then - f_log "info" "${trm_vpnservice} client connection enabled" - if [ -z "$("${trm_iptables}" "-w $((trm_maxwait/6))" -C ${trm_iptrule_drop} 2>&1)" ] - then - "${trm_iptables}" "-w $((trm_maxwait/6))" -D ${trm_iptrule_drop} 2>&1 - if [ -z "$("${trm_iptables}" "-w $((trm_maxwait/6))" -C ${trm_iptrule_accept} 2>&1)" ] - then - "${trm_iptables}" "-w $((trm_maxwait/6))" -D ${trm_iptrule_accept} 2>&1 + if [ "${net_status}" = "net ok" ]; then + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "${trm_vpnservice} client connection enabled" 2>/dev/null + if [ -z "$("${trm_iptables}" "-w $((trm_maxwait / 6))" -C "${trm_iptrule_drop}" 2>&1)" ]; then + "${trm_iptables}" "-w $((trm_maxwait / 6))" -D "${trm_iptrule_drop}" 2>&1 + if [ -z "$("${trm_iptables}" "-w $((trm_maxwait / 6))" -C "${trm_iptrule_accept}" 2>&1)" ]; then + "${trm_iptables}" "-w $((trm_maxwait / 6))" -D "${trm_iptrule_accept}" 2>&1 fi - f_log "info" "lan forward freed for device '${trm_landevice}'" + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "lan forward freed for device '${trm_landevice}'" 2>/dev/null fi break fi fi - if [ "${cnt}" -ge "$((trm_maxwait/6))" ] - then - f_log "info" "${trm_vpnservice} restart failed, lan forward for device '${trm_landevice}' still blocked" + if [ "${cnt}" -ge "$((trm_maxwait / 6))" ]; then + "${trm_logger}" -p "info" -t "trm-vpn [${$}]" "${trm_vpnservice} restart failed, lan forward for device '${trm_landevice}' still blocked" 2>/dev/null ubus call network.interface."${trm_vpniface}" down exit 2 fi sleep 1 - cnt="$((cnt+1))" + cnt="$((cnt + 1))" done fi - if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" = "true" ] - then - if [ -f "/etc/init.d/sysntpd" ] - then + if [ "${vpn_action}" = "enable" ] && [ "${vpn_status}" = "true" ]; then + if [ -f "/etc/init.d/sysntpd" ]; then /etc/init.d/sysntpd restart >/dev/null 2>&1 fi fi diff --git a/net/travelmate/files/travelmate_ntp.hotplug b/net/travelmate/files/travelmate_ntp.hotplug index 2a215e4ba4..6a9be8219a 100755 --- a/net/travelmate/files/travelmate_ntp.hotplug +++ b/net/travelmate/files/travelmate_ntp.hotplug @@ -1,34 +1,19 @@ #!/bin/sh # ntp hotplug script for travelmate -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=3023 trm_init="/etc/init.d/travelmate" trm_ntpfile="/var/state/travelmate.ntp" trm_logger="$(command -v logger)" -f_log() -{ - local class="${1}" log_msg="${2}" - - if [ -x "${trm_logger}" ] - then - "${trm_logger}" -p "${class}" -t "trm-ntp [${$}]" "${log_msg}" - else - printf "%s %s %s\\n" "${class}" "trm-ntp [${$}]" "${log_msg}" - fi -} - -if [ "${ACTION}" = "stratum" ] && [ ! -f "${trm_ntpfile}" ] && [ "$("${trm_init}" enabled; printf "%u" ${?})" = "0" ] -then +if [ "${ACTION}" = "stratum" ] && [ ! -f "${trm_ntpfile}" ] && "${trm_init}" enabled; then { - flock -xn 1001 - if [ "$?" = "0" ] - then - f_log "info" "get ntp time sync" + if flock -xn 1001; then + "${trm_logger}" -p "info" -t "trm-ntp [${$}]" "get ntp time sync" 2>/dev/null "${trm_init}" restart fi } 1001>"${trm_ntpfile}" diff --git a/net/travelmate/files/vodafone.login b/net/travelmate/files/vodafone.login new file mode 100755 index 0000000000..17628da624 --- /dev/null +++ b/net/travelmate/files/vodafone.login @@ -0,0 +1,49 @@ +#!/bin/sh +# captive portal auto-login script for vodafone hotspots (DE) +# Copyright (c) 2021 Dirk Brenken (dev@brenken.org) +# This is free software, licensed under the GNU General Public License v3. + +# set (s)hellcheck exceptions +# shellcheck disable=1091,3040 + +export LC_ALL=C +export PATH="/usr/sbin:/usr/bin:/sbin:/bin" +set -o pipefail + +# source function library if necessary +# +if [ -z "${_C}" ]; then + . "/lib/functions.sh" +fi + +username="${1}" +password="${2}" +trm_domain="hotspot.vodafone.de" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" +trm_captiveurl="$(uci_get travelmate global trm_captiveurl "http://detectportal.firefox.com")" +trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" +trm_fetch="$(command -v curl)" + +# get sid +# +raw_html="$(${trm_fetch} --user-agent "${trm_useragent}" --referer "http://www.example.com" --connect-timeout $((trm_maxwait / 6)) --write-out "%{redirect_url}" --silent --show-error --output /dev/null "${trm_captiveurl}")" +sid="$(printf "%s" "${raw_html}" 2>/dev/null | awk 'BEGIN{FS="[=&]"}{printf "%s",$2}')" +if [ -z "${sid}" ]; then + exit 1 +fi + +# get session +# +raw_html="$("${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://${trm_domain}/portal/?sid=${sid}" --silent --connect-timeout $((trm_maxwait / 6)) "https://${trm_domain}/api/v4/session?sid=${sid}")" +session="$(printf "%s" "${raw_html}" 2>/dev/null | jsonfilter -q -l1 -e '@.session')" +if [ -z "${session}" ]; then + exit 2 +fi + +# final login request +# +raw_html="$("${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://${trm_domain}/portal/?sid=${sid}" --silent --connect-timeout $((trm_maxwait / 6)) --data "accessType=csc-community&accountType=csc&loginProfile=4&password=${password}&session=${session}&username=${username}&save=true" "https://${trm_domain}/api/v4/login?sid=${sid}")" +success="$(printf "%s" "${raw_html}" 2>/dev/null | jsonfilter -q -l1 -e '@.success')" +if [ "${success}" != "true" ]; then + exit 3 +fi diff --git a/net/travelmate/files/wifionice.login b/net/travelmate/files/wifionice.login index c74a2bf14d..316c747013 100755 --- a/net/travelmate/files/wifionice.login +++ b/net/travelmate/files/wifionice.login @@ -1,41 +1,38 @@ #!/bin/sh -# captive portal auto-login script for german ICE hotspots -# Copyright (c) 2020 Dirk Brenken (dev@brenken.org) +# captive portal auto-login script for ICE hotspots (DE) +# Copyright (c) 2020-2021 Dirk Brenken (dev@brenken.org) # This is free software, licensed under the GNU General Public License v3. # set (s)hellcheck exceptions -# shellcheck disable=1091,2016,2039,2059,2086,2143,2181,2188 +# shellcheck disable=1091,2181,3040 export LC_ALL=C export PATH="/usr/sbin:/usr/bin:/sbin:/bin" set -o pipefail -if [ "$(uci_get 2>/dev/null; printf "%u" "${?}")" = "127" ] -then - . "/lib/functions.sh" +# source function library if necessary +# +if [ -z "${_C}" ]; then + . "/lib/functions.sh" fi trm_domain="www.wifionice.de" -trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0")" +trm_useragent="$(uci_get travelmate global trm_useragent "Mozilla/5.0 (Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0")" trm_maxwait="$(uci_get travelmate global trm_maxwait "30")" trm_fetch="$(command -v curl)" -# initial get request to receive & extract a valid security token +# get security token # -"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait/6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "http://${trm_domain}/en/" -if [ -f "/tmp/${trm_domain}.cookie" ] -then - sec_token="$(awk '/csrf/{print $7}' "/tmp/${trm_domain}.cookie")" - rm -f "/tmp/${trm_domain}.cookie" -else - exit 2 +"${trm_fetch}" --user-agent "${trm_useragent}" --referer "http://www.example.com" --silent --connect-timeout $((trm_maxwait / 6)) --cookie-jar "/tmp/${trm_domain}.cookie" --output /dev/null "http://${trm_domain}/en/" +sec_token="$(awk '/csrf/{print $7}' "/tmp/${trm_domain}.cookie" 2>/dev/null)" +rm -f "/tmp/${trm_domain}.cookie" +if [ -z "${sec_token}" ]; then + exit 1 fi -# final post request/login with valid session cookie/security token +# final post request # -if [ -n "${sec_token}" ] -then - "${trm_fetch}" --user-agent "${trm_useragent}" --silent --connect-timeout $((trm_maxwait/6)) --header "Cookie: csrf=${sec_token}" --data "login=true&CSRFToken=${sec_token}&connect=" --output /dev/null "http://${trm_domain}/en/" -else - exit 3 +"${trm_fetch}" --user-agent "${trm_useragent}" --silent --connect-timeout $((trm_maxwait / 6)) --header "Cookie: csrf=${sec_token}" --data "login=true&CSRFToken=${sec_token}&connect=" --output /dev/null "http://${trm_domain}/en/" +if [ "${?}" != "0" ]; then + exit 2 fi