Lines 195-202
_add_address()
Link Here
|
195 |
error|fatal) msgfunc=eerror rc=1;; |
195 |
error|fatal) msgfunc=eerror rc=1;; |
196 |
*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;; |
196 |
*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;; |
197 |
esac |
197 |
esac |
198 |
eval $msgfunc "Address ${address}${netmask:+/}${netmask} already existed!" |
198 |
$msgfunc "Address ${address}${netmask:+/}${netmask} already existed!" |
199 |
eval $msgfunc \"$(ip addr show to "${address}/${family_maxnetmask}" dev "${IFACE}" 2>&1)\" |
199 |
$msgfunc "$(ip -o addr show to "${address}/${family_maxnetmask}" dev "${IFACE}" 2>&1)" |
200 |
else |
200 |
else |
201 |
: # TODO: Handle other errors |
201 |
: # TODO: Handle other errors |
202 |
fi |
202 |
fi |
Lines 204-209
_add_address()
Link Here
|
204 |
return $rc |
204 |
return $rc |
205 |
} |
205 |
} |
206 |
|
206 |
|
|
|
207 |
_filter_metric() |
208 |
{ |
209 |
# ip route show does not allow to filter by metric |
210 |
# so we need to filter metric manually |
211 |
local metric_value="$1" |
212 |
shift |
213 |
|
214 |
if [ "${metric_value}" -eq 0 ]; then |
215 |
# metric 0 is not displayed |
216 |
ip -o "$@" | fgrep -vs " metric " |
217 |
else |
218 |
# add trailing space for matching |
219 |
ip -o "$@" | sed 's/$/ /' | fgrep -s " metric ${metric_value} " |
220 |
fi |
221 |
} |
222 |
|
223 |
_is_route_type() |
224 |
{ |
225 |
case "$1" in |
226 |
unicast|multicast|local|broadcast|throw|unreachable|prohibit|blackhole) true ;; |
227 |
*) false ;; |
228 |
esac |
229 |
} |
230 |
|
207 |
_add_route() |
231 |
_add_route() |
208 |
{ |
232 |
{ |
209 |
local family= |
233 |
local family= |
Lines 219-259
_add_route()
Link Here
|
219 |
shift |
243 |
shift |
220 |
fi |
244 |
fi |
221 |
|
245 |
|
222 |
if [ $# -eq 3 ]; then |
246 |
if _is_route_type "$2"; then |
|
|
247 |
: |
248 |
elif [ $# -eq 3 ]; then |
223 |
set -- "$1" "$2" via "$3" |
249 |
set -- "$1" "$2" via "$3" |
224 |
elif [ "$3" = "gw" ]; then |
250 |
elif [ "$3" = "gw" ]; then |
225 |
local one=$1 two=$2 |
251 |
local one="$1" two="$2" |
226 |
shift; shift; shift |
252 |
shift; shift; shift |
227 |
set -- "${one}" "${two}" via "$@" |
253 |
set -- "${one}" "${two}" via "$@" |
228 |
fi |
254 |
fi |
229 |
|
255 |
|
230 |
local cmd= cmd_nometric= have_metric=false |
256 |
local cmd_prefix= cmd_add= cmd_show= metric_value= table_value= |
|
|
257 |
local have_metric=false have_table=false have_prefix=false nodev=false |
231 |
while [ -n "$1" ]; do |
258 |
while [ -n "$1" ]; do |
232 |
case "$1" in |
259 |
case "$1" in |
233 |
metric) metric=$2 ; cmd="${cmd} metric $2" ; shift ; have_metric=true ;; |
260 |
metric|priority|preference) |
234 |
netmask) x="/$(_netmask2cidr "$2")" ; cmd="${cmd}${x}" ; cmd_nometric="${cmd}${x}" ; shift;; |
261 |
cmd_prefix="${cmd_prefix} ${1} ${2}" |
|
|
262 |
metric_value="$2" |
263 |
have_metric=true |
264 |
shift ;; |
265 |
netmask) |
266 |
x="/$(_netmask2cidr "$2")" |
267 |
cmd_prefix="${cmd_prefix}${x}" |
268 |
cmd_show="${cmd_show}${x}" |
269 |
have_prefix=true |
270 |
shift ;; |
271 |
tos) |
272 |
cmd_add="${cmd_add} ${1} ${2}" |
273 |
cmd_show="${cmd_show} ${1} ${2}" |
274 |
shift ;; |
275 |
table) |
276 |
cmd_add="${cmd_add} ${1} ${2}" |
277 |
cmd_show="${cmd_show} ${1} ${2}" |
278 |
have_table=true |
279 |
shift ;; |
280 |
unicast|multicast) |
281 |
cmd_prefix="${cmd_prefix} ${1}" |
282 |
;; |
283 |
local|broadcast) |
284 |
# those are added to table local by default |
285 |
cmd_prefix="${cmd_prefix} ${1}" |
286 |
table_value="local" |
287 |
;; |
288 |
throw|unreachable|prohibit|blackhole) |
289 |
cmd_prefix="${cmd_prefix} ${1}" |
290 |
nodev=true |
291 |
;; |
235 |
-host|-net);; |
292 |
-host|-net);; |
236 |
*) cmd="${cmd} ${1}" ; cmd_nometric="${cmd_nometric} ${1}" ;; |
293 |
*) |
|
|
294 |
if ${have_prefix}; then |
295 |
cmd_add="${cmd_add} ${1}" |
296 |
else |
297 |
cmd_prefix="${cmd_prefix} ${1}" |
298 |
cmd_show="${cmd_show} ${1}" |
299 |
have_prefix=true |
300 |
fi ;; |
237 |
esac |
301 |
esac |
238 |
shift |
302 |
shift |
239 |
done |
303 |
done |
240 |
|
304 |
|
241 |
# We cannot use a metric if we're using a nexthop |
305 |
# Add table for special types |
242 |
if ! ${have_metric} && \ |
306 |
if ! ${have_table} && [ -n "${table_value}" ]; then |
243 |
[ -n "${metric}" -a \ |
307 |
cmd_show="${cmd_show} table ${table_value}" |
244 |
"${cmd##* nexthop }" = "$cmd" ] |
|
|
245 |
then |
246 |
cmd="${cmd} metric ${metric}" |
247 |
fi |
308 |
fi |
248 |
|
309 |
|
|
|
310 |
# Add interface's metric by default |
311 |
if ! ${have_metric} && [ -n "${metric}" ]; then |
312 |
cmd_prefix="${cmd_prefix} metric ${metric}" |
313 |
metric_value="${metric}" |
314 |
fi |
315 |
|
316 |
cmd_add="${cmd_prefix}${cmd_add}" |
317 |
|
249 |
# Check for route already existing: |
318 |
# Check for route already existing: |
250 |
ip ${family} route show ${cmd_nometric} dev "${IFACE}" 2>/dev/null | \ |
319 |
ip ${family} route test ${cmd_add} 2>&1 | grep -q 'RTNETLINK answers: File exists' |
251 |
fgrep -sq "${cmd%% *}" |
|
|
252 |
route_already_exists=$? |
320 |
route_already_exists=$? |
253 |
|
321 |
|
254 |
veinfo ip ${family} route append ${cmd} dev "${IFACE}" |
322 |
if yesno "${nodev}"; then |
255 |
ip ${family} route append ${cmd} dev "${IFACE}" |
323 |
veinfo ip ${family} route append ${cmd_add} |
256 |
rc=$? |
324 |
ip ${family} route append ${cmd_add} |
|
|
325 |
rc=$? |
326 |
else |
327 |
veinfo ip ${family} route append ${cmd_add} dev "${IFACE}" |
328 |
ip ${family} route append ${cmd_add} dev "${IFACE}" |
329 |
rc=$? |
330 |
fi |
331 |
|
257 |
# Check return code in some cases |
332 |
# Check return code in some cases |
258 |
if [ $rc -ne 0 ]; then |
333 |
if [ $rc -ne 0 ]; then |
259 |
# If the route already exists, our default behavior is to WARN but continue. |
334 |
# If the route already exists, our default behavior is to WARN but continue. |
Lines 267-274
_add_route()
Link Here
|
267 |
error|fatal) msgfunc=eerror rc=1;; |
342 |
error|fatal) msgfunc=eerror rc=1;; |
268 |
*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;; |
343 |
*) msgfunc=eerror rc=1 ; eerror "Unknown error behavior: $eh_behavior" ;; |
269 |
esac |
344 |
esac |
270 |
eval $msgfunc "Route '$cmd_nometric' already existed:" |
345 |
local metric_show= |
271 |
eval $msgfunc \"$(ip $family route show ${cmd_nometric} dev "${IFACE}" 2>&1)\" |
346 |
if [ -n "${metric_value}" -a "${metric_value}" != 0 ]; then |
|
|
347 |
metric_show=" metric ${metric_value}" |
348 |
fi |
349 |
$msgfunc "Route '${cmd_show# }${metric_show}' already existed:" |
350 |
eindent |
351 |
_filter_metric "${metric_value}" ${family} route show ${cmd_show} 2>&1 | \ |
352 |
while read l; do $msgfunc "$l"; done |
353 |
eoutdent |
272 |
else |
354 |
else |
273 |
: # TODO: Handle other errors |
355 |
: # TODO: Handle other errors |
274 |
fi |
356 |
fi |