NetworkManager/examples/dispatcher/10-ifcfg-rh-routes.sh
Thomas Haller c6d53c5500 dispatcher: avoid "dirname" and "basename" calls in "10-ifcfg-rh-routes.sh" script
The script is run for every dispatcher event. Most of the events are not
actually relevant, and we just need to determine that there is nothing
to do and quit.

Avoid calling "dirname" and "basename".

The supported ifcfg-file has a very specific form. We can just check
(and parse) it in one got regular expression in bash.
2019-10-04 12:38:16 +02:00

122 lines
3.8 KiB
Bash
Executable file

#!/bin/bash
# This script applies policy-based routing rules defined for the
# connection in the /etc/sysconfig/network-scripts/ directory.
#
# This should be installed in both dispatcher.d/ and
# dispatcher.d/pre-up.d/
#
# pre-up scripts delay activation of the device. To reduce the delay,
# it is advised to install the script as symlink to no-wait.d directory.
#
# This file is derived from scripts 'if{up,down}-routes' from
# Fedora/RHEL initscripts.
if [ "$2" != "pre-up" ] && [ "$2" != "down" ]; then
exit 0
fi
file_regex='^/etc/sysconfig/network-scripts/ifcfg-([^/]+)$'
[[ "$CONNECTION_FILENAME" =~ $file_regex ]] || exit 0
profile="${BASH_REMATCH[1]}"
if [ ! -f "/etc/sysconfig/network-scripts/rule-$profile" ] && [ ! -f "/etc/sysconfig/network-scripts/rule6-$profile" ]; then
exit 0
fi
MATCH='^[[:space:]]*(\#.*)?$'
handle_file () {
. $1
routenum=0
while [ "x$(eval echo '$'ADDRESS$routenum)x" != "xx" ]; do
eval $(ipcalc -p $(eval echo '$'ADDRESS$routenum) $(eval echo '$'NETMASK$routenum))
line="$(eval echo '$'ADDRESS$routenum)/$PREFIX"
if [ "x$(eval echo '$'GATEWAY$routenum)x" != "xx" ]; then
line="$line via $(eval echo '$'GATEWAY$routenum)"
fi
line="$line dev $2"
/sbin/ip route add $line
routenum=$(($routenum+1))
done
}
handle_ip_file() {
local f t type= file=$1 proto="-4"
f=${file##*/}
t=${f%%-*}
type=${t%%6}
if [ "$type" != "$t" ]; then
proto="-6"
fi
{ cat "$file" ; echo ; } | while read line; do
if [[ ! "$line" =~ $MATCH ]]; then
/sbin/ip $proto $type add $line
fi
done
}
case "$2" in
pre-up)
# Routes
FILES="/etc/sysconfig/network-scripts/route-$DEVICE_IP_IFACE"
FILES="$FILES /etc/sysconfig/network-scripts/route6-$DEVICE_IP_IFACE"
if [ "$profile" != "$DEVICE_IP_IFACE" ]; then
FILES="$FILES /etc/sysconfig/network-scripts/route-$profile"
FILES="$FILES /etc/sysconfig/network-scripts/route6-$profile"
fi
for file in $FILES; do
if [ -f "$file" ]; then
if grep -Eq '^[[:space:]]*ADDRESS[0-9]+=' $file ; then
# new format
handle_file $file ${1%:*}
else
# older format
handle_ip_file $file
fi
fi
done
# Rules
FILES="/etc/sysconfig/network-scripts/rule-$DEVICE_IP_IFACE"
FILES="$FILES /etc/sysconfig/network-scripts/rule6-$DEVICE_IP_IFACE"
if [ "$profile" != "$DEVICE_IP_IFACE" ]; then
FILES="$FILES /etc/sysconfig/network-scripts/rule-$profile"
FILES="$FILES /etc/sysconfig/network-scripts/rule6-$profile"
fi
for file in $FILES; do
if [ -f "$file" ]; then
handle_ip_file $file
fi
done
;;
down)
# Routes are deleted by NetworkManager
# Rules
FILES="/etc/sysconfig/network-scripts/rule-$DEVICE_IP_IFACE"
FILES="$FILES /etc/sysconfig/network-scripts/rule6-$DEVICE_IP_IFACE"
if [ "$profile" != "$DEVICE_IP_IFACE" ]; then
FILES="$FILES /etc/sysconfig/network-scripts/rule-$profile"
FILES="$FILES /etc/sysconfig/network-scripts/rule6-$profile"
fi
for file in $FILES; do
if [ -f "$file" ]; then
proto=
if [ "$file" != "${file##*/rule6-}" ]; then
proto="-6"
fi
{ cat "$file" ; echo ; } | while read line; do
if [[ ! "$line" =~ $MATCH ]]; then
/sbin/ip $proto rule del $line
fi
done
fi
done
;;
esac