[SCM] CTDB repository - branch master updated - ctdb-1.13-49-g7293762

Ronnie Sahlberg sahlberg at samba.org
Wed Mar 21 22:54:36 MDT 2012


The branch, master has been updated
       via  7293762046e25a9c96e6417e34e18c214ebc6e55 (commit)
       via  5083b266dd68b292c4275505f3d1b878dbf12f11 (commit)
       via  7d7488a49bc7e799f39f3da3fa81be7a2e14480a (commit)
       via  da2e9650a97f99e7d694659926d9958927edd8ad (commit)
       via  0142729c96b8bfecfabe35439071557bcc6ed4da (commit)
       via  1db9a533aacc6e02ddbadf76241429144a949e1c (commit)
       via  299ce89fb3deeefcc7c01b20197dc6adee1e8194 (commit)
       via  79eec235ac9b051333751186c32924d92e6ebeff (commit)
       via  0fc20ab5207d4f812bf62b90a66c707f76742f84 (commit)
       via  9c30bf7fd3d94884e27a258571a28dca5e460177 (commit)
       via  6d4b4b1293ba960d8fdf81958d6e8dd23c9d771a (commit)
       via  38396185effbcf313678c2e94d4bd20f534c4f03 (commit)
       via  d132a8f4a8c0573ac447713a71911f02b6f0d73c (commit)
       via  236d572556e447e2d82d14d2c8a40ed8cb98944d (commit)
       via  351ca413eec460330571ca8b01ad269728fe15df (commit)
       via  d4621277240721e6d130a930b0100506b64467ea (commit)
       via  bdb4cdaf2aed79c8de6a8db8c01685b242808310 (commit)
       via  d034845ecea66b47004bc73f2554914a397b1c9d (commit)
       via  ac2cd2a8cbed97348ceae54167ad83cb074ff6b3 (commit)
       via  26292f362890ca6cb65d0028d50fa97458e0449f (commit)
       via  8b8e17bea87a8c16f7c0f54fcfe29190f203f673 (commit)
       via  f4949b3c1b36949544e98c9fbb64447f94f9e432 (commit)
       via  994492f79275fe84155d842f6bc288c1858217dd (commit)
       via  93f90caf91246074d9359bf31a39b26212cccc42 (commit)
       via  2a2ea6c61a05af2d0765e964abcc7ef04047431e (commit)
       via  45c3476d12bf0f52966b72d286f101fce1382cd2 (commit)
       via  0f7cbbb55f26cf3c953e98fe5e7eaa12f59fbf78 (commit)
       via  97b0c138cb97e30db27c40b4ee1481109ae90c78 (commit)
      from  270edc87e6bcfd6e76c526bf86df865e4d47d11c (commit)

http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7293762046e25a9c96e6417e34e18c214ebc6e55
Merge: 5083b266dd68b292c4275505f3d1b878dbf12f11 7d7488a49bc7e799f39f3da3fa81be7a2e14480a
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Thu Mar 22 15:39:59 2012 +1100

    Merge remote branch 'martins/policy_routing'

commit 5083b266dd68b292c4275505f3d1b878dbf12f11
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Mar 22 15:27:25 2012 +1100

    Undo damage done by d8d37493478a26c5f1809a5f3df89ffd6e149281
    
    The implementation of DisableIPFailover got intermingled with
    --nopublicipcheck.  This just looks wrong - Ronnie must have been
    having a bad day.  :-)
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>

-----------------------------------------------------------------------

