gw: fix the 'ip' delete argument in the policy routing script
[olsrd.git] / files / sgw_policy_routing_setup.sh
1 #!/bin/bash
2
3 set -e
4 set -u
5
6 ###############################################################################
7 #
8 # SETTINGS
9 #
10 ###############################################################################
11
12 declare IPVERSION_4="ipv4"
13 declare IPVERSION_6="ipv6"
14
15 declare MODE_GENERIC="generic"
16 declare MODE_OLSRIF="olsrif"
17 declare MODE_SGWSRVTUN="sgwsrvtun"
18 declare MODE_EGRESSIF="egressif"
19 declare MODE_SGWTUN="sgwtun"
20
21 declare ADDMODE_ADD="add"
22 declare ADDMODE_DEL="del"
23
24
25 ###############################################################################
26 #
27 # HELPER FUNCTIONS
28 #
29 ###############################################################################
30
31 function usage() {
32   echo ""
33   echo "The script was called as:"
34   echo "  ${script} ${arguments[@]:-}"
35   echo ""
36   echo "Usage:"
37   echo "  ${script} ipVersion mode addMode [ifname [ifmark]]"
38   echo "    - ipVersion: ${IPVERSION_4} or ${IPVERSION_6}"
39   echo "    - mode     : ${MODE_GENERIC}, ${MODE_OLSRIF}, ${MODE_SGWSRVTUN}, ${MODE_EGRESSIF} or ${MODE_SGWTUN}"
40   echo "    - addMode  : ${ADDMODE_ADD} or ${ADDMODE_DEL}"
41   echo "    - ifname   : an interface name, not relevant for generic mode"
42   echo "    - ifmark   : an interface marking (number), only relevant for ${MODE_EGRESSIF} and ${MODE_SGWTUN} modes"
43 }
44
45 function error() {
46   local -i firstLine=1
47   while [ ${#} -gt 0 ]; do
48     if [ ${firstLine} -eq 1 ]; then
49       echo "Error: ${1}"
50     else
51       echo "       ${1}"
52     fi
53     firstLine=0
54     shift 1
55   done
56 }
57
58
59 ###############################################################################
60 #
61 # MODE FUNCTIONS
62 #
63 ###############################################################################
64
65 function generic() {
66   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" PREROUTING  -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
67   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" OUTPUT      -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
68 }
69
70 function olsrif() {
71   # do nothing
72   echo -n "" > /dev/null
73 }
74
75 function sgwsrvtun() {
76   # do nothing
77   echo -n "" > /dev/null
78 }
79
80 function egressif() {
81   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" POSTROUTING -m conntrack --ctstate NEW -o "${1}" -j CONNMARK --set-mark "${2}"
82   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" INPUT       -m conntrack --ctstate NEW -i "${1}" -j CONNMARK --set-mark "${2}"
83   "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}"
84 }
85
86 function sgwtun() {
87   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" POSTROUTING -m conntrack --ctstate NEW -o "${1}" -j CONNMARK --set-mark "${2}"
88   "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}"
89 }
90
91
92 ###############################################################################
93 #
94 # MAIN
95 #
96 ###############################################################################
97
98 declare script="${0}"
99 declare -a arguments=( ${@} )
100 declare -i argc=${#}
101
102 # we always need 3 arguments, check it
103 if [ ${argc} -lt 3 ]; then
104   error "Need at least 3 arguments"
105   usage
106   exit 1
107 fi
108
109 # get first 3 arguments
110 declare ipVersion=${1}
111 declare mode="${2}"
112 declare addMode="${3}"
113 shift 3
114 argc=${#}
115
116 # check IP version argument
117 if [ ! "${ipVersion}" == "${IPVERSION_4}" ] && \
118    [ ! "${ipVersion}" == "${IPVERSION_6}" ]; then
119   error "Illegal IP version"
120   usage
121   exit 1
122 fi
123
124 # check mode argument
125 if [ ! "${mode}" == "${MODE_GENERIC}" ] && \
126    [ ! "${mode}" == "${MODE_OLSRIF}" ] && \
127    [ ! "${mode}" == "${MODE_SGWSRVTUN}" ] && \
128    [ ! "${mode}" == "${MODE_EGRESSIF}" ] && \
129    [ ! "${mode}" == "${MODE_SGWTUN}" ]; then
130   error "Illegal mode"
131   usage
132   exit 1
133 fi
134
135 # check addMode argument
136 if [ ! "${addMode}" == "${ADDMODE_ADD}" ] && \
137    [ ! "${addMode}" == "${ADDMODE_DEL}" ]; then
138   error "Illegal addMode"
139   usage
140   exit 1
141 fi
142
143 # check argument count for all modes
144 if ([ "${mode}" == "${MODE_GENERIC}" ]   && [ ${argc} -ne 0 ]) || \
145    ([ "${mode}" == "${MODE_OLSRIF}" ]    && [ ${argc} -ne 1 ]) || \
146    ([ "${mode}" == "${MODE_SGWSRVTUN}" ] && [ ${argc} -ne 1 ]) || \
147    ([ "${mode}" == "${MODE_EGRESSIF}"  ] && [ ${argc} -ne 2 ]) || \
148    ([ "${mode}" == "${MODE_SGWTUN}"  ]   && [ ${argc} -ne 2 ]); then
149   error "Not enough arguments or too many arguments"
150   usage
151   exit 1
152 fi
153
154 # process ipVersion argument
155 declare IPTABLES="iptables"
156 declare IPTABLES_ARGS=""
157 declare IP="ip"
158 declare IP_ARGS="-4"
159 if [ "${ipVersion}" == "${IPVERSION_6}" ]; then
160   IPTABLES="ip6tables"
161   IPTABLES_ARGS=""
162   IP="ip"
163   IP_ARGS="-6"
164 fi
165
166 # process addMode argument
167 declare ADDMODE_IPTABLES="-D"
168 declare ADDMODE_IP="delete"
169 if [ "${addMode}" == "${ADDMODE_ADD}" ]; then
170   # first call the delete mode to remove any left-over rules
171   set +e
172   "${mode}" "${@}" 2> /dev/null
173   set -e
174
175   ADDMODE_IPTABLES="-I"
176   ADDMODE_IP="add"
177 fi
178
179 # call the mode
180 "${mode}" "${@}"