info: java: update workspace
[olsrd.git] / files / sgw_policy_routing_setup.sh
1 #!/bin/bash
2
3 # The olsr.org Optimized Link-State Routing daemon (olsrd)
4 #
5 # (c) by the OLSR project
6 #
7 # See our Git repository to find out who worked on this file
8 # and thus is a copyright holder on it.
9 #
10 # All rights reserved.
11 #
12 # Redistribution and use in source and binary forms, with or without
13 # modification, are permitted provided that the following conditions
14 # are met:
15 #
16 # * Redistributions of source code must retain the above copyright
17 #   notice, this list of conditions and the following disclaimer.
18 # * Redistributions in binary form must reproduce the above copyright
19 #   notice, this list of conditions and the following disclaimer in
20 #   the documentation and/or other materials provided with the
21 #   distribution.
22 # * Neither the name of olsr.org, olsrd nor the names of its
23 #   contributors may be used to endorse or promote products derived
24 #   from this software without specific prior written permission.
25 #
26 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
29 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
30 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
32 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
36 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 # POSSIBILITY OF SUCH DAMAGE.
38 #
39 # Visit http://www.olsr.org for more information.
40 #
41 # If you find this software useful feel free to make a donation
42 # to the project. For more information see the website or contact
43 # the copyright holders.
44 #
45
46 set -e
47 set -u
48
49
50 declare script="$0"
51 declare scriptName="$(basename "${0%\.*}")"
52 declare -a arguments=( ${@} )
53 declare -i argc=$#
54
55
56 ###############################################################################
57 #
58 # OVERVIEW
59 #
60 ###############################################################################
61
62 # Tables (from SmartGatewayTablesOffset):
63 #                                               +-----------------+-----------------+---------------+
64 #                                               | sgwsrvtun table | egressif tables | sgwtun tables |
65 #                                               +-----------------+-----------------+---------------+
66 # Example:                                              90               91 92            93 94 ...
67 #
68 #
69 # Rules (from SmartGatewayRulesOffset):
70 # +-----------------------+---------------------+-----------------+-----------------+---------------+
71 # | egressif bypass rules | olsrif bypass rules | sgwsrvtun rule  | egressif rules  | sgwtun rules  |
72 # +-----------------------+---------------------+-----------------+-----------------+---------------+
73 # Example:  84 85               86 87 88 89             90               91 92            93 94 ...
74
75
76 ###############################################################################
77 #
78 # SETTINGS
79 #
80 ###############################################################################
81
82 declare IPVERSION_4="ipv4"
83 declare IPVERSION_6="ipv6"
84
85 declare MODE_CLEANUP="cleanup"
86 declare MODE_GENERIC="generic"
87 declare MODE_OLSRIF="olsrif"
88 declare MODE_SGWSRVTUN="sgwsrvtun"
89 declare MODE_EGRESSIF="egressif"
90 declare MODE_SGWTUN="sgwtun"
91
92 declare ADDMODE_ADD="add"
93 declare ADDMODE_DEL="del"
94
95 declare -i MODE_CLEANUP_ARGC=0
96 declare -i MODE_GENERIC_ARGC=0
97 declare -i MODE_OLSRIF_ARGC=2
98 declare -i MODE_EGRESSIF_ARGC=4
99 declare -i MODE_SGWSRVTUN_ARGC=3
100 declare -i MODE_SGWTUN_ARGC=3
101
102
103 ###############################################################################
104 #
105 # HELPER FUNCTIONS
106 #
107 ###############################################################################
108
109 function usage() {
110   echo ""
111   echo "The script was called as:"
112   echo "  $script ${arguments[@]:-}"
113   echo ""
114   echo "Usage:"
115   echo "  $script instanceId ipVersion mode addMode ifName tableNr ruleNr bypassRuleNr"
116   echo "    - instanceId  : the olsrd instance id"
117   echo "    - ipVersion   : $IPVERSION_4 or $IPVERSION_6"
118   echo "    - mode        : $MODE_CLEANUP, $MODE_GENERIC, $MODE_OLSRIF, $MODE_EGRESSIF, $MODE_SGWSRVTUN or $MODE_SGWTUN"
119   echo "    - addMode     : $ADDMODE_ADD or $ADDMODE_DEL"
120   echo "    - ifName      : the interface name       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
121   echo "    - tableNr     : the routing table number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
122   echo "    - ruleNr      : the ip rule number       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
123   echo "    - bypassRuleNr: the bypass ip rule number, only relevant for mode  $MODE_EGRESSIF, $MODE_OLSRIF"
124 }
125
126 function error() {
127   local -i firstLine=1
128   while [ $# -gt 0 ]; do
129     if [ $firstLine -eq 1 ]; then
130       echo "Error: $1"
131     else
132       echo "       $1"
133     fi
134     firstLine=0
135     shift 1
136   done
137 }
138
139
140 ###############################################################################
141 #
142 # HELPER FUNCTIONS
143 #
144 ###############################################################################
145
146 function updateLogFile() {
147   local logLine="$ipVersion $mode $ADDMODE_DEL"
148   while [ $# -gt 0 ]; do
149     logLine="$logLine $1"
150     shift 1
151   done
152
153   echo "$logLine" >> "$logFile"
154 }
155
156
157 ###############################################################################
158 #
159 # MODE FUNCTIONS
160 #
161 ###############################################################################
162
163 function cleanup() {
164   if [ ! -e "$logFile" ]; then
165     return
166   fi
167
168   if [ "$addMode" = "$ADDMODE_ADD" ] && \
169      [ -s "$logFile" ]; then
170     # read logFile
171     local ifsOrg="$IFS"
172     IFS=$'\n'
173     local -a lines=( $(cat "$logFile" | sed -r '/^[[:space:]]*$/ d') )
174     IFS="$ifsOrg"
175
176     local -i index=${#lines[*]}
177     index+=-1
178     while [ $index -ge 0 ]; do
179       set +e
180       "$script" "$instanceId" ${lines[$index]}
181       set -e
182       index+=-1
183     done
184   fi
185
186   rm -f "$logFile"
187 }
188
189 function generic() {
190   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
191   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" OUTPUT      -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
192 }
193
194 function olsrif() {
195   local interfaceName="$1"
196   local bypassRuleNr="$2"
197
198   "$IP"       $IP_ARGS        rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
199 }
200
201 function egressif() {
202   local interfaceName="$1"
203   local tableNr="$2"
204   local ruleNr="$3"
205   local bypassRuleNr="$4"
206
207   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
208   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" INPUT       -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
209   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr"        table "$tableNr" priority "$ruleNr"
210   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
211 }
212
213 function sgwsrvtun() {
214   local interfaceName="$1"
215   local tableNr="$2"
216   local ruleNr="$3"
217
218   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
219   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" iif    "$interfaceName" table "$tableNr" priority "$ruleNr"
220   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr"        table "$tableNr" priority "$ruleNr"
221 }
222
223 function sgwtun() {
224   local interfaceName="$1"
225   local tableNr="$2"
226   local ruleNr="$3"
227
228   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
229   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
230 }
231
232
233 ###############################################################################
234 #
235 # MAIN
236 #
237 ###############################################################################
238
239 # we always need 4 arguments, check it
240 if [ $argc -lt 4 ]; then
241   error "Need at least 4 arguments"
242   usage
243   exit 1
244 fi
245
246 # get first 4 arguments
247 declare instanceId="$1"
248 declare ipVersion="$2"
249 declare mode="$3"
250 declare addMode="$4"
251 shift 4
252 declare logFile="/var/run/$scriptName-$instanceId.log"
253 argc=$#
254
255 # check IP version argument
256 if [ ! "$ipVersion" = "$IPVERSION_4" ] && \
257    [ ! "$ipVersion" = "$IPVERSION_6" ]; then
258   error "Illegal IP version"
259   usage
260   exit 1
261 fi
262
263 # check mode argument
264 if [ ! "$mode" = "$MODE_CLEANUP" ] && \
265    [ ! "$mode" = "$MODE_GENERIC" ] && \
266    [ ! "$mode" = "$MODE_OLSRIF" ] && \
267    [ ! "$mode" = "$MODE_SGWSRVTUN" ] && \
268    [ ! "$mode" = "$MODE_EGRESSIF" ] && \
269    [ ! "$mode" = "$MODE_SGWTUN" ]; then
270   error "Illegal mode"
271   usage
272   exit 1
273 fi
274
275 # check addMode argument
276 if [ ! "$addMode" = "$ADDMODE_ADD" ] && \
277    [ ! "$addMode" = "$ADDMODE_DEL" ]; then
278   error "Illegal addMode"
279   usage
280   exit 1
281 fi
282
283 # check argument count for all modes
284 if ([ "$mode" = "$MODE_CLEANUP" ]   && [ $argc -lt $MODE_CLEANUP_ARGC   ]) || \
285    ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -lt $MODE_GENERIC_ARGC   ]) || \
286    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -lt $MODE_OLSRIF_ARGC    ]) || \
287    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -lt $MODE_EGRESSIF_ARGC  ]) || \
288    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -lt $MODE_SGWSRVTUN_ARGC ]) || \
289    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -lt $MODE_SGWTUN_ARGC    ]); then
290   if [ $argc -eq 0 ]; then
291     error "Not enough arguments arguments ($argc) for mode $mode"
292   else
293     error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
294   fi
295   usage
296   exit 1
297 fi
298
299 # check argument count for all modes
300 if ([ "$mode" = "$MODE_CLEANUP" ]   && [ $argc -gt $MODE_CLEANUP_ARGC   ]) || \
301    ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -gt $MODE_GENERIC_ARGC   ]) || \
302    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -gt $MODE_OLSRIF_ARGC    ]) || \
303    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -gt $MODE_EGRESSIF_ARGC  ]) || \
304    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -gt $MODE_SGWSRVTUN_ARGC ]) || \
305    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -gt $MODE_SGWTUN_ARGC    ]); then
306   if [ $argc -eq 0 ]; then
307     error "Too many arguments arguments ($argc) for mode $mode"
308   else
309     error "Too many arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
310   fi
311   usage
312   exit 1
313 fi
314
315 # process ipVersion argument
316 declare IPTABLES="iptables"
317 declare IPTABLES_ARGS="-w"
318 declare IP="ip"
319 declare IP_ARGS="-4"
320 if [ "$ipVersion" = "$IPVERSION_6" ]; then
321   IPTABLES="ip6tables"
322   IPTABLES_ARGS="-w"
323   IP="ip"
324   IP_ARGS="-6"
325 fi
326
327 # process addMode argument
328 declare ADDMODE_IPTABLES="-D"
329 declare ADDMODE_IP="delete"
330 if [ "$addMode" = "$ADDMODE_ADD" ]; then
331   # first call the delete mode to remove any left-over rules
332   set +e
333   "$mode" "${@}" 2> /dev/null
334   set -e
335
336   ADDMODE_IPTABLES="-I"
337   ADDMODE_IP="add"
338 fi
339
340 # call the mode
341 if [ "$addMode" = "$ADDMODE_ADD" ] && [ ! "$mode" = "$MODE_CLEANUP" ]; then
342   updateLogFile "${@}"
343 fi
344 "$mode" "${@}"