ctdb-scripts: Fix regression in updateip code
[obnox/samba/samba-obnox.git] / ctdb / config / events.d / 10.interface
index 69da2106b3909efc9c27350b5bf74925276045b3..7445200b3287014db9034b9a64f7ad94344324c7 100755 (executable)
@@ -52,6 +52,30 @@ get_all_interfaces ()
     all_interfaces=$(echo $all_interfaces $ctdb_ifaces | tr ' ' '\n' | sort -u)
 }
 
+get_real_iface ()
+{
+    # Output of "ip link show <iface>"
+    _iface_info="$1"
+
+    # Extract the full interface description to see if it is a VLAN
+    _t=$(echo "$_iface_info" |
+               awk 'NR == 1 { iface = $2; sub(":$", "", iface) ; \
+                              print iface }')
+    case "$_t" in
+       *@*)
+           # VLAN: use the underlying interface, after the '@'
+           echo "${_t##*@}"
+           ;;
+       *)
+           # Not a regular VLAN.  For backward compatibility, assume
+           # there is some other sort of VLAN that doesn't have the
+           # '@' in the output and only use what is before a '.'.  If
+           # there is no '.' then this will be the whole interface
+           # name.
+           echo "${_t%%.*}"
+    esac
+}
+
 monitor_interfaces()
 {
        get_all_interfaces
@@ -65,7 +89,7 @@ monitor_interfaces()
        # problem with an interface then set fail=true and continue.
        for iface in $all_interfaces ; do
 
-           ip link show $iface 2>/dev/null >/dev/null || {
+           _iface_info=$(ip link show $iface 2>&1) || {
                echo "ERROR: Interface $iface does not exist but it is used by public addresses."
                mark_down $iface
                continue
@@ -74,7 +98,7 @@ monitor_interfaces()
            # These interfaces are sometimes bond devices
            # When we use VLANs for bond interfaces, there will only
            # be an entry in /proc for the underlying real interface
-           realiface=`echo $iface |sed -e 's/\..*$//'`
+           realiface=$(get_real_iface "$_iface_info")
            bi=$(get_proc "net/bonding/$realiface" 2>/dev/null) && {
                echo "$bi" | grep -q 'Currently Active Slave: None' && {
                        echo "ERROR: No active slaves for bond device $realiface"
@@ -106,7 +130,7 @@ monitor_interfaces()
                mark_up $iface
                ;;
            ib*)
-               # we dont know how to test ib links
+               # we don't know how to test ib links
                mark_up $iface
                ;;
            *)
@@ -267,7 +291,7 @@ case "$1" in
        _ip=$4
        _maskbits=$5
 
-       get_iface_ip_maskbits_family "$_oiface" "$ip" "$maskbits"
+       get_iface_ip_maskbits_family "$_oiface" "$_ip" "$_maskbits"
        oiface="$iface"
 
        # we do an extra delete to cope with the script being killed