#!/bin/sh /etc/rc.common
-# Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>
-# Special thanks to bittorf wireless ))
-START=50
+# Copyright (C) 2008-2012 OpenWrt.org
-OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 IpVersion=4 AllowNoInt:bool=1 Pollrate=0.025 TcRedundancy=2 MprCoverage=3 LinkQualityFishEye=1 LinkQualityWinSize=100 LinkQualityDijkstraLimit=0+9.0 LinkQualityLevel=2 UseHysteresis:bool=0 FIBMetric=flat ClearScreen:bool=1 Willingness=3 LinkQualityAging=0.1 LinkQualityAlgorithm=etx_fpm'
+START=65
+
+SERVICE_DAEMONIZE=1
+SERVICE_WRITE_PID=1
+
+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'
OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2'
-OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool Ip4Broadcast=255.255.255.255 HelloInterval=2.0 HelloValidityTime=40.0 TcInterval=5.0 TcValidityTime=100.0 MidInterval=18.0 MidValidityTime=324.0 HnaInterval=18.0 HnaValidityTime=108.0'
+OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool'
+OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool'
T=' '
N='
'
+log()
+{
+ logger -t olsrd -p daemon.info -s "$1"
+}
+
validate_varname() {
local varname="$1"
[ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
return 0
}
-validate_ifname() {
- local ifname="$1"
- [ -z "$ifname" -o "$ifname" != "${ifname%%[!A-Za-z0-9.:_-]*}" ] && return 1
- return 0
-}
-
validate_olsrd_option() {
local str="$1"
- [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z./:_-]*}" ] && return 1
- return 0
-}
-
-get_ifname() {
- IFNAME=
- local interface="$1"
- validate_varname "$interface" || return 1
- local ifname
-
- config_get ifname "$interface" ifname
- validate_ifname "$ifname" || return 1
- IFNAME="$ifname"
-
+ [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z./|:_-]*}" ] && return 1
return 0
}
}
warning_invalid_value() {
+ local funcname="warning_invalid_value"
local package="$1"
validate_varname "$package" || package=
local config="$2"
local option="$3"
validate_varname "$option" || option=
- echo -n "Warning: Invalid value" 1>&2
-
if [ -n "$package" -a -n "$config" ]; then
- echo -n " in option '$package.$config${option:+.}$option'" 1>&2
+ log "$funcname() in option '$package.$config${option:+.}$option', skipped"
+ else
+ log "$funcname() skipped"
fi
- echo ", skipped" 1>&2
-
return 0
}
fi
if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
- if [ "$option" != "Ip6AddrType" -a "$value" != "yes" -a "$value" != "no" ]; then
+ if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then
value="\"$value\""
fi
fi
}
olsrd_write_plparam() {
+ local funcname="olsrd_write_plparam"
local param="$1"
local cfg="$2"
validate_varname "$cfg" || return 1
shift
value="$*"
fi
+ if [ "$option" = 'NonOlsrIf' ]; then
+ if validate_varname "$value"; then
+ if network_get_device ifname "$value"; then
+ log "$funcname() Info: mdns Interface '$value' ifname '$ifname' found"
+ else
+ log "$funcname() Warning: mdns Interface '$value' not found, skipped"
+ fi
+ else
+ warning_invalid_value olsrd "$cfg" "NonOlsrIf"
+ fi
+ [ -z "$ifname" ] || value=$ifname
+ fi
echo -n "${N}${param}PlParam \"$option\" \"$value\""
local cfg="$1"
validate_varname "$cfg" || return 0
local ignore
- local ipversion
config_get_bool ignore "$cfg" ignore 0
[ "$ignore" -ne 0 ] && return 0
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
}
fi
[ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{"
- echo -n "${N}${T}$netaddr $netmask"
+ echo -n "${N}${T}${T}$netaddr $netmask"
HNA4_COUNT=$((HNA4_COUNT + 1))
return 0
fi
[ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{"
- echo -n "${N}${T}$netaddr $prefix"
+ echo -n "${N}${T}${T}$netaddr $prefix"
HNA6_COUNT=$((HNA6_COUNT + 1))
return 0
}
olsrd_write_loadplugin() {
+ local funcname="olsrd_write_loadplugin"
local cfg="$1"
validate_varname "$cfg" || return 0
local ignore
return 0
fi
if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then
- echo "Warning: Plugin library '$library' not found, skipped" 1>&2
+ log "$funcname() Warning: Plugin library '$library' not found, skipped"
return 0
fi
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}{"
}
olsrd_write_interface() {
+ local funcname="olsrd_write_interface"
local cfg="$1"
validate_varname "$cfg" || return 0
local ignore
config_get interfaces "$cfg" interface
for interface in $interfaces; do
if validate_varname "$interface"; then
- if get_ifname "$interface"; then
+ if network_get_device IFNAME "$interface"; then
ifnames="$ifnames \"$IFNAME\""
+ ifsglobal="$ifsglobal $IFNAME"
else
- echo "Warning: Interface '$interface' not found, skipped" 1>&2
+ log "$funcname() Warning: Interface '$interface' not found, skipped"
fi
else
warning_invalid_value olsrd "$cfg" "interface"
return 0
}
+olsrd_write_interface_defaults() {
+ local cfg="$1"
+ validate_varname "$cfg" || return 0
+
+ echo -n "${N}InterfaceDefaults$ifnames${N}{"
+ config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}"
+ echo "${N}}"
+
+ return 1
+}
+
olsrd_update_schema() {
local command="$1"
validate_varname "$command" || return 0
IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";;
LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";;
Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";;
+ InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";;
esac
return 0
[ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
config_foreach olsrd_write_loadplugin LoadPlugin
INTERFACES_COUNT=0
+ config_foreach olsrd_write_interface_defaults InterfaceDefaults
config_foreach olsrd_write_interface Interface
echo
return 0
}
+olsrd_setup_smartgw_rules() {
+ local funcname="olsrd_setup_smartgw_rules"
+ # Check if ipip is installed
+ [ -e /etc/modules.d/[0-9]*-ipip ] || {
+ log "$funcname() Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
+ return 1
+ }
+
+ 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
+ log "$funcname() 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
+}
+
+error() {
+ log "error() ${initscript}: $@"
+}
+
start() {
SYSTEM_HOSTNAME=
SYSTEM_LAT=
olsrd_update_schema "list" "$@"
}
- include /lib/network
- scan_interfaces
+ . /lib/functions/network.sh
+
config_load olsrd
reset_cb
local bindv6only='0'
if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then
bindv6only="$(sysctl -n net.ipv6.bindv6only)"
- sysctl -w net.ipv6.bindv6only=1
- fi
+ 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
+ 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
+
+ SERVICE_PID_FILE="$PID6"
+ if service_check /usr/sbin/olsrd; then
+ error "there is already an IPv6 instance of olsrd running (pid: '$(cat $PID6)'), not starting."
+ else
+ service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv6 -nofork
+ fi
- olsrd -f "$OLSRD_CONFIG_FILE" -nofork < /dev/null > /dev/null &
+ SERVICE_PID_FILE="$PID"
+ if service_check /usr/sbin/olsrd; then
+ error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
+ else
+ service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv4 -nofork
+ fi
- if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then
- sed -e 's/^IpVersion[ ][ ]*6$/IpVersion 4/' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv4
- olsrd -f /var/etc/olsrd.conf.ipv4 -nofork < /dev/null > /dev/null &
sleep 3
- sysctl -w net.ipv6.bindv6only="$bindv6only"
+ sysctl -w net.ipv6.bindv6only="$bindv6only" > /dev/null
+
+ else
+
+ 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
+
+ SERVICE_PID_FILE="$PID"
+ if service_check /usr/sbin/olsrd; then
+ error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
+ return 1
+ else
+ service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork
+ fi
fi
+ olsrd_setup_smartgw_rules
}
stop() {
- killall olsrd
+ SERVICE_PID_FILE="$PID"
+ service_stop /usr/sbin/olsrd
+
+ SERVICE_PID_FILE="$PID6"
+ service_stop /usr/sbin/olsrd
}