| #!/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 |
| } |