2018-05-16 14:58:24 +00:00
|
|
|
#!/bin/sh /etc/rc.common
|
|
|
|
USE_PROCD=1
|
|
|
|
START=45
|
|
|
|
PORT=33123
|
|
|
|
|
|
|
|
DAEMON=/usr/sbin/babeld
|
|
|
|
pidfile=/var/run/gluon-babeld.pid
|
|
|
|
CONFIGFILE=/etc/gluon-babeld.conf
|
|
|
|
BABELOPTSFILE=/tmp/addn-babelopts
|
|
|
|
touch $BABELOPTSFILE
|
|
|
|
|
|
|
|
start_service() {
|
|
|
|
procd_open_instance
|
|
|
|
procd_set_param command $DAEMON
|
|
|
|
procd_append_param command -D -I "$pidfile" -G "$PORT" -c "$CONFIGFILE" $(cat $BABELOPTSFILE) babeldummydoesnotexist
|
|
|
|
procd_set_param respawn ${respawn_threshold:-60} ${respawn_timeout:-5} ${respawn_retry:-0}
|
|
|
|
procd_set_param stderr 1
|
|
|
|
procd_set_param stdout 1
|
|
|
|
procd_close_instance
|
|
|
|
}
|
|
|
|
|
|
|
|
echotobabel() {
|
|
|
|
local count=0
|
|
|
|
local line="$1"
|
2018-11-22 22:51:54 +00:00
|
|
|
local maxretries=10
|
2018-08-31 22:39:44 +00:00
|
|
|
while ! (echo -e "$line" | busybox nc ::1 "$PORT" >/dev/null 2>&1)
|
2018-05-16 14:58:24 +00:00
|
|
|
do
|
|
|
|
sleep 1
|
|
|
|
echo retrying to connect to babeld in PID $$, waited ${count}s >&2
|
|
|
|
count=$((count+1))
|
2018-11-22 22:51:54 +00:00
|
|
|
if [ $count -gt $maxretries ]; then
|
|
|
|
return 1
|
|
|
|
fi
|
2018-05-16 14:58:24 +00:00
|
|
|
done
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
waitforsocket() {
|
|
|
|
echotobabel "dump"
|
|
|
|
[ $? -gt 0 ] && { echo "Failed to connect to babeld socket on port $PORT, assuming the service was not started properly"; exit 43; }
|
|
|
|
}
|
|
|
|
|
|
|
|
reload_service() {
|
|
|
|
waitforsocket
|
|
|
|
|
|
|
|
for i in $(ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device")
|
|
|
|
do
|
|
|
|
if ! echotobabel dump|grep "add interface"|grep -q $i
|
|
|
|
then
|
|
|
|
echotobabel "interface $i update-interval 300"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
for i in $(echotobabel "dump"|grep "add interface"|cut -d" " -f3)
|
|
|
|
do
|
|
|
|
if ! ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device"|grep -q $i
|
|
|
|
then
|
|
|
|
echotobabel "flush interface $i"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
service_triggers() {
|
|
|
|
local script=$(readlink "$initscript")
|
|
|
|
local name=$(basename "${script:-$initscript}")
|
|
|
|
|
|
|
|
procd_open_trigger
|
|
|
|
procd_add_raw_trigger "interface.*" 0 "/etc/init.d/$name" reload
|
|
|
|
procd_close_trigger
|
|
|
|
}
|
|
|
|
|
|
|
|
service_started() {
|
|
|
|
# make sure the init script does not finish until babeld is actually up.
|
|
|
|
# unfortunately procd will still start multiple instances of the same script which is why waitforsocket is also run on reload
|
|
|
|
waitforsocket
|
|
|
|
}
|
|
|
|
stop_service(){
|
|
|
|
kill $(pgrep -P 1 babeld)
|
|
|
|
}
|
|
|
|
status() {
|
|
|
|
kill -USR1 $(pgrep -P 1 babeld)
|
|
|
|
}
|