diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2012-03-15 13:35:48 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2012-03-15 13:35:48 +0000 |
commit | 86c2c6527c68246b409ecb163074dafc1a222551 (patch) | |
tree | d8c126d990c904785bb74cdb8d2f8bb6c5c860cb /main/bonding/bonding.post-down | |
parent | 9146859d63fb9bc88018664950a7d70086ec51eb (diff) | |
download | aports-86c2c6527c68246b409ecb163074dafc1a222551.tar.bz2 aports-86c2c6527c68246b409ecb163074dafc1a222551.tar.xz |
main/bonding: moved from testing
Diffstat (limited to 'main/bonding/bonding.post-down')
-rwxr-xr-x | main/bonding/bonding.post-down | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/main/bonding/bonding.post-down b/main/bonding/bonding.post-down new file mode 100755 index 0000000000..8dd4c07e93 --- /dev/null +++ b/main/bonding/bonding.post-down @@ -0,0 +1,64 @@ +#!/bin/sh + +[ "$VERBOSITY" = 1 ] && set -x + +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/$IFACE/master/bonding/$2" + 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" +IFSTATE=/var/run/ifstate + +# 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 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 "$slave" primary + 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 + # If $slave is currently up in $IFSTATE, then bring it down, to keep $IFSTATE consistent. + # This is supposed to have the side effect of freeing the interface. + grep -q "^$slave=" $IFSTATE && 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 |