| #!/bin/bash |
| # |
| # Copyright LINBIT, 2008 |
| # |
| # 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, 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; see the file COPYING. If not, write to the |
| # Free Software Foundation, Inc., 675 Mass Ave, Cambridge, |
| # MA 02139, USA. |
| # |
| |
| # |
| # DRBD resource management using the drbdadm utility. |
| # |
| |
| LC_ALL=C |
| LANG=C |
| PATH=/bin:/sbin:/usr/bin:/usr/sbin |
| export LC_ALL LANG PATH |
| |
| . $(dirname $0)/ocf-shellfuncs |
| |
| drbd_verify_all() |
| { |
| # Do we have the drbdadm utility? |
| if ! which drbdadm >/dev/null 2>&1 ; then |
| ocf_log error "drbdadm not installed, not found in PATH ($PATH), or not executable." |
| return $OCF_ERR_INSTALLED |
| fi |
| |
| # Is drbd loaded? |
| if ! grep drbd /proc/modules >/dev/null 2>&1; then |
| ocf_log error "drbd not found in /proc/modules. Do you need to modprobe?" |
| return $OCF_ERR_INSTALLED |
| fi |
| |
| # Do we have the "resource" parameter? |
| if [ -n "$OCF_RESKEY_resource" ]; then |
| |
| # Can drbdadm parse the resource name? |
| if ! drbdadm sh-dev $OCF_RESKEY_resource >/dev/null 2>&1; then |
| ocf_log error "DRBD resource \"$OCF_RESKEY_resource\" not found." |
| return $OCF_ERR_CONFIGURED |
| fi |
| |
| # Is the backing device a locally available block device? |
| backing_dev=$(drbdadm sh-ll-dev $OCF_RESKEY_resource) |
| for dev in $backing_dev ; do |
| [ -b $dev ] && continue; |
| ocf_log error "Backing device for DRBD resource \"$OCF_RESKEY_resource\" ($dev) not found or not a block device." |
| return $OCF_ERR_INSTALLED |
| done |
| |
| fi |
| |
| return 0 |
| } |
| |
| drbd_status() { |
| local all_primary=true |
| for role in $(drbdadm role $OCF_RESKEY_resource); do |
| case $role in |
| Primary/*) |
| ;; |
| Secondary/*) |
| all_primary=false |
| ;; |
| *) |
| return $OCF_ERR_GENERIC |
| ;; |
| esac |
| done |
| $all_primary && return $OCF_SUCCESS |
| return $OCF_NOT_RUNNING |
| } |
| |
| drbd_promote() { |
| drbdadm primary $OCF_RESKEY_resource || return $? |
| } |
| |
| drbd_demote() { |
| drbdadm secondary $OCF_RESKEY_resource || return $? |
| } |
| |
| |
| if [ -z "$OCF_CHECK_LEVEL" ]; then |
| OCF_CHECK_LEVEL=0 |
| fi |
| |
| # This one doesn't need to pass the verify check |
| case $1 in |
| meta-data) |
| cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` && exit 0 |
| exit $OCF_ERR_GENERIC |
| ;; |
| esac |
| |
| # Everything else does |
| drbd_verify_all || exit $? |
| case $1 in |
| start) |
| if drbd_status; then |
| ocf_log debug "DRBD resource ${OCF_RESKEY_resource} already configured" |
| exit 0 |
| fi |
| drbd_promote |
| if [ $? -ne 0 ]; then |
| exit $OCF_ERR_GENERIC |
| fi |
| |
| exit $? |
| ;; |
| stop) |
| if drbd_status; then |
| drbd_demote |
| if [ $? -ne 0 ]; then |
| exit $OCF_ERR_GENERIC |
| fi |
| else |
| ocf_log debug "DRBD resource ${OCF_RESKEY_resource} is not configured" |
| fi |
| exit 0 |
| ;; |
| status|monitor) |
| drbd_status |
| exit $? |
| ;; |
| restart) |
| $0 stop || exit $OCF_ERR_GENERIC |
| $0 start || exit $OCF_ERR_GENERIC |
| exit 0 |
| ;; |
| verify-all) |
| exit 0 |
| ;; |
| *) |
| echo "usage: $0 {start|stop|status|monitor|restart|meta-data|verify-all}" |
| exit $OCF_ERR_GENERIC |
| ;; |
| esac |