6in4: fix update timeout
authorJo-Philipp Wich <jow@openwrt.org>
Sun, 8 Feb 2015 22:20:38 +0000 (22:20 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sun, 8 Feb 2015 22:20:38 +0000 (22:20 +0000)
The recent rework of the 6in4 endpoint update broke the retry mechanism.
Rework the timeout handling and make the update status more verbose.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44327 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/network/ipv6/6in4/Makefile
package/network/ipv6/6in4/files/6in4.sh

index 0dc1068..ef96912 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=6in4
-PKG_VERSION:=19
+PKG_VERSION:=20
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-2.0
 
index 00b6e35..f8a43ce 100755 (executable)
@@ -9,6 +9,19 @@
        init_proto "$@"
 }
 
+proto_6in4_update() {
+       sh -c '
+               local timeout=5
+
+               (while [ $((timeout--)) -gt 0 ]; do
+                       sleep 1
+                       kill -0 $$ || exit 0
+               done; kill -9 $$) 2>/dev/null &
+
+               exec "$@"
+       ' "$1" "$@"
+}
+
 proto_6in4_setup() {
        local cfg="$1"
        local iface="$2"
@@ -97,13 +110,20 @@ proto_6in4_setup() {
                local try=0
                local max=3
 
-               while [ $((++try)) -le $max ]; do
-                       ( exec $urlget $urlget_opts "$url" | logger -t "$link" ) &
-                       local pid=$!
-                       ( sleep 20; kill $pid 2>/dev/null ) &
-                       wait $pid && break
-                       sleep 20;
-               done
+               (
+                       set -o pipefail
+                       while [ $((++try)) -le $max ]; do
+                               if proto_6in4_update $urlget $urlget_opts "$url" 2>&1 | \
+                                       sed -e 's,^Killed$,timeout,' -e "s,^,update $try/$max: ," | \
+                                       logger -t "$link";
+                               then
+                                       logger -t "$link" "updated"
+                                       return 0
+                               fi
+                               sleep 5
+                       done
+                       logger -t "$link" "update failed"
+               )
        }
 }