ctdb-scripts: Add support for backing up persistent TDBs
[samba4-gss.git] / ctdb / config / events / legacy / 91.lvs.script
blob885506873a0b3c0cd3acec015e57a232a628a922
1 #!/bin/sh
2 # script to manage the lvs ip multiplexer for a single public address cluster
4 [ -n "$CTDB_BASE" ] || \
5 CTDB_BASE=$(d=$(dirname "$0") && cd -P "$d" && dirname "$PWD")
7 . "${CTDB_BASE}/functions"
9 load_script_options
11 [ -n "$CTDB_LVS_NODES" ] || exit 0
12 export CTDB_LVS_NODES
14 # type is commonly supported and more portable than which(1)
15 # shellcheck disable=SC2039
16 if ! type ipvsadm >/dev/null 2>&1 ; then
17 echo "LVS configured but ipvsadm not found"
18 exit 0
22 lvs_follower_only ()
24 _ip_address=$(ctdb_get_ip_address)
25 awk -v my_ip="$_ip_address" \
26 '$1 == my_ip { if ($2 ~ "follower-only") { exit 0 } else { exit 1 } }' \
27 "$CTDB_LVS_NODES"
30 lvs_check_config ()
32 [ -r "$CTDB_LVS_NODES" ] || \
33 die "error: CTDB_LVS_NODES=${CTDB_LVS_NODES} unreadable"
34 [ -n "$CTDB_LVS_PUBLIC_IP" ] || \
35 die "Invalid configuration: CTDB_LVS_PUBLIC_IP not set"
36 if ! lvs_follower_only ; then
37 [ -n "$CTDB_LVS_PUBLIC_IFACE" ] || \
38 die "Invalid configuration: CTDB_LVS_PUBLIC_IFACE not set"
42 case "$1" in
43 setup)
44 lvs_check_config
46 startup)
47 lvs_check_config
49 ipvsadm -D -t "$CTDB_LVS_PUBLIC_IP" >/dev/null 2>&1
50 ipvsadm -D -u "$CTDB_LVS_PUBLIC_IP" >/dev/null 2>&1
52 ip addr add "${CTDB_LVS_PUBLIC_IP}/32" dev lo scope host
54 # do not respond to ARPs that are for ip addresses with scope 'host'
55 set_proc_maybe sys/net/ipv4/conf/all/arp_ignore 3
56 # do not send out arp requests from loopback addresses
57 set_proc_maybe sys/net/ipv4/conf/all/arp_announce 2
60 shutdown)
61 lvs_check_config
63 ipvsadm -D -t "$CTDB_LVS_PUBLIC_IP"
64 ipvsadm -D -u "$CTDB_LVS_PUBLIC_IP"
66 ip addr del "${CTDB_LVS_PUBLIC_IP}/32" dev lo >/dev/null 2>&1
68 flush_route_cache
71 ipreallocated)
72 lvs_check_config
74 # Kill connections
75 ipvsadm -D -t "$CTDB_LVS_PUBLIC_IP" >/dev/null 2>&1
76 ipvsadm -D -u "$CTDB_LVS_PUBLIC_IP" >/dev/null 2>&1
77 kill_tcp_connections_local_only \
78 "$CTDB_LVS_PUBLIC_IFACE" "$CTDB_LVS_PUBLIC_IP"
80 pnn=$(ctdb_get_pnn)
81 lvsleader=$("${CTDB_HELPER_BINDIR}/ctdb_lvs" leader)
82 if [ "$pnn" != "$lvsleader" ] ; then
83 # This node is not the LVS leader so change the IP address
84 # to have scope "host" so this node won't respond to ARPs
85 ip addr del "${CTDB_LVS_PUBLIC_IP}/32" dev lo >/dev/null 2>&1
86 ip addr add "${CTDB_LVS_PUBLIC_IP}/32" dev lo scope host
87 exit 0
90 # Change the scope so this node starts responding to ARPs
91 ip addr del "${CTDB_LVS_PUBLIC_IP}/32" dev lo >/dev/null 2>&1
92 ip addr add "${CTDB_LVS_PUBLIC_IP}/32" dev lo >/dev/null 2>&1
94 ipvsadm -A -t "$CTDB_LVS_PUBLIC_IP" -p 1999999 -s lc
95 ipvsadm -A -u "$CTDB_LVS_PUBLIC_IP" -p 1999999 -s lc
97 # Add all nodes (except this node) as LVS servers
98 "${CTDB_HELPER_BINDIR}/ctdb_lvs" list |
99 awk -v pnn="$pnn" '$1 != pnn { print $2 }' |
100 while read ip ; do
101 ipvsadm -a -t "$CTDB_LVS_PUBLIC_IP" -r "$ip" -g
102 ipvsadm -a -u "$CTDB_LVS_PUBLIC_IP" -r "$ip" -g
103 done
105 # Add localhost too...
106 ipvsadm -a -t "$CTDB_LVS_PUBLIC_IP" -r 127.0.0.1
107 ipvsadm -a -u "$CTDB_LVS_PUBLIC_IP" -r 127.0.0.1
109 $CTDB gratarp \
110 "$CTDB_LVS_PUBLIC_IP" "$CTDB_LVS_PUBLIC_IFACE" >/dev/null 2>&1
112 flush_route_cache
115 monitor)
116 lvs_check_config
118 if [ -n "$CTDB_LVS_PUBLIC_IFACE" ] ; then
119 interface_monitor "$CTDB_LVS_PUBLIC_IFACE" || exit 1
122 esac
124 exit 0