a cleaner solution for disabling dyngw and dyngw_plain in freifunk-policyrouting...
[project/luci.git] / contrib / package / freifunk-policyrouting / files / etc / init.d / freifunk-policyrouting
index 58faa67..4c91724 100755 (executable)
 #!/bin/sh /etc/rc.common
 
-START=60
+START=15
 . /lib/functions/network.sh
-boot()
-{
-       prenabled=$(uci get freifunk-policyrouting.pr.enable)
-       if [ ! "$prenabled" = "1" ] || ! network_is_up wan; then
-               uci -q delete olsrd.@olsrd[0].RtTable
-               uci -q delete olsrd.@olsrd[0].RtTableDefault
-               uci commit olsrd
+. /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
 }