ctdb-scripts: Replace uses of "ctdb pnn" with ctdb_get_pnn()
[vlendec/samba-autobuild/.git] / ctdb / config / events.d / 91.lvs
1 #!/bin/sh
2 # script to manage the lvs ip multiplexer for a single public address cluster
3
4 [ -n "$CTDB_BASE" ] || \
5     export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD")
6
7 . $CTDB_BASE/functions
8
9 loadconfig ctdb
10
11 [ -z "$CTDB_LVS_PUBLIC_IP" ] && exit 0
12 [ -z "$CTDB_PUBLIC_INTERFACE" ] && exit 0
13
14 [ -x /sbin/ipvsadm ] || {
15     echo "LVS configured but /sbin/ipvsadm is not installed."
16     exit 0
17 }
18
19 case "$1" in 
20      startup)
21         ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
22         ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
23
24         ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
25
26         # do not respond to ARPs that are for ip addresses with scope 'host'
27         echo 3 > /proc/sys/net/ipv4/conf/all/arp_ignore
28         # do not send out arp requests from loopback addresses
29         echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
30         ;;
31
32      shutdown)
33         ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
34         ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
35
36         # remove the ip
37         ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
38
39         # flush our route cache
40         echo 1 > /proc/sys/net/ipv4/route/flush
41         ;;
42
43      recovered|ipreallocated)
44         # kill off any tcp connections
45         ipvsadm -D -t $CTDB_LVS_PUBLIC_IP:0
46         ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0
47         kill_tcp_connections_local_only $CTDB_LVS_PUBLIC_IP
48
49         ctdb_get_pnn
50         LVSMASTER=`ctdb lvsmaster | sed -e "s/.*Node //" -e "s/ .*//"`
51
52         [ "$pnn" != "$LVSMASTER" ] && {
53             # we are not the lvs master so we have to
54             # change the ip address to have scope host so we wont respond
55             # to arps
56             ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
57             ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo scope host >/dev/null 2>/dev/null
58             exit 0
59         }
60
61         # change the scope so we start responding to arps
62         ip addr del $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
63         ip addr add $CTDB_LVS_PUBLIC_IP/32 dev lo >/dev/null 2>/dev/null
64
65         ipvsadm -A -t $CTDB_LVS_PUBLIC_IP:0 -p 1999999 -s lc
66         ipvsadm -A -u $CTDB_LVS_PUBLIC_IP:0 -p 1999999 -s lc
67
68         # add all nodes (except ourselves) to the lvs config
69         ctdb lvs | egrep -v "^${pnn}:" | sed -e "s/.*://" | while read IP; do
70                 ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
71                 ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r $IP -g
72         done
73         # and add the localhost too
74         ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
75         ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r 127.0.0.1
76
77         # send out a gratious arp so our peers will update their arp tables
78         ctdb gratiousarp $CTDB_LVS_PUBLIC_IP $CTDB_PUBLIC_INTERFACE >/dev/null 2>/dev/null
79
80         # flush our route cache
81         echo 1 > /proc/sys/net/ipv4/route/flush
82         ;;
83
84     *)
85         ctdb_standard_event_handler "$@"
86         ;;
87 esac
88
89 exit 0