1 # utility functions for ctdb event scripts
3 #######################################
4 # pull in a system config file, if any
7 if [ -f /etc/sysconfig/$name ]; then
9 elif [ -f /etc/default/$name ]; then
11 elif [ -f $CTDB_BASE/sysconfig/$name ]; then
12 . $CTDB_BASE/sysconfig/$name
17 ######################################################
18 # simulate /sbin/service on platforms that don't have it
22 if [ -x /sbin/service ]; then
23 /sbin/service "$service_name" "$op"
24 elif [ -x /etc/init.d/$service_name ]; then
25 /etc/init.d/$service_name "$op"
26 elif [ -x /etc/rc.d/init.d/$service_name ]; then
27 /etc/rc.d/init.d/$service_name "$op"
31 ######################################################
32 # simulate /sbin/service (niced) on platforms that don't have it
36 if [ -x /sbin/service ]; then
37 nice /sbin/service "$service_name" "$op"
38 elif [ -x /etc/init.d/$service_name ]; then
39 nice /etc/init.d/$service_name "$op"
40 elif [ -x /etc/rc.d/init.d/$service_name ]; then
41 nice /etc/rc.d/init.d/$service_name "$op"
45 ######################################################
46 # wait for a command to return a zero exit status
47 # usage: ctdb_wait_command SERVICE_NAME <command>
48 ######################################################
52 [ -z "$wait_cmd" ] && return;
54 echo "Waiting for service $service_name to start"
55 while [ $all_ok -eq 0 ]; do
56 $wait_cmd > /dev/null 2>&1 && all_ok=1
57 ctdb status > /dev/null 2>&1 || {
58 echo "ctdb daemon has died. Exiting wait for $service_name"
61 [ $all_ok -eq 1 ] || sleep 1
63 echo "Local service $service_name is up"
67 ######################################################
68 # wait for a set of tcp ports
69 # usage: ctdb_wait_tcp_ports SERVICE_NAME <ports...>
70 ######################################################
71 ctdb_wait_tcp_ports() {
75 [ -z "$wait_ports" ] && return;
77 echo "Waiting for tcp service $service_name to start"
78 while [ $all_ok -eq 0 ]; do
80 for p in $wait_ports; do
81 if [ -x /usr/bin/netcat ]; then
82 /usr/bin/netcat -z 127.0.0.1 $p > /dev/null || all_ok=0
83 elif [ -x /usr/bin/nc ]; then
84 /usr/bin/nc -z 127.0.0.1 $p > /dev/null || all_ok=0
85 elif [ -x /usr/bin/netstat ]; then
86 (netstat -a -n | egrep "0.0.0.0:$p\s*LISTEN" > /dev/null) || all_ok=0
87 elif [ -x /bin/netstat ]; then
88 (netstat -a -n | egrep "0.0.0.0:$p\s*LISTEN" > /dev/null) || all_ok=0
90 echo "No tool to check tcp ports availabe. can not check in ctdb_wait_tcp_ports"
94 [ $all_ok -eq 1 ] || sleep 1
95 ctdb status > /dev/null 2>&1 || {
96 echo "ctdb daemon has died. Exiting tcp wait $service_name"
100 echo "Local tcp services for $service_name are up"
105 ######################################################
106 # wait for a set of directories
107 # usage: ctdb_wait_directories SERVICE_NAME <directories...>
108 ######################################################
109 ctdb_wait_directories() {
113 [ -z "$wait_dirs" ] && return;
115 echo "Waiting for local directories for $service_name"
116 while [ $all_ok -eq 0 ]; do
118 for d in $wait_dirs; do
119 [ -d $d ] || all_ok=0
121 [ $all_ok -eq 1 ] || sleep 1
122 ctdb status > /dev/null 2>&1 || {
123 echo "ctdb daemon has died. Exiting directory wait for $service_name"
127 echo "Local directories for $service_name are available"
131 ######################################################
132 # check that a rpc server is registered with portmap
133 # and responding to requests
134 # usage: ctdb_check_rpc SERVICE_NAME PROGNUM VERSION
135 ######################################################
140 rpcinfo -u localhost $prognum $version > /dev/null || {
141 echo "ERROR: $service_name not responding to rpc requests"
146 ######################################################
147 # check a set of directories is available
148 # usage: ctdb_check_directories SERVICE_NAME <directories...>
149 ######################################################
150 ctdb_check_directories() {
154 [ -z "$wait_dirs" ] && return;
155 for d in $wait_dirs; do
157 echo "ERROR: $service_name directory $d not available"
163 ######################################################
164 # check a set of tcp ports
165 # usage: ctdb_check_tcp_ports SERVICE_NAME <ports...>
166 ######################################################
167 ctdb_check_tcp_ports() {
171 [ -z "$wait_ports" ] && return;
172 for p in $wait_ports; do
174 if [ -x /usr/bin/netcat ]; then
175 /usr/bin/netcat -z 127.0.0.1 $p > /dev/null || all_ok=0
176 elif [ -x /usr/bin/nc ]; then
177 /usr/bin/nc -z 127.0.0.1 $p > /dev/null || all_ok=0
178 elif [ -x /usr/bin/netstat ]; then
179 (netstat -a -n | egrep "0.0.0.0:$p .*LISTEN" > /dev/null ) || all_ok=0
180 elif [ -x /bin/netstat ]; then
181 (netstat -a -n | egrep "0.0.0.0:$p .*LISTEN" > /dev/null ) || all_ok=0
183 [ $all_ok -eq 1 ] || {
184 echo "ERROR: $service_name tcp port $p is not responding"
190 ######################################################
191 # check a command returns zero status
192 # usage: ctdb_check_command SERVICE_NAME <command>
193 ######################################################
194 ctdb_check_command() {
197 [ -z "$wait_cmd" ] && return;
198 $wait_cmd > /dev/null 2>&1 || {
199 echo "ERROR: $service_name - $wait_cmd returned error"
204 ################################################
205 # kill off any TCP connections with the given IP
206 ################################################
207 kill_tcp_connections() {
212 connfile="$CTDB_BASE/state/connections.$_IP"
213 netstat -tn |egrep "^tcp.*\s+$_IP:.*ESTABLISHED" | awk '{print $4" "$5}' > $connfile
214 while read dest src; do
215 srcip=`echo $src | cut -d: -f1`
216 srcport=`echo $src | cut -d: -f2`
217 destip=`echo $dest | cut -d: -f1`
218 destport=`echo $dest | cut -d: -f2`
219 ctdb killtcp $srcip:$srcport $destip:$destport >/dev/null 2>&1 || _failed=1
220 echo "Killing TCP connection $srcip:$srcport $destip:$destport"
221 _killcount=`expr $_killcount + 1`
224 [ $_failed = 0 ] || {
225 echo "Failed to send killtcp control"
228 [ $_killcount -gt 0 ] || {
232 while netstat -tn |egrep "^tcp.*\s+$_IP:.*ESTABLISHED" > /dev/null; do
234 _count=`expr $_count + 1`
235 [ $_count -gt 3 ] && {
236 echo "Timed out killing tcp connections for IP $_IP"
240 echo "killed $_killcount TCP connections to released IP $_IP"
243 ########################################################
244 # start/stop the nfs service on different platforms
245 ########################################################
248 [ -x /etc/init.d/nfsserver ] && {
251 [ -x /etc/init.d/nfslock ] && {
259 service nfsserver start
262 service nfsserver stop > /dev/null 2>&1
269 service nfslock start
273 service nfs stop > /dev/null 2>&1
274 service nfslock stop > /dev/null 2>&1
279 echo "Unknown platform. NFS is not supported with ctdb"
285 ########################################################
286 # start/stop the nfs lockmanager service on different platforms
287 ########################################################
288 startstop_nfslock() {
290 [ -x /etc/init.d/nfsserver ] && {
293 [ -x /etc/init.d/nfslock ] && {
299 # for sles there is no service for lockmanager
300 # so we instead just shutdown/restart nfs
303 service nfsserver start
306 service nfsserver stop > /dev/null 2>&1
313 service nfslock start
316 service nfslock stop > /dev/null 2>&1
321 echo "Unknown platform. NFS locking is not supported with ctdb"