#!/bin/sh # ctdb event script for monitoring the multipath daemon # # Configure monitporing of multipath devices by listing the device serials # in /etc/ctdb/multipathd : # CTDB_MONITOR_MPDEVICES="device1 device2 ..." # [ -n "$CTDB_BASE" ] || \ CTDB_BASE=$(d=$(dirname "$0") ; cd -P "$d" ; dirname "$PWD") . "${CTDB_BASE}/functions" # service_name is used by various functions # shellcheck disable=SC2034 service_name="multipathd" loadconfig [ -n "$CTDB_MONITOR_MPDEVICES" ] || exit 0 service_state_dir=$(ctdb_setup_service_state_dir) || exit $? multipath_fail="${service_state_dir}/fail" multipathd_check_background() { for _device in $CTDB_MONITOR_MPDEVICES; do # Check multipath knows about the device _out=$(multipath -ll "$_device") if [ -z "$_out" ] ; then echo "ERROR: device \"${_device}\" not known to multipathd" \ >"$multipath_fail" exit 1 fi # Check for at least 1 active path if ! echo "$_out" | grep 'prio=.* status=active' >/dev/null 2>&1 ; then echo "ERROR: multipath device \"${_device}\" has no active paths" \ >"$multipath_fail" exit 1 fi done exit 0 } multipathd_check() { # Run the actual check in the background since the call to # multipath may block multipathd_check_background /dev/null 2>&1 & _pid="$!" _timeleft=10 while [ $_timeleft -gt 0 ]; do _timeleft=$((_timeleft - 1)) # see if the process still exists kill -0 $_pid >/dev/null 2>&1 || { if wait $_pid ; then return 0 else cat "$multipath_fail" rm -f "$multipath_fail" return 1 fi } sleep 1 done echo "ERROR: callout to multipath checks hung" # If hung then this probably won't work, but worth trying... kill -9 $_pid >/dev/null 2>&1 return 1 } case "$1" in monitor) multipathd_check || die "multipath monitoring failed" ;; esac exit 0