#
LC_ALL=C
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
-trm_ver="1.0.1"
+trm_ver="1.0.2"
trm_sysver="unknown"
trm_enabled=0
trm_debug=0
trm_rtfile="/tmp/trm_runtime.json"
trm_wpa="$(command -v wpa_supplicant)"
-# f_envload: load travelmate environment
+# load travelmate environment
#
f_envload()
{
if [ ${trm_enabled} -ne 1 ]
then
- f_log "info " "travelmate is currently disabled, please set 'trm_enabled' to '1' to use this service"
+ f_log "info" "travelmate is currently disabled, please set 'trm_enabled' to '1' to use this service"
exit 0
fi
trm_eap="$("${trm_wpa}" -veap >/dev/null 2>&1; printf "%u" ${?})"
}
-# f_prepare: gather radio information & bring down all STA interfaces
+# gather radio information & bring down all STA interfaces
#
-f_prepare()
+f_prep()
{
local config="${1}"
local mode="$(uci -q get wireless."${config}".mode)"
trm_stalist="${trm_stalist} ${config}_${radio}"
fi
fi
- f_log "debug" "prepare: ${config}, mode: ${mode}, network: ${network}, radio: ${radio}, eap: ${trm_eap}, disabled: ${disabled}"
+ f_log "debug" "f_prep ::: config: ${config}, mode: ${mode}, network: ${network}, radio: ${radio}, disabled: ${disabled}"
}
-# f_check: check interface status
+# check interface status
#
f_check()
{
- local ifname radio status cnt=1 mode="${1}"
+ local ifname radio dev_status cnt=1 mode="${1}" status="${2:-"false"}"
trm_ifstatus="false"
ubus call network reload
while [ ${cnt} -le ${trm_maxwait} ]
do
- status="$(ubus -S call network.wireless status 2>/dev/null)"
- if [ -n "${status}" ]
+ dev_status="$(ubus -S call network.wireless status 2>/dev/null)"
+ if [ -n "${dev_status}" ]
then
if [ "${mode}" = "dev" ]
then
+ if [ "${trm_ifstatus}" != "${status}" ]
+ then
+ trm_ifstatus="${status}"
+ f_jsnup
+ fi
for radio in ${trm_radiolist}
do
- trm_ifstatus="$(printf "%s" "${status}" | jsonfilter -l1 -e "@.${radio}.up")"
+ trm_ifstatus="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e "@.${radio}.up")"
if [ "${trm_ifstatus}" = "true" ] && [ -z "$(printf "%s" "${trm_devlist}" | grep -Fo " ${radio}")" ]
then
trm_devlist="${trm_devlist} ${radio}"
fi
done
- ifname="${trm_devlist}"
+ if [ "${trm_radiolist}" = "${trm_devlist}" ] || [ ${cnt} -eq ${trm_maxwait} ] || [ "${status}" = "false" ]
+ then
+ ifname="${trm_devlist}"
+ break
+ fi
else
- ifname="$(printf "%s" "${status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
+ ifname="$(printf "%s" "${dev_status}" | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
if [ -n "${ifname}" ]
then
trm_ifstatus="$(ubus -S call network.interface dump 2>/dev/null | jsonfilter -l1 -e "@.interface[@.device=\"${ifname}\"].up")"
fi
if [ "${mode}" = "initial" ] || [ "${trm_ifstatus}" = "true" ]
then
+ if [ "${mode}" != "initial" ] && [ "${trm_ifstatus}" != "${status}" ]
+ then
+ f_jsnup
+ fi
break
fi
fi
cnt=$((cnt+1))
sleep 1
done
- f_log "debug" "check: ${mode}, name: ${ifname}, status: ${trm_ifstatus}, count: ${cnt}, max-wait: ${trm_maxwait}, automatic: ${trm_automatic}"
+ f_log "debug" "f_check::: mode: ${mode}, name: ${ifname}, status: ${trm_ifstatus}, cnt: ${cnt}, max-wait: ${trm_maxwait}, automatic: ${trm_automatic}"
}
-# f_jsnupdate: update runtime information
+# update runtime information
#
-f_jsnupdate()
+f_jsnup()
{
- local iface="${1}" radio="${2}" essid="${3:-"-"}" bssid="${4:-"-"}"
+ local status iface="${1}" radio="${2}" essid="${3}" bssid="${4}"
+
+ if [ "${trm_ifstatus}" = "true" ]
+ then
+ status="connected"
+ elif [ "${trm_ifstatus}" = "false" ]
+ then
+ status="not connected"
+ elif [ "${trm_ifstatus}" = "running" ]
+ then
+ status="running"
+ elif [ "${trm_ifstatus}" = "error" ]
+ then
+ status="error"
+ fi
json_init
json_add_object "data"
+ json_add_string "travelmate_status" "${status}"
json_add_string "travelmate_version" "${trm_ver}"
- json_add_string "station_connection" "${trm_ifstatus}"
- json_add_string "station_id" "${essid}/${bssid}"
- json_add_string "station_interface" "${iface}"
- json_add_string "station_radio" "${radio}"
+ json_add_string "station_id" "${essid:-"-"}/${bssid:-"-"}"
+ json_add_string "station_interface" "${iface:-"n/a"}"
+ json_add_string "station_radio" "${radio:-"n/a"}"
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_status: output runtime information
-#
-f_status()
-{
- local key keylist value
-
- if [ -s "${trm_rtfile}" ]
- then
- printf "%s\n" "::: travelmate runtime information"
- json_load "$(cat "${trm_rtfile}" 2>/dev/null)"
- json_select data
- json_get_keys keylist
- for key in ${keylist}
- do
- json_get_var value "${key}"
- printf " %-18s : %s\n" "${key}" "${value}"
- done
- fi
-}
-
-# f_log: write to syslog, exit on error
+# write to syslog
#
f_log()
{
if [ -n "${log_msg}" ] && ([ "${class}" != "debug" ] || [ ${trm_debug} -eq 1 ])
then
- logger -t "travelmate-[${trm_ver}] ${class}" "${log_msg}"
- if [ "${class}" = "error" ]
+ logger -p "${class}" -t "travelmate-[${trm_ver}]" "${log_msg}"
+ if [ "${class}" = "err" ]
then
- logger -t "travelmate-[${trm_ver}] ${class}" "Please check 'https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md' (${trm_sysver})"
- exit 255
+ trm_ifstatus="error"
+ f_jsnup
+ logger -p "${class}" -t "travelmate-[${trm_ver}]" "Please check 'https://github.com/openwrt/packages/blob/master/net/travelmate/files/README.md' (${trm_sysver})"
+ exit 1
fi
fi
}
-# f_main: main function for connection handling
+# main function for connection handling
#
f_main()
{
f_check "initial"
if [ "${trm_ifstatus}" != "true" ]
then
- > "${trm_rtfile}"
config_load wireless
- config_foreach f_prepare wifi-iface
+ config_foreach f_prep wifi-iface
if [ -n "$(uci -q changes wireless)" ]
then
uci -q commit wireless
fi
- f_check "dev"
- f_log "debug" "main: ${trm_devlist}, sta-list: ${trm_stalist}"
+ f_check "dev" "running"
+ f_log "debug" "f_main ::: iwinfo: ${trm_iwinfo}, eap_rc: ${trm_eap}, dev_list: ${trm_devlist}, sta_list: ${trm_stalist}"
for dev in ${trm_devlist}
do
cnt=1
raw_scan="$(${trm_iwinfo} "${dev}" scan)"
essid_list="$(printf "%s" "${raw_scan}" | awk '/ESSID: "/{ORS=" ";if (!seen[$0]++) for(i=2; i<=NF; i++) print $i}')"
bssid_list="$(printf "%s" "${raw_scan}" | awk '/Address: /{ORS=" ";if (!seen[$5]++) print $5}')"
- f_log "debug" "main: ${trm_iwinfo}, dev: ${dev}"
- f_log "debug" "main: ${essid_list}"
- f_log "debug" "main: ${bssid_list}"
+ f_log "debug" "f_main ::: dev: ${dev}, ssid_list: ${essid_list}, bssid_list: ${bssid_list}"
if [ -n "${essid_list}" ] || [ -n "${bssid_list}" ]
then
for sta in ${trm_stalist}
if [ "${trm_ifstatus}" = "true" ]
then
uci -q commit wireless
- f_log "info " "interface '${sta_iface}' on '${sta_radio}' connected to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${trm_sysver})"
- f_jsnupdate "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+ f_log "info" "interface '${sta_iface}' on '${sta_radio}' connected to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${trm_sysver})"
+ f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
return 0
elif [ ${trm_maxretry} -ne 0 ] && [ ${cnt} -eq ${trm_maxretry} ]
then
fi
uci -q commit wireless
f_check "dev"
- f_log "info " "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}), uplink disabled (${trm_sysver})"
+ f_log "info" "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}), uplink disabled (${trm_sysver})"
else
if [ ${trm_maxretry} -eq 0 ]
then
fi
uci -q revert wireless
f_check "dev"
- f_log "info " "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}) (${trm_sysver})"
+ f_log "info" "can't connect to uplink '${sta_essid:-"-"}/${sta_bssid:-"-"}' (${cnt}/${trm_maxretry}) (${trm_sysver})"
fi
- f_jsnupdate "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+ f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
fi
done
fi
if [ ! -s "${trm_rtfile}" ]
then
trm_ifstatus="false"
- f_jsnupdate "n/a" "n/a"
+ f_jsnup
fi
else
if [ ! -s "${trm_rtfile}" ]
sta_essid="$(uci -q get wireless."${config}".ssid)"
sta_bssid="$(uci -q get wireless."${config}".bssid)"
sta_iface="$(uci -q get wireless."${config}".network)"
- f_jsnupdate "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
+ f_jsnup "${sta_iface}" "${sta_radio}" "${sta_essid}" "${sta_bssid}"
fi
fi
}
. "/lib/functions.sh"
. "/usr/share/libubox/jshn.sh"
else
- f_log "error" "system libraries not found"
+ f_log "err" "system libraries not found"
fi
-# handle different travelmate actions
+# control travelmate actions
#
f_envload
-case "${1}" in
- status)
- f_status
- ;;
- *)
- f_main
- while [ ${trm_automatic} -eq 1 ]
- do
- sleep ${trm_timeout}
- f_envload
- f_main
- done
- ;;
-esac
+f_main
+while [ ${trm_automatic} -eq 1 ]
+do
+ sleep ${trm_timeout}
+ f_envload
+ f_main
+done
exit 0