#!/bin/sh /etc/rc.common START=15 . /lib/functions/network.sh . /lib/functions.sh proto="4" [ -f /proc/net/ipv6_route ] && proto="4 6" [ -f /etc/config/olsrd ] && cfgs="olsrd" [ -f /etc/config/olsrd6 ] && cfgs="$cfgs olsrd6" config_load freifunk-policyrouting config_get enable pr enable config_get fallback pr fallback config_get zones pr zones olsrd_rmtables() { for cfg in $cfgs; do # Remove custom routing tables from olsrd if [ "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then uci delete $cfg.@olsrd[0].RtTable uci delete $cfg.@olsrd[0].RtTableDefault uci commit fi done } olsrd_intalltables() { for cfg in $cfgs; do if [ ! "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ ! "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then uci set $cfg.@olsrd[0].RtTable='111' uci set $cfg.@olsrd[0].RtTableDefault='112' uci commit $cfg /etc/init.d/$cfg restart 2&> /dev/null fi done } rt_tables() { tables="/etc/iproute2/rt_tables" if [ -z "`grep "110" $tables`" ]; then echo "110 localnets" >> $tables fi if [ -z "`grep "111" $tables`" ]; then echo "111 olsr" >> $tables fi if [ -z "`grep "112" $tables`" ]; then echo "112 olsr-default" >> $tables fi } handle_disable_dyngw() { local cfg="$1" local olsrd_cfg="$2" config_get library "$cfg" library case "$library" in olsrd_dyn_gw_plain*) config_get RtTable "$cfg" RtTable if [ -z "$RtTable" ] || [ "$RtTable" = "254" ]; then config_set "$cfg" ignore '1' uci set $olsrd_cfg.$cfg.ignore="1" uci commit $olsrd_cfg logger -s -t policyrouting -p info "dyngw_plain plugin disabled." fi ;; olsrd_dyn_gw.so*) logger -s -t policyrouting -p info "$cfg" uci set $olsrd_cfg.$cfg.ignore="1" uci commit $olsrd_cfg logger -s -t policyrouting -p info "dyngw plugin disabled." ;; esac } disable_dyngw() { for olsrd_cfg in $cfgs; do config_load $olsrd_cfg config_foreach handle_disable_dyngw LoadPlugin $olsrd_cfg done } restart_services() { logger -s -t policyrouting -p info "Restarting services" /etc/init.d/network restart 2&> /dev/null for cfg in $cfgs; do /etc/init.d/$cfg restart 2&> /dev/null done } boot() { if [ "$enable" = "1" ]; then [ -d /var/state ] || mkdir -p /var/state touch /var/state/freifunk-policyrouting start noservicerestart else olsrd_rmtables fi } add_lookup_rule() { name=${1/-/_} lookup=$2 prio=$3 if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then logger -s -t policyrouting "Missing parameters for add_rule!" else for p in $proto; do if [ "$p" = "6" ]; then rule="rule6" else rule="rule" fi uci batch <<- EOF set network.${name}ipv${p}="$rule" set network.${name}ipv${p}.lookup="$lookup" set network.${name}ipv${p}.priority="$prio" EOF done fi } del_lookup_rule() { name=${1/-/_} for p in $proto; do uci -q delete network.${name}ipv${p} done } start() { if [ $enable = "1" ]; then logger -s -t policyrouting "Starting policy routing." rt_tables olsrd_intalltables disable_dyngw add_lookup_rule olsr olsr 1000 add_lookup_rule localnets localnets 2000 if [ "$fallback" = 1 ]; then add_lookup_rule olsr-default olsr-default 100000 fi fi uci commit network if [ ! "$1" = "noservicerestart" ]; then restart_services fi } stop() { logger -s -t policyrouting "Stopping policy routing" olsrd_rmtables del_lookup_rule olsr-default del_lookup_rule olsr del_lookup_rule localnets uci commit network restart_services echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting." } restart() { logger -s -t policyrouting "Restarting policy routing" olsrd_rmtables del_lookup_rule olsr-default del_lookup_rule olsr del_lookup_rule localnets uci commit network start }