#!/bin/sh
#ident "$script: dlmdlp Build 5.90.0.8 07/02/09 11:30:00 $"
#----------------------------------------------------------------------------#
# PRODUCT :  HDLM Driver 0541                                                # 
#----------------------------------------------------------------------------#
# NAME :     dlmdlp                                                          #
# FUNCTION : dlmdlp script to support data loss patch                        #
#  	     Usage: dlmdlp -e|-d                                              #
#            -e  option configures support of data loss patch .              #
#            -d  option unconfigures support of data loss patch.             #
# INSTANCE:                                                                  #
# ATTR:      500                                                             #
# MEMO :     dlmdlp execution shell script                                   #
# DATE :     2004/10/18                                                      #
# AUTHOR :   BB                                                              #
# HISTORY :                                                                  #
#                                                                            #
# All Rights Reserved. Copyright (C) 2004,2007 Hitachi, Ltd.                 #
#----------------------------------------------------------------------------#

messag_txt()
{
	SUPPORT_JAP=$LANG
	KERNEL_VERSION=`$UNAME -r |$CUT -d "." -f2`


	if [ "$SUPPORT_JAP" == "ja_JP.eucjp" ] || [ "$SUPPORT_JAP" == "ja_JP.eucJP" ] ; then
		dlmdlpid1="KAPL12027-E ͥѥ˥åݡȥƥƥdlmdlpȤ̾ΤΤߤǼ¹ԤǤޤ"
		dlmdlpid2="KAPL12028-E ͥѥ˥åݡȥƥƥdlmdlpˤʣƱ˼¹ԤǤޤ"
		dlmdlpid3="KAPL12016-E dlmdlp¹Ԥ뤿ɬפʥե롢ޤϥǥ쥯ȥ꤬ĤޤǤFile or directory name = "
		dlmdlpid4="KAPL12018-E ǥ쥯ȥκ˼Ԥޤǥ쥯ȥ = "
		dlmdlpid5="KAPL12029-W : /opt/DynamicLinkManager/bin/dlmdlp {-e| -d}"
 		dlmdlpid6="KAPL12031-I ͥѥ˥åݡȥƥƥ$OPTIONｪλޤ"
		dlmdlpid7="KAPL12032-I ͥѥ˥åݡȥƥƥ$OPTIONμ¹Ԥ˼Ԥޤ"
		dlmdlpid8="KAPL12003-I ͥѥ˥åǽ򥵥ݡȤ뤿ѹϤǤ¸ߤƤޤե̾ = "
	       dlmdlpid9="KAPL12017-E եΥХååפ˼Ԥޤե̾ = "
		dlmdlpid10="KAPL12030-I ͥѥ˥åݡȥƥƥ$OPTIONưޤ"
		dlmdlpid11="KAPL12019-W եιǤޤǤե̾ = "
              dlmdlpid12="KAPL12033-I ͥѥ˥åݡȥƥƥ$OPTIONμ¹Ԥ桼ˤäǤޤ"
              dlmdlpid13="KAPL12034-I ͥѥ˥åǽ$OPTIONˤ뤿ޥ֡ȤƤ"
              dlmdlpid14="KAPL12565-E եιǤޤǤե̾ = "
              dlmdlpid15="KAPL12035-E 󥹥ȡ뤵ƤHDLMбƤ륫ͥΥСȡưƤ륫ͥΥС󤬰פޤ"
              dlmdlpid16="KAPL12036-E HDLMΥե뤬Ǥե̾ = "
		OPTENABLE="ͭ"
		OPTDISABLE="̵"


	elif [ "$SUPPORT_JAP" == "ja_JP.UTF-8" -a "$KERNEL_VERSION" == "6" -a -f /etc/redhat-release ]; then
		dlmdlpid1="KAPL12027-E カーネルパニックサポートユティリティはdlmdlpという名称のみで実行できます。"
		dlmdlpid2="KAPL12028-E カーネルパニックサポートユティリティ（dlmdlp）は複数同時に実行できません。"
		dlmdlpid3="KAPL12016-E dlmdlpを実行するために必要なファイル、またはディレクトリが見つかりませんでした。File or directory name = "
		dlmdlpid4="KAPL12018-E ディレクトリの作成に失敗しました。ディレクトリ = "
		dlmdlpid5="KAPL12029-W 使用例: /opt/DynamicLinkManager/bin/dlmdlp {-e| -d}"
 		dlmdlpid6="KAPL12031-I カーネルパニックサポートユティリティ$OPTIONが正常終了しました。"
		dlmdlpid7="KAPL12032-I カーネルパニックサポートユティリティ$OPTIONの実行に失敗しました。"
		dlmdlpid8="KAPL12003-I カーネルパニック機能をサポートするための変更はすでに存在しています。ファイル名 = "
	       dlmdlpid9="KAPL12017-E ファイルのバックアップに失敗しました。ファイル名 = "
		dlmdlpid10="KAPL12030-I カーネルパニックサポートユティリティ$OPTIONを起動しました。"
		dlmdlpid11="KAPL12019-W ファイルの更新ができませんでした。ファイル名 = "
              dlmdlpid12="KAPL12033-I カーネルパニックサポートユティリティ$OPTIONの実行がユーザによって中断されました。"
              dlmdlpid13="KAPL12034-I カーネルパニック機能を$OPTIONにするためマシンをリブートしてください。"
              dlmdlpid14="KAPL12565-E ファイルの更新ができませんでした。ファイル名 = "
              dlmdlpid15="KAPL12035-E インストールされているHDLMが対応しているカーネルのバージョンと，現在動作しているカーネルのバージョンが一致しません。"
              dlmdlpid16="KAPL12036-E HDLMのファイルが不正です。ファイル名 = "
		OPTENABLE="有効"
		OPTDISABLE="無効"

	else
		dlmdlpid1="KAPL12027-E This script can only be executed with the name dlmdlp."
		dlmdlpid2="KAPL12028-E Multiple instances of the kernel panic support utility cannot be executed concurrently."
		dlmdlpid3="KAPL12016-E Necessary file or directory does not exist. File or directory name = "
		dlmdlpid4="KAPL12018-E Failed to create directory. Directory =  "
		dlmdlpid5="KAPL12029-W Usage: /opt/DynamicLinkManager/bin/dlmdlp {-e| -d}"
 		dlmdlpid6="KAPL12031-I Kernel panic support utility $OPTION is successful."
		dlmdlpid7="KAPL12032-I Kernel panic support utility $OPTION failed."
		dlmdlpid8="KAPL12003-I Support change already exist in"
	       dlmdlpid9="KAPL12017-E Failed to copy file. File name = "
		dlmdlpid10="KAPL12030-I Kernel panic support utility $OPTION started."
		dlmdlpid11="KAPL12019-W Could not modify file. File name = "
              dlmdlpid12="KAPL12033-I Kernel panic support utility $OPTION is aborted by user."
              dlmdlpid13="KAPL12034-I Please reboot the machine to $OPTION the kernel panic functionality."
              dlmdlpid14="KAPL12565-E Could not modify file. File name = "
              dlmdlpid15="KAPL12035-E The version of the kernel supported by the installed HDLM does not match the currently running kernel version."
              dlmdlpid16="KAPL12036-E The HDLM file is invalid. File name ="
		OPTENABLE="enable"
		OPTDISABLE="disable"
        fi


}	
usage()
{
	logmsg "$dlmdlpid5"
}

