+++ /dev/null
-#!/bin/sh
-# ctdb event script for NFS tickle acks
-
-. $CTDB_BASE/functions
-
-service_name="nfs"
-
-loadconfig
-
-service_start="mkdir -p $CTDB_BASE/state/nfstickle;mkdir -p $NFS_TICKLE_SHARED_DIRECTORY/`hostname`;echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle"
-service_reconfigure=$service_start
-
-ctdb_start_stop_service
-
-[ -z "$NFS_TICKLE_SHARED_DIRECTORY" ] && exit 0
-
-case "$1" in
- startup)
- ctdb_service_start
- ;;
-
- takeip)
- iface=$2
- ip=$3
- # first send a grat arp, to ensure the client knows the updated
- # mac address for this IP
- ctdb gratiousarp $ip $iface
- # send tickle acks for all the connections the old server had
- for f in $NFS_TICKLE_SHARED_DIRECTORY/*/$ip; do
- [ -f $f ] && cat $f | while read dest; do
- # send three, in case of lost packets
- echo "Sending NFS tickle ack for $ip to $dest"
- for i in `seq 1 3`; do
- ctdb tickle $dest $ip:2049
- done
- done
- done
- ;;
-
- monitor)
- mydir=$NFS_TICKLE_SHARED_DIRECTORY/`hostname`
- rm -f $mydir/*
- # record our connections to shared storage
- netstat -tn |
- awk -v mydir="$mydir" '
-$1 == "tcp" && $6 == "ESTABLISHED" && $4 ~ /:2049$/ {
- destip = gensub(/:2049$/, "", 1, $4);
- c[destip] = c[destip] (c[destip] ? "\n" : "" ) $5;
-}
-END {
- for (ip in c) {
- print c[ip] > mydir "/" ip
- }
-}'
- ;;
-
- *)
- ctdb_standard_event_handler "$@"
- ;;
-esac
-
-exit 0
flock -w 30 /var/ctdb/iptables-ctdb.flock /sbin/iptables "$@"
}
+########################################################
+# tickle handling
+########################################################
+
+# Temporary directory for tickles.
+tickledir="$CTDB_BASE/state/tickles"
+mkdir -p "$tickledir"
+
+update_tickles ()
+{
+ _port="$1"
+
+ mkdir -p "$tickledir" # Just in case
+
+ # Who am I?
+ _pnn=$(ctdb pnn) ; _pnn=${_pnn#PNN:}
+
+ # What public IPs do I hold?
+ _ips=$(ctdb -Y ip | awk -F: -v pnn=$_pnn '$3 == pnn {print $2}')
+
+ # IPs as a regexp choice
+ _ipschoice="($(echo $_ips | sed -e 's/ /|/g' -e 's/\./\\\\./g'))"
+
+ # Record connections to our public IPs in a temporary file
+ _my_connections="${tickledir}/${_port}.connections"
+ rm -f "$_my_connections"
+ netstat -tn |
+ awk -v destpat="^${_ipschoice}:${_port}\$" \
+ '$1 == "tcp" && $6 == "ESTABLISHED" && $4 ~ destpat {print $5, $4}' |
+ sort >"$_my_connections"
+
+ # Record our current tickles in a temporary file
+ _my_tickles="${tickledir}/${_port}.tickles"
+ rm -f "$_my_tickles"
+ for _i in $_ips ; do
+ ctdb -Y gettickles $_i $_port |
+ awk -F: 'NR > 1 { printf "%s:%s %s:%s\n", $2, $3, $4, $5 }'
+ done |
+ sort >"$_my_tickles"
+
+ # Add tickles for connections that we haven't already got tickles for
+ comm -23 "$_my_connections" "$_my_tickles" |
+ while read _src _dst ; do
+ ctdb addtickle $_src $_dst
+ done
+
+ # Remove tickles for connections that are no longer there
+ comm -13 "$_my_connections" "$_my_tickles" |
+ while read _src _dst ; do
+ ctdb deltickle $_src $_dst
+ done
+
+ rm -f "$_my_connections" "$_my_tickles"
+}
+
########################################################
# load a site local config file
########################################################