travelmate: release 0.4.0 4102/head
authorDirk Brenken <dev@brenken.org>
Fri, 3 Mar 2017 13:39:38 +0000 (14:39 +0100)
committerDirk Brenken <dev@brenken.org>
Fri, 3 Mar 2017 13:39:38 +0000 (14:39 +0100)
* add an "active mode", where travelmate will be restarted
  every n seconds (default 60) and checks existing uplink connection
  regardless of ifdown event trigger (disabled by default)
* enhance multiple radio support
    * fix the ap detection
    * respect different radios during scanning & connection handling
* cosmetics

Signed-off-by: Dirk Brenken <dev@brenken.org>
net/travelmate/Makefile
net/travelmate/files/README.md
net/travelmate/files/travelmate.conf
net/travelmate/files/travelmate.init
net/travelmate/files/travelmate.sh

index ca31adb0f7aa9183796b52c42ed4f77e4320164e..c16bfc8a90d797d6bd961fb3e46bb5d84940d46e 100644 (file)
@@ -6,7 +6,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=travelmate
-PKG_VERSION:=0.3.5
+PKG_VERSION:=0.4.0
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-3.0+
 PKG_MAINTAINER:=Dirk Brenken <dev@brenken.org>
index 0570558d9a2ebb40ca080c97f5b35e7e0b7a1b55..5671e78d9bcd7eeb3569a375523e09c0feaeacdc 100644 (file)
@@ -9,7 +9,8 @@ To avoid these kind of deadlocks, travelmate set all station interfaces in an "a
 * STA interfaces operating in an "always off" mode, to make sure that the AP is always accessible
 * easy setup within normal OpenWrt/LEDE environment
 * fast uplink connections
-* support multiple radios
+* "active mode" support, where travelmate will be restarted every n seconds (default 60) and checks the existing uplink connection regardless of ifdown event trigger
+* support of devices with multiple radios
 * procd init system support
 * procd based hotplug support, the travelmate start will be triggered by interface triggers
 * status & debug logging to syslog
@@ -41,8 +42,10 @@ To avoid these kind of deadlocks, travelmate set all station interfaces in an "a
 * travelmate config options:
     * trm\_enabled => main switch to enable/disable the travelmate service (default: '0', disabled)
     * trm\_debug => enable/disable debug logging (default: '0', disabled)
+    * trm\_active => keep travelmate in an active state (default: '0', disabled)
     * trm\_maxwait => how long (in seconds) should travelmate wait for wlan interface reload action (default: '20')
     * trm\_maxretry => how many times should travelmate try to find an uplink after a trigger event (default: '3')
+    * trm\_timeout => timeout in seconds for "active mode" (default: '60')
     * trm\_iw => set this option to '0' to use iwinfo for wlan scanning (default: '1', use iw)
     * trm\_radio => limit travelmate to a dedicated radio, e.g. 'radio0' (default: not set, use all radios)
     * trm\_iface => restrict the procd interface trigger to a (list of) certain wan interface(s) or disable it at all (default: not set, disabled)
index c63000f3806b7969a8beab630ea6e23b8ffb4419..f51973e9c2a62194d98c41ee27f61bba1c2048b2 100644 (file)
@@ -4,6 +4,8 @@
 config travelmate 'global'
        option trm_enabled '0'
        option trm_debug '0'
+       option trm_active '0'
        option trm_maxwait '20'
        option trm_maxretry '3'
+       option trm_timeout '60'
        option trm_iw '1'
index c6f81255ab5da44b997d2936f34c883244168cc5..71afc0dd11568bf07a2f097b93fc56fd09aec6a7 100755 (executable)
@@ -11,7 +11,6 @@ start_service()
     then
         ubus -t 30 wait_for network.interface
         procd_open_instance "travelmate"
-        procd_set_param env trm_procd="true"
         procd_set_param command "${trm_script}" "${@}"
         procd_set_param stdout 1
         procd_set_param stderr 1
@@ -23,8 +22,6 @@ service_triggers()
 {
     local iface="$(uci -q get travelmate.global.trm_iface)"
 
-    procd_open_trigger
-    procd_add_config_trigger "config.change" "travelmate" /etc/init.d/travelmate start
     if [ -z "${iface}" ]
     then
         procd_add_raw_trigger "interface.*.down" 1000 /etc/init.d/travelmate start
@@ -34,5 +31,5 @@ service_triggers()
             procd_add_interface_trigger "interface.*.down" "${name}" /etc/init.d/travelmate start
         done
     fi
-    procd_close_trigger
+    procd_add_config_trigger "config.change" "travelmate" /etc/init.d/travelmate start
 }
index 734b0167ca2b89f7f8b9620db9cf53cc0cf1ddd4..1a9131de5a26d24e2451deb5a8406b9c3857bae1 100755 (executable)
 #
 LC_ALL=C
 PATH="/usr/sbin:/usr/bin:/sbin:/bin"
-trm_ver="0.3.5"
+trm_ver="0.4.0"
 trm_enabled=1
 trm_debug=0
+trm_active=0
 trm_maxwait=20
 trm_maxretry=3
-trm_radio="*"
+trm_timeout=60
 trm_iw=1
 
 f_envload()