##############################################################################
# Method to log messages to /var/log/messages and console
logmsg(){
		       $LOGGER -t "$SYSLOG_TAG" "$*"
		       $ECHO $*
}
##############################################################################

##############################CheckExistingFileName()##############################
CheckExistingFileName(){
	FILENAME="$1"
	COUNTER=0

	while [ $COUNTER -lt 10 ]
	do	
		if [ -f "$FILENAME""_""$COUNTER" ]; then
			let "COUNTER = COUNTER + 1"
		else
			TEMP_EXTN_COUNTER=$COUNTER
			return 0
		fi
	done

	return 1
}
cchandler()                                                                
{                                                                          
	if [ $edited -eq 0 ]
 	then
		$CHMOD --reference=$CNFFILE $BCKFILE
		#Set the proper security context for SE Linux
		if [ $SE_LINUX -eq 1 ] ; then
			CheckExistingFileName $CNFFILE_TMP
			ERR=$?
			if [ $ERR -ne 0 ]; then
				logmsg "$dlmdlpid9" "$CNFFILE, $ERRCODE = $ERR"
			else
				CNFFILE_TMP="$CNFFILE_TMP""_""$TEMP_EXTN_COUNTER"
				$MV $BCKFILE $CNFFILE_TMP
				$CHCON --reference=$CNFFILE $CNFFILE_TMP > /dev/null 2>&1
				$CHOWN --reference=$CNFFILE $CNFFILE_TMP
				$MV $CNFFILE_TMP $CNFFILE        	
			fi
		else
			$CHOWN --reference=$CNFFILE $BCKFILE
			$MV $BCKFILE $CNFFILE
		fi

		logmsg "$dlmdlpid12"
		logmsg "$dlmdlpid7"
 	fi
        exit 1
}                                                                          
cleanup()
{
	if [ $OTHERSCRIPT == 0 ]
	then
		if [ $CNFFILE_BAK != "$CNFFILE""_dlm" ]
		then
			$RM -f $CNFFILE_BAK
		fi
		if [ $CNFFILE_TMP != "$CNFFILE""_tmp_dlm" ]
		then
			$RM -f $CNFFILE_TMP
		fi
		$RM -f $LOCKFILE
		$RM -rf $BCKFILEDIR
	fi
	if [ $edited == 1 ]
	then
		if [ $OPTION == "-e" ]
		then
			OPTION=$OPTENABLE
		else
			OPTION=$OPTDISABLE
		fi
		messag_txt
		logmsg "$dlmdlpid13"
	fi	
}

