#!/bin/bash
#
# cs_add_watchdog_to_initrd
#
# (c) 2011 SUSE Linux GmbH, Germany.
# GNU Public License. No warranty.
# Author: A.Rehg, L.Pinne
# 
# Version: 0.02 2011-09-29 19:00
#

EXE="$0"
FIL="/etc/sysconfig/kernel"
BAK=${FIL}.bak


function help(){
	echo "usage: $(basename $0) --create [<MODULE>]"
	echo "usage: $(basename $0) [OPTION]"
	echo
	echo "OPTION:"
	echo " --help		show help."
	echo " --version	show version."
	echo " --show 	show available and used wathdog modules."
	echo " --create	create new initrd."
	echo
}


function version(){
	echo -n "$(basename $EXE) "
	head -11 $EXE | grep "^# Version: "
}


function show_mod(){
	V=$(uname -a | awk '{print $3}')
	OTHMOD=$(ls /lib/modules/${V}/kernel/drivers/watchdog/)
	RUNMOD=$(lsmod | awk '{print $1}' | sort -u)
 
# TODO 	echo "active watchdog module:" ??
# TODO	lsof | grep watchdog

	echo "=== loaded watchdog modules:"
	for m in $OTHMOD; do
		MDL=$(basename $m .ko)
		echo "$RUNMOD" | awk '$1=="'$MDL'" {print $1}'
		dmesg | grep $MDL
		# grep -v "Modules.linked.in" ?
	done
	echo
	echo "=== configured watchdog modules:"
	FIL="/etc/sysconfig/kernel"
	echo "$FIL"
	grep "^INITRD_MODULES=" $FIL
	grep "^MODULES_LOADED_ON_BOOT=" $FIL
	echo "/etc/modprobe.*"
	for m in $OTHMOD; do
                MDL=$(basename $m .ko)
		grep $MDL /etc/modprobe.conf*
		grep $MDL /etc/modprobe.d/*
	done
	echo
	echo "=== initrd watchdog modules:"
	/bin/zcat /boot/initrd | cpio -itv 2>/dev/null |\
               	grep "lib/modules/.*/kernel/drivers/watchdog/.*ko$" |\
		awk '{print $9}'
	echo
	echo "=== available watchdog modules:"
	echo $OTHMOD
	echo
}


function add_mod(){
	echo "INFO: start $EXE $FUNCNAME"
	test -s $FIL || exit 2
	grep -v "#.*INITRD_MODULES" $FIL | grep "INITRD_MODULES=.*$MOD" >/dev/null
	RC=$?

	if [ $RC -gt 0 ]; then
		cp -a $FIL $BAK || exit $?
		awk -F'"' '     $1=="INITRD_MODULES=" {print $1"\""$2" '"$MOD"'\" "}
        		        $1!="INITRD_MODULES=" {print}' $BAK >$FIL &&
		echo "INFO: wrote $FIL"
		mkinitrd
	else
        	echo "WARN: found \"${MOD}\" already in ${FIL}"
	fi
	echo "INFO: end $EXE $FUNCNAME"
}


function load_mod() {
	echo "INFO: start $EXE $FUNCNAME"
		modprobe $MOD
	echo "INFO: end $EXE $FUNCNAME"
}


# function main()

case $1 in
	-h|--help)
		help
		exit
	;;
	-v|--version)
		version
		exit
	;;
	-s|--show)
		echo "INFO: start $EXE"
		show_mod
		echo "INFO: normal_end $EXE"
		exit
	;;
	-c|--create)
		echo "INFO: start $EXE"
		shift
		MOD=${1:-"softdog"}
		for m in $OTHMOD; do
			MDL=$(basename $m .ko)
			rmmod $m 2>/dev/null
		done
		add_mod
		load_mod
		echo "INFO: normal_end $EXE"
		exit
	;;
esac
#
