mirror of
https://github.com/openwrt/routing.git
synced 2025-12-21 19:14:31 +04:00
Alfred can be stopped during a (re)start or reload when:
* disabled = 1
* batman-adv interface is missing
* MAC based EUI64 IPv6 link-local address not set
It is assumed that procd detects that the procd instance definition
disappeared and the currently running instance must be stopped. But all
these checks were triggering an "exit" which then stopped the alfred init
script and the wrapper from /lib/functions/procd.sh. And thus procd was
never informed about the instances which should be changed.
The correct handling is to return the result of the function instead of
directly killing the init scripts.
Fixes: 45db0e60d2 ("alfred: use procd")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
146 lines
3.1 KiB
Bash
Executable File
146 lines
3.1 KiB
Bash
Executable File
#!/bin/sh /etc/rc.common
|
|
|
|
#
|
|
# This is free software, licensed under the GNU General Public License v2.
|
|
# See /LICENSE for more information.
|
|
#
|
|
|
|
START=99
|
|
USE_PROCD=1
|
|
alfred_args=""
|
|
vis_args=""
|
|
facters_dir="/etc/alfred"
|
|
enable=0
|
|
vis_enable=0
|
|
|
|
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
|
|
local interfaces
|
|
|
|
# check if section is disabled
|
|
config_get_bool disabled "$section" disabled 0
|
|
[ $disabled = 0 ] || return 1
|
|
|
|
args=""
|
|
|
|
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"
|
|
|
|
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/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_service() {
|
|
config_load "alfred"
|
|
config_foreach alfred_start alfred
|
|
|
|
[ "$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
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|