alfred: workaround race condition when batmanif is not ready at boot time
authorGui Iribarren <gui@altermundi.net>
Fri, 13 Dec 2013 19:05:26 +0000 (16:05 -0300)
committerSimon Wunderlich <sw@simonwunderlich.de>
Mon, 16 Dec 2013 15:03:44 +0000 (16:03 +0100)
Wait up to 30 seconds during init.d script on boot, so that batmanif can
come up. If the timeout is reached, the init.d script refuses to start
alfred and related daemons.

This prevents an alfred crash when it would start during early boot, before
batmanif is available. Instead, alfred is started as soon as batmanif appears,
if that happens during the 30-second window.

Signed-off-by: Gui Iribarren <gui@altermundi.net>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
alfred/Makefile
alfred/files/alfred.init

index b9c2c33f56cac781dbb163e836297a63fbd5c7c9..c8e73c27a7c6dbb1606b99d7d61b5fe6e1a4aee9 100644 (file)
@@ -12,7 +12,7 @@ include $(TOPDIR)/rules.mk
 #
 PKG_NAME:=alfred
 PKG_VERSION:=2013.4.0
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 PKG_MD5SUM:=3891697e127b1037cfc9349fd96e9993
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
index b678d4c8be74d970f851b0f2f73e7e9b610e46de..b777b535ab3d8587321b614b776543e3d0583d72 100755 (executable)
@@ -16,6 +16,7 @@ pid_file_alfred="/var/run/alfred.pid"
 pid_file_vis="/var/run/batadv-vis.pid"
 enable=0
 vis_enable=0
+batmanif=""
 SERVICE_DAEMONIZE=1
 SERVICE_WRITE_PID=1
 
@@ -23,7 +24,7 @@ alfred_start()
 {
        local args=""
        local section="$1"
-       local disabled interface mode batmanif
+       local disabled interface mode
 
        # check if section is disabled
        config_get_bool disabled "$section" disabled 0
@@ -62,6 +63,21 @@ start()
        if [ "$enable" = "0" ]; then
                exit 0
        fi
+
+       mesh_dir="/sys/class/net/$batmanif/mesh/"
+       if ! [ -d "$mesh_dir" ] ; then
+               timeout=30
+               echo "${initscript}: waiting $timeout secs for $batmanif interface..."
+               for i in $(seq $timeout); do
+                       sleep 1
+                       [ -d "$mesh_dir" ] && break
+                       if [ $i == $timeout ] ; then
+                               echo "${initscript}: $batmanif not detected, alfred not starting."
+                               exit 1
+                       fi
+               done
+       fi
+
        echo "${initscript}: starting alfred"
        SERVICE_PID_FILE="$pid_file_alfred"
        service_start /usr/sbin/alfred ${alfred_args}