mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-05-12 12:14:35 +02:00
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 #12319.
144 lines
3.4 KiB
Bash
Executable file
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
|