@@ -65,34 +66,46 @@ f_prepare()
 {
     local config="${1}"
     local mode="$(uci -q get wireless."${config}".mode)"
-    local network="$(uci -q get wireless."${config}".network)"
+    local radio="$(uci -q get wireless."${config}".device)"
     local disabled="$(uci -q get wireless."${config}".disabled)"
 
-    if [ "${mode}" = "sta" ] && [ -n "${network}" ]
+    if [ "${mode}" = "ap" ] && ([ -z "${disabled}" ] || [ "${disabled}" = "0" ]) && \
+        ([ -z "${trm_radio}" ] || [ "${trm_radio}" = "${radio}" ])
     then
-        trm_stalist="${trm_stalist} ${config}_${network}"
+        trm_radiolist="${trm_radiolist} ${radio}"
+    elif [ "${mode}" = "sta" ]
+    then
+        trm_stalist="${trm_stalist} ${config}_${radio}"
         if [ -z "${disabled}" ] || [ "${disabled}" = "0" ]
         then
             uci -q set wireless."${config}".disabled=1
-            f_log "debug" "config: ${config}, interface: ${network}"
         fi
     fi
+    f_log "debug" "mode: ${mode}, radio: ${radio}, config: ${config}, disabled: ${disabled}"
 }
 
 f_check()
 {
-    local ifname cnt=1 mode="${1}"
+    local ifname radio cnt=1 mode="${1}"
     trm_ifstatus="false"
 
     while [ ${cnt} -le ${trm_maxwait} ]
     do
         if [ "${mode}" = "ap" ]
         then
-            ifname="$(ubus -S call network.wireless status | jsonfilter -l1 -e "@.${trm_radio}.interfaces[@.config.mode=\"ap\"].ifname")"
-            if [ -n "${ifname}" ]
-            then
-                trm_ifstatus="$(ubus -S call network.wireless status | jsonfilter -l1 -e "@.${trm_radio}.up")"
-            fi
+            for radio in ${trm_radiolist}
+            do
+                trm_ifstatus="$(ubus -S call network.wireless status | jsonfilter -e "@.${radio}.up")"
+                if [ "${trm_ifstatus}" = "true" ]
+                then
+                    trm_aplist="${trm_aplist} $(ubus -S call network.wireless status | jsonfilter -e "@.${radio}.interfaces[@.config.mode=\"ap\"].ifname")_${radio}"
+                    ifname="${trm_aplist}"
+                else
+                    trm_aplist=""
+                    trm_ifstatus="false"
+                    break
+                fi
+            done
         else
             ifname="$(ubus -S call network.wireless status | jsonfilter -l1 -e '@.*.interfaces[@.config.mode="sta"].ifname')"
             if [ -n "${ifname}" ]
@@ -107,7 +120,7 @@ f_check()
         cnt=$((cnt+1))
         sleep 1
     done
-    f_log "debug" "mode: ${mode}, radio: ${trm_radio}, name: ${ifname}, status: ${trm_ifstatus}, count: ${cnt}, max-wait: ${trm_maxwait}"
+    f_log "debug" "mode: ${mode}, name: ${ifname}, status: ${trm_ifstatus}, count: ${cnt}, max-wait: ${trm_maxwait}"
 }
 
 # function to write to syslog
@@ -130,7 +143,7 @@ f_log()
 
 f_main()
 {
-    local ap_list ssid_list config network ssid cnt=1
+    local ssid_list config ap_radio sta_radio ssid cnt=1
     local sysver="$(ubus -S call system board | jsonfilter -e '@.release.description')"
 
     f_log "info " "start travelmate scanning ..."
@@ -145,15 +158,20 @@ f_main()
             ubus call network reload
         fi
         f_check "ap"
-        ap_list="$(ubus -S call network.wireless status | jsonfilter -e "@.${trm_radio}.interfaces[@.config.mode=\"ap\"].ifname" | awk '{ORS=" "; print $0}')"
-        f_log "debug" "ap-list: ${ap_list}, sta-list: ${trm_stalist}"
-        if [ -z "${ap_list}" ] || [ -z "${trm_stalist}" ]
+        f_log "debug" "ap-list: ${trm_aplist}, sta-list: ${trm_stalist}"
+        if [ -z "${trm_aplist}" ] || [ -z "${trm_stalist}" ]
         then
             f_log "error" "no usable AP/STA configuration found"
         fi
-        for ap in ${ap_list}
+        for ap in ${trm_aplist}
         do
             cnt=1
+            ap_radio="${ap##*_}"
+            ap="${ap%%_*}"
+            if [ -z "$(printf "${trm_stalist}" | grep -Fo "_${ap_radio}")" ]
+            then
+                continue
+            fi
             while [ ${cnt} -le ${trm_maxretry} ]
             do
                 if [ ${trm_iw} -eq 1 ]
@@ -170,9 +188,9 @@ f_main()
                     for sta in ${trm_stalist}
                     do
                         config="${sta%%_*}"
-                        network="${sta##*_}"
+                        sta_radio="${sta##*_}"
                         ssid="\"$(uci -q get wireless."${config}".ssid)\""
-                        if [ -n "$(printf "${ssid_list}" | grep -Fo "${ssid}")" ]
+                        if [ -n "$(printf "${ssid_list}" | grep -Fo "${ssid}")" ] && [ "${ap_radio}" = "${sta_radio}" ]
                         then
                             uci -q set wireless."${config}".disabled=0
                             uci -q commit wireless
@@ -204,9 +222,13 @@ f_main()
     fi
 }
 
-if [ "${trm_procd}" = "true" ]
+f_envload
+f_main
+
+# keep travelmate in an active state
+#
+if [ ${trm_active} -eq 1 ]
 then
-    f_envload
-    f_main
+    (sleep ${trm_timeout}; /etc/init.d/travelmate start >/dev/null 2>&1) &
 fi
 exit 0