#!/bin/bash
#
# cs_disable_other_watchdog
#
# (c) 2011-2013 SUSE Linux GmbH, Germany.
# GNU Public License. No warranty.
# Author: L.Pinne
#
# Version: 2013-01-25 10:25
#

EXE="$0"
FIL="/etc/sysconfig/kernel"

CFG="/etc/ClusterTools2/cs_disable_other_watchdog"
test -s $CFG && source $CFG

test -z "${TEMP}" &&\
	TEMP="/dev/shm/cltl.$RANDOM"

test -z "$MODCFG" && MODCFG="/etc/modprobe.d/ClusterTools2"
test -z "$METHOD" && METHOD="hp-asrd"
test -z "$MODULES" && MODULES="hpwdt hangcheck-timer iTCO_wdt ibmasr"


function help() {
        echo "usage: $(basename $0) OPTION"
        echo "usage: $(basename $0) --stop <METHOD>"
        echo
        echo "OPTION:"
        echo " --help		show help."
        echo " --version	show version."
        echo " --list		list module blacklist and initrd line."
        echo " --stop		disable other restart method."
        echo
}


function disable_hpasr() {
	echo "INFO: start $EXE $FUNCNAME"

	for m in $METHOD; do
		/etc/init.d/$METHOD stop
		chkconfig $METHOD off
	done
	# TODO separate function that checks for loaded modules from /lib/...
	# V=$(uname -a | awk '{print $3}')
	# TODO MODS=$(/lib/modules/${V}/kernel/drivers/watchdog/ | )

	mv $MODCFG $MODCFG.bak
	for m in $MODULES; do
		echo blacklist ${m} >>$MODCFG
	done
	for m in $MODULES; do
		rmmod ${m}
	done

	# TODO /etc/sysconfig/kernel
	test -s $FIL || exit 2
	# TODO mkinitrd ?
	echo "INFO: end $EXE $FUNCNAME"
}


function list_other_restart() {

	V=$(uname -a | awk '{print $3}')
	OTHMOD=$(ls /lib/modules/${V}/kernel/drivers/watchdog/)
	echo "available watchdog modules:"
	echo $OTHMOD

	# TODO see add_watchdog_to_initrd
	echo "configured watchdog module:"
	grep -v "#.*INITRD_MODULES" $FIL | grep "^INITRD_MODULES="
	grep -v "#.*MODULES_LOADED_ON_BOOT" $FIL | grep "^MODULES_LOADED_ON_BOOT="
	for m in $MODULES; do
		( grep -v "#" /etc/modprobe.d/* /etc/modprobe.conf /etc/modprobe.conf.local ) | grep -v "blacklist" | grep $m
	done

	echo "loaded watchdog modules:"
	for m in $OTHMOD; do
		# TODO awk
		lsmod | grep $(basename $m .ko) | sort -u
		#modinfo -F filename $(basename $m .ko) 2>/dev/null
	done

	echo "installed reboot daemon:"
	for m in $METHOD; do
		ls /etc/init.d/$METHOD 2>/dev/null
		/etc/init.d/$METHOD status 2>/dev/null
		chkconfig -l $METHOD 2>/dev/null
	done
	# TODO search process list
	
	echo "installed initrds:"
	ls -l /boot/initrd*

	echo "initrd watchdog module:"
	/bin/zcat /boot/initrd | cpio -itv 2>/dev/null |\
		grep "lib/modules/.*/kernel/drivers/watchdog/.*ko$"
}


function guess_other_restart() {
	echo "INFO: start $EXE $FUNCNAME"
	# TODO look into initrd, see above
	# TODO search loaded modules for files from /lib/modules/.../watchdog/

	fuser -f /dev/watchdog
	lsof | grep "/dev/watchdog"
	# TODO define METHOD_LISTONLY
	# TODO Veritas?
	for f in hp-asrd oprocd; do
		ps aux | grep $f
	done
	# TODO Veritas
	for f in VRTS ; do
		find /var -name "*${f}*"
	done
	for f in vxfen ; do
		find /etc -name "*${f}*"
	done
	# TODO Oracle cluster config
	mount | grep clusterware

	# TODO HP generic ilo cluster interface
	ls -l /etc/cluster/cluster.conf

	echo "INFO: end $EXE $FUNCNAME"
}


# function main()

case $1 in
        -v|--version)
                echo -n "$(basename $EXE) "
                head -11 $EXE | grep "^# Version: "
                exit
        ;;
        -g|--guess)
                echo "INFO: start $EXE"
                guess_other_restart
                echo "INFO: normal_end $EXE"
		exit
        ;;
	-l|--list)
		echo "INFO: start $EXE"
		list_other_restart
		echo "INFO: normal_end $EXE"
		exit
	;;
	-s|--stop)
		echo "INFO: start $EXE"
		disable_hpasr
		echo "INFO: normal_end $EXE"
		exit
	;;
        *)
                help
                exit
        ;;
esac
#
