mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-14 20:18:39 +00:00
c6d53c5500
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.
122 lines
3.8 KiB
Bash
Executable file
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
|