X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=alfred%2Ffiles%2Falfred.init;h=e439be10f71647adb17c52743cec3f819ae31439;hb=993f03cecb2db3e845bfa6ba4326bc352f853e3c;hp=56818d84ccb5c91815c934a857527b7ecec82f20;hpb=f76074d42429a26b73976b3a5c799a895fd2d1d7;p=feed%2Frouting.git diff --git a/alfred/files/alfred.init b/alfred/files/alfred.init index 56818d8..e439be1 100755 --- a/alfred/files/alfred.init +++ b/alfred/files/alfred.init @@ -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 + } }