b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | #!/bin/sh /etc/rc.common |
| 2 | # Copyright (C) 2014-2015 OpenWrt.org |
| 3 | |
| 4 | START=99 |
| 5 | USE_PROCD=1 |
| 6 | |
| 7 | mcproxy_handle_instances() { |
| 8 | local instance="$1" |
| 9 | local conf_file="$2" |
| 10 | local disabled |
| 11 | local pre="" |
| 12 | local name |
| 13 | local upstreams |
| 14 | local downstreams |
| 15 | |
| 16 | config_get_bool disabled "$instance" 'disabled' '0' |
| 17 | config_get name "$instance" "name" "$instance" |
| 18 | config_get upstreams "$instance" "upstream" |
| 19 | config_get downstreams "$instance" "downstream" |
| 20 | |
| 21 | if [ $disabled -eq 1 ]; then |
| 22 | pre="# " |
| 23 | fi |
| 24 | |
| 25 | local str_up="" |
| 26 | if [ -n "$upstreams" ]; then |
| 27 | local upstream |
| 28 | for upstream in $upstreams; do |
| 29 | str_up="$str_up \"$upstream\"" |
| 30 | done |
| 31 | fi |
| 32 | |
| 33 | local str_down="" |
| 34 | if [ -n "$downstreams" ]; then |
| 35 | local downstream |
| 36 | for downstream in $downstreams; do |
| 37 | str_down="$str_down \"$downstream\"" |
| 38 | done |
| 39 | fi |
| 40 | |
| 41 | if [ ! -z $downstream ]; then |
| 42 | echo -e "${pre}pinstance ${name}:${str_up} ==>${str_down};\n" >> $conf_file |
| 43 | fi |
| 44 | } |
| 45 | |
| 46 | # mcproxy_list_table <var> <section> <option> |
| 47 | mcproxy_list_table() { |
| 48 | local val |
| 49 | local len |
| 50 | local _buffer |
| 51 | local c=1 |
| 52 | |
| 53 | config_get len "$2" "${3}_LENGTH" |
| 54 | [ -z "$len" ] && return 0 |
| 55 | while [ $c -le "$len" ]; do |
| 56 | config_get val "$2" "${3}_ITEM$c" |
| 57 | append _buffer "\t${val}\n" |
| 58 | c="$(($c + 1))" |
| 59 | done |
| 60 | |
| 61 | export "${1}=${_buffer}"; |
| 62 | } |
| 63 | |
| 64 | mcproxy_handle_tables() { |
| 65 | local table="$1" |
| 66 | local conf_file="$2" |
| 67 | local name |
| 68 | local entries |
| 69 | |
| 70 | config_get name "$table" "name" "" |
| 71 | mcproxy_list_table entries "$table" "entries" |
| 72 | |
| 73 | if [ ! -z $name ] && [ ! -z $table ]; then |
| 74 | echo -e "table $name {\n${entries}};\n" >> $conf_file |
| 75 | fi |
| 76 | } |
| 77 | |
| 78 | mcproxy_handle_behaviour() { |
| 79 | local behaviour="$1" |
| 80 | local conf_file="$2" |
| 81 | local disabled |
| 82 | local pre="" |
| 83 | local instance |
| 84 | local section |
| 85 | local interface |
| 86 | local direction |
| 87 | local rulematching |
| 88 | local table |
| 89 | |
| 90 | config_get_bool disabled "$behaviour" 'disabled' '0' |
| 91 | config_get instance "$behaviour" "instance" |
| 92 | config_get section "$behaviour" "section" "upstream" |
| 93 | config_get interface "$behaviour" "interface" "*" |
| 94 | config_get direction "$behaviour" "direction" "in" |
| 95 | config_get rulematching "$behaviour" "rulematching" |
| 96 | config_get table "$behaviour" "table" |
| 97 | |
| 98 | if [ -z $instance ]; then |
| 99 | return 1 |
| 100 | fi |
| 101 | |
| 102 | local rule_table |
| 103 | if [ ! -z $rulematching ]; then |
| 104 | rule_table="rulematching $rulematching" |
| 105 | elif [ ! -z $table ]; then |
| 106 | local whitelist |
| 107 | local list |
| 108 | |
| 109 | config_get_bool whitelist "$behaviour" 'whitelist' '0' |
| 110 | if [ $whitelist -eq 1 ]; then |
| 111 | list="whitelist" |
| 112 | else |
| 113 | list="blacklist" |
| 114 | fi |
| 115 | |
| 116 | rule_table="$list table $table" |
| 117 | else |
| 118 | rule_table="rulematching all" |
| 119 | fi |
| 120 | |
| 121 | if [ $disabled -eq 1 ]; then |
| 122 | pre="# " |
| 123 | fi |
| 124 | |
| 125 | echo -e "${pre}pinstance $instance $section \"$interface\" $direction $rule_table;\n" >> $conf_file |
| 126 | } |
| 127 | |
| 128 | mcproxy_network_trigger() { |
| 129 | procd_add_interface_trigger "interface.*" "$1" /etc/init.d/mcproxy restart |
| 130 | } |
| 131 | mcproxy_handle_network() { |
| 132 | local instance="$1" |
| 133 | |
| 134 | config_list_foreach "$instance" upstream mcproxy_network_trigger |
| 135 | config_list_foreach "$instance" downstream mcproxy_network_trigger |
| 136 | } |
| 137 | |
| 138 | start_instance() { |
| 139 | local cfg="$1" |
| 140 | local aux |
| 141 | local conf_file |
| 142 | |
| 143 | config_get_bool aux "$cfg" 'disabled' '0' |
| 144 | [ "$aux" = 1 ] && return 1 |
| 145 | |
| 146 | config_get conf_file "$cfg" "file" |
| 147 | if [ ! -n "$conf_file" ]; then |
| 148 | mkdir -p /var/etc |
| 149 | conf_file="/var/etc/mcproxy_${cfg}.conf" |
| 150 | |
| 151 | local protocol |
| 152 | config_get protocol "$cfg" "protocol" "IGMPv3" |
| 153 | echo -e "protocol ${protocol};\n" > $conf_file |
| 154 | |
| 155 | config_foreach mcproxy_handle_instances instance $conf_file |
| 156 | config_foreach mcproxy_handle_tables table $conf_file |
| 157 | config_foreach mcproxy_handle_behaviour behaviour $conf_file |
| 158 | fi |
| 159 | |
| 160 | procd_open_instance |
| 161 | |
| 162 | procd_set_param command /usr/sbin/mcproxy |
| 163 | procd_append_param command -f $conf_file |
| 164 | |
| 165 | config_get_bool aux "$cfg" 'respawn' '0' |
| 166 | [ "$aux" = 1 ] && procd_set_param respawn |
| 167 | |
| 168 | procd_open_trigger |
| 169 | config_foreach mcproxy_handle_network instance |
| 170 | procd_close_trigger |
| 171 | |
| 172 | procd_close_instance |
| 173 | } |
| 174 | |
| 175 | service_triggers() { |
| 176 | procd_open_trigger |
| 177 | procd_add_config_trigger "config.change" "mcproxy" /etc/init.d/mcproxy restart |
| 178 | procd_close_trigger |
| 179 | } |
| 180 | |
| 181 | start_service() { |
| 182 | config_load mcproxy |
| 183 | config_foreach start_instance mcproxy |
| 184 | } |