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 || {
return 1;
}
+ mkdir -p $_script_dir || {
+ echo "Failed to mkdir -p $_script_dir"
+ return 1;
+ }
+
+ rm -f $_script_dir/*
+
return 0;
}
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
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;
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