Summary of changes:
 .gitignore                                         |    2 +
 Makefile.in                                        |    1 -
 config/README                                      |    6 -
 config/events.d/13.per_ip_routing                  |  662 ++++++++------------
 config/functions                                   |  197 +++----
 config/interface_modify.sh                         |  142 -----
 include/ctdb_private.h                             |    1 +
 packaging/RPM/ctdb.spec.in                         |    1 -
 server/ctdb_recoverd.c                             |    2 +-
 server/ctdbd.c                                     |    4 +-
 tests/eventscripts/common.sh                       |  188 ++++--
 tests/eventscripts/etc-ctdb/public_addresses       |    5 +
 .../multievent/13.per_ip_routing.001.sh            |   16 +
 .../multievent/13.per_ip_routing.002.sh            |   14 +
 .../multievent/13.per_ip_routing.003.sh            |   24 +
 .../multievent/13.per_ip_routing.004.sh            |   25 +
 .../multievent/13.per_ip_routing.005.sh            |   38 ++
 .../multievent/13.per_ip_routing.006.sh            |   38 ++
 .../multievent/13.per_ip_routing.007.sh            |   40 ++
 .../multievent/13.per_ip_routing.008.sh            |   42 ++
 .../multievent/13.per_ip_routing.009.sh            |   44 ++
 .../multievent/13.per_ip_routing.010.sh            |   52 ++
 .../multievent/13.per_ip_routing.011.sh            |   41 ++
 .../multievent/13.per_ip_routing.012.sh            |   48 ++
 tests/eventscripts/run_tests.sh                    |   13 +
 .../simple/10.interface.monitor.015.sh             |    2 +-
 .../eventscripts/simple/10.interface.takeip.003.sh |    6 +-
 tests/eventscripts/stubs/ctdb                      |  208 +++++--
 tests/eventscripts/stubs/ip                        |  598 +++++++++++++-----
 29 files changed, 1512 insertions(+), 948 deletions(-)
 delete mode 100755 config/interface_modify.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.001.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.002.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.003.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.004.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.005.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.006.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.007.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.008.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.009.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.010.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.011.sh
 create mode 100755 tests/eventscripts/multievent/13.per_ip_routing.012.sh


Changeset truncated at 500 lines:

diff --git a/.gitignore b/.gitignore
index ef8ae6a..77ffc3b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,5 @@ tests/events.d/00.ctdb_test_trigger
 tests/var
 tests/takeover/ctdb_takeover.pyc
 tests/eventscripts/var
+tests/eventscripts/etc/iproute2
+tests/eventscripts/etc-ctdb/policy_routing
diff --git a/Makefile.in b/Makefile.in
index 9055a8f..90d7b08 100755
--- a/Makefile.in
+++ b/Makefile.in
@@ -315,7 +315,6 @@ install: all $(PMDA_INSTALL)
 	${INSTALLCMD} -m 644 include/ctdb_typesafe_cb.h $(DESTDIR)$(includedir)
 	${INSTALLCMD} -m 644 config/functions $(DESTDIR)$(etcdir)/ctdb
 	${INSTALLCMD} -m 755 config/statd-callout $(DESTDIR)$(etcdir)/ctdb
-	${INSTALLCMD} -m 755 config/interface_modify.sh $(DESTDIR)$(etcdir)/ctdb
 	${INSTALLCMD} -m 644 config/events.d/README $(DESTDIR)$(docdir)/ctdb/README.eventscripts
 	${INSTALLCMD} -m 644 doc/recovery-process.txt $(DESTDIR)$(docdir)/ctdb/recovery-process.txt
 	${INSTALLCMD} -m 755 config/events.d/00.ctdb $(DESTDIR)$(etcdir)/ctdb/events.d
diff --git a/config/README b/config/README
index f2457a7..ffbeb0e 100644
--- a/config/README
+++ b/config/README
@@ -14,12 +14,6 @@ Selected highlights:
 
     Support functions, sourced by eventscripts and other scripts.
 
-  interface_modify.sh
-
-    Script to support add/remove IPs and other funky stuff.  Not sure
-    why this is separate... but it certainly allows easy wrapping by
-    flock.
-
   statd-callout
 
     rpc.statd high-availability callout to support lock migration on
diff --git a/config/events.d/13.per_ip_routing b/config/events.d/13.per_ip_routing
index d8a0644..f51d5ed 100755
--- a/config/events.d/13.per_ip_routing
+++ b/config/events.d/13.per_ip_routing
@@ -3,492 +3,350 @@
 . $CTDB_BASE/functions
 loadconfig
 
-ctdb_setup_service_state_dir "per_ip_routing"
+# Do nothing if unconfigured 
+[ -n "$CTDB_PER_IP_ROUTING_CONF" ] || exit 0
 
-[ -z "$CTDB_PER_IP_ROUTING_STATE" ] && {
-	CTDB_PER_IP_ROUTING_STATE="$service_state_dir"
-}
+table_id_prefix="ctdb."
 
