#!/bin/bash

DATE="2022-03-15"
BINFILES=""
LIBFILES=""
TOOLSFILES=""
REGFILES="ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A04
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A14
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A33
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A46
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/C000931E
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/C0009323
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/C0009330
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A07
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A15
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/80198A45
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/C000910B
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/C0009320
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/C000932C
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/V_DATE
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCOMMONSERVICE/V_VERSION
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCPUPERF/V_DATE
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMCPUPERF/V_VERSION
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMFSSERVICE/V_DATE
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMFSSERVICE/V_VERSION
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMMEMORYUSAGE/V_DATE
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMMEMORYUSAGE/V_VERSION
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMSYSTEMMANAGEMENTSERVICE/V_DATE
ESMALERTMAN/REPORTTABLE/EVENTLOG/APPLICATION/ESMSYSTEMMANAGEMENTSERVICE/V_VERSION"

OTHERFILES="/opt/nec/esmpro_sa/data/mo/ja/LC_MESSAGES/reprttbl.mo
/opt/nec/esmpro_sa/data/mo/ja/LC_MESSAGES/esmcmn.mo
/opt/nec/esmpro_sa/data/mo/en_US/LC_MESSAGES/esmcmn.mo.en
/opt/nec/esmpro_sa/data/stdalert.tbl
/opt/nec/esmpro_sa/data/esmsmsrv.conf"

########################################

FILELIST=""
ETCLOG="/etc/esmpro/Esmpro-Cmnsrv.log"
UPDATE=""
RECOVER=0
ERROR_FLAG="0"

ACTION=""
MSGCRT=""
MSGFILE=""
FILEBGN=""
CRTOK=""
FILEOK=""

REGHKEY="registry/HKEY_LOCAL_MACHINE"
REGTGZ="registry/regupdate.tgz"
REGDIR="$REGHKEY/SOFTWARE/NEC"
DIRS="bin lib tools  $REGDIR other"
SADIR="/opt/nec/esmpro_sa"
ETCDIR="/etc/esmpro"
LOGLIST="Esmpro-Provider.log Esmpro-Cmnsrv.log"
OUTPUT="$SADIR/log/update-$DATE.log"
MOD="0755"

ILO="/opt/nec/esmpro_sa/data/esmsmsrv.conf"
KEYWORDOFILO="# 2022/03/15 Ver2.3.0.3 for SAS (IML HDD)"
BACKUPFILE="/opt/nec/esmpro_sa/log/.reprttbl.mo.$DATE"
BACKOFTBLDATE="/opt/nec/esmpro_sa/log/.V_DATE.$DATE"
BACKOFTBLVERSION="/opt/nec/esmpro_sa/log/.V_VERSION.$DATE"

DAEMONFILES="ESMntagent ESMcmn ESMsmsrv ESMamvmain ESMntserver"
DAEMONFILES1="ESMntserver ESMamvmain ESMsmsrv ESMcmn ESMntagent"

