File: //etc/network/if-post-down.d/ifenslave
#!/bin/sh
[ "$VERBOSITY" = 1 ] && set -x
[ "$ADDRFAM" = meta ] && exit 0
sysfs()
{
	# Called with :
	# $1 = basename of the file in bonding/ to write to.
	# $2 = value to write. Won't write if $2 is empty.
	if [ "$2" ] ; then
		echo "$2" > "/sys/class/net/$IFACE/master/bonding/$1"
		return $?
	fi
	return 0
}
sysfs_remove_all()
{
	# Called with:
	# $1 = target filename
	read values < "/sys/class/net/$IFACE/bonding/$1"
	for value in $values ; do 
		echo "-$value" > "/sys/class/net/$IFACE/bonding/$1"
	done
}
BOND_PARAMS="/sys/class/net/$IFACE/bonding"
# free $IFACE if it is currently enslaved to a bonding device.
if [ -f "/sys/class/net/$IFACE/master/bonding/slaves" ] ; then
	echo "-$IFACE" > "/sys/class/net/$IFACE/master/bonding/slaves"
	# The first slave in bond-primary found in current slaves becomes the primary.
	# If no slave in bond-primary is found, then the primary does not change and might be undefined if just removed.
	for slave in $IF_BOND_PRIMARY ; do
		if grep -sq "\\<$slave\\>" "/sys/class/net/$IFACE/master/bonding/slaves" ; then
			sysfs primary "$slave"
			break
		fi
	done
fi
# If $IFACE is not a master, exit.
[ ! -f "$BOND_PARAMS/slaves" ] && exit
# Unset multivalue sysfs entries, so that re-enabling the interface later won't cause error.
sysfs_remove_all arp_ip_target
# Remove any slaves of $IFACE.
[ "$VERBOSITY" = 1 ] && v=-v
read slaves < "$BOND_PARAMS/slaves"
for slave in $slaves ; do
	# This is supposed to have the side effect of freeing the interface.
	ifquery --state $slave && ifdown $v $slave
	# Anyway, ensure $slave is free.
	if [ -f "/sys/class/net/$slave/master/bonding/slaves" ] ; then
		echo "-$slave" > "$BOND_PARAMS/slaves" 2> /dev/null
	fi
done
# Remove the master itself
echo "-$IFACE" > /sys/class/net/bonding_masters
rm /run/network/ifenslave.$IFACE