144 lines
3.2 KiB
Bash
Executable File
144 lines
3.2 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
|
|
SERVICE_DAEMONIZE=1
|
|
SERVICE_WRITE_PID=1
|
|
|
|
wait_for_dir()
|
|
{
|
|
local ifce="$1" dir="$2"
|
|
|
|
if ! [ -d "$dir" ] ; then
|
|
timeout=30
|
|
echo "${initscript}: waiting $timeout secs for $ifce interface..."
|
|
for i in $(seq $timeout); do
|
|
sleep 1
|
|
[ -d "$dir" ] && break
|
|
if [ $i == $timeout ] ; then
|
|
echo "${initscript}: $ifce not detected, alfred not starting."
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
wait_for_ll_address()
|
|
{
|
|
local iface="$1"
|
|
local timeout=30
|
|
|
|
echo "${initscript}: 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 flags field begins 38 columns after the fe80 prefix
|
|
# - on interface $iface
|
|
if awk '
|
|
BEGIN { RET=1 }
|
|
/^fe80.{37} [012389ab]/ { if ($6 == "'"$iface"'") RET=0 }
|
|
END { exit RET }
|
|
' /proc/net/if_inet6; then
|
|
return
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
echo "${initscript}: $iface address not detected, alfred not starting."
|
|
exit 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"
|
|
|
|
if [ "$batmanif" != "none" ]; then
|
|
wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
|
|
fi
|
|
|
|
wait_for_ll_address "$interface"
|
|
|
|
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
|
|
|
|
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
|
|
}
|