aports/main/bonding/bonding.pre-up
Ariadne Conill 0bd0527214 main/bonding: add support for bond-members statements
The newer ifupdown-ng bond executor uses bond-members instead of bond-slaves and
rewrites the term as support for legacy terms was reimplemented as a term rewriter
when namespaced terms was introduced in ifupdown-ng 0.10.

Alpine still uses the legacy bonding scripts for 3.13, so we need to handle the
rewritten term as well here.

Fixes .
2021-01-16 06:38:52 -07:00

144 lines
3.4 KiB
Bash
Executable file

#!/bin/sh
[ "$VERBOSITY" = 1 ] && set -x
IFSTATE=/var/run/ifstate
add_master()
{
# Return if $BOND_MASTER is already a bonding interface.
[ -f "/sys/class/net/$BOND_MASTER/bonding/slaves" ] && return
# If the bonding module is not yet loaded, load it.
if [ ! -r /sys/class/net/bonding_masters ]; then
modprobe -q bonding
fi
# Create the master interface.
if ! grep -sq "\\<$BOND_MASTER\\>" /sys/class/net/bonding_masters; then
echo "+$BOND_MASTER" > /sys/class/net/bonding_masters
fi
}
sysfs()
{
# Called with :
# $1 = value to write. Won't write if $1 is empty.
# $2 = basename of the file in bonding/ to write to.
if [ "$1" ] ; then
echo "$1" > "/sys/class/net/$BOND_MASTER/bonding/$2"
return $?
fi
return 0
}
sysfs_add()
{
# Called with :
# $1 = values to write.
# $2 = target filename.
for value in $1; do
# Do not add $1 to $2 if already present.
if ! grep -sq "\\<$value\\>" /sys/class/net/$BOND_MASTER/bonding/$2
then
sysfs "+$value" "$2"
fi
done
}
ifup_once()
{
local v=
[ "$VERBOSITY" = 1 ] && v=-v
if [ "$1" != "$IFACE" ] && ! grep -q "^$1=" $IFSTATE && ifup -n "$1" >/dev/null 2>&1; then
ifup $v $1
fi
}
enslave_slaves()
{
case "$BOND_SLAVES" in
none)
BOND_SLAVES=""
;;
all)
BOND_SLAVES=`sed -ne 's/ *\(eth[^:]*\):.*/\1/p' /proc/net/dev`
AUTOIF="yes"
;;
esac
for slave in $BOND_SLAVES ; do
if ( [ "$AUTOIF" ] && grep -q "^$slave=" $IFSTATE ) ; then
echo "Not enslaving interface $slave since it is already configured"
else
# Ensure $slave is down.
ip link set "$slave" down 2>/dev/null
if ! sysfs_add "$slave" slaves 2>/dev/null ; then
echo "Failed to enslave $slave to $BOND_MASTER. Is $BOND_MASTER ready and a bonding interface ?" >&2
else
# Bring up slave if it is defined in interfaces
# This is usefull to bring up slaves that need extra setup.
ifup_once $slave
fi
fi
done
}
setup_master()
{
sysfs "$IF_BOND_MODE" mode
sysfs "$IF_BOND_MIIMON" miimon
sysfs "$IF_BOND_USE_CARRIER" use_carrier
sysfs "$IF_BOND_UPDELAY" updelay
sysfs "$IF_BOND_DOWNDELAY" downdelay
sysfs "$IF_BOND_ARP_INTERVAL" arp_interval
sysfs "$IF_BOND_ARP_VALIDATE" arp_validate
sysfs "$IF_BOND_FAIL_OVER_MAC" fail_over_mac
sysfs "$IF_BOND_XMIT_HASH_POLICY" xmit_hash_policy
sysfs "$IF_BOND_LACP_RATE" lacp_rate
sysfs_add "$IF_BOND_ARP_IP_TARGET" arp_ip_target
}
setup_slaves()
{
# The first slave in bond-primary found in current slaves becomes the primary.
# If no slave in bond-primary is found, then primary does not change.
for slave in $IF_BOND_PRIMARY ; do
if grep -sq "\\<$slave\\>" "/sys/class/net/$BOND_MASTER/bonding/slaves" ; then
sysfs "$slave" primary
break
fi
done
if [ "$IF_BOND_ACTIVE_SLAVE" ] ; then
# Need to force interface up before. Bonding will refuse to activate a down interface.
ip link set "$IF_BOND_ACTIVE_SLAVE" up
sysfs "$IF_BOND_ACTIVE_SLAVE" active_slave
fi
}
# Are there anything to do ?
# Option slaves deprecated, replaced by bond-slaves, but still supported for backward compatibility.
IF_BOND_SLAVES=${IF_BOND_MEMBERS:-${IF_BOND_SLAVES:-$IF_SLAVES}}
if [ "$IF_BOND_MASTER" ] ; then
BOND_MASTER="$IF_BOND_MASTER"
BOND_SLAVES="$IFACE"
if ! [ -e /sys/class/net/$IFACE/master ]; then
ifup_once $BOND_MASTER
fi
else
if [ "$IF_BOND_SLAVES$IF_BOND_MODE" ]; then
BOND_MASTER="$IFACE"
BOND_SLAVES="$IF_BOND_SLAVES"
fi
fi
# Exit if nothing to do...
[ -z "$BOND_MASTER$BOND_SLAVES" ] && exit
add_master
setup_master
enslave_slaves
setup_slaves