gateway: do not show (bogus) errors
[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 "  ${scriptBasename} 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}" OUTPUT -j CONNMARK --restore-mark
67 }
68
69 function olsrif() {
70   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" PREROUTING -i "${1}" -j CONNMARK --restore-mark
71 }
72
73 function sgwsrvtun() {
74   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" PREROUTING -i "${1}" -j CONNMARK --restore-mark
75 }
76
77 function egressif() {
78   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" POSTROUTING -m conntrack --ctstate NEW -o "${1}" -j CONNMARK --set-mark "${2}"
79   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" INPUT       -m conntrack --ctstate NEW -i "${1}" -j CONNMARK --set-mark "${2}"
80   "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}"
81 }
82
83 function sgwtun() {
84   "${IPTABLES}" ${IPTABLES_ARGS} -t mangle "${ADDMODE_IPTABLES}" POSTROUTING -m conntrack --ctstate NEW -o "${1}" -j CONNMARK --set-mark "${2}"
85   "${IP}" ${IP_ARGS} rule "${ADDMODE_IP}" fwmark "${2}" table "${2}" pref "${2}"
86 }
87
88
89 ###############################################################################
90 #
91 # MAIN
92 #
93 ###############################################################################
94
95 declare script="${0}"
96 declare scriptBasename="$(basename "${script}")"
97 declare scriptDir="$(dirname "${script}")"
98 declare -a arguments=( ${@} )
99 declare -i argc=${#}
100
101 # we always need 3 arguments, check it
102 if [ ${argc} -lt 3 ]; then
103   error "Need at least 3 arguments"
104   usage
105   exit 1
106 fi
107
108 # get first 3 arguments
109 declare ipVersion=${1}
110 declare mode="${2}"
111 declare addMode="${3}"
112 shift 3
113 argc=${#}
114
115 # check IP version argument
116 if [ ! "${ipVersion}" == "${IPVERSION_4}" ] && \
117    [ ! "${ipVersion}" == "${IPVERSION_6}" ]; then
118   error "Illegal IP version"
119   usage
120   exit 1
121 fi
122
123 # check mode argument
124 if [ ! "${mode}" == "${MODE_GENERIC}" ] && \
125    [ ! "${mode}" == "${MODE_OLSRIF}" ] && \
126    [ ! "${mode}" == "${MODE_SGWSRVTUN}" ] && \
127    [ ! "${mode}" == "${MODE_EGRESSIF}" ] && \
128    [ ! "${mode}" == "${MODE_SGWTUN}" ]; then
129   error "Illegal mode"
130   usage
131   exit 1
132 fi
133
134 # check addMode argument
135 if [ ! "${addMode}" == "${ADDMODE_ADD}" ] && \
136    [ ! "${addMode}" == "${ADDMODE_DEL}" ]; then
137   error "Illegal addMode"
138   usage
139   exit 1
140 fi
141
142 # check argument count for all modes
143 if ([ "${mode}" == "${MODE_GENERIC}" ]   && [ ${argc} -ne 0 ]) || \
144    ([ "${mode}" == "${MODE_OLSRIF}" ]    && [ ${argc} -ne 1 ]) || \
145    ([ "${mode}" == "${MODE_SGWSRVTUN}" ] && [ ${argc} -ne 1 ]) || \
146    ([ "${mode}" == "${MODE_EGRESSIF}"  ] && [ ${argc} -ne 2 ]) || \
147    ([ "${mode}" == "${MODE_SGWTUN}"  ]   && [ ${argc} -ne 2 ]); then
148   error "Not enough arguments or too many arguments"
149   usage
150   exit 1
151 fi
152
153 # process ipVersion argument
154 declare IPTABLES="iptables"
155 declare IPTABLES_ARGS=""
156 declare IP="ip"
157 declare IP_ARGS="-4"
158 if [ "${ipVersion}" == "${IPVERSION_6}" ]; then
159   IPTABLES="ip6tables"
160   IPTABLES_ARGS=""
161   IP="ip"
162   IP_ARGS="-6"
163 fi
164
165 # process addMode argument
166 declare ADDMODE_IPTABLES="-D"
167 declare ADDMODE_IP="del"
168 if [ "${addMode}" == "${ADDMODE_ADD}" ]; then
169   # first call the delete mode to remove any left-over rules
170   set +e
171   "${mode}" "${@}" 2> /dev/null
172   set -e
173
174   ADDMODE_IPTABLES="-I"
175   ADDMODE_IP="add"
176 fi
177
178 # call the mode
179 "${mode}" "${@}"