# Method to set the option in modules.conf as entered by user
# $1 is 0 -> disable
# $1 is 1 -> enable
set_option()
{
	GOT=0
	CURRLINENO=1
	TOTAL_LINES=`$CAT $CNFFILE | $WC -l`
	STR=`$ECHO "DlmfdrvKernelPanic=$1"`
	while read line; do
		RET_VAL=`$ECHO "$line" | $EGREP "^options[[:space:]]+sddlmfdrv[[:space:]]" | $WC -l`
		if [ $RET_VAL -eq 1 ]; then # option line for Filter driver got
			GOT=1
			$CAT $CNFFILE | $HEAD -n $CURRLINENO > $CNFHEADFILE 
			$CAT $CNFFILE | $TAIL -n `$EXPR $TOTAL_LINES - $CURRLINENO` > $CNFTAILFILE
			$SED '/^[[:space:]]*options[[:space:]]\+sddlmfdrv[[:space:]].*/d' $CNFHEADFILE >$CNFHEADFILE.1
			ERR=$?
			if [ $ERR -ne 0 ]; then
				logmsg "$dlmdlpid14" "$CNFFILE"
				logmsg "$dlmdlpid7"
				exit 1
			fi
			RET_VAL=`$ECHO $line | $EGREP "[[:space:]]DlmfdrvKernelPanic[[:space:]]*=" | $WC -l`
			if [ $RET_VAL -eq 1 ]; then # option got, edit the option
				NEWLINE=`$ECHO "$line" | $SED 's,[[:space:]]\+DlmfdrvKernelPanic[[:space:]]*[=][[:space:]]*[^ ]*, '$STR',g'`
				ERR=$?
				if [ $ERR -ne 0 ]; then
					logmsg "$dlmdlpid14" "$CNFFILE"
					logmsg "$dlmdlpid7"
					exit 1
				fi
			else	#option not got, add the option at the end of the line
				NEWLINE=`$ECHO "$line" $STR`
			fi
			$ECHO $NEWLINE >> $CNFHEADFILE.1
			$CAT $CNFTAILFILE >> $CNFHEADFILE.1
			break
		fi
		let "CURRLINENO=$CURRLINENO+1"
	done < $CNFFILE
	if [ $GOT = 0 ];then # no option for filter driver, add the new option
		$ECHO "options sddlmfdrv DlmfdrvKernelPanic=$1" >>$CNFFILE
	else
		CheckExistingFileName $CNFFILE_BAK
		ERR=$?
		if [ $ERR -ne 0 ]; then
			logmsg "$dlmdlpid9" "$CNFFILE, $ERRCODE = $ERR"
			logmsg "$dlmdlpid7"
			exit 1
		fi
		CNFFILE_BAK="$CNFFILE_BAK""_""$TEMP_EXTN_COUNTER"
		$CHMOD --reference=$CNFFILE $CNFHEADFILE.1
		#Set the proper security context for SE Linux
		if [ $SE_LINUX -eq 1 ] ; then
			$MV $CNFHEADFILE.1 $CNFFILE_BAK
			$CHCON --reference=$CNFFILE $CNFFILE_BAK > /dev/null 2>&1
			$CHOWN --reference=$CNFFILE $CNFFILE_BAK
			$MV $CNFFILE_BAK $CNFFILE
		else
			$CHOWN --reference=$CNFFILE $CNFHEADFILE.1
			$MV $CNFHEADFILE.1 $CNFFILE
		fi
	fi
	$RM -rf $CNFHEADFILE*
	$RM -rf $CNFTAILFILE*
}

