1#!/bin/bash
2#
3# chkconfig: - 24 76
4# description: Starts and stops clvmd
5#
6# For Red-Hat-based distributions such as Fedora, RHEL, CentOS.
7#
8### BEGIN INIT INFO
9# Provides: clvmd
10# Required-Start: $local_fs
11# Required-Stop: $local_fs
12# Default-Start:
13# Default-Stop: 0 1 6
14# Short-Description: Clustered LVM Daemon
15### END INIT INFO
16
17. /etc/init.d/functions
18
19DAEMON=clvmd
20
21exec_prefix=
22sbindir=${exec_prefix}/sbin
23
24LVDISPLAY=${sbindir}/lvdisplay
25VGCHANGE=${sbindir}/vgchange
26VGSCAN=${sbindir}/vgscan
27VGDISPLAY=${sbindir}/vgdisplay
28VGS=${sbindir}/vgs
29
30CLVMDOPTS="-T20"
31
32[ -f /etc/sysconfig/cluster ] && . /etc/sysconfig/cluster
33
34[ -n "$CLVMD_CLUSTER_IFACE" ] && CLVMDOPTS="$CLVMDOPTS -I $CLVMD_CLUSTER_IFACE"
35
36LOCK_FILE="/var/lock/subsys/$DAEMON"
37
38start()
39{
40	for rtrn in 0
41	do
42		if ! pidof $DAEMON > /dev/null
43		then
44			echo -n "Starting $DAEMON: "
45			daemon $DAEMON $CLVMDOPTS
46			rtrn=$?
47			echo
48			if [ $rtrn -ne 0 ]
49			then
50				break
51			fi
52 		fi
53		# refresh cache
54		$VGSCAN  > /dev/null 2>&1
55
56		if [ -n "$LVM_VGS" ]
57		then
58			for vg in $LVM_VGS
59			do
60				action "Activating VG $vg:" $VGCHANGE -ayl $vg || rtrn=$?
61			done
62		else
63			action "Activating VGs:" $VGCHANGE -ayl || rtrn=$?
64		fi
65	done
66
67	return $rtrn
68}
69
70stop()
71{
72	for rtrn in 0
73	do
74		if [ -n "$LVM_VGS" ]
75		then
76			for vg in $LVM_VGS
77			do
78				action "Deactivating VG $vg:" $VGCHANGE -anl $vg || rtrn=$?
79			done
80		else
81			# Hack to only deactivate clustered volumes
82			clustervgs=`$VGDISPLAY 2> /dev/null | awk 'BEGIN {RS="VG Name"} {if (/Clustered/) print $1;}'`
83			for vg in $clustervgs; do
84				action "Deactivating VG $vg:" $VGCHANGE -anl $vg || rtrn=$?
85			done
86		fi
87
88		[ $rtrn -ne 0 ] && break
89
90		echo -n "Stopping clvm:"
91		killproc $DAEMON -TERM
92		rtrn=$?
93		echo
94	done
95
96	return $rtrn
97}
98
99wait_for_finish()
100{
101	count=0
102
103	while [ "$count" -le 10 -a -n "`pidof $DAEMON`" ]
104	do
105		sleep 1
106		count=$((count + 1))
107	done
108
109	if [ `pidof $DAEMON` ]
110	then
111		return 1
112	else
113		return 0
114	fi
115}
116
117reload() {
118	$DAEMON -R
119}
120
121rh_status() {
122	status $DAEMON
123}
124
125rh_status_q() {
126	rh_status >/dev/null 2>&1
127}
128
129
130rtrn=1
131
132# See how we were called.
133case "$1" in
134  start)
135	start
136	rtrn=$?
137	[ $rtrn = 0 ] && touch $LOCK_FILE
138	;;
139
140  stop)
141	stop
142	rtrn=$?
143	[ $rtrn = 0 ] && rm -f $LOCK_FILE
144	;;
145
146  restart)
147	if stop
148	then
149		wait_for_finish
150		start
151	fi
152	rtrn=$?
153	;;
154
155  reload)
156	rh_status_q || exit 7
157	reload
158	;;
159
160  status)
161	rh_status
162	rtrn=$?
163	vols=$( $LVDISPLAY -C --nohead 2> /dev/null | awk '($3 ~ /....a./) {print $1}' )
164	echo active volumes: ${vols:-"(none)"}
165	;;
166
167  *)
168	echo $"Usage: $0 {start|stop|restart|reload|status}"
169	;;
170esac
171
172exit $rtrn
173