From 059b26c242ad5a97f7c51b9fd68784073abb2a53 Mon Sep 17 00:00:00 2001 From: Saverio Proto Date: Mon, 14 Nov 2011 21:27:40 +0000 Subject: [PATCH] [packages] olsrd: Manuel Munz freifunk@somakoma.de modified init file of olsrd with improvements for 6and4 operation and also for setup of smartgw git-svn-id: svn://svn.openwrt.org/openwrt/packages/net/olsrd@29134 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- files/olsrd.init | 141 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 125 insertions(+), 16 deletions(-) diff --git a/files/olsrd.init b/files/olsrd.init index db04327..fa57106 100644 --- a/files/olsrd.init +++ b/files/olsrd.init @@ -1,12 +1,12 @@ #!/bin/sh /etc/rc.common -# Copyright (C) 2008-2011 OpenWrt.org # Copyright (C) 2008 Alina Friedrichsen # 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 } -- 2.30.2