enable_support()
{
	logmsg "$dlmdlpid10"
	edited=0
	set_option 1
	edited=1
	logmsg "$dlmdlpid6"
}
disable_support()
{
	logmsg "$dlmdlpid10"
	edited=0
	a=`$EGREP "DlmfdrvKernelPanic" $CNFFILE`
	if [ "$a" != "" ]
	then
		set_option 0
	fi
	edited=1
	logmsg "$dlmdlpid6"
}
uninstall()
{
	CheckExistingFileName $CNFFILE_BAK
	ERR=$?
	if [ $ERR -ne 0 ]; then
		exit 1
	fi
	CNFFILE_BAK="$CNFFILE_BAK""_""$TEMP_EXTN_COUNTER"
	
	$SED '/.*DlmfdrvKernelPanic.*=.*/d' $CNFFILE >$CNFFILE_BAK
	ERR=$?
	if [ $ERR -ne 0 ]; then
		exit 1
	fi

	$CHMOD --reference=$CNFFILE $CNFFILE_BAK
	$CHOWN --reference=$CNFFILE $CNFFILE_BAK
	#Set the proper security context for SE Linux
	if [ $SE_LINUX -eq 1 ] ; then
		$CHCON --reference=$CNFFILE $CNFFILE_BAK > /dev/null 2>&1
	fi
	$MV $CNFFILE_BAK $CNFFILE
}

chkcnffile()
{
#############################################################################
# check whether modules.conf exists
# check whether modprobe.conf exists for kernel 2.6
if [ ! -f $CNFFILE ] 
then
	if [ "$OPTION" != "-u" ]
	then
#		logmsg "$dlmdlpid3" "/etc/modules.conf"
		logmsg "$dlmdlpid3" "$CNFFILE"
		logmsg "$dlmdlpid7"
	fi
		exit 1
fi
#############################################################################
#############################################################################
# backup modules.conf file
# backup modprobe.conf file for kernel 2.6
if [ -f $CNFFILE ]                                                
then                       	
	if [ ! -d "$BCKFILEDIR" ]
	then
        	$MKDIR $BCKFILEDIR
        	ERR=$?
         	if [ $ERR != 0 ]
         	then
                 	logmsg "$dlmdlpid4" "$BCKFILEDIR $ERRCODE= $ERR"
                	 exit 1
        	fi
	fi
 	$CP $CNFFILE $BCKFILE
	ERR=$?
	if [ $ERR != 0 ]
	then
		logmsg "$dlmdlpid9" "$CNFFILE, $ERRCODE= $ERR"
        	logmsg "$dlmdlpid7"
        	exit 1
	fi
fi                                                                         
#############################################################################
}
                                                                           

##############################################################################
PATH="/bin:/sbin:/usr/bin:/usr/sbin:$PATH"
export PATH