function rpmversionchk(){
	RPMPACKAGE1=$1
	RPMPACKAGE2=$2

	TEMPTEMP=${RPMPACKAGE1##Esmpro-Selsrv-}
	RPMPACKAGE1VER=$TEMPTEMP

	TEMPTEMP=${RPMPACKAGE2##Esmpro-Selsrv-}
	RPMPACKAGE2VER=$TEMPTEMP

	if [ "$RPMPACKAGE1VER" = "$RPMPACKAGE2VER" ] ; then
		return 0
	fi
	
	BIGVER1=`/bin/echo "$RPMPACKAGE1VER" 2>/dev/null | /bin/awk -F . '{ print $1 }' 2>/dev/null`
	
	MIDVER1=${RPMPACKAGE1VER%%-*}
	MIDVER1=${MIDVER1#*.}
	MIDVER1=${MIDVER1%.*}

	SMALLVER1=${RPMPACKAGE1VER%%-*}
	SMALLVER1=${SMALLVER1#*.}
	SMALLVER1=${SMALLVER1#*.}

	REVISON1=${RPMPACKAGE1VER##*-}
	REVISON1=${REVISON1%ML}
	
	#BIGVER2=${RPMPACKAGE2VER%%.*}
	BIGVER2=`/bin/echo "$RPMPACKAGE2VER" 2>/dev/null | /bin/awk -F . '{ print $1 }' 2>/dev/null`
	
	MIDVER2=${RPMPACKAGE2VER%%-*}
	MIDVER2=${MIDVER2#*.}
	MIDVER2=${MIDVER2%.*}
	
	SMALLVER2=${RPMPACKAGE2VER%%-*}
	SMALLVER2=${SMALLVER2#*.}
	SMALLVER2=${SMALLVER2#*.}

	REVISON2=${RPMPACKAGE2VER##*-}
	REVISON2=${REVISON2%ML}
	
	if [ $BIGVER1 -gt $BIGVER2 ] ; then
		return 1
	elif [ $BIGVER1 -lt $BIGVER2 ] ; then
		return 2
	fi

	if [ $MIDVER1 -gt $MIDVER2 ] ; then
		return 1
	elif [ $MIDVER1 -lt $MIDVER2 ] ; then
		return 2
	fi

	if [ $SMALLVER1 -gt $SMALLVER2 ] ; then
		return 1
	elif [ $SMALLVER1 -lt $SMALLVER2 ] ; then
		return 2
	fi

	if [ $REVISON1 -gt $REVISON2 ] ; then
		return 1
	elif [ $REVISON1 -lt $REVISON2 ] ; then
		return 2
	fi

	return 3
}

function checkupdate(){
    ACTION="$1"
    if [ ! -f $ILO ] ; then
        echo "$ACTION is unnecessary."
        exit 6
    fi

    if [ $ACTION = "Update" ] ; then
        CURRENTSAVER=`/bin/rpm -qa --qf '%{name}-%{version}-%{release}\n' 2>/dev/null| /bin/grep "Esmpro-Selsrv-" 2>/dev/null`
        if [ ! -z "$CURRENTSAVER" ] ; then
            BASESAVER="Esmpro-Selsrv-2.1.0-0"
            rpmversionchk $CURRENTSAVER $BASESAVER
            if [ 2 -eq $? ] ; then
                echo "Update is unnecessary."
                exit 3
            fi
        fi

        if [ -f $BACKUPFILE ] ; then
            echo "Update has been applied."
            exit 8
        else
            grep "^$KEYWORDOFILO" $ILO >/dev/null 2>&1
            if [ 0 -eq $? ] ; then
                echo "Update is unnecessary."
                exit 7
            fi
        fi
    elif [ $ACTION = "Recovery" ] ; then
        if [ ! -f $BACKUPFILE ] ; then
            echo "Update has not been applied."
            exit 9
        fi
    fi

}

function usage(){
	echo -e "Usage:\n\t$0 : Update"
	echo -e "\t$0 -r: Recovery\n"
}

function fillstr(){
    MSGACT="$ACTION"
	MSGCRT="$ACTION: "
	MSGFILE="$MSGCRT $DATE"
	FILEBGN="$MSGFILE begin."
	ACTIONBGN="$MSGACT begin. Please wait a while..."
	CRTOK="$MSGACT is successfully."
	FILEOK="$MSGFILE successfully."
}

function testuser(){
	if [ $UID != 0 ] ; then
		echo "This program could be executed by root Only."
		exit 1
	fi	
}

function testtag(){
	if [ -z "$DATE" ] ; then
		echo -e "\nTag is NULL! Please modify the \$DATE.\n"
		exit 127
	fi
	if [ -z "$BINFILES" ] && [ -z "$LIBFILES" ] && [ -z "$TOOLSFILES" ] && [ -z "$REGFILES" ] && [ -z "$OTHERFILES" ]; then
		echo -e "\nFile is NULL! Please modify the \$BINFILES, \$LIBFILES, \$TOOLSFILES, \$REGFILES or \$OTHERFILES.\n"
		exit 127
	fi
}

function logtime(){
	TIME="`date`"
	echo -e "\n$TIME\n">>$OUTPUT 2>&1
}

function GetESMStatus(){
	for log in $LOGLIST ; do
		ETCLOG="$ETCDIR/$log"
		
		if [ $log = Esmpro-Provider.log ] ; then
			if [ ! -f "$ETCLOG" ] ; then
				echo "ESMPRO ServerAgentService is not existing in this system."
				exit 2
			fi
		elif [ $log = Esmpro-Cmnsrv.log ] ; then
			if [ ! -f "$ETCLOG" ] ; then
				echo "ESMPRO ServerAgentService is installed by No Service Mode."
				exit 2
			fi
        fi
	done
}

exe()
{
	ACTION="$1"
	OBJECT="$2"
	case ${ACTION} in
		"stop")
			case ${OBJECT} in
				"SADAEMON")
					LIST="${DAEMONFILES}"
					;;
				"snmpd")
					LIST="${OBJECT}"
					;;
				*)
					LIST=""
					;;
			esac
			;;
		"start")
			case ${OBJECT} in
				"SADAEMON")
					LIST="${DAEMONFILES1}"
					;;
				"snmpd")
					LIST="${OBJECT}"
					;;
				*)
					LIST=""
					;;
			esac
			;;
		*)
			return 1
			;;
	esac
	
	LEVEL="`/sbin/runlevel 2>>$OUTPUT | /bin/awk '{print $2}' 2>>$OUTPUT`"||LEVEL=3
	
	if [ -f /usr/bin/systemctl ] && [ -f /usr/lib/systemd/system/ESMntserver.service ] ; then
		for daemonname in ${LIST} ; do
			if [ -f /usr/lib/systemd/system/${daemonname}.service ] ; then
				/usr/bin/systemctl is-enabled ${daemonname}.service >>$OUTPUT 2>&1
				if [ 0 -eq $? ] ; then
					/usr/bin/systemctl  ${ACTION} ${daemonname}.service >/dev/null 2>>$OUTPUT
				else
					echo "${daemonname} is not installed or chkconfig failed">>$OUTPUT
				fi
			fi
		done
	
	elif [ -f /sbin/service ] ; then
		for daemonname in ${LIST} ; do
			/sbin/chkconfig ${daemonname} 2>>$OUTPUT
			if [ 0 -eq $? ] ; then
				/sbin/service ${daemonname} "${ACTION}" >/dev/null 2>>$OUTPUT
			else
				echo "${daemonname} is not installed or chkconfig failed">>$OUTPUT
			fi
		done
	else
		for daemons in ${LIST} ; do
			daemonname="`/usr/bin/find /etc/rc.d/rc${LEVEL}.d/ -name S[[:digit:]]*${daemons} 2>>$OUTPUT`"
			if [ -f "${daemonname}" ] ; then
				${daemonname} "${ACTION}" >/dev/null 2>>$OUTPUT
			else
				echo "${daemonname} is no exist." >>$OUTPUT
			fi
		done
	fi
}


function StopService(){
    exe "stop" "SADAEMON"
}

function StartService(){
	exe "start" "SADAEMON"
}

function rollback(){
	for dirs in $DIRS ; do
		if [ $dirs = "bin" ] ; then
			FILELIST="$BINFILES"
			MOD="0755"
		elif [ $dirs = "lib" ] ; then
			FILELIST="$LIBFILES"
			MOD="0755"
		elif [ $dirs = "tools" ] ; then
			FILELIST="$TOOLSFILES"
			MOD="0755"
        elif [ $dirs = $REGDIR ] ; then
			FILELIST="$REGFILES"
			MOD="0644"
		elif [ $dirs = "other" ] ; then
			FILELIST="$OTHERFILES"
			MOD="0644"
		fi
		for binfile in $FILELIST ; do
			#BAKFILE="$SADIR/log/.$binfile.$DATE"
            BAKFILE1="`echo $binfile | /bin/sed "s/[A-Z|a-z|_]*\///g"`"
			BAKFILE="$SADIR/log/.$BAKFILE1.$DATE"
			if [ $dirs = "other" ] ; then
	            echo $binfile | grep ".en$" -i >/dev/null 2>&1
	            if [ 0 -eq $? ] ; then
	                binfile=`echo $binfile | sed 's/.en$//'`
                fi

				ORGFILE="$binfile" 
			else
				ORGFILE="$SADIR/$dirs/$binfile"
			fi

            if [ $dirs = $REGDIR ] ; then
                echo $BAKFILE1 | grep "^V_" >/dev/null 2>&1
                if [ 1 -eq $? ] ; then
                    /bin/rm -rf $ORGFILE>/dev/null 2>>$OUTPUT || ERROR_FLAG="2"
                else
                    /bin/cp -a $BAKFILE $ORGFILE>/dev/null 2>>$OUTPUT || ERROR_FLAG="2"
                fi
            else
			    if [ -f $BAKFILE ] ; then
				    /bin/mv -f $BAKFILE $ORGFILE>/dev/null 2>>$OUTPUT || ERROR_FLAG="2"
			    else
				    echo "Could not find $BAKFILE." >>$OUTPUT 
			    fi
            fi
		done
	done
    if [ -f $BACKOFTBLDATE ] ; then
        /bin/rm -rf $BACKOFTBLDATE >/dev/null 2>>$OUTPUT || ERROR_FLAG="2"
    fi
    if [ -f $BACKOFTBLVERSION ] ; then
        /bin/rm -rf $BACKOFTBLVERSION >/dev/null 2>>$OUTPUT || ERROR_FLAG="2"
    fi
}

function UpdateMethod(){
	logtime

	echo "$ACTIONBGN" | /usr/bin/tee -a $OUTPUT
	echo "$FILEBGN" >>$OUTPUT

    if [ -f "$REGTGZ"  ] ; then
        cd ./registry
        /bin/tar xzvf regupdate.tgz >>$OUTPUT 2>&1
        cd - >>$OUTPUT
    fi

	StopService
	for dirs in $DIRS ; do
		if [ $dirs = "bin" ] ; then
			FILELIST="$BINFILES"
			MOD="0755"
		elif [ $dirs = "lib" ] ; then
			FILELIST="$LIBFILES"
			MOD="0755"
		elif [ $dirs = "tools" ] ; then
			FILELIST="$TOOLSFILES"
			MOD="0755"
		elif [ $dirs = $REGDIR ] ; then
			FILELIST="$REGFILES"
			MOD="0644"
		elif [ $dirs = "other" ] ; then
			FILELIST="$OTHERFILES"
			MOD="0644"
		fi
		for binfile in $FILELIST ; do
			
			BAKFILE1="`echo $binfile | /bin/sed "s/[A-Z|a-z|_]*\///g"`"
			BAKFILE="$SADIR/log/.$BAKFILE1.$DATE"

			if [ $dirs = "other" ] ; then
	            echo $binfile | grep ".en$" -i >/dev/null 2>&1
	            if [ 0 -eq $? ] ; then
	                binfile=`echo $binfile | sed 's/.en$//'`
                fi

                NEWFILE="./$dirs/$BAKFILE1"
				ORGFILE="$binfile"
			else
				NEWFILE="./$dirs/$binfile"
				ORGFILE="$SADIR/$dirs/$binfile"
			fi
			if [ -f $ORGFILE ] ; then
				#/usr/bin/install -p -m $MOD -o root -g root $ORGFILE $BAKFILE>/dev/null 2>>$OUTPUT || ( ERROR_FLAG="1" ; break )
				/bin/cp -a $ORGFILE $BAKFILE>/dev/null 2>>$OUTPUT || { ERROR_FLAG="1" ; break; }
				/bin/chmod $MOD $BAKFILE>/dev/null 2>>$OUTPUT || { ERROR_FLAG="1" ; break; } 
				/bin/chown root:root $BAKFILE>/dev/null 2>>$OUTPUT || { ERROR_FLAG="1" ; break; }
			else
				echo "Could not find $ORGFILE." >>$OUTPUT
			fi
			#/usr/bin/install -p -m $MOD -o root -g root $NEWFILE $ORGFILE > /dev/null 2>>$OUTPUT || ( ERROR_FLAG="3" ; break )
			/bin/cp -a $NEWFILE $ORGFILE>/dev/null 2>>$OUTPUT || { ERROR_FLAG="3" ; break; } 
			/bin/chmod $MOD $ORGFILE>/dev/null 2>>$OUTPUT || { ERROR_FLAG="3" ; break; }
			/bin/chown root:root $ORGFILE>/dev/null 2>>$OUTPUT || { ERROR_FLAG="3" ; break; }
            
		done
	done

        if [ -d "$REGHKEY"  ] ; then
		/bin/rm -rf $REGHKEY
	fi
	
	if [ "$ERROR_FLAG" != "0" ] ; then
		rollback
		StartService
		if [ "$ERROR_FLAG" = "2" ] ; then
			echo "$MSGACT error, and files rollback failed." | /usr/bin/tee -a $OUTPUT
			exit 4
		else
			echo "$MSGACT error, all files have been rollbacked." | /usr/bin/tee -a $OUTPUT
			exit 5
		fi
	else
		StartService
		echo "$CRTOK" | /usr/bin/tee -a $OUTPUT
		echo "$FILEOK TIME: `date`" >> $ETCLOG
		exit 0
	fi
}

function CleanFile(){
	cat $ETCLOG |grep -v "$FILEOK">>$ETCLOG.cat
	/bin/mv -f $ETCLOG.cat $ETCLOG
	
}

function RecoverMethod(){
	logtime

	echo "$ACTIONBGN" | /usr/bin/tee -a $OUTPUT
	echo "$FILEBGN" >>$OUTPUT

	StopService
	rollback
	StartService
	if [ "$ERROR_FLAG" != "0" ] ; then
		echo "$MSGCRT finished, but maybe has some problem." | /usr/bin/tee -a $OUTPUT
		exit 11
	else
		echo "$CRTOK" | /usr/bin/tee -a $OUTPUT
        echo "$FILEOK TIME: `date`" >> $ETCLOG
		exit 0 
	fi
}

trap "" 2 3
testuser
testtag
case $# in
0)  
    ACTION="Update"
	checkupdate $ACTION
	fillstr
	UpdateMethod
	;;
1)
	case $1 in
	-r)
		ACTION="Recovery"
	    checkupdate $ACTION
		fillstr
		RecoverMethod
		;;
	*)
		usage
		;;
	esac
	;;
*)
	usage
	;;
esac
