sgw: policy script: add the instance id to the script
[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 instanceId ipVersion mode addMode ifName tableNr ruleNr bypassRuleNr"
70   echo "    - instanceId  : the olsrd instance id"
71   echo "    - ipVersion   : $IPVERSION_4 or $IPVERSION_6"
72   echo "    - mode        : $MODE_GENERIC, $MODE_OLSRIF, $MODE_EGRESSIF, $MODE_SGWSRVTUN or $MODE_SGWTUN"
73   echo "    - addMode     : $ADDMODE_ADD or $ADDMODE_DEL"
74   echo "    - ifName      : the interface name       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
75   echo "    - tableNr     : the routing table number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
76   echo "    - ruleNr      : the ip rule number       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
77   echo "    - bypassRuleNr: the bypass ip rule number, only relevant for mode  $MODE_EGRESSIF, $MODE_OLSRIF"
78 }
79
80 function error() {
81   local -i firstLine=1
82   while [ $# -gt 0 ]; do
83     if [ $firstLine -eq 1 ]; then
84       echo "Error: $1"
85     else
86       echo "       $1"
87     fi
88     firstLine=0
89     shift 1
90   done
91 }
92
93
94 ###############################################################################
95 #
96 # MODE FUNCTIONS
97 #
98 ###############################################################################
99
100 function generic() {
101   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
102   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" OUTPUT      -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
103 }
104
105 function olsrif() {
106   local interfaceName="$1"
107   local bypassRuleNr="$2"
108
109   "$IP"       $IP_ARGS        rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
110 }
111
112 function egressif() {
113   local interfaceName="$1"
114   local tableNr="$2"
115   local ruleNr="$3"
116   local bypassRuleNr="$4"
117
118   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
119   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" INPUT       -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
120   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr"        table "$tableNr" priority "$ruleNr"
121   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
122 }
123
124 function sgwsrvtun() {
125   local interfaceName="$1"
126   local tableNr="$2"
127   local ruleNr="$3"
128
129   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
130   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
131 }
132
133 function sgwtun() {
134   local interfaceName="$1"
135   local tableNr="$2"
136   local ruleNr="$3"
137
138   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
139   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
140 }
141
142
143 ###############################################################################
144 #
145 # MAIN
146 #
147 ###############################################################################
148
149 # we always need 4 arguments, check it
150 if [ $argc -lt 4 ]; then
151   error "Need at least 4 arguments"
152   usage
153   exit 1
154 fi
155
156 # get first 4 arguments
157 declare instanceId="$1"
158 declare ipVersion="$2"
159 declare mode="$3"
160 declare addMode="$4"
161 shift 4
162 argc=$#
163
164 # check IP version argument
165 if [ ! "$ipVersion" = "$IPVERSION_4" ] && \
166    [ ! "$ipVersion" = "$IPVERSION_6" ]; then
167   error "Illegal IP version"
168   usage
169   exit 1
170 fi
171
172 # check mode argument
173 if [ ! "$mode" = "$MODE_GENERIC" ] && \
174    [ ! "$mode" = "$MODE_OLSRIF" ] && \
175    [ ! "$mode" = "$MODE_SGWSRVTUN" ] && \
176    [ ! "$mode" = "$MODE_EGRESSIF" ] && \
177    [ ! "$mode" = "$MODE_SGWTUN" ]; then
178   error "Illegal mode"
179   usage
180   exit 1
181 fi
182
183 # check addMode argument
184 if [ ! "$addMode" = "$ADDMODE_ADD" ] && \
185    [ ! "$addMode" = "$ADDMODE_DEL" ]; then
186   error "Illegal addMode"
187   usage
188   exit 1
189 fi
190
191 # check argument count for all modes
192 if ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -lt $MODE_GENERIC_ARGC   ]) || \
193    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -lt $MODE_OLSRIF_ARGC    ]) || \
194    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -lt $MODE_EGRESSIF_ARGC  ]) || \
195    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -lt $MODE_SGWSRVTUN_ARGC ]) || \
196    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -lt $MODE_SGWTUN_ARGC    ]); then
197   if [ $argc -eq 0 ]; then
198     error "Not enough arguments arguments ($argc) for mode $mode"
199   else
200     error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
201   fi
202   usage
203   exit 1
204 fi
205
206 # check argument count for all modes
207 if ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -gt $MODE_GENERIC_ARGC   ]) || \
208    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -gt $MODE_OLSRIF_ARGC    ]) || \
209    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -gt $MODE_EGRESSIF_ARGC  ]) || \
210    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -gt $MODE_SGWSRVTUN_ARGC ]) || \
211    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -gt $MODE_SGWTUN_ARGC    ]); then
212   if [ $argc -eq 0 ]; then
213     error "Too many arguments arguments ($argc) for mode $mode"
214   else
215     error "Too many arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
216   fi
217   usage
218   exit 1
219 fi
220
221 # process ipVersion argument
222 declare IPTABLES="iptables"
223 declare IPTABLES_ARGS=""
224 declare IP="ip"
225 declare IP_ARGS="-4"
226 if [ "$ipVersion" = "$IPVERSION_6" ]; then
227   IPTABLES="ip6tables"
228   IPTABLES_ARGS=""
229   IP="ip"
230   IP_ARGS="-6"
231 fi
232
233 # process addMode argument
234 declare ADDMODE_IPTABLES="-D"
235 declare ADDMODE_IP="delete"
236 if [ "$addMode" = "$ADDMODE_ADD" ]; then
237   # first call the delete mode to remove any left-over rules
238   set +e
239   "$mode" "${@}" 2> /dev/null
240   set -e
241
242   ADDMODE_IPTABLES="-I"
243   ADDMODE_IP="add"
244 fi
245
246 # call the mode
247 "$mode" "${@}"