# Script Variables start here
FILENAME=dlmdlp
BCKFILEDIR=/etc/opt/DynamicLinkManager/DLMDLP/
#LOGGER=/usr/bin/logger
ECHO=/bin/echo
BASENAME=/bin/basename
UNAME=/bin/uname
EGREP="/bin/grep -E"
CP=/bin/cp
MKDIR=/bin/mkdir
MV=/bin/mv
SED=/bin/sed
RM=/bin/rm
#CUT=/bin/cut
CAT=/bin/cat
WC=/usr/bin/wc
HEAD=/usr/bin/head
TAIL=/usr/bin/tail
TOUCH=/bin/touch
SYSLOG_TAG=dlmdlp
CHMOD=/bin/chmod
CHOWN=/bin/chown
EXPR=/usr/bin/expr
if [ -f /etc/redhat-release ]; then
LOGGER=/usr/bin/logger
CUT=/bin/cut
elif [ -f /etc/SuSE-release ]; then
LOGGER=/bin/logger
CUT=/usr/bin/cut
fi
TMPDIR=/etc/opt/DynamicLinkManager
OTHERSCRIPT=0
LOCKFILE=$TMPDIR/.dlm_modules.conf.lock
ERRCODE="Errno"
edited=0
HDLM_COMMON_KNL_CHK="/etc/sysconfig/hdlm-scripts/dlmcommonknlcheck"

KERNEL_VERSION=`$UNAME -r |$CUT -d "." -f2`
if [ "$KERNEL_VERSION" = "4" ]; then 
	CNFFILE=/etc/modules.conf
	BCKFILE=/etc/opt/DynamicLinkManager/DLMDLP/modules.conf
	CNFHEADFILE=$BCKFILEDIR/modules.conf.head.$$
	CNFTAILFILE=$BCKFILEDIR/modules.conf.tail.$$
elif [ "$KERNEL_VERSION" = "6" ]; then
	CNFFILE=/etc/modprobe.conf
	BCKFILE=/etc/opt/DynamicLinkManager/DLMDLP/modprobe.conf
	CNFHEADFILE=$BCKFILEDIR/modprobe.conf.head.$$
	CNFTAILFILE=$BCKFILEDIR/modprobe.conf.tail.$$
fi
CNFFILE_BAK="$CNFFILE""_dlm"
CNFFILE_TMP="$CNFFILE""_tmp_dlm"

if [ "$KERNEL_VERSION" = "6" ] && [ -f /etc/redhat-release ] ; then
SE_LINUX=1
CHCON=/usr/bin/chcon
else
SE_LINUX=0
fi
TEMP_EXTN_COUNTER=""
# Script Variables end here
##############################################################################

if [ "$HIDDEN_OPT" == "" ]
then
	HIDDEN_OPT=0
fi

trap "cchandler" 2
trap "cleanup" EXIT
messag_txt
i=`$BASENAME $0`

##############################################################################
# check for name of script
if [ "$i" != "$FILENAME" ]
then
	logmsg "$dlmdlpid1"
	exit 1
fi
#############################################################################

###########################################################################
#Kernel Version Agreement Check
#For matching kernel version-START#
if [ -f $HDLM_COMMON_KNL_CHK ]; then
	. $HDLM_COMMON_KNL_CHK
	if [ "$HDLM_COMMON_RESULT" != "MATCH" ]; then
		if [ "$HDLM_COMMON_RESULT" == "UNMATCH" ]; then
			logmsg "$dlmdlpid15"
		else
			logmsg "$dlmdlpid16" "$HDLM_COMMON_KNL_VER_FILE"
		fi	
		exit 1
	fi
else
	logmsg "$dlmdlpid16" "$HDLM_COMMON_KNL_CHK"
	exit 1
fi
#For matching kernel version-END#
##########################################################################


# check whether single instance of script is running
if [ -f $LOCKFILE ]
then
	OTHERSCRIPT=1
	logmsg "$dlmdlpid2"
	logmsg "$dlmdlpid7"
	exit 1
else
	if [ ! -d $TMPDIR ]; then
		logmsg "$dlmdlpid3" "$TMPDIR"
		exit 1
	fi
	$TOUCH $LOCKFILE
fi
#############################################################################
#start of main script
getopts edu option  2>/dev/null
if [ $# -ne 1 ] || [ $OPTIND -ne 2 ]
then
	usage
	exit 1
fi 
if [ "$1" == "-u" ]
then
	if [ "$HIDDEN_OPT" == 0 ]
	then
		usage 
		exit 1
	fi
fi

#Varibales for messges:
if [ "$1" == "-e" -o "$1" == "-d" -o "$1" == "-u" ]; then
  OPTION="$1"
else
  OPTION=""
fi
messag_txt
chkcnffile
case $option in
e)enable_support;break;;
d)disable_support;break;;
u)uninstall;break;;
*)usage;exit 1;break;;
esac
exit 0
