summaryrefslogtreecommitdiffstats
path: root/rgmanager/src/resources/lvm.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'rgmanager/src/resources/lvm.sh.in')
-rw-r--r--rgmanager/src/resources/lvm.sh.in180
1 files changed, 180 insertions, 0 deletions
diff --git a/rgmanager/src/resources/lvm.sh.in b/rgmanager/src/resources/lvm.sh.in
new file mode 100644
index 0000000..a3a6c30
--- /dev/null
+++ b/rgmanager/src/resources/lvm.sh.in
@@ -0,0 +1,180 @@
+#!@BASH_SHELL@
+
+#
+# LVM Failover Script.
+# NOTE: Changes to /etc/lvm/lvm.conf are required for proper operation.
+#
+# Copyright (C) 1997-2003 Sistina Software, Inc. All rights reserved.
+# Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+
+LC_ALL=C
+LANG=C
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+export LC_ALL LANG PATH
+
+. $(dirname $0)/ocf-shellfuncs
+. $(dirname $0)/utils/member_util.sh
+. $(dirname $0)/lvm_by_lv.sh
+. $(dirname $0)/lvm_by_vg.sh
+
+rv=0
+
+################################################################################
+# ha_lvm_proper_setup_check
+#
+################################################################################
+function ha_lvm_proper_setup_check
+{
+ ##
+ # Does the Volume Group exist?
+ # 1) User may have forgotten to create it
+ # 2) User may have misspelled it in the config file
+ ##
+ if ! vgs $OCF_RESKEY_vg_name --config 'global{locking_type=0}'>& /dev/null; then
+ ocf_log err "HA LVM: Unable to get volume group attributes for $OCF_RESKEY_vg_name"
+ return $OCF_ERR_GENERIC
+ fi
+
+ ##
+ # Are we using the "tagging" or "CLVM" variant?
+ # The CLVM variant will have the cluster attribute set
+ ##
+ if [[ "$(vgs -o attr --noheadings --config 'global{locking_type=0}' $OCF_RESKEY_vg_name 2>/dev/null)" =~ .....c ]]; then
+ # Is clvmd running?
+ if ! ps -C clvmd >& /dev/null; then
+ ocf_log err "HA LVM: $OCF_RESKEY_vg_name has the cluster attribute set, but 'clvmd' is not running"
+ return $OCF_ERR_GENERIC
+ fi
+ return $OCF_SUCCESS
+ fi
+
+ ##
+ # The "tagging" variant is being used if we have gotten this far.
+ ##
+
+ ##
+ # The default for lvm.conf:activation/volume_list is empty,
+ # this must be changed for HA LVM.
+ ##
+ if ! lvm dumpconfig activation/volume_list >& /dev/null; then
+ ocf_log err "HA LVM: Improper setup detected"
+ ocf_log err "* \"volume_list\" not specified in lvm.conf."
+ return $OCF_ERR_GENERIC
+ fi
+
+ ##
+ # Machine's cluster node name must be present as
+ # a tag in lvm.conf:activation/volume_list
+ ##
+ if ! lvm dumpconfig activation/volume_list | grep $(local_node_name); then
+ ocf_log err "HA LVM: Improper setup detected"
+ ocf_log err "* @$(local_node_name) missing from \"volume_list\" in lvm.conf"
+ return $OCF_ERR_GENERIC
+ fi
+
+ ##
+ # The volume group to be failed over must NOT be in
+ # lvm.conf:activation/volume_list; otherwise, machines
+ # will be able to activate the VG regardless of the tags
+ ##
+ if lvm dumpconfig activation/volume_list | grep "\"$OCF_RESKEY_vg_name\""; then
+ ocf_log err "HA LVM: Improper setup detected"
+ ocf_log err "* $OCF_RESKEY_vg_name found in \"volume_list\" in lvm.conf"
+ return $OCF_ERR_GENERIC
+ fi
+
+ ##
+ # Next, we need to ensure that their initrd has been updated
+ # If not, the machine could boot and activate the VG outside
+ # the control of rgmanager
+ ##
+ # Fixme: we might be able to perform a better check...
+ if [ "$(find /boot -name *.img -newer /etc/lvm/lvm.conf)" == "" ]; then
+ ocf_log err "HA LVM: Improper setup detected"
+ ocf_log err "* initrd image needs to be newer than lvm.conf"
+
+ # While dangerous if not done the first time, there are many
+ # cases where we don't simply want to fail here. Instead,
+ # keep warning until the user remakes the initrd - or has
+ # it done for them by upgrading the kernel.
+ #return $OCF_ERR_GENERIC
+ fi
+
+ return $OCF_SUCCESS
+}
+
+################################################################################
+# MAIN
+################################################################################
+
+case $1 in
+start)
+ ha_lvm_proper_setup_check || exit 1
+
+ if [ -z "$OCF_RESKEY_lv_name" ]; then
+ vg_start || exit 1
+ else
+ lv_start || exit 1
+ fi
+ ;;
+
+status|monitor)
+ ocf_log notice "Getting status"
+
+ if [ -z "$OCF_RESKEY_lv_name" ]; then
+ vg_status
+ exit $?
+ else
+ lv_status
+ exit $?
+ fi
+ ;;
+
+stop)
+ ha_lvm_proper_setup_check
+
+ if [ -z "$OCF_RESKEY_lv_name" ]; then
+ vg_stop || exit 1
+ else
+ lv_stop || exit 1
+ fi
+ ;;
+
+recover|restart)
+ $0 stop || exit $OCF_ERR_GENERIC
+ $0 start || exit $OCF_ERR_GENERIC
+ ;;
+
+meta-data)
+ cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'`
+ ;;
+
+validate-all|verify-all)
+ if [ -z "$OCF_RESKEY_lv_name" ]; then
+ vg_verify || exit 1
+ else
+ lv_verify || exit 1
+ fi
+ ;;
+*)
+ echo "usage: $0 {start|status|monitor|stop|restart|meta-data|validate-all}"
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+
+exit $rv