[packages] olsrd: Manuel Munz freifunk@somakoma.de modified init file of olsrd with...
[feed/routing.git] / files / olsrd.init
index db043279d2a692c58e2c1eb3a8aa6bdcfea06979..fa571068ef4d37c04938ff7f22714eecac1ddc99 100644 (file)
@@ -1,12 +1,12 @@
 #!/bin/sh /etc/rc.common
-# Copyright (C) 2008-2011 OpenWrt.org
 # Copyright (C) 2008  Alina Friedrichsen <x-alina@gmx.net>
 # Special thanks to bittorf wireless ))
 
 START=65
-
-SERVICE_DAEMONIZE=1
-SERVICE_WRITE_PID=1
+BIN=/usr/sbin/olsrd
+CONF=/var/etc/olsrd.conf
+PID=/var/run/olsrd.pid
+PID6=/var/run/olsrd.ipv6.pid
 
 OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes'
 OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2'
@@ -45,7 +45,6 @@ get_ifname() {
        config_get ifname "$interface" ifname
        validate_ifname "$ifname" || return 1
        IFNAME="$ifname"
-
        return 0
 }
 
@@ -324,7 +323,6 @@ olsrd_write_olsrd() {
        local cfg="$1"
        validate_varname "$cfg" || return 0
        local ignore
-       local ipversion
 
        config_get_bool ignore "$cfg" ignore 0
        [ "$ignore" -ne 0 ] && return 0
@@ -336,11 +334,12 @@ olsrd_write_olsrd() {
                OLSRD_IPVERSION_6AND4=1
                config_set "$cfg" IpVersion '6'
        fi
+       config_get smartgateway "$cfg" SmartGateway
+       config_get smartgatewayuplink "$cfg" SmartGatewayUplink
 
        config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
        echo
        OLSRD_COUNT=$((OLSRD_COUNT + 1))
-
        return 0
 }
 
@@ -461,9 +460,15 @@ olsrd_write_loadplugin() {
                                fi
                        fi
 
-                       config_get latlon_file "$cfg" latlon_file
+                       for f in latlon_file hosts_file services_file resolv_file macs_file; do
+                               config_get $f "$cfg" $f
+                       done
+
                        [ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js'
                ;;
+               olsrd_watchdog.*)
+                       config_get wd_file "$cfg" file
+               ;;
        esac
 
        echo -n "${N}LoadPlugin \"$library\"${N}{"
@@ -490,6 +495,7 @@ olsrd_write_interface() {
                if validate_varname "$interface"; then
                        if get_ifname "$interface"; then
                                ifnames="$ifnames \"$IFNAME\""
+                               ifsglobal="$ifsglobal $IFNAME"
                        else
                                echo "Warning: Interface '$interface' not found, skipped" 1>&2
                        fi
@@ -562,6 +568,76 @@ olsrd_write_config() {
        return 0
 }
 
+olsrd_setup_smartgw_rules() {
+       # Check if ipip is installed
+       [ ! -e /etc/modules.d/[0-9]*-ipip ] && echo "Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
+
+       wanifnames=$(ip r l e 0/0 t all | sed -e 's/^.* dev //' |cut -d " " -f 1 | sort | uniq)
+       nowan=0
+       if [ -z "$wanifnames" ]; then
+               nowan=1
+       fi
+
+       IP4T=$(which iptables)
+       IP6T=$(which ip6tables)
+
+       # Delete smartgw firewall rules first
+       for IPT in $IP4T $IP6T; do
+               while $IPT -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
+               for IFACE in $wanifnames; do
+                       while $IPT -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
+               done
+               for IFACE in $ifsglobal; do
+                       while $IPT -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
+               done
+       done
+       while $IP4T -t nat -D postrouting_rule -o tnl_+ -j MASQUERADE 2> /dev/null; do :;done
+
+       if [ "$smartgateway" == "yes" ]; then
+               echo "Notice: Inserting firewall rules for SmartGateway"
+               if [ ! "$smartgatewayuplink" == "none" ]; then
+                       if [ "$smartgatewayuplink" == "ipv4" ]; then
+                               # Allow everything to be forwarded to tnl_+ and use NAT for it
+                               $IP4T -I forwarding_rule -o tnl_+ -j ACCEPT
+                               $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
+                               # Allow forwarding from tunl0 to (all) wan-interfaces
+                               if [ "$nowan"="0" ]; then
+                                       for IFACE in $wanifnames; do
+                                               $IP4T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
+                                       done
+                               fi
+                               # Allow incoming ipip on all olsr-interfaces
+                               for IFACE in $ifsglobal; do
+                                       $IP4T -I input_rule -i $IFACE -p 4 -j ACCEPT
+                               done
+                       elif [ "$smartgatewayuplink" == "ipv6" ]; then
+                               $IP6T -I forwarding_rule -o tnl_+ -j ACCEPT
+                               if [ "$nowan"="0" ]; then
+                                       for IFACE in $wanifnames; do
+                                               $IP6T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
+                                       done
+                               fi
+                               for IFACE in $ifsglobal; do
+                                       $IP6T -I input_rule -i $IFACE -p 4 -j ACCEPT
+                               done
+                       else
+                               for IPT in $IP4T $IP6T; do
+                                       $IPT -I forwarding_rule -o tnl_+ -j ACCEPT
+                                       $IPT -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
+                                       if [ "$nowan"="0" ]; then
+                                               for IFACE in $wanifnames; do
+                                                       $IPT -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
+                                               done
+                                       fi
+                                       for IFACE in $ifsglobal; do
+                                               $IPT -I input_rule -i $IFACE -p 4 -j ACCEPT
+                                       done
+                               done
+                       fi
+               fi
+       fi
+}
+
 start() {
        SYSTEM_HOSTNAME=
        SYSTEM_LAT=
@@ -598,19 +674,52 @@ start() {
        local bindv6only='0'
        if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then
                bindv6only="$(sysctl -n net.ipv6.bindv6only)"
-               sysctl -w net.ipv6.bindv6only=1
-               sed -e 's/^\t\t[0-9.]*[ ][0-9.]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv6
-               sed -i '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' /var/etc/olsrd.conf.ipv6
-               service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv6 -nofork
+               sysctl -w net.ipv6.bindv6only=1 > /dev/null
+               sed -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv6
                sed -e 's/^IpVersion[ ][ ]*6$/IpVersion 4/' -e 's/^\t\t[A-Fa-f0-9.:]*[:][A-Fa-f0-9.:]*[ ][0-9]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv4
-               service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv4 -nofork
+               rm $OLSRD_CONFIG_FILE
+
+               # some filenames should get the suffix .ipv6
+               for file in $latlon_file $hosts_file $services_file $resolv_file $macs_file $wd_file;do
+                       f=$(echo $file|sed 's/\//\\\//g')
+                       sed -i "s/$f/$f.ipv6/g" /var/etc/olsrd.conf.ipv6
+               done
+
+               if ([ -s $PID6 ] && kill -0 $(cat $PID6) 2>&-); then
+                       echo "Error: There already is a IPv6 instance of olsrd running ($(cat $PID6)), not starting."
+               else
+                       start-stop-daemon -q -b -m -p $PID6 -x $BIN -S -- -f /var/etc/olsrd.conf.ipv6 -nofork
+               fi
+
+                if ([ -s $PID ] && kill -0 $(cat $PID) 2>&-); then
+                               echo "Error: There already is a IPv4 instance of olsrd running ($(cat $PID)), not starting."
+               else
+                       start-stop-daemon -q -b -m -p $PID -x $BIN -S -- -f /var/etc/olsrd.conf.ipv4 -nofork
+               fi
+
                sleep 3
-               sysctl -w net.ipv6.bindv6only="$bindv6only"
+               sysctl -w net.ipv6.bindv6only="$bindv6only" > /dev/null
+
        else
-               service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork
+
+               if [ "$ipversion" = "6" ]; then
+                       sed -i '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' "$OLSRD_CONFIG_FILE"
+               fi
+
+               ### check for running instance
+               if ([ -s $PID ] && kill -0 $(cat $PID) 2>&-); then
+                       echo "Error: There already is a instance of olsrd running ($(cat $PID)), exiting now."
+                       return 1
+               else
+                       start-stop-daemon -q -b -m -p $PID -x $BIN -S -- -f "$OLSRD_CONFIG_FILE" -nofork
+               fi
        fi
+       olsrd_setup_smartgw_rules
 }
 
 stop() {
-       service_stop /usr/sbin/olsrd
+       start-stop-daemon -q -p $PID -x $BIN -K
+       start-stop-daemon -q -p $PID6 -x $BIN -K
+       test -s $PID && rm $PID
+       test -s $PID6 && rm $PID6
 }