| #!/bin/sh /etc/rc.common |
| # Copyright (C) 2018 OpenWrt.org |
| |
| START=99 |
| USE_PROCD=1 |
| PROG=/usr/sbin/omcproxy |
| |
| # Uncomment to enable verbosity |
| #OPTIONS="-v" |
| PROXIES="" |
| |
| omcproxy_add_proxy() { |
| local proxy scope uplink updevice downlinks |
| |
| config_get uplink $1 uplink |
| [ -n "$uplink" ] || return |
| |
| network_get_device updevice "$uplink" || { |
| procd_append_param error "$uplink is not up" |
| return; |
| } |
| |
| config_get downlinks $1 downlink |
| for downlink in $downlinks; do |
| local device |
| |
| network_get_device device "$downlink" || { |
| procd_append_param error "$downlink is not up" |
| continue; |
| } |
| |
| proxy="$proxy,$device" |
| |
| # Disable in-kernel querier while ours is active, default is 1. |
| [ -f /sys/class/net/$device/bridge/multicast_querier ] && \ |
| echo 0 > /sys/class/net/$device/bridge/multicast_querier |
| done |
| |
| [ -n "$proxy" ] || return 0 |
| |
| config_get scope $1 scope |
| [ -n "$scope" ] && proxy="$proxy,scope=$scope" |
| |
| PROXIES="$PROXIES $updevice$proxy" |
| } |
| |
| omcproxy_add_network_triggers() { |
| local uplink downlinks |
| |
| config_get uplink $1 uplink |
| config_get downlinks $1 downlink |
| |
| for link in $uplink $downlinks; do |
| local duplicate=0 |
| |
| for l in $LINKS; do |
| [ "$l" = "$link" ] && duplicate=1 |
| done |
| |
| [ "$duplicate" = 0 ] && { |
| LINKS="$LINKS $link" |
| procd_add_interface_trigger "interface.*" $link /etc/init.d/omcproxy restart |
| } |
| done |
| } |
| |
| omcproxy_add_firewall_rules() { |
| local uplink downlinks |
| |
| config_get uplink $1 uplink |
| config_get downlinks $1 downlink |
| |
| upzone=$(fw3 -q network $uplink 2>/dev/null) |
| [ -n "$upzone" ] || return 0 |
| |
| json_add_object "" |
| json_add_string type rule |
| json_add_string src "$upzone" |
| json_add_string family ipv4 |
| json_add_string proto igmp |
| json_add_string target ACCEPT |
| json_close_object |
| |
| json_add_object "" |
| json_add_string type rule |
| json_add_string family ipv6 |
| json_add_string src "$upzone" |
| json_add_string proto icmp |
| json_add_string src_ip fe80::/10 |
| json_add_array icmp_type |
| json_add_string "" 130/0 |
| json_add_string "" 131/0 |
| json_add_string "" 132/0 |
| json_add_string "" 143/0 |
| json_close_array |
| json_add_string target ACCEPT |
| json_close_object |
| |
| for downlink in $downlinks; do |
| downzone=$(fw3 -q network $downlink 2>/dev/null) |
| [ -n "$downzone" ] || continue |
| |
| json_add_object "" |
| json_add_string type rule |
| json_add_string src "$upzone" |
| json_add_string dest "$downzone" |
| json_add_string family ipv4 |
| json_add_string proto udp |
| json_add_string dest_ip "224.0.0.0/4" |
| json_add_string target ACCEPT |
| json_close_object |
| |
| json_add_object "" |
| json_add_string type rule |
| json_add_string src "$upzone" |
| json_add_string dest "$downzone" |
| json_add_string family ipv6 |
| json_add_string proto udp |
| json_add_string dest_ip "ff00::/8" |
| json_add_string target ACCEPT |
| json_close_object |
| done |
| } |
| |
| service_triggers() { |
| LINKS="" |
| |
| procd_add_reload_trigger "omcproxy" |
| config_foreach omcproxy_add_network_triggers proxy |
| } |
| |
| start_service() { |
| . /lib/functions/network.sh |
| |
| config_load omcproxy |
| |
| config_foreach omcproxy_add_proxy proxy |
| [ -n "$PROXIES" ] || return 0 |
| |
| procd_open_instance |
| procd_set_param command $PROG |
| [ -n "$OPTIONS" ] && procd_append_param command $OPTIONS |
| procd_append_param command $PROXIES |
| procd_set_param respawn |
| |
| procd_open_data |
| |
| json_add_array firewall |
| config_foreach omcproxy_add_firewall_rules proxy |
| json_close_array |
| |
| procd_close_data |
| |
| procd_close_instance |
| |
| # Increase maximum IPv4 group memberships per socket, default is 100. |
| echo 128 > /proc/sys/net/ipv4/igmp_max_memberships |
| } |
| |
| service_started() { |
| procd_set_config_changed firewall |
| } |
| |
| stop_service() { |
| procd_set_config_changed firewall |
| } |