alfred: workaround race condition when batmanif is not ready at boot time
[feed/routing.git] / alfred / files / alfred.init
index 56818d84ccb5c91815c934a857527b7ecec82f20..b777b535ab3d8587321b614b776543e3d0583d72 100755 (executable)
@@ -11,10 +11,12 @@ START=99
 STOP=99
 alfred_args=""
 vis_args=""
+facters_dir="/etc/alfred"
 pid_file_alfred="/var/run/alfred.pid"
-pid_file_vis="/var/run/vis.pid"
+pid_file_vis="/var/run/batadv-vis.pid"
 enable=0
 vis_enable=0
+batmanif=""
 SERVICE_DAEMONIZE=1
 SERVICE_WRITE_PID=1
 
@@ -22,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
@@ -43,11 +45,13 @@ alfred_start()
        enable=1
 
         config_get_bool start_vis "$section" start_vis 0
-        if [ "$start_vis" = 1 ] && [ -x /usr/sbin/vis ]; then
+        if [ "$start_vis" = 1 ] && [ -x /usr/sbin/batadv-vis ]; then
                 vis_enable=1
                 append vis_args "-i $batmanif -s"
         fi
 
+       config_get_bool run_facters "$section" run_facters 0
+
        return 0
 }
 
@@ -59,16 +63,39 @@ 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}
 
-        if [ "$vis_enable" = "0" ]; then
-                exit 0
-        fi
-        echo "${initscript}: starting vis"
-       SERVICE_PID_FILE="$pid_file_vis"
-        service_start /usr/sbin/vis ${vis_args}
+       if [ "$vis_enable" = "1" ]; then
+               echo "${initscript}: starting batadv-vis"
+               SERVICE_PID_FILE="$pid_file_vis"
+               service_start /usr/sbin/batadv-vis ${vis_args}
+       fi
+
+       if [ "$run_facters" = "1" ]; then
+               ( for file in $facters_dir/* ; do [ -x $file ] && $file ; done )
+               if ! ( grep -q "for file in $facters_dir/\* ; do " /etc/crontabs/root 2>/dev/null ) ; then
+                       echo "*/5 * * * * ( for file in $facters_dir/* ; do [ -x \$file ] && \$file ; done )" >> /etc/crontabs/root
+                       /etc/init.d/cron enable
+                       /etc/init.d/cron restart
+               fi
+       fi
 }
 
 stop()
@@ -76,6 +103,7 @@ stop()
        SERVICE_PID_FILE="$pid_file_alfred"
        service_stop /usr/sbin/alfred
        SERVICE_PID_FILE="$pid_file_vis"
-       [ -x /usr/sbin/vis ] && service_stop /usr/sbin/vis
-
+       [ -x /usr/sbin/batadv-vis ] && service_stop /usr/sbin/batadv-vis
+       sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
+       /etc/init.d/cron restart
 }