#!/bin/sh /etc/rc.common # Copyright (C) 2014-2015 OpenWrt.org START=99 USE_PROCD=1 mcproxy_handle_instances() { local instance="$1" local conf_file="$2" local disabled local pre="" local name local upstreams local downstreams config_get_bool disabled "$instance" 'disabled' '0' config_get name "$instance" "name" "$instance" config_get upstreams "$instance" "upstream" config_get downstreams "$instance" "downstream" if [ $disabled -eq 1 ]; then pre="# " fi local str_up="" if [ -n "$upstreams" ]; then local upstream for upstream in $upstreams; do str_up="$str_up \"$upstream\"" done fi local str_down="" if [ -n "$downstreams" ]; then local downstream for downstream in $downstreams; do str_down="$str_down \"$downstream\"" done fi if [ ! -z $downstream ]; then echo -e "${pre}pinstance ${name}:${str_up} ==>${str_down};\n" >> $conf_file fi } # mcproxy_list_table <var> <section> <option> mcproxy_list_table() { local val local len local _buffer local c=1 config_get len "$2" "${3}_LENGTH" [ -z "$len" ] && return 0 while [ $c -le "$len" ]; do config_get val "$2" "${3}_ITEM$c" append _buffer "\t${val}\n" c="$(($c + 1))" done export "${1}=${_buffer}"; } mcproxy_handle_tables() { local table="$1" local conf_file="$2" local name local entries config_get name "$table" "name" "" mcproxy_list_table entries "$table" "entries" if [ ! -z $name ] && [ ! -z $table ]; then echo -e "table $name {\n${entries}};\n" >> $conf_file fi } mcproxy_handle_behaviour() { local behaviour="$1" local conf_file="$2" local disabled local pre="" local instance local section local interface local direction local rulematching local table config_get_bool disabled "$behaviour" 'disabled' '0' config_get instance "$behaviour" "instance" config_get section "$behaviour" "section" "upstream" config_get interface "$behaviour" "interface" "*" config_get direction "$behaviour" "direction" "in" config_get rulematching "$behaviour" "rulematching" config_get table "$behaviour" "table" if [ -z $instance ]; then return 1 fi local rule_table if [ ! -z $rulematching ]; then rule_table="rulematching $rulematching" elif [ ! -z $table ]; then local whitelist local list config_get_bool whitelist "$behaviour" 'whitelist' '0' if [ $whitelist -eq 1 ]; then list="whitelist" else list="blacklist" fi rule_table="$list table $table" else rule_table="rulematching all" fi if [ $disabled -eq 1 ]; then pre="# " fi echo -e "${pre}pinstance $instance $section \"$interface\" $direction $rule_table;\n" >> $conf_file } mcproxy_network_trigger() { procd_add_interface_trigger "interface.*" "$1" /etc/init.d/mcproxy restart } mcproxy_handle_network() { local instance="$1" config_list_foreach "$instance" upstream mcproxy_network_trigger config_list_foreach "$instance" downstream mcproxy_network_trigger } start_instance() { local cfg="$1" local aux local conf_file config_get_bool aux "$cfg" 'disabled' '0' [ "$aux" = 1 ] && return 1 config_get conf_file "$cfg" "file" if [ ! -n "$conf_file" ]; then mkdir -p /var/etc conf_file="/var/etc/mcproxy_${cfg}.conf" local protocol config_get protocol "$cfg" "protocol" "IGMPv3" echo -e "protocol ${protocol};\n" > $conf_file config_foreach mcproxy_handle_instances instance $conf_file config_foreach mcproxy_handle_tables table $conf_file config_foreach mcproxy_handle_behaviour behaviour $conf_file fi procd_open_instance procd_set_param command /usr/sbin/mcproxy procd_append_param command -f $conf_file config_get_bool aux "$cfg" 'respawn' '0' [ "$aux" = 1 ] && procd_set_param respawn procd_open_trigger config_foreach mcproxy_handle_network instance procd_close_trigger procd_close_instance } service_triggers() { procd_open_trigger procd_add_config_trigger "config.change" "mcproxy" /etc/init.d/mcproxy restart procd_close_trigger } start_service() { config_load mcproxy config_foreach start_instance mcproxy }