#!/bin/bash
#
# cs_show_hana_autofailover_patterns
#
# (c) 2019 SUSE LLC
# Author: L.Pinne
# GNU General Public License v2. No warranty.
# http://www.gnu.org/licenses/gpl.html
#
# Version: 2019-11-28 17:30 SLES12
#
# TODO /etc/ClusterTools2/cs_show_hana_autofailover_patterns
# TODO patterns instead of functions like cs_error_patterns
# TODO  --help
# TODO  -g and -f like cs_show_supportconfig
# TODO FCHBA needed?
#

D=$(date +"%F")
DATE=${2:-"$D"}
LOGS=${3:-"messages*"}
FCHBA=${4:-"ibmvfc"}

EXE=$0
#TEMP="/dev/shm/cltl.$RANDOM"

# shellcheck disable=SC2086
NLOG=$(find ${LOGS} | wc -l)
#echo $LOGS
#echo $NLOG
#exit


# find pattern
function find_line() {
	# TODO date and time
	# shellcheck disable=SC2086
	grep "${DATE}.*${1}" $LOGS | cut_line | show_info "${2}"
}

# select colums
function cut_line() {
	if test "$NLOG" -eq 1; then
		awk -F" " '{print $1}' |\
		awk -F":" '{print $1":"$2":"$3}' |\
		awk -F"." '{print $1}' | sort -u
	else
		awk -F" " '{print $1}' |\
		awk -F":" '{print $2":"$3":"$4}' |\
		awk -F"." '{print $1}' | sort -u
	fi
}

# show additional info
function show_info() {
	while read -r; do echo "${REPLY}"" - ""${1}" ; done
}

# find SCSI reservation 
function find_scsi() {
	# SCSI3 reservation reserve
	find_line "USER=root.*sg_persist.*out.*reserve" "scsi_lock ..."
	# SCSI3 reservation preempt
	find_line "USER=root.*sg_persist.*out.*preempt" "scsi_pre"
	# SCSI3 reservation clear
	find_line "USER=root.*sg_persist.*out.*clear" "scsi_free"
	# SCSI3 reservation conflict
	find_line "kernel.*reservation.conflict" "scsi_clash"
}

# find sbd 
function find_sbd() {
	# SBD path error
	find_line "sbd.*terminated" "sbd_err"
	# SBD read reset
	find_line "sbd.*Received.command.reset" "sbd_recv ---"
	# SBD write reset
	find_line "USER=root.*sbd.*message.*reset" "sbd_send +++" 
	# SBD self-reboot
	# TODO due to path error or poison pill?
	#find_line "sbd.*Rebooting.system" "sbd_shut <<<<<<"
}

# find mpio 
function find_mpio() {
	# MPIO path removed
	find_line "multipath.*path.removed" "mpio_del"
	# MPIO path added
	find_line "multipath.*path.added" "mpio_add"
	# MPIO path failed
	#find_line "kernel.*FAILED.Result" "mpio_fail"
	#find_line "multipathd.*remaining.active.paths" "mpio_fail"
	#find_line "multipathd.*checker.failed.path" "mpio_fail"
}

# find xfs 
function find_xfs() {
	# XFS shutdown
	find_line "XFS.*Shutting.down" "xfs_err !!!"
	# XFS repair 
	find_line "USER=root.*xfs_repair.*hana" "xfs_rep"
	# XFS mount
	find_line "USER=root.*mount.*xfs.*hana" "xfs_mnt"
	# XFS umount
	find_line "USER=root.*umount.*hana" "xfs_umnt"
}

# find hba
function find_hba() {
	# HBA port login failed, e.g. switch replacement
	find_line "${FCHBA}.*Login.failed" "hba_err_p"
	find_line "${FCHBA}.*Target.failed" "hba_err_q"
	find_line "${FCHBA}.*Partner.initialization.complete" "hba_init"
}

# find boot 
function find_boot() {
	# system boot
	find_line "kernel.*bootconsole.*enabled" "sys_boot >>>>>>"
	# system shutdown
	find_line "systemd.*Stopping.Restore.*shutdown" "sys_shut <<<<<<"
}

# show help
function show_help() {
	BEX=$(basename "$EXE")
	echo "usage: $BEX [--help | --version]"
	echo "usage: $BEX OPTION [<date> [<logfile> [<hba>]]]"
	echo
	echo "OPTION:"
	echo " --all		find all patterns"
	echo " --scsi		find SCSI3 reservation patterns"
	echo " --xfs		find XFS patterns"
	echo " --sbd		find SBD patterns"
	echo " --mpio		find MPIO patterns"
	echo " --hba		find HBA patterns"
	echo " --boot		find re-boot patterns"
	echo
}


# main()

case $1 in
	--help|-h)
		show_help
		exit
	;;
	--version|-v)
		echo -n "$(basename "$EXE") "
		head -11 "$EXE" | grep "^# Version: "
		exit
	;;
	--scsi)
		find_scsi | sort
		exit
	;;
	--xfs)
		find_xfs | sort
		exit
	;;
	--mpio)
		find_mpio | sort
		exit
	;;
	--hba)
		find_hba | sort
		exit
	;;
	--sbd)
		find_sbd | sort
		exit
	;;
	--boot)
		find_boot | sort
		exit
	;;
	--all|*)
		( find_sbd
		find_xfs
		find_scsi
		find_mpio
		find_hba
		find_boot ) | sort
		exit
	;;
esac
#
