diff --git a/package/gluon-mmfd/Makefile b/package/gluon-mmfd/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..dc66bf4f45e65a7e0b4c979a8c1361eda768b4f3 --- /dev/null +++ b/package/gluon-mmfd/Makefile @@ -0,0 +1,13 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=gluon-mmfd +PKG_VERSION:=1 + +include ../gluon.mk + +define Package/gluon-mmfd + TITLE:=Mesh multicast forwarding daemon - Gluon integration + DEPENDS:=+mmfd +uc +gluon-core +endef + +$(eval $(call BuildPackageGluon,gluon-mmfd)) diff --git a/package/gluon-mmfd/files/etc/init.d/mmfd b/package/gluon-mmfd/files/etc/init.d/mmfd new file mode 100755 index 0000000000000000000000000000000000000000..4307c7e767e60b13001e4d35dd572d38b47c959a --- /dev/null +++ b/package/gluon-mmfd/files/etc/init.d/mmfd @@ -0,0 +1,60 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 +START=50 +DAEMON=/usr/sbin/mmfd +SOCKET=/var/run/mmfd.sock + +start_service() { + local interfaces=$(for dev in $(gluon-list-mesh-interfaces); do echo " -i $dev"; done) + + procd_open_instance + procd_set_param command $DAEMON -s $SOCKET $interfaces + procd_set_param respawn ${respawn_threshold:-60} ${respawn_timeout:-1} ${respawn_retry:-0} + procd_set_param stderr 1 + procd_set_param stdout 1 + procd_close_instance +} + +mmfd_get_interfaces() { + echo get_meshifs | uc $SOCKET | jsonfilter -e "@.mesh_interfaces[@]" +} + +mmfd_has_interface() { + mmfd_get_interfaces | grep -q "^$1$" +} + +addif() { + echo "add_meshif $@" | uc $SOCKET +} + +delif() { + echo "del_meshif $@" | uc $SOCKET +} + +reload_service() { + waitforsocket + + for i in $(ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device") + do + if ! mmfd_has_interface $i; then + addif $i + fi + done + + for i in $(mmfd_get_interfaces) + do + if ! ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device" | grep -q "^$i$"; then + delif $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 +}