gluon-firmware/package/gluon-mesh-babel/files/etc/init.d/gluon-mesh-babel

83 lines
2.1 KiB
Bash
Executable File

#!/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"
local maxretries=10
while ! (echo -e "$line" | busybox nc ::1 "$PORT" >/dev/null 2>&1)
do
sleep 1
echo retrying to connect to babeld in PID $$, waited ${count}s >&2
count=$((count+1))
if [ $count -gt $maxretries ]; then
return 1
fi
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)
}