routing/alfred/files/alfred.init
Gui Iribarren e2cfab7f28 alfred: workaround race condition when batmanif is not ready at boot time
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>
2013-12-16 16:03:44 +01:00

109 lines
2.5 KiB
Bash
Executable file

#!/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
alfred_args=""
vis_args=""
facters_dir="/etc/alfred"
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
alfred_start()
{
local args=""
local section="$1"
local disabled interface mode
# check if section is disabled
config_get_bool disabled "$section" disabled 0
[ $disabled = 0 ] || return 1
args=""
config_get interface "$section" interface
append args "-i $interface"
config_get mode "$section" mode
[ "$mode" = "master" ] && append args "-m"
config_get batmanif "$section" batmanif
append args "-b $batmanif"
append alfred_args "$args"
enable=1
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()
{
config_load "alfred"
config_foreach alfred_start alfred
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" = "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()
{
SERVICE_PID_FILE="$pid_file_alfred"
service_stop /usr/sbin/alfred
SERVICE_PID_FILE="$pid_file_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
}