alfred: Fix procd process handling for disable state
[feed/routing.git] / alfred / files / alfred.init
index 56818d84ccb5c91815c934a857527b7ecec82f20..e439be10f71647adb17c52743cec3f819ae31439 100755 (executable)
@@ -1,28 +1,72 @@
 #!/bin/sh /etc/rc.common
 
-#
-# Copyright (C) 2013 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
 #
 
 START=99
-STOP=99
+USE_PROCD=1
 alfred_args=""
 vis_args=""
-pid_file_alfred="/var/run/alfred.pid"
-pid_file_vis="/var/run/vis.pid"
+facters_dir="/etc/alfred"
 enable=0
 vis_enable=0
-SERVICE_DAEMONIZE=1
-SERVICE_WRITE_PID=1
 
-alfred_start()
+wait_for_dir() {
+       local ifce="$1" dir="$2"
+
+       if ! [ -d "$dir" ] ; then
+               timeout=30
+               echo "waiting $timeout secs for $ifce interface..."
+               for i in $(seq $timeout); do
+                       sleep 1
+                       [ -d "$dir" ] && break
+                       if [ $i = $timeout ] ; then
+                               echo "$ifce not detected, alfred not starting."
+                               return 1
+                       fi
+               done
+       fi
+
+       return 0
+}
+
+wait_for_ll_address() {
+       local iface="$1"
+       local timeout=30
+
+       echo "waiting $timeout secs for $iface address..."
+       for i in $(seq $timeout); do
+               # We look for
+               # - the link-local address (starts with fe80)
+               # - without tentative flag (bit 0x40 in the flags field; the first char of the fifth field is evaluated)
+               # - on interface $iface
+               if awk '
+                       BEGIN { RET=1 }
+                       $1 ~ /^fe80/ && $5 ~ /^[012389ab]/ && $6 == "'"$iface"'" { RET=0 }
+                       END { exit RET }
+               ' /proc/net/if_inet6; then
+                       return 0
+               fi
+               sleep 1
+       done
+
+       echo "$iface address not detected, alfred not starting."
+       return 1
+}
+
+append_interface()
 {
+       append "interfaces" "$1" ","
+       wait_for_ll_address "$1"
+}
+
+alfred_start() {
        local args=""
        local section="$1"
-       local disabled interface mode batmanif
+       local disabled interface mode
+       local interfaces
 
        # check if section is disabled
        config_get_bool disabled "$section" disabled 0
@@ -30,8 +74,12 @@ alfred_start()
 
        args=""
 
-       config_get interface "$section" interface
-       append args "-i $interface"
+       config_list_foreach "$section" "interface" append_interface
+       if [ -z "$interfaces" ]; then
+               config_get interface "$section" interface
+               append_interface "$interface"
+       fi
+       append args "-i $interfaces"
 
        config_get mode "$section" mode
        [ "$mode" = "master" ] && append args "-m"
@@ -39,43 +87,59 @@ alfred_start()
        config_get batmanif "$section" batmanif
        append args "-b $batmanif"
 
+       if [ "$batmanif" != "none" ]; then
+               wait_for_dir "$batmanif" "/sys/devices/virtual/net/$batmanif" || return 1
+       fi
+
        append alfred_args "$args"
        enable=1
 
-        config_get_bool start_vis "$section" start_vis 0
-        if [ "$start_vis" = 1 ] && [ -x /usr/sbin/vis ]; then
-                vis_enable=1
-                append vis_args "-i $batmanif -s"
-        fi
+       config_get_bool start_vis "$section" start_vis 0
+       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
 }
 
-start()
-{
+start_service() {
        config_load "alfred"
        config_foreach alfred_start alfred
 
-       if [ "$enable" = "0" ]; then
-               exit 0
-       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}
+       [ "$enable" = "0" ] && return 0
+
+       procd_open_instance "alfred"
+       procd_set_param command /usr/sbin/alfred
+       procd_append_param command ${alfred_args}
+       procd_close_instance
+
+       [ "$vis_enable" = "1" ] && {
+               procd_open_instance "batadv-vis"
+               procd_set_param command /usr/sbin/batadv-vis
+               procd_append_param command ${vis_args}
+               procd_close_instance
+       }
+
+       [ "$run_facters" = "1" ] && {
+               ( 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
+       }
 }
 
-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
+service_triggers() {
+       procd_add_reload_trigger "alfred"
+}
 
+stop_service() {
+       [ -e /etc/crontabs/root ] && {
+               sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
+               /etc/init.d/cron restart
+       }
 }