release: fix the list of generated files
[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}" 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 -a arguments=( ${@} )
97 declare -i argc=${#}
98
99 # we always need 3 arguments, check it
100 if [ ${argc} -lt 3 ]; then
101   error "Need at least 3 arguments"
102   usage
103   exit 1
104 fi
105
106 # get first 3 arguments
107 declare ipVersion=${1}
108 declare mode="${2}"
109 declare addMode="${3}"
110 shift 3
111 argc=${#}
112
113 # check IP version argument
114 if [ ! "${ipVersion}" == "${IPVERSION_4}" ] && \
115    [ ! "${ipVersion}" == "${IPVERSION_6}" ]; then
116   error "Illegal IP version"
117   usage
118   exit 1
119 fi
120
121 # check mode argument
122 if [ ! "${mode}" == "${MODE_GENERIC}" ] && \
123    [ ! "${mode}" == "${MODE_OLSRIF}" ] && \
124    [ ! "${mode}" == "${MODE_SGWSRVTUN}" ] && \
125    [ ! "${mode}" == "${MODE_EGRESSIF}" ] && \
126    [ ! "${mode}" == "${MODE_SGWTUN}" ]; then
127   error "Illegal mode"
128   usage
129   exit 1
130 fi
131
132 # check addMode argument
133 if [ ! "${addMode}" == "${ADDMODE_ADD}" ] && \
134    [ ! "${addMode}" == "${ADDMODE_DEL}" ]; then
135   error "Illegal addMode"
136   usage
137   exit 1
138 fi
139
140 # check argument count for all modes
141 if ([ "${mode}" == "${MODE_GENERIC}" ]   && [ ${argc} -ne 0 ]) || \
142    ([ "${mode}" == "${MODE_OLSRIF}" ]    && [ ${argc} -ne 1 ]) || \
143    ([ "${mode}" == "${MODE_SGWSRVTUN}" ] && [ ${argc} -ne 1 ]) || \
144    ([ "${mode}" == "${MODE_EGRESSIF}"  ] && [ ${argc} -ne 2 ]) || \
145    ([ "${mode}" == "${MODE_SGWTUN}"  ]   && [ ${argc} -ne 2 ]); then
146   error "Not enough arguments or too many arguments"
147   usage
148   exit 1
149 fi
150
151 # process ipVersion argument
152 declare IPTABLES="iptables"
153 declare IPTABLES_ARGS=""
154 declare IP="ip"
155 declare IP_ARGS="-4"
156 if [ "${ipVersion}" == "${IPVERSION_6}" ]; then
157   IPTABLES="ip6tables"
158   IPTABLES_ARGS=""
159   IP="ip"
160   IP_ARGS="-6"
161 fi
162
163 # process addMode argument
164 declare ADDMODE_IPTABLES="-D"
165 declare ADDMODE_IP="del"
166 if [ "${addMode}" == "${ADDMODE_ADD}" ]; then
167   # first call the delete mode to remove any left-over rules
168   set +e
169   "${mode}" "${@}" 2> /dev/null
170   set -e
171
172   ADDMODE_IPTABLES="-I"
173   ADDMODE_IP="add"
174 fi
175
176 # call the mode
177 "${mode}" "${@}"