config: add setup_iface_ip_readd_script() helper function
authorStefan Metzmacher <metze@samba.org>
Fri, 12 Feb 2010 08:48:01 +0000 (09:48 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 23 Feb 2010 09:38:47 +0000 (10:38 +0100)
This adds a generic infrastructure to register scripts which will
be called when the delete_ip_from_iface() funtion needs to readd
secondary ips to an interface.

metze

config/functions
config/interface_modify.sh

index 531f85937db3a3237536d995feac6d95eb6b4ec9..067515473958a25c6f67a821c3f5c1270163fd33 100644 (file)
@@ -447,13 +447,14 @@ add_ip_to_iface()
        local _iface=$1
        local _ip=$2
        local _maskbits=$3
+       local _readd_base="$CTDB_BASE/state/interface_modify.$_iface.readd.d"
        local _lockfile="$CTDB_BASE/state/interface_modify.$_iface.flock"
 
        test -f $_lockfile || {
                touch $_lockfile
        }
 
-       flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh add "$_iface" "$_ip" "$_maskbits"
+       flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh add "$_iface" "$_ip" "$_maskbits" "$_readd_base"
        return $?
 }
 
@@ -462,13 +463,31 @@ delete_ip_from_iface()
        local _iface=$1
        local _ip=$2
        local _maskbits=$3
+       local _readd_base="$CTDB_BASE/state/interface_modify.$_iface.readd.d"
        local _lockfile="$CTDB_BASE/state/interface_modify.$_iface.flock"
 
        test -f $_lockfile || {
                touch $_lockfile
        }
 
-       flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh delete "$_iface" "$_ip" "$_maskbits"
+       flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh delete "$_iface" "$_ip" "$_maskbits" "$_readd_base"
+       return $?
+}
+
+setup_iface_ip_readd_script()
+{
+       local _iface=$1
+       local _ip=$2
+       local _maskbits=$3
+       local _readd_script=$4
+       local _readd_base="$CTDB_BASE/state/interface_modify.$_iface.readd.d"
+       local _lockfile="$CTDB_BASE/state/interface_modify.$_iface.flock"
+
+       test -f $_lockfile || {
+               touch $_lockfile
+       }
+
+       flock --timeout 30 $_lockfile $CTDB_BASE/interface_modify.sh readd_script "$_iface" "$_ip" "$_maskbits" "$_readd_base" "$_readd_script"
        return $?
 }
 
index 2835d18faffca3873eacca5bdf91510c0a6c1c69..738530b4e9eb682b5e4353646cc06c2394a51974 100755 (executable)
@@ -5,12 +5,16 @@ OP=$1
 IFACE=$2
 IP=$3
 MASKBITS=$4
+READD_BASE=$5
+READD_SCRIPT=$6
 
 add_ip_to_iface()
 {
        local _iface=$1
        local _ip=$2
        local _maskbits=$3
+       local _readd_base=$4
+       local _script_dir="$_readd_base/$_ip.$_maskbits"
 
        # we make sure the interface is up first
        /sbin/ip link set $_iface up || {
@@ -22,6 +26,13 @@ add_ip_to_iface()
                return 1;
        }
 
+       mkdir -p $_script_dir || {
+               echo "Failed to mkdir -p $_script_dir"
+               return 1;
+       }
+
+       rm -f $_script_dir/*
+
        return 0;
 }
 
@@ -30,6 +41,8 @@ delete_ip_from_iface()
        local _iface=$1
        local _ip=$2
        local _maskbits=$3
+       local _readd_base=$4
+       local _script_dir="$_readd_base/$_ip.$_maskbits"
 
        # the ip tool will delete all secondary IPs if this is the primary. To work around
        # this _very_ annoying behaviour we have to keep a record of the secondaries and re-add
@@ -49,8 +62,27 @@ delete_ip_from_iface()
                    echo "re-adding secondary address $_i to dev $_iface"
                    /sbin/ip addr add $_i brd + dev $_iface || _failed=1
                fi
+               local _s_ip=`echo "$_i" | cut -d '/' -f1`
+               local _s_maskbits=`echo "$_i" | cut -d '/' -f2`
+               local _s_script_dir="$_readd_base/$_s_ip.$_s_maskbits"
+
+               local _s_script=""
+               for _s_script in $_s_script_dir/*; do
+                       $_s_script "$_iface" "$_s_ip" "$_s_maskbits" || {
+                               ret=$?
+                               echo "$_s_script '$_iface' '$_s_ip' '$_s_maskbits' - failed - $ret"
+                               _failed=1
+                       }
+                       echo "call $_s_script '$_iface' '$_s_ip' '$_s_maskbits'"
+               done
+
            done
        }
+
+       test -d $_script_dir && {
+               rm -f $_script_dir/*
+       }
+
        [ $_failed = 0 ] || {
                echo "Failed to del $_ip on dev $_iface"
                return 1;
@@ -58,13 +90,47 @@ delete_ip_from_iface()
        return 0;
 }
 
+setup_iface_ip_readd_script()
+{
+       local _iface=$1
+       local _ip=$2
+       local _maskbits=$3
+       local _readd_base=$4
+       local _readd_script=$5
+       local _script_dir="$_readd_base/$_ip.$_maskbits"
+
+       test -x "$_readd_script" || {
+               echo "Script '$_readd_script' isn't executable"
+               return 1;
+       }
+
+       local _readd_basename=`basename $_readd_script`
+       local _readd_final="$_script_dir/$_readd_basename"
+
+       mkdir -p $_script_dir || {
+               echo "Failed to mkdir -p $_script_dir"
+               return 1;
+       }
+
+       cp -a $_readd_script $_readd_final || {
+               echo "Failed to - cp -a $_readd_script $_readd_final"
+               return 1;
+       }
+
+       return 0
+}
+
 case "$OP" in
        add)
-               add_ip_to_iface $IFACE $IP $MASKBITS
+               add_ip_to_iface $IFACE $IP $MASKBITS $READD_BASE
                exit $?
                ;;
        delete)
-               delete_ip_from_iface $IFACE $IP $MASKBITS
+               delete_ip_from_iface $IFACE $IP $MASKBITS $READD_BASE
+               exit $?
+               ;;
+       readd_script)
+               setup_iface_ip_readd_script $IFACE $IP $MASKBITS $READD_BASE $READD_SCRIPT
                exit $?
                ;;
 esac