-AUTO_LINK_LOCAL="no"
-
-case "$CTDB_PER_IP_ROUTING_CONF" in
-	__auto_link_local__)
-		AUTO_LINK_LOCAL="yes"
-		CTDB_PER_IP_ROUTING_CONF="$CTDB_PER_IP_ROUTING_STATE/auto_link_local.conf"
-		;;
-	*)
-		[ -z "$CTDB_PER_IP_ROUTING_CONF" ] && {
-			#echo "No config file found. Nothing to do for 13.per_ip_routing"
-			exit 0;
-		}
-		;;
-esac
+[ -n "$CTDB_PER_IP_ROUTING_RULE_PREF" ] || \
+    die "error: CTDB_PER_IP_ROUTING_RULE_PREF not configured"
 
-_low=$CTDB_PER_IP_ROUTING_TABLE_ID_LOW
-_high=$CTDB_PER_IP_ROUTING_TABLE_ID_HIGH
+[ "$CTDB_PER_IP_ROUTING_TABLE_ID_LOW" -lt "$CTDB_PER_IP_ROUTING_TABLE_ID_HIGH" ] 2>/dev/null || \
+    die "error: CTDB_PER_IP_ROUTING_TABLE_ID_LOW[$CTDB_PER_IP_ROUTING_TABLE_ID_LOW] and/or CTDB_PER_IP_ROUTING_TABLE_ID_HIGH[$CTDB_PER_IP_ROUTING_TABLE_ID_HIGH] improperly configured"
 
-test -z "$_low" && {
-	echo "$0: CTDB_PER_IP_ROUTING_TABLE_ID_LOW not configured";
-	exit 1;
-}
-test -z "$_high" && {
-	echo "$0: CTDB_PER_IP_ROUTING_TABLE_ID_HIGH not configured";
-	exit 1;
-}
-test "$_low" -ge "$_high" && {
-	echo "$0: CTDB_PER_IP_ROUTING_TABLE_ID_LOW[$_low] needs to be below CTDB_PER_IP_ROUTING_TABLE_ID_HIGH[$_high]";
-	exit 1;
-}
+######################################################################
 
-test -z "$CTDB_PER_IP_ROUTING_RULE_PREF" && {
-	echo "$0: CTDB_PER_IP_ROUTING_RULE_PREF not configured";
-	exit 1;
-}
-
-locknesting=0
-lock_root="$CTDB_PER_IP_ROUTING_STATE"
-host=`hostname`
-
-lock_debug()
+ipv4_is_valid_addr()
 {
-	echo -n ""
-}
-
-############################
-# grab a lock file. Not atomic, but close :)
-# tries to cope with NFS
-lock_file() {
-	if [ -z "$lock_root" ]; then
-		lock_root=`pwd`;
-	fi
-	lckf="$lock_root/$1"
-	machine=`cat "$lckf" 2> /dev/null | cut -d: -f1`
-	pid=`cat "$lckf" 2> /dev/null | cut -d: -f2`
-
-	if [ "$pid" = "$$" ]; then
-		locknesting=`expr $locknesting + 1`
-		lock_debug "lock nesting now $locknesting"
-		return 0
+    _ip="$1"
+
+    _count=0
+    # Get the shell to break up the address into 1 word per octet 
+    for _o in $(export IFS="." ; echo $_ip) ; do
+	# The 2>/dev/null stops output from failures where an "octet"
+	# is not numeric.  The test will still fail.
+	if ! [ 0 -le $_o -a $_o -le 255 ] 2>/dev/null ; then
+	    return 1
 	fi
+	_count=$(($_count + 1))
+    done
 
-	if test -f "$lckf"; then
-		test $machine = $host || {
-			lock_debug "lock file $lckf is valid for other machine $machine"
-			stat -c%y "$lckf"
-			return 1
-		}
-		kill -0 $pid && {
-			lock_debug "lock file $lckf is valid for process $pid"
-			stat -c%y "$lckf"
-			return 1
-		}
-		lock_debug "stale lock file $lckf for $machine:$pid"
-		cat "$lckf"
-		rm -f "$lckf"
-	fi
-	echo "$host:$$" > "$lckf"
-	return 0
+    # A valid IPv4 address has 4 octets
+    [ $_count -eq 4 ]
 }
 
