sgw: policy script: move some declarations
[olsrd.git] / files / sgw_policy_routing_setup.sh
1 #!/bin/bash
2
3 set -e
4 set -u
5
6
7 declare script="$0"
8 declare -a arguments=( ${@} )
9 declare -i argc=$#
10
11
12 ###############################################################################
13 #
14 # OVERVIEW
15 #
16 ###############################################################################
17
18 # Tables (from SmartGatewayTablesOffset):
19 #                                               +-----------------+-----------------+---------------+
20 #                                               | sgwsrvtun table | egressif tables | sgwtun tables |
21 #                                               +-----------------+-----------------+---------------+
22 # Example:                                              90               91 92            93 94 ...
23 #
24 #
25 # Rules (from SmartGatewayRulesOffset):
26 # +-----------------------+---------------------+-----------------+-----------------+---------------+
27 # | egressif bypass rules | olsrif bypass rules | sgwsrvtun rule  | egressif rules  | sgwtun rules  |
28 # +-----------------------+---------------------+-----------------+-----------------+---------------+
29 # Example:  84 85               86 87 88 89             90               91 92            93 94 ...
30
31
32 ###############################################################################
33 #
34 # SETTINGS
35 #
36 ###############################################################################
37
38 declare IPVERSION_4="ipv4"
39 declare IPVERSION_6="ipv6"
40
41 declare MODE_GENERIC="generic"
42 declare MODE_OLSRIF="olsrif"
43 declare MODE_SGWSRVTUN="sgwsrvtun"
44 declare MODE_EGRESSIF="egressif"
45 declare MODE_SGWTUN="sgwtun"
46
47 declare ADDMODE_ADD="add"
48 declare ADDMODE_DEL="del"
49
50 declare -i MODE_GENERIC_ARGC=0
51 declare -i MODE_OLSRIF_ARGC=2
52 declare -i MODE_EGRESSIF_ARGC=4
53 declare -i MODE_SGWSRVTUN_ARGC=3
54 declare -i MODE_SGWTUN_ARGC=3
55
56
57 ###############################################################################
58 #
59 # HELPER FUNCTIONS
60 #
61 ###############################################################################
62
63 function usage() {
64   echo ""
65   echo "The script was called as:"
66   echo "  $script ${arguments[@]:-}"
67   echo ""
68   echo "Usage:"
69   echo "  $script ipVersion mode addMode ifName tableNr ruleNr bypassRuleNr"
70   echo "    - ipVersion   : $IPVERSION_4 or $IPVERSION_6"
71   echo "    - mode        : $MODE_GENERIC, $MODE_OLSRIF, $MODE_EGRESSIF, $MODE_SGWSRVTUN or $MODE_SGWTUN"
72   echo "    - addMode     : $ADDMODE_ADD or $ADDMODE_DEL"
73   echo "    - ifName      : the interface name       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
74   echo "    - tableNr     : the routing table number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
75   echo "    - ruleNr      : the ip rule number       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
76   echo "    - bypassRuleNr: the bypass ip rule number, only relevant for mode  $MODE_EGRESSIF, $MODE_OLSRIF"
77 }
78
79 function error() {
80   local -i firstLine=1
81   while [ $# -gt 0 ]; do
82     if [ $firstLine -eq 1 ]; then
83       echo "Error: $1"
84     else
85       echo "       $1"
86     fi
87     firstLine=0
88     shift 1
89   done
90 }
91
92
93 ###############################################################################
94 #
95 # MODE FUNCTIONS
96 #
97 ###############################################################################
98
99 function generic() {
100   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
101   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" OUTPUT      -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
102 }
103
104 function olsrif() {
105   local interfaceName="$1"
106   local bypassRuleNr="$2"
107
108   "$IP"       $IP_ARGS        rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
109 }
110
111 function egressif() {
112   local interfaceName="$1"
113   local tableNr="$2"
114   local ruleNr="$3"
115   local bypassRuleNr="$4"
116
117   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
118   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" INPUT       -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
119   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr"        table "$tableNr" priority "$ruleNr"
120   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
121 }
122
123 function sgwsrvtun() {
124   local interfaceName="$1"
125   local tableNr="$2"
126   local ruleNr="$3"
127
128   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
129   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
130 }
131
132 function sgwtun() {
133   local interfaceName="$1"
134   local tableNr="$2"
135   local ruleNr="$3"
136
137   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
138   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
139 }
140
141
142 ###############################################################################
143 #
144 # MAIN
145 #
146 ###############################################################################
147
148 # we always need 3 arguments, check it
149 if [ $argc -lt 3 ]; then
150   error "Need at least 3 arguments"
151   usage
152   exit 1
153 fi
154
155 # get first 3 arguments
156 declare ipVersion=$1
157 declare mode="$2"
158 declare addMode="$3"
159 shift 3
160 argc=$#
161
162 # check IP version argument
163 if [ ! "$ipVersion" = "$IPVERSION_4" ] && \
164    [ ! "$ipVersion" = "$IPVERSION_6" ]; then
165   error "Illegal IP version"
166   usage
167   exit 1
168 fi
169
170 # check mode argument
171 if [ ! "$mode" = "$MODE_GENERIC" ] && \
172    [ ! "$mode" = "$MODE_OLSRIF" ] && \
173    [ ! "$mode" = "$MODE_SGWSRVTUN" ] && \
174    [ ! "$mode" = "$MODE_EGRESSIF" ] && \
175    [ ! "$mode" = "$MODE_SGWTUN" ]; then
176   error "Illegal mode"
177   usage
178   exit 1
179 fi
180
181 # check addMode argument
182 if [ ! "$addMode" = "$ADDMODE_ADD" ] && \
183    [ ! "$addMode" = "$ADDMODE_DEL" ]; then
184   error "Illegal addMode"
185   usage
186   exit 1
187 fi
188
189 # check argument count for all modes
190 if ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -lt $MODE_GENERIC_ARGC   ]) || \
191    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -lt $MODE_OLSRIF_ARGC    ]) || \
192    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -lt $MODE_EGRESSIF_ARGC  ]) || \
193    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -lt $MODE_SGWSRVTUN_ARGC ]) || \
194    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -lt $MODE_SGWTUN_ARGC    ]); then
195   if [ $argc -eq 0 ]; then
196     error "Not enough arguments arguments ($argc) for mode $mode"
197   else
198     error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
199   fi
200   usage
201   exit 1
202 fi
203
204 # check argument count for all modes
205 if ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -gt $MODE_GENERIC_ARGC   ]) || \
206    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -gt $MODE_OLSRIF_ARGC    ]) || \
207    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -gt $MODE_EGRESSIF_ARGC  ]) || \
208    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -gt $MODE_SGWSRVTUN_ARGC ]) || \
209    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -gt $MODE_SGWTUN_ARGC    ]); then
210   if [ $argc -eq 0 ]; then
211     error "Too many arguments arguments ($argc) for mode $mode"
212   else
213     error "Too many arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
214   fi
215   usage
216   exit 1
217 fi
218
219 # process ipVersion argument
220 declare IPTABLES="iptables"
221 declare IPTABLES_ARGS=""
222 declare IP="ip"
223 declare IP_ARGS="-4"
224 if [ "$ipVersion" = "$IPVERSION_6" ]; then
225   IPTABLES="ip6tables"
226   IPTABLES_ARGS=""
227   IP="ip"
228   IP_ARGS="-6"
229 fi
230
231 # process addMode argument
232 declare ADDMODE_IPTABLES="-D"
233 declare ADDMODE_IP="delete"
234 if [ "$addMode" = "$ADDMODE_ADD" ]; then
235   # first call the delete mode to remove any left-over rules
236   set +e
237   "$mode" "${@}" 2> /dev/null
238   set -e
239
240   ADDMODE_IPTABLES="-I"
241   ADDMODE_IP="add"
242 fi
243
244 # call the mode
245 "$mode" "${@}"