summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-08-20 20:24:15 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-08-28 18:56:56 +0200
commit357edff198aa732e25073b84a4da3e53293e2602 (patch)
treee163c39116753be70c9126cdcc092b41f3261d00 /examples
parent93f85edcce502cfa6d3676f58bf9e8e1a527ea53 (diff)
examples: make 10-ifcfg-rh-routes.sh self-contained
Don't call the 'if{up,down}-routes' scripts because in next Fedora versions network scripts will be deprecated and will not be present in the default installation. Instead, just copy and adapt the code from those scripts. https://bugzilla.redhat.com/show_bug.cgi?id=1618419
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/dispatcher/10-ifcfg-rh-routes.sh106
1 files changed, 97 insertions, 9 deletions
diff --git a/examples/dispatcher/10-ifcfg-rh-routes.sh b/examples/dispatcher/10-ifcfg-rh-routes.sh
index b1d0314d5..147506e47 100755
--- a/examples/dispatcher/10-ifcfg-rh-routes.sh
+++ b/examples/dispatcher/10-ifcfg-rh-routes.sh
@@ -1,15 +1,49 @@
-#!/bin/sh
-
-# This ifcfg-rh-specific script runs
-# /etc/sysconfig/network-scripts/ifup-routes when bringing up
-# interfaces that have routing rules associated with them that can't
-# be expressed by NMSettingIPConfig. (Eg, policy-based routing.)
+#!/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.
+
+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
+}
+
if [ "$2" != "pre-up" -a "$2" != "down" ]; then
exit 0
@@ -19,19 +53,73 @@ dir=$(dirname "$CONNECTION_FILENAME")
if [ "$dir" != "/etc/sysconfig/network-scripts" ]; then
exit 0
fi
+
profile=$(basename "$CONNECTION_FILENAME" | sed -ne 's/^ifcfg-//p')
if [ -z "$profile" ]; then
exit 0
fi
+
if ! [ -f "$dir/rule-$profile" -o -f "$dir/rule6-$profile" ]; then
exit 0
fi
case "$2" in
pre-up)
- /etc/sysconfig/network-scripts/ifup-routes "$DEVICE_IP_IFACE" "$profile"
+ # 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)
- /etc/sysconfig/network-scripts/ifdown-routes "$DEVICE_IP_IFACE" "$profile"
+ # 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