-############################
-# unlock a lock file
-unlock_file() {
-	if [ -z "$lock_root" ]; then
-		lock_root=`pwd`;
-	fi
-	if [ "$locknesting" != "0" ]; then
-		locknesting=`expr $locknesting - 1`
-		lock_debug "lock nesting now $locknesting"
-	else
-		lckf="$lock_root/$1"
-		rm -f "$lckf"
-	fi
-}
-
-generate_table_id () {
-	local _ip=$1
-	local _ipsdir="$CTDB_PER_IP_ROUTING_STATE/ips"
-	local _ipdir="$_ipsdir/$_ip"
+ensure_ipv4_is_valid_addr ()
+{
+    _event="$1"
+    _ip="$2"
 
-	mkdir -p $_ipdir
+    ipv4_is_valid_addr "$_ip" || {
+	echo "$0: $_event not an ipv4 address skipping IP:$_ip"
+	exit 0
+    }
+}
 
-	#echo "generate_table_id $_ip"
+ipv4_host_addr_to_net ()
+{
+    _host="$1"
+    _maskbits="$2"
+
+    # Convert the host address to an unsigned long by splitting out
+    # the octets and doing the math.
+    _host_ul=0
+    for _o in $(export IFS="." ; echo $_host) ; do
+	_host_ul=$(( ($_host_ul << 8) + $_o)) # work around Emacs color bug
+    done
+
+    # Calculate the mask and apply it.
+    _mask_ul=$(( 0xffffffff << (32 - $_maskbits) ))
+    _net_ul=$(( $_host_ul & $_mask_ul ))
+ 
+    # Now convert to a network address one byte at a time.
+    _net=""
+    for _o in $(seq 1 4) ; do
+	_net="$(($_net_ul & 255))${_net:+.}${_net}"
+	_net_ul=$(($_net_ul >> 8))
+    done
+
+    echo "${_net}/${_maskbits}"
+}
 
-	local _id=`cat $_ipdir/table_id 2>/dev/null| xargs`
-	test -n "$_id" && {
-		#echo "IP: $_ip => OLD TABLE: $_id"
-		table_id=$_id
-		return 0;
-	}
+######################################################################
 
-	local _low="$CTDB_PER_IP_ROUTING_TABLE_ID_LOW"
-	local _high="$CTDB_PER_IP_ROUTING_TABLE_ID_HIGH"
-
-	local _newid=""
-	for _id in `seq $_low $_high | xargs`; do
-		local _table_lck="table_id_$_id.lock"
-		lock_file $_table_lck 2>/dev/null || {
-			continue;
-		}
-		local _taken=`grep "^$_id$" $_ipsdir/*/table_id 2>/dev/null| wc -l | xargs`
-		test x"$_taken" != x"0" && {
-			unlock_file $_table_lck
-			#echo "tableid: $_id taken"
-			continue
-		}
-		_newid=$_id;
-		echo "$_newid" > $_ipdir/table_id
-		unlock_file $_table_lck
-		break;
+# Setup a table id to use for the given IP.  We don't need to know it,
+# it just needs to exist in /etc/iproute2/rt_tables.  Fail if no free
+# table id could be found in the configured range.
+ensure_table_id_for_ip ()
+{
+    _ip=$1
+
+    _f="$CTDB_ETCDIR/iproute2/rt_tables"
+    # This file should always exist, but...
+    if [ ! -f "$_f" ] ; then
+	mkdir -p $(dirname "$_f")
+	touch "$_f"
+    fi
+
+    # Maintain a table id for each IP address we've ever seen in
+    # rt_tables.  We use a "ctdb." prefix on the label.
+    _label="${table_id_prefix}${_ip}"
+
+    # This finds either the table id corresponding to the label or a
+    # new unused one (that is greater than all the used ones in the
+    # range).
+    (
+	# Note that die() just gets us out of the subshell...
+	flock --timeout 30 0 || \
+	    die "ensure_table_id_for_ip: failed to lock file $_f"
+
+	_new=$CTDB_PER_IP_ROUTING_TABLE_ID_LOW
+	while read _t _l ; do
+	    # Skip comments
+	    case "$_t" in
+		\#*) continue ;;
+	    esac
+	    # Found existing: done
+	    if [ "$_l" = "$_label" ] ; then
+		return 0
+	    fi
+	    # Potentially update the new table id to be used.  The
+	    # redirect stops error spam for a non-numeric value.
+	    if [ $_new -le $_t -a \
+		$_t -le $CTDB_PER_IP_ROUTING_TABLE_ID_HIGH ] 2>/dev/null ; then
+		_new=$(($_t + 1))
+	    fi
 	done
 
-	test -z "$_newid" && {
-		echo "generate_table_id: out of table ids: $_low - $_high"
-		exit 1;
-	}
-
-	#echo "IP: $_ip => NEW TABLE: $_newid"
-	table_id=$_newid
-	return 0;
+	# If the new table id is legal then add it to the file and
+	# print it.
+	if [ $_new -le $CTDB_PER_IP_ROUTING_TABLE_ID_HIGH ] ; then
+	    printf "%d\t%s\n" "$_new" "$_label" >>"$_f"
+	    return 0
+	else
+	    return 1
+	fi
+    ) <"$_f"
 }
 
-run_release_script_once()
+# Clean up all the table ids that we might own.
+clean_up_table_ids ()
 {
-	local _script=$1
-
-	#echo "run_release_script_once[$_script]"
-
-	test -x "$_script" && {
-		#echo "run it: start"
-		$_script || {
-			echo "release_script: $_script - failed $?"
-			return $?;
-		}
-		#echo "run it: end"
-	}
-
-	echo '#!/bin/sh' > $_script
-	echo '#' >> $_script
-	echo >> $_script
+    _f="$CTDB_ETCDIR/iproute2/rt_tables"
+    # Even if this didn't exist on the system, adding a route will
+    # have created it.  What if we startup and immediately shutdown?
+    if [ ! -f "$_f" ] ; then
+	mkdir -p $(basename "$_f")
+	touch "$_f"
+    fi
+
+    (
+	# Note that die() just gets us out of the subshell...
+	flock --timeout 30 0 || \
+	    die "clean_up_table_ids: failed to lock file $_f"
+
+	# Delete any items from the file that have a table id in our
+	# range or a label matching our label.  Preserve comments.
+	_tmp="${_f}.$$.ctdb"
+	awk -v min="$CTDB_PER_IP_ROUTING_TABLE_ID_LOW" \
+	    -v max="$CTDB_PER_IP_ROUTING_TABLE_ID_HIGH" \
+	    -v pre="$table_id_prefix" \
+	    '/^#/ || \
+	     !(min <= $1 && $1 <= max) && \
+	     !(index($2, pre) == 1) \
+	     { print $0 }' "$_f" >"$_tmp"
+
+	mv "$_tmp" "$_f"
+	# The lock is gone - don't do anything else here
+    ) <"$_f"
+}
 
-	chmod +x $_script
+######################################################################
 
-	return 0;
+# This prints the config for an IP, which is either relevant entries
+# from the config file or, if set to the magic link local value, some
+# link local routing config for the IP.
+# NOTE: non-zero return indicates missing configuration file
+get_config_for_ip ()
+{
+    _ip="$1"
+
+    if [ "$CTDB_PER_IP_ROUTING_CONF" = "__auto_link_local__" ] ; then
+	# When parsing public_addresses also split on '/'.  This means
+	# that we get the maskbits as item #2 without further parsing.
+	while IFS="/$IFS" read _i _maskbits _x ; do
+	    if [ "$_ip" = "$_i" ] ; then
+		echo -n "$_ip "; ipv4_host_addr_to_net "$_ip" "$_maskbits"
+	    fi
+	done <"${CTDB_PUBLIC_ADDRESSES:-${CTDB_BASE:-/dev/null}${CTDB:+/public_addresses}}"
+    else
+	[ -f "$CTDB_PER_IP_ROUTING_CONF" ] || return 1
+
+	while read _i _rest ; do
+	    if [ "$_ip" = "$_i" ] ; then
+		printf "%s\t%s\n" "$_ip" "$_rest"
+	    fi
+	done <"$CTDB_PER_IP_ROUTING_CONF"
+    fi
 }
 
-generate_auto_link_local()
+ip_has_configuration ()
 {
-	local _ip=$1
-	local _maskbits=$2
-
-	#echo "generate_auto_link_local $_ip $_maskbits"
-
-	local _netip=`ipv4_host_addr_to_net_addr $_ip $_maskbits`
-
-	local _line="$_ip $_netip/$_maskbits"
-
-	local _lockfile="$CTDB_PER_IP_ROUTING_CONF.lock"
-	local _script="$CTDB_PER_IP_ROUTING_CONF.$$.sh"
-
-	echo "#!/bin/sh" > $_script
-	echo "#" >> $_script
-	echo "" >> $_script
-	echo "_config=\`cat $CTDB_PER_IP_ROUTING_CONF 2>/dev/null\`" >> $_script
-	echo "_exact=\`echo -n \"\$_config\" | grep \"^$_line\$\" | wc -l | xargs\`" >> $_script
-	echo "" >> $_script
-
-	echo "test x\"\$_exact\" = x\"1\" && {" >> $_script
-	echo "    exit 0;" >> $_script
-	echo "}" >> $_script
-	echo "" >> $_script
-
-	echo "_tmp=\"$CTDB_PER_IP_ROUTING_CONF.$$.tmp\"" >> $_script
-	echo "echo -n \"\$_config\" | grep -v \"^$_ip \" | cat > \$_tmp || {" >> $_script
-	echo "    echo \"echo -n \\\"\$_config\\\" | grep -v \\\"^$_ip \\\" > \$_tmp - failed\"" >> $_script
-	echo "    exit 1;" >> $_script
-	echo "}" >> $_script
-	echo "echo \"$_line\" >> \$_tmp || {" >> $_script
-	echo "    echo \"echo \\\"$_line\\\" >> \$_tmp - failed\"" >> $_script
-	echo "    exit 1;" >> $_script
-	echo "}" >> $_script
-	echo "" >> $_script
-
-	echo "mv \$_tmp $CTDB_PER_IP_ROUTING_CONF || {" >> $_script
-	echo "    echo \"mv \$_tmp $CTDB_PER_IP_ROUTING_CONF - failed\"" >> $_script
-	echo "    exit 1;" >> $_script
-	echo "}" >> $_script
-	echo "" >> $_script
-
-	echo "echo \"Added '$_line' to $CTDB_PER_IP_ROUTING_CONF\"">> $_script
-	echo "exit 0" >> $_script
-
-	chmod +x $_script
-
-	test -f $_lockfile || {
-		touch $_lockfile
-	}
+    _ip="$1"
 
-	flock --timeout 30 $_lockfile $_script
-	ret=$?
-	rm $_script
-	return $ret
+    _config="$(get_config_for_ip $_ip)" || \
+	die "error: CTDB_PER_IP_ROUTING_CONF=$CTDB_PER_IP_ROUTING_CONF file not found"
+    [ -n "$_config" ]
 }
 
-generate_per_ip_routing()
+add_routing_for_ip ()
 {
-	local _ip=$1
-	local _maskbits=$2
-	local _iface=$3
-	local _readonly=$4
-	local _ipdir="$CTDB_PER_IP_ROUTING_STATE/ips/$_ip"
-
-	table_id=""
-	release_script="$_ipdir/per_ip_routing_release.sh"
-	setup_script="$_ipdir/per_ip_routing_setup.sh"
-
-	test x"$_readonly" = x"yes" && {
-		test -d $_ipdir || {
-			return 1;
-		}
-		return 0;
-	}
+    _iface="$1"
+    _ip="$2"
 
-	mkdir -p $_ipdir || {
-		echo "mkdir -p $_ipdir failed"
-		return 1;
-	}
-	echo "$_ip" > $_ipdir/ip
+    # Do nothing if no config for this IP.
+    ip_has_configuration "$_ip" || return 0
 
-	generate_table_id $_ip
+    ensure_table_id_for_ip "$_ip" || \
+	die "add_routing_for_ip: out of table ids in range $CTDB_PER_IP_ROUTING_TABLE_ID_LOW - $CTDB_PER_IP_ROUTING_TABLE_ID_HIGH"
 
-	test x"$AUTO_LINK_LOCAL" = x"yes" && {
-		generate_auto_link_local $_ip $_maskbits
-	}
+    _pref="$CTDB_PER_IP_ROUTING_RULE_PREF"
+    _table_id="${table_id_prefix}${_ip}"
 
-	run_release_script_once $release_script
+    del_routing_for_ip "$_ip"
 
-	echo '#!/bin/sh' > $setup_script
-	echo '#' >> $setup_script
-	echo >> $setup_script
-	chmod +x $setup_script
+    ip rule add from "$_ip" pref "$_pref" table "$_table_id" || \
+	die "add_routing_for_ip: failed to add rule for $_ip"
 
-	return 0;
+    # Add routes to table for any lines matching the IP.
+    get_config_for_ip "$_ip" |


-- 
CTDB repository


More information about the samba-cvs mailing list