| #!/sbin/runscript |
| # Copyright 1999-2012 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| CMAN_TOOL="/usr/sbin/cman_tool" |
| FENCE_TOOL="/usr/sbin/fence_tool" |
| GFS_CONTROLD="/usr/sbin/gfs_controld" |
| DLM_CONTROLD="/usr/sbin/dlm_controld" |
| GROUPD="/usr/sbin/groupd" |
| FENCED="/usr/sbin/fenced" |
| CCSD="/usr/sbin/ccsd" |
| |
| [ -z "$CCSD_OPTS" ] && CCSD_OPTS="" |
| [ -z "$CMAN_CLUSTER_TIMEOUT" ] && CMAN_CLUSTER_TIMEOUT=120 |
| [ -z "$CMAN_QUORUM_TIMEOUT" ] && CMAN_QUORUM_TIMEOUT=0 |
| [ -z "$CMAN_SHUTDOWN_TIMEOUT" ] && CMAN_SHUTDOWN_TIMEOUT=60 |
| [ -z "$FENCED_START_TIMEOUT" ] && FENCED_START_TIMEOUT=300 |
| [ -z "$FENCED_MEMBER_DELAY" ] && FENCED_MEMBER_DELAY=300 |
| |
| depend() { |
| use net |
| after xend |
| after xendomains |
| provide cman |
| } |
| |
| load_modules() { |
| local module modules |
| modules=$1 |
| |
| rcS=0 # catch the first error here |
| [ -f /proc/modules ] && for module in ${modules}; do |
| ebegin "Loading ${module} kernel module" |
| modprobe -q ${module} |
| rc=$? # error for this modprobe call |
| eend $rc "Failed to load ${module} kernel module" |
| [ $rc -ne 0 ] && rcS=$rc |
| done |
| return $rcS |
| } |
| |
| unload_modules() { |
| local module modules |
| modules=$1 |
| |
| [ -f /proc/modules ] && for module in ${modules}; do |
| ebegin "Unloading ${module} kernel module" |
| modprobe -r ${module} > /dev/null |
| eend $? "Failed to unload ${module} kernel module" |
| done |
| } |
| |
| check_configfs() { |
| awk '{ print $2 }' /proc/mounts | grep -sq "/sys/kernel/config" \ |
| && awk '{ print $3 }' /proc/mounts | grep -sq "configfs" |
| |
| if [ $? -ne 0 ]; then |
| ewarn "Please add the following line to /etc/fstab:" |
| ewarn "none configfs /sys/kernel/config defaults 0 0" |
| eend 1 "configfs not mounted at /sys/kernel/config" |
| fi |
| } |
| |
| mount_configfs() |
| { |
| local module=$(awk '$2 == "configfs" { print $2 }' /proc/filesystems) |
| |
| if [ -z "${module}" ]; then |
| load_modules "configfs" |
| rc=$? |
| sleep 1s |
| [ $rc -ne 0 ] && return 1 |
| fi |
| |
| # configfs |
| awk '{ print $2 }' /proc/mounts | grep -sq "/sys/kernel/config" \ |
| && awk '{ print $3 }' /proc/mounts | grep -sq "configfs" |
| rc=$? |
| |
| if [ $rc -ne 0 ] |
| then |
| ebegin "Mounting ConfigFS" |
| /bin/mount -t configfs none /sys/kernel/config 2>&1 |
| rc=$? |
| eend $rc |
| fi |
| |
| return $rc |
| } |
| |
| umount_configfs() { |
| local sig retry |
| local entry entries |
| |
| entries="$(awk '$3 == "configfs" { print $2 }' /proc/mounts | sort -r)" |
| |
| for entry in $entries; do |
| ebegin "Unmounting ConfigFS" |
| umount $entry >/dev/null 2>&1 |
| eend $? |
| done |
| |
| local module=$(awk '$1 == "configfs" { print $1 }' /proc/modules) |
| |
| if [ ! -z "${module}" ]; then |
| unload_modules "configfs" |
| sleep 1s |
| fi |
| } |
| |
| umount_gfs_filesystems() { |
| local sig retry |
| local remaining="$(awk '$3 == "gfs" || $3 == "gfs2" { print $2 }' /proc/mounts | sort -r)" |
| |
| if [ -n "${remaining}" ] |
| then |
| sig= |
| retry=3 |
| while [ -n "${remaining}" -a "${retry}" -gt 0 ] |
| do |
| if [ "${retry}" -lt 3 ] |
| then |
| ebegin "Unmounting GFS filesystems (retry)" |
| umount ${remaining} >/dev/null 2>&1 |
| eend $? "Failed to unmount GFS filesystems this retry" |
| else |
| ebegin "Unmounting GFS filesystems" |
| umount ${remaining} >/dev/null 2>&1 |
| eend $? "Failed to unmount GFS filesystems" |
| fi |
| remaining="$(awk '$3 == "gfs" || $3 == "gfs2" { if ($2 != "/") print $2 }' /proc/mounts | sort -r)" |
| [ -z "${remaining}" ] && break |
| /bin/fuser -k -m ${sig} ${remaining} >/dev/null 2>&1 |
| sleep 5 |
| retry=$((${retry} -1)) |
| sig=-9 |
| done |
| fi |
| } |
| |
| unload_allmodules() { |
| local modules |
| |
| modules=$(awk '$1 == "lock_gulm" || \ |
| $1 == "lock_dlm" || $1 == "dlm" || \ |
| $1 == "lock_harness" || $1 == "gfs2" || \ |
| $1 == "gfs" { print $1 }' /proc/modules) |
| |
| #modules=$(awk '$1 == "lock_harness" || \ |
| # $1 == "gfs" { print $1 }' /proc/modules) |
| |
| unload_modules "${modules}" |
| } |
| |
| start_ccsd() { |
| ebegin "Starting ccsd" |
| start-stop-daemon --start --quiet --exec ${CCSD} -- ${CCSD_OPTS} |
| eend $? |
| } |
| |
| stop_ccsd() { |
| ebegin "Stopping ccsd" |
| start-stop-daemon --stop --quiet -s 9 --exec ${CCSD} |
| eend $? |
| } |
| |
| start_cman() { |
| ${CMAN_TOOL} status >/dev/null 2>&1 |
| if [ $? -ne 0 ] |
| then |
| ebegin "Starting cman" |
| ${CMAN_TOOL} -t ${CMAN_CLUSTER_TIMEOUT} \ |
| -w join ${CMAN_JOIN_OPTS} >/dev/null 2>&1 |
| |
| if [ "$?" -ne 0 ] |
| then |
| eend 1 "Failed to start cman" |
| return 1 |
| else |
| eend 0 |
| |
| # make sure that we are quorate? |
| if [ ${CMAN_QUORUM_TIMEOUT} -gt 0 ] |
| then |
| ebegin "Waiting for quorum (${CMAN_QUORUM_TIMEOUT} secs)" |
| ${CMAN_TOOL} -t ${CMAN_QUORUM_TIMEOUT} -q wait |
| rc=$? |
| eend $rc |
| return $rc |
| fi |
| fi |
| else |
| einfo "cman already running" |
| fi |
| } |
| |
| stop_cman() { |
| ebegin "Stopping cman" |
| local stat=0 |
| ${CMAN_TOOL} status > /dev/null 2>&1 |
| if [ $? -eq 0 ]; then |
| retry=3 |
| stat=1 |
| while [ "${stat}" -eq 1 -a "${retry}" -gt 0 ] |
| do |
| #sleep 2 |
| #${CMAN_TOOL} -w -t ${CMAN_SHUTDOWN_TIMEOUT} \ |
| # leave remove ${CMAN_LEAVE_OPTS} > /dev/null |
| ${CMAN_TOOL} leave -t ${CMAN_SHUTDOWN_TIMEOUT} ${CMAN_LEAVE_OPTS} \ |
| remove >/dev/null 2>&1 |
| stat=$? |
| retry=$((${retry} -1)) |
| done |
| fi |
| eend ${stat} |
| } |
| |
| start_groupd() { |
| ebegin "Starting groupd" |
| start-stop-daemon --start --exec ${GROUPD} --name groupd |
| eend $? |
| } |
| |
| stop_groupd() { |
| ebegin "Stopping groupd" |
| start-stop-daemon --stop --exec ${GROUPD} --name groupd |
| eend $? |
| } |
| |
| start_fenced() { |
| ebegin "Starting fenced" |
| start-stop-daemon --start --exec ${FENCED} --name fenced |
| eend $? |
| |
| ${CMAN_TOOL} status | grep Flags | grep 2node >/dev/null 2>&1 |
| local errmsg=$? |
| |
| ebegin "Joining fence domain" |
| if [ "${errmsg}" -ne 0 ] |
| then |
| ${FENCE_TOOL} join -t $FENCED_START_TIMEOUT >/dev/null 2>&1 |
| [ $? -eq 0 ] && errmsg=$? || errmsg=1 |
| else |
| ${FENCE_TOOL} join -m $FENCED_MEMBER_DELAY >/dev/null 2>&1 |
| [ $? -eq 0 ] && errmsg=$? || errmsg=1 |
| fi |
| eend $errmsg |
| } |
| |
| stop_fenced() { |
| # fenced services |
| # local fence_status="$( ${CMAN_TOOL} services | awk '$1 ~ /fence/ { print $3 }')" |
| # if [ -n "${fence_status}" ]; then |
| # if [ -x ${FENCE_TOOL} ]; then |
| # ebegin "Leaving fence domain" |
| # ${FENCE_TOOL} leave > /dev/null 2>&1 |
| # eend $? |
| # fi |
| # fi |
| |
| if [ -x ${FENCE_TOOL} ]; then |
| if ${FENCE_TOOL} ls >/dev/null 2>&1; then |
| ebegin "Leaving fence domain" |
| ${FENCE_TOOL} leave > /dev/null 2>&1 |
| eend $? |
| fi |
| fi |
| |
| ebegin "Stopping fenced" |
| start-stop-daemon --stop --exec ${FENCED} --name fenced |
| eend $? |
| } |
| |
| start_gfs_controld() { |
| ebegin "Starting gfs_controld" |
| start-stop-daemon --start --exec ${GFS_CONTROLD} --name gfs_controld |
| eend $? |
| } |
| |
| stop_gfs_controld() { |
| ebegin "Stopping gfs_controld" |
| start-stop-daemon --stop --exec ${GFS_CONTROLD} --name gfs_controld |
| eend $? |
| } |
| |
| start_dlm_controld() { |
| ebegin "Starting dlm_controld" |
| start-stop-daemon --start --exec ${DLM_CONTROLD} --name dlm_controld |
| eend $? |
| } |
| |
| stop_dlm_controld() { |
| ebegin "Stopping dlm_controld" |
| start-stop-daemon --stop --exec ${DLM_CONTROLD} --name dlm_controld |
| eend $? |
| } |
| |
| start() { |
| if ! mount_configfs ; then |
| eerror "ConfigFS & DLM are required to use cman" |
| return 1 |
| fi |
| |
| [ -e /sys/module/dlm ] || [ -e /sys/kernel/dlm ] || load_modules "dlm" |
| if [ ! -e /sys/kernel/dlm ]; then |
| eerror "ConfigFS & DLM are required to use cman" |
| return 1 |
| fi |
| mkdir -p /var/run/cluster |
| |
| # start_ccsd |
| if ! start_cman ; then |
| eerror "Failed to start cman" |
| return 1 |
| fi |
| if ! start_fenced; then |
| eerror "Failed to start fenced" |
| return 1 |
| fi |
| if ! start_groupd; then |
| eerror "Failed to start groupd" |
| return 1 |
| fi |
| if ! start_dlm_controld; then |
| eerror "Failed to start dlm_controld" |
| return 1 |
| fi |
| # start_gfs_controld |
| } |
| |
| stop() { |
| |
| # umount GFS filesystems |
| # umount_gfs_filesystems |
| |
| stop_dlm_controld |
| stop_groupd |
| stop_fenced |
| stop_cman |
| |
| #stop_gfs_controld |
| #stop_dlm_controld |
| #stop_groupd |
| |
| unload_modules "dlm" |
| # stop_ccsd |
| # unload_allmodules |
| umount_configfs |
| } |