#!/bin/bash

# ********************************************** ***************************** #
# File Name: appctl
# Description: Provide Basic Interfaces For Component-Upgrade
# Input:
# Output:
# Author: 
# Created: 2018-11-30
# Function List:
# **************************************************************************** #

# **********************************Global Vars******************************* #
CMPT_NAME="CMPT_OMM"
PKG_DIR=`dirname $0`/..
REPO_DIR=$PKG_DIR/repo
CMPT_DIR=/OSM/component/omm
OM_MAJOR_FILE="extend.ini passwd shadow group passwd.bak shadow.bak group.bak sudoers sshd_port.conf sha256sum_ps sha256sum_ps_bak license.dat license.dat.bak"

# **********************************Private Function*************************** #
function DeleteRedundentFiles()
{
	if [ "$NODE_TYPE" == "DATA_NODE"  ];then
		rm /OSM/component/omm/bin/aa              /OSM/bin/aa    &>/dev/null
		rm /OSM/component/omm/bin/ad              /OSM/bin/ad    &>/dev/null
		rm /OSM/component/omm/bin/alarm           /OSM/bin/alarm    &>/dev/null
		rm /OSM/component/omm/bin/eagent          /OSM/bin/eagent    &>/dev/null
		rm /OSM/component/omm/bin/info_collector  /OSM/bin/info_collector    &>/dev/null
		rm /OSM/component/omm/bin/kmm_server      /OSM/bin/kmm_server    &>/dev/null
		rm /OSM/component/omm/bin/ldap_client     /OSM/bin/ldap_client    &>/dev/null
		rm /OSM/component/omm/bin/kmms            /OSM/bin/kmms    &>/dev/null
		rm /OSM/component/omm/bin/mmt          	  /OSM/bin/mmt    &>/dev/null
		rm /OSM/component/omm/bin/oam_diagnose    /OSM/bin/oam_diagnose    &>/dev/null
		rm /OSM/component/omm/bin/omales          /OSM/bin/omales    &>/dev/null
		rm /OSM/component/omm/bin/omevent         /OSM/bin/omevent    &>/dev/null
		rm /OSM/component/omm/bin/omm_crypt_tool  /OSM/bin/omm_crypt_tool    &>/dev/null
		rm /OSM/component/omm/bin/omsync          /OSM/bin/omsync    &>/dev/null
		rm /OSM/component/omm/bin/perf            /OSM/bin/perf    &>/dev/null
		mv /OSM/component/omm/bin/osd_omtool /OSM/component/omm/bin/omtool  &>/dev/null
		rm /OSM/component/omm/bin/sa              /OSM/bin/sa    &>/dev/null
		rm /OSM/bin/osd_omtool &>/dev/null
	else
		rm /OSM/component/omm/bin/osd_perf        /OSM/bin/osd_perf    &>/dev/null
		rm /OSM/component/omm/bin/osd_omales      /OSM/bin/osd_omales    &>/dev/null
		rm /OSM/component/omm/bin/osd_oam_diagnose /OSM/bin/osd_oam_diagnose   &>/dev/null
		rm /OSM/component/omm/bin/osd_info_collector /OSM/bin/osd_info_collector  &>/dev/null
		rm /OSM/component/omm/bin/osd_omtool         /OSM/bin/osd_omtool     &>/dev/null
	fi

	return 0
}
function restoreModifiedFileAfterRPMInstall()
{
    if [ -f "/startup_disk/conf/conf_local/kmcm_primary_file.dat.rpmsave" ] ; then
        mv -f /startup_disk/conf/conf_local/kmcm_primary_file.dat.rpmsave /startup_disk/conf/conf_local/kmcm_primary_file.dat &>/dev/null
        OS_echo "[$CMPT_NAME] mv kmcm_primary_file.dat.rpmsave ,result $? ."
    fi
    if [ -f "/startup_disk/conf/conf_local/kmcm_standby_file.dat.rpmsave" ] ; then
        mv -f /startup_disk/conf/conf_local/kmcm_standby_file.dat.rpmsave /startup_disk/conf/conf_local/kmcm_standby_file.dat &>/dev/null
        OS_echo "[$CMPT_NAME] mv kmcm_standby_file.dat.rpmsave ,result $? ."
    fi
}
function DeleteRedundentCertFiles()
{
    variable=("CHS_DefaultCACert.crt" "DM_DefaultCert.crt" "DM_DefaultPriKey.key" "HM_DefaultCACert.crt" "HM_DefaultCert.crt" "HM_DefaultPriKey.key")
	for i in ${variable[@]}; do
	    if [ -f "/OSM/conf/$i" ] ; then 
		    OS_echo "[$CMPT_NAME] del cert file $i ."
			rm -fr "/OSM/conf/$i"
		fi 
	done
}
function StartSnmProcess()
{
	local PROCESS_NAME=$1

	OS_echo "[$CMPT_NAME] Begin to start $PROCESS_NAME."
	# nothing to do if it's already start
	ONLINE_FLAG=`ps -ef | grep -w "/OSM/component/omm/bin/$PROCESS_NAME" | grep -v grep | awk '{print $2}'`
	if [ -n "$ONLINE_FLAG" ]; then
		OS_echo "[$CMPT_NAME] $PROCESS_NAME is already online."
		return 0
	fi

	# failed if process file is not exist or start fail
	test -f /OSM/component/omm/bin/$PROCESS_NAME && sh snm.sh -s /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/${PROCESS_NAME}_snm_config.xml
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to start $PROCESS_NAME."
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to start $PROCESS_NAME."

	return 0
}

function StopSnmProcess()
{
	local PROCESS_NAME=$1

	OS_echo "[$CMPT_NAME] Begin to stop $PROCESS_NAME."
	sh snm.sh -t /OSM/component/omm/script/omm_snm.py -f /OSM/component/omm/conf/snm_config/${PROCESS_NAME}_snm_config.xml
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to stop $PROCESS_NAME."
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to stop $PROCESS_NAME."

	return 0
}

function StartDaemonProcess()
{
	local PROCESS_NAME=$1

	OS_echo "[$CMPT_NAME] Begin to start $PROCESS_NAME."
	# start oam_diagnose
	test -f /OSM/component/omm/bin/$PROCESS_NAME && sh /OSM/script/omm_task_start.sh /OSM/component/omm/bin/$PROCESS_NAME
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to start $PROCESS_NAME"
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to start $PROCESS_NAME."

	return 0
}

function StopDaemonProcess()
{
	local PROCESS_NAME=$1

	OS_echo "[$CMPT_NAME] Begin to stop $PROCESS_NAME."
	# if process file is exist, then daemon -s
	if [ -f /OSM/component/omm/bin/$PROCESS_NAME ]; then
		daemon -s /OSM/component/omm/bin/$PROCESS_NAME
	# if not exist, then kill
	else
		OS_echo "[$CMPT_NAME] $PROCESS_NAME exec file is not exist, use kill."
		kill -9 `ps -ef | grep -w $PROCESS_NAME | grep -v grep | awk '{print $2}'`
	fi

	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to stop $PROCESS_NAME."
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to stop $PROCESS_NAME."

	return 0
}

function StartAD()
{
	OS_echo "[$CMPT_NAME] Begin to start AD."
	# nothing to do if it's already start
	ONLINE_FLAG=`ps -ef | grep -w "bin/ad" | grep -v grep | awk '{print $2}'`
	if [ -n "$ONLINE_FLAG" ]; then
		OS_echo "[$CMPT_NAME] ad is already online."
		return 0
	fi

	if [ -d "/OSM/coffer_data/asan" ];then
		export LD_PRELOAD=/usr/local/lib64/asan/libasan.so
		export ASAN_OPTIONS=halt_on_error=0:verbosity=0:use_sigaltstack=0:detect_leaks=0:log_path=/OSM/coffer_data/asan/ad.log
	fi
	test -f /OSM/bin/ad && (/OSM/bin/cgroup_manage.sh -g omm start) && (cd /OSM/component/omm/bin/; LD_LIBRARY_PATH=/OSM/component/omm/lib /OSM/bin/ad &) && (/OSM/bin/cgroup_manage.sh end)
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to start AD."
		return 1
	fi
	cp /OSM/fdsa/plugins/om/mon_ad_online.sh /OSM/fdsa/plugins/om/mon_mononline.sh && cp /OSM/fdsa/plugins/om/mon_ad_alivestatus.sh /OSM/fdsa/plugins/om/mon_ad_tmpstatus.sh
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to copy shell-script."
	fi
	OS_echo "[$CMPT_NAME] Finish to start AD."

	return 0
}

function StopAD()
{
	OS_echo "[$CMPT_NAME] Begin to stop AD."
	#stop ad
	ONLINE_FLAG=`ps -ef | grep -w "/OSM/bin/ad" | grep -v grep | awk '{print $2}'`
	if [ -z "$ONLINE_FLAG" ]; then
		OS_echo "[$CMPT_NAME] AD is already offline."
		return 0
	fi

	cp /OSM/fdsa/plugins/om/mon_ad_offline.sh /OSM/fdsa/plugins/om/mon_mononline.sh && cp /OSM/fdsa/plugins/om/mon_ad_deadstatus.sh /OSM/fdsa/plugins/om/mon_ad_tmpstatus.sh
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to copy shell-script."
	fi

	kill -9 `ps -ef | grep -w bin/ad | grep -v grep | awk '{print $2}'`
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to stop AD."
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to stop AD."

	return 0
}

function StartIbase()
{
	OS_echo "[$CMPT_NAME] Begin to start ibase."
	test -f /OSM/coffer_data/ISM/package/ism_cs_full.tgz && test -f /ISM/R01ism_setup.sh && sh /ISM/R01ism_setup.sh V6
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to start ibase."
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to start ibase."

	return 0
}

function StopIbase()
{
	OS_echo "[$CMPT_NAME] Begin to stop ibase."
	#stop ibase
	sh /ISM/R01ism_setup.sh stop
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to stop ibase."
		return 1
	fi
	OS_echo "[$CMPT_NAME] Finish to stop ibase"

	return 0
}

function CheckOmmOnline()
{
	local PROCESS_LIST=$1
	local IS_SOMEONE_OFFLINE=1
	local RETRY_TIMES=0

	OS_echo "[$CMPT_NAME] Begin to check $PROCESS_LIST online."
	while [ $IS_SOMEONE_OFFLINE -eq 1 -a $RETRY_TIMES -lt 30 ]
	do
		ps_result=`ps -ef| grep omm`
		IS_SOMEONE_OFFLINE=0
		for process in $PROCESS_LIST
		do
			ONLINE_FLAG=`echo "$ps_result" | grep -w /OSM/component/omm/bin/$process | grep -v grep`
			if [ -z "$ONLINE_FLAG" ]; then
				OS_echo "[$CMPT_NAME] RETRY_TIMES($RETRY_TIMES) check $process is offline."
				IS_SOMEONE_OFFLINE=1
				break
			fi
		done
		sleep 0.2
		((RETRY_TIMES++))
	done
	
	if [ $IS_SOMEONE_OFFLINE -eq 1 ];then
		OS_echo "[$CMPT_NAME] Finish to check $PROCESS_LIST online, some process is offline."
		return 1
	else
		OS_echo "[$CMPT_NAME] Finish to check $PROCESS_LIST online."
		return 0
	fi
}

function CheckIbaseOnline()
{
	for process_name in ibase
	do
		OS_echo "[$CMPT_NAME] Begin to check $process_name."
		# for every process, check 10 times at most
		ONLINE_FLAG=`ps -ef | grep -w "$process_name" | grep -v grep | awk '{print $2}'`
		RETRY_TIMES=0
		while [ -z "$ONLINE_FLAG" -a $RETRY_TIMES -lt 30 ]
		do
			((RETRY_TIMES++))
			OS_echo "[$CMPT_NAME] Failed to check $process_name, times($RETRY_TIMES)."
			sleep 1
			ONLINE_FLAG=`ps -ef | grep -w "$process_name" | grep -v grep | awk '{print $2}'`
		done

		if [ -z "$ONLINE_FLAG" ]; then
			OS_echo "[$CMPT_NAME] Failed to check $process_name."
			return 1
		fi

		OS_echo "[$CMPT_NAME] Finish to check $process_name."
	done

	return 0
}

function KillProcess()
{
	local proc_name=$1
	kill -9 `pidof $proc_name` >/dev/null
	return $?
}

function CheckOmmOffline()
{
	local PROCESS_LIST=$1
	local IS_SOMEONE_ONLINE=1
	local RETRY_TIMES=0
	local MAX_RETRY_TIMES=30
	local FAIL_LIST
	OS_echo "[$CMPT_NAME] Begin to check $PROCESS_LIST offline."
	while [ $IS_SOMEONE_ONLINE -eq 1 -a $RETRY_TIMES -lt $MAX_RETRY_TIMES ]
	do
		ps_result=`ps -ef| grep omm`
		IS_SOMEONE_ONLINE=0
		for process in $PROCESS_LIST
		do
			ONLINE_FLAG=`echo "$ps_result" | grep -w /OSM/component/omm/bin/$process | grep -v grep`
			if [ -n "$ONLINE_FLAG" ]; then
				OS_echo "[$CMPT_NAME] RETRY_TIMES($RETRY_TIMES) check $process is online."
				IS_SOMEONE_ONLINE=1
				if [ $RETRY_TIMES -eq `expr $MAX_RETRY_TIMES - 1` ];then
				    FAIL_LIST="$FAIL_LIST $process"
				    continue
				fi
				break
			fi
		done
		sleep 0.2
		((RETRY_TIMES++))
	done

	if [ $IS_SOMEONE_ONLINE -eq 1 ];then
        for process in $FAIL_LIST
        do
            KillProcess $process
            if [ $? -ne 0 ];then
		OS_echo "[$CMPT_NAME] Finish to check $PROCESS_LIST offline, some process is online."
		return 1
            fi
        done
        OS_echo "[$CMPT_NAME] Finish to check $PROCESS_LIST offline."
        return 0
	else
		OS_echo "[$CMPT_NAME] Finish to check $PROCESS_LIST offline."
		return 0
	fi
}

function CheckIbaseOffline()
{
	for process_name in ibase  
	do
		OS_echo "[$CMPT_NAME] Begin to check $process_name offline."
		# for every process, check 10 times at most
		ONLINE_FLAG=`ps -ef | grep -w "$process_name" | grep -v grep | awk '{print $2}'`
		RETRY_TIMES=0
		while [ -n "$ONLINE_FLAG" -a $RETRY_TIMES -lt 30 ]
		do
			((RETRY_TIMES++))
			OS_echo "[$CMPT_NAME] Failed to check $process_name offline, times($RETRY_TIMES)."
			sleep 1
			ONLINE_FLAG=`ps -ef | grep -w "$process_name" | grep -v grep | awk '{print $2}'`
		done

		if [ -n "$ONLINE_FLAG" ]; then
			OS_echo "[$CMPT_NAME] Failed to check $process_name offline."
			return 1
		fi

		OS_echo "[$CMPT_NAME] Finish to check $process_name offline."
	done

	return 0
}

# **********************************Public Function*************************** #

# show help info
function ShowHelp()
{
	echo "Usage:"
	echo "	appctl [options]"
	echo ""
	echo "Options:"
	echo "	showhelp"
	echo "	install"
	echo "	uninstall"
	echo "	start"
	echo "	stop"
	echo "	check_status"
	echo "	online"
	echo "	offline"
	echo "	pre_upgrade"
	echo "	upgrade"
	echo "	check_upgrade"
	echo "	pre_rollback"
	echo "	rollback"

	return 0
}

# install all RPMs in repo directory
function Install()
{
	local SSHD_CONIFG="/etc/ssh/sshd_config"
	local CPU_ARCH=`uname -r`

	# prepare dir
	OS_echo "[$CMPT_NAME] Install---step 1---prepair directory."
	mkdir -p /var/lib/omm_rpm
	mkdir -p /OSM/conf/disk_auth/current_cert
	mkdir -p /startup_disk/conf/conf_local/disk_auth/current_cert	
	mkdir -p /OSM/conf/omm_cert/
	mkdir -p /OSM/conf/omm_cert/default_cert
	mkdir -p /OSM/conf/omm_cert/export_cert
	mkdir -p /OSM/coffer_data/omm/export_import_for_ibc
	chown ibc_os_hs:UTOPUSERS /OSM/coffer_data/omm/export_import_for_ibc
	chmod 750 /OSM/coffer_data/omm/export_import_for_ibc

	# intall rpms
	OS_echo "[$CMPT_NAME] Install---step 2---install rpms."
	for file in `ls $REPO_DIR/*.rpm`
	do
		retryTimes=3
		cur=0
		while [[ $cur -lt $retryTimes ]];do
			rpm -ivh --nodeps --force --dbpath=/var/lib/omm_rpm $file
			if [ $? -eq 0 ]; then
				break
			fi
			if [ $cur -eq 2 ];then
				OS_echo "[$CMPT_NAME] Install---step 2---install rpm($file) fail."
				return 1
			fi
			OS_echo "[$CMPT_NAME] Install---step 2---retry($cur) install rpm($file) ."
			sleep 3
			let cur++
		done
	done
        restoreModifiedFileAfterRPMInstall

	#clean redundent files
	OS_echo "[$CMPT_NAME] Install---step 3---delete redundent files."
	DeleteRedundentFiles
	if [ -f /OSM/conf/unroot_flag ]; then
		chown -R :OceanStorCommonGroup /etc/dp_log
	fi
	# customize
	OS_echo "[$CMPT_NAME] Install---step 4---customize sftp config."
	sed -i '/^\/OSM\/ccdb$/d' /usr/local/etc/sftppermit.config
	sed -i '/^\/OSM\/data\/infrastructure\/ccdb$/d' /usr/local/etc/sftppermit.config
	sed -i '/^\/OSM\/coffer_data\/ccdb\/data$/d' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/data/infrastructure/tmp/ccdb_sync_tmp' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/data/infrastructure/tmp/ccdb_backup' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/data/omm' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/ccdb/data/ccdb_sync_tmp' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/omm/alarm' /usr/local/etc/sftppermit.config
	sed -i '/^\/tmp$/d' /usr/local/etc/other_sftppermit.config
	sed -i '$a\/OSM/coffer_data/ccdb/ccdb_export' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/ccdb/ccdb_export_tar' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/ccdb/ccdb_import' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/ccdb/ccdb_import_cluster' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_runningdata/internal_disklog' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/data/infrastructure/ccdb' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/omm/export_import_for_ibc' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/omm/export_import_for_ibc' /usr/local/etc/other_sftppermit.config

	sed -i 's/^MaxFileSize.*$/MaxFileSize 4096/' /usr/local/etc/sftp-put-check.cfg
	sed -i 's/^MinFreeMemSize.*$/MinFreeMemSize 100/' /usr/local/etc/sftp-put-check.cfg

	OS_echo "[$CMPT_NAME] Install---step 5---customize ssh, ntp and syslog config in background."
	{
		cp /usr/lib/systemd/system/ntpd.service /usr/lib/systemd/system/ntpdinner.service
		sed -i 's/ExecStart=\/usr\/sbin\/ntpd/ExecStart=ip vrf exec vrf-inner \/usr\/sbin\/ntpd -c \/etc\/ntp.conf_inner/' /usr/lib/systemd/system/ntpdinner.service
		systemctl daemon-reload
		systemctl restart ntpdinner.service

		cat <<EOF > /etc/rsyslog.d/ntpd.conf
if ( \$programname == "ntpd" ) then {
    if ( \$msg contains "failed: Cannot assign requested address" or
         \$msg contains "unable to create socket on" or
         \$msg contains "failed to init interface for address" or
         \$msg contains "failed: Address already in use")
    then    ~
}
EOF
		systemctl restart rsyslog
		
		sed -i "/AuthorizedKeysFile/ s/^.*$/AuthorizedKeysFile \.ssh\/authorized_keys \/OSM\/publickey\/%u_publickey.pub/" $SSHD_CONIFG
		sed -i "/UsePrivilegeSeparation/ s/^#//" $SSHD_CONIFG
		sed -i "/CheckUserSplash/ s/^.*$/CheckUserSplash no/" $SSHD_CONIFG
		if [ "${CPU_ARCH##*.}" == "aarch64" ]; then
			sed -i '/^PubkeyAcceptedKeyTypes/d' $SSHD_CONIFG
			sed -i "/UsePAM yes/a PubkeyAcceptedKeyTypes=+ssh-dss" $SSHD_CONIFG
		fi
		echo -e "Match User ibc_os_hs\n\tAllowTcpForwarding yes" >> $SSHD_CONIFG

		# /etc/pam.d/login配置文件中添加pam_securetty.so的配置，以支持串口登录域用户
		grep -F "pam_securetty.so" /etc/pam.d/login || sed '1 aauth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so' -i /etc/pam.d/login

		systemctl restart sshd
		systemctl restart systemd-logind
		sh /OSM/component/omm/script/aa_ssh_port.sh -a
	}&

	OS_echo "[$CMPT_NAME] Install---step 6---customize dir permission."
	chmod 775 /OSM/conf/disk_auth/current_cert/
	chmod 775 /OSM/conf/disk_auth/default_cert/
	chmod 775 /startup_disk/conf/conf_local/disk_auth/current_cert/
	chmod 700 /home/ibc_os_hs
	chmod 750 /OSM/data/omm/chs
	chmod 700 /OSM/conf/omm_cert
	chmod 700 /OSM/conf/omm_cert/default_cert
	chmod 700 /OSM/conf/omm_cert/export_cert
	if [ "$NODE_TYPE" == "DATA_NODE"  ];then
		/OSM/script/aa_create_group.sh -c
		usermod -a -G UTOPUSERS ibc_os_hs
	fi
    
	OS_echo "[$CMPT_NAME] Install---step 7---cp manifest.yml."
	cp $PKG_DIR/manifest.yml $CMPT_DIR/
	chmod 640 $CMPT_DIR/manifest.yml
	if [ "$NODE_TYPE" != "DATA_NODE"  ];then
		# restart tpm service on ctrl node
		if [ -f /usr/lib/systemd/system/tpm2-abrmd.service ]; then
			sed -i "/RestartSec/ s/^.*$/RestartSec=3600/" /usr/lib/systemd/system/tpm2-abrmd.service
			systemctl daemon-reload
			systemctl restart tpm2-abrmd
		fi
		
		chown root:UTOPUSERS /OSM/data/omm
	fi

	OS_echo "[$CMPT_NAME] Install---step 8---customize _super_admin sudo."
	SUDOER_STR_FOR_SUPER_ADMIN=`cat /OSM/conf/sudoers | grep -E '^_super_admin'`
	SUDOER_STR_FOR_OCEANSTOR=`cat /OSM/conf/sudoers | grep -E '^OceanStorMgrUser'`
	SUDOER_STR_FOR_UTOPUSERS=`cat /OSM/conf/sudoers | grep -E '^%UTOPUSERS'`

	if [ -f /etc/sudoers ]; then
		sed -i "/^_super_admin/d" /etc/sudoers
		echo $SUDOER_STR_FOR_SUPER_ADMIN >> /etc/sudoers
		sed -i "/^OceanStorMgrUser/d" /etc/sudoers
		echo $SUDOER_STR_FOR_OCEANSTOR >> /etc/sudoers
		sed -i "/^%UTOPUSERS/d" /etc/sudoers
		echo $SUDOER_STR_FOR_UTOPUSERS >> /etc/sudoers
	fi

	if [ -f  /startup_disk/conf/conf_local/sudoers ]; then
		sed -i "/^_super_admin/d" /startup_disk/conf/conf_local/sudoers
		echo $SUDOER_STR_FOR_SUPER_ADMIN >> /startup_disk/conf/conf_local/sudoers
		sed -i "/^OceanStorMgrUser/d" /startup_disk/conf/conf_local/sudoers
		echo $SUDOER_STR_FOR_OCEANSTOR >> /startup_disk/conf/conf_local/sudoers
		sed -i "/^%UTOPUSERS/d" /startup_disk/conf/conf_local/sudoers
		echo $SUDOER_STR_FOR_UTOPUSERS >> /startup_disk/conf/conf_local/sudoers
	fi
	
	OS_echo "[$CMPT_NAME] Install---step 9---customize om major file on startup_disk."
	for file in ${OM_MAJOR_FILE}
	do
		if [ -d /startup_disk/conf/conf_local/${file} ]; then
			OS_echo "[$CMPT_NAME] /startup_disk/conf/conf_local/${file} must be a file, but is a dir, need rm."
			rm -rf /startup_disk/conf/conf_local/${file}
		fi
	done
	
	OS_echo "[$CMPT_NAME] Install---end."
	return 0
}

# uninstall all RPMs in repo directory
function Uninstall()
{
	OS_echo "[$CMPT_NAME] Uninstall---start."
	for file in `ls $REPO_DIR/*.rpm`
	do
		RPM_PKG=${file##*/}
		rpm -e --nodeps --dbpath=/var/lib/omm_rpm ${RPM_PKG%.*}
		if [ $? -ne 0 ]; then
			OS_echo "[$CMPT_NAME] Uninstall rpm($file) fail."
			return 1
		fi
	done
	if [ -d /OSM/conf/omm_cert ] ; then
	    rm  -fr /OSM/conf/omm_cert
	fi
	
	OS_echo "[$CMPT_NAME] Uninstall---end."
	return 0
}

# start component
function Start()
{
	OS_echo "[$CMPT_NAME] Start start."
	ln -s /OSM/component/omm/lib/libjsoncpp.so /OSM/component/omm/lib/libjsoncpp.so.23
	# choose product.ini
	OS_echo "[$CMPT_NAME] Start---step 1---choose product.ini."
	if [ -d "/OSM/coffer_data/asan" ];then
		export LD_PRELOAD=/usr/local/lib64/asan/libasan.so
		export ASAN_OPTIONS=halt_on_error=0:verbosity=0:use_sigaltstack=0:detect_leaks=0:log_path=/OSM/coffer_data/asan/omm_product_ini.log
	fi

	LD_LIBRARY_PATH=/OSM/component/omm/lib python /OSM/component/omm/script/gen_product_ini.py /OSM/component/omm/conf/product_ini/omm/rule.ini &&
	LD_LIBRARY_PATH=/OSM/component/omm/lib python /OSM/component/omm/script/gen_product_ini.py /OSM/component/omm/conf/product_ini/spec/rule.ini
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to choose product.ini."
		return 1
	fi

	auditctl -W  /OSM/data/omm/kmm -p wxa
	auditctl -W  /OSM/data/omm -p wxa
	auditctl -W  /OSM/coffer_data/omm -p wxa
	auditctl -W  /OSM/coffer_data/omm/kmm -p wxa

	OS_echo "[$CMPT_NAME] Start---step 2---load vos log config."
        echo -e "initlograte\nexit\n"|diagnose --auto

	OS_echo "[$CMPT_NAME] Start---step 3---start processes in background."
	if [ "$NODE_TYPE" != "DATA_NODE"  ]; then
		StartSnmProcess omsync &
		StartSnmProcess sa &
		StartSnmProcess mmt &
		StartSnmProcess alarm &
		StartSnmProcess aa &
		StartSnmProcess omales &
		StartSnmProcess kmms &
		StartSnmProcess kmm_server &
		StartSnmProcess perf &
		StartSnmProcess eagent &
		StartSnmProcess info_collector &
		StartDaemonProcess oam_diagnose &
		StartAD &
		StartIbase &
	else
		StartSnmProcess	osd_omales &
		StartSnmProcess osd_perf &
		StartSnmProcess osd_info_collector &
		StartDaemonProcess osd_oam_diagnose &
	fi

	OS_echo "[$CMPT_NAME] Start---end."
	return 0
}

# stop component
function Stop()
{
	OS_echo "[$CMPT_NAME] Stop---step 1---stop processes in background."
	if [ "$NODE_TYPE" != "DATA_NODE"  ]; then
		StopSnmProcess omsync &
		StopSnmProcess sa &
		StopSnmProcess mmt &
		StopSnmProcess alarm &
		StopSnmProcess aa &
		StopSnmProcess omales &
		StopSnmProcess kmms &
		StopSnmProcess kmm_server &
		StopSnmProcess perf &
		StopSnmProcess eagent &
		StopSnmProcess info_collector &
		StopDaemonProcess oam_diagnose &
		StopAD &
		StopIbase &
	else
		StopSnmProcess	osd_omales &
		StopSnmProcess osd_perf &
		StopSnmProcess osd_info_collector &
		StopDaemonProcess osd_oam_diagnose &
	fi

	OS_echo "[$CMPT_NAME] Stop---step 2---check if processed offline."
	if [ "$NODE_TYPE" != "DATA_NODE"  ]; then
		CheckIbaseOffline &
		CheckOmmOffline "omsync sa mmt alarm aa omales kmms kmm_server perf eagent info_collector oam_diagnose"
	else
		CheckOmmOffline	"osd_omales osd_perf osd_info_collector osd_oam_diagnose"
	fi

	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Stop---step 2---check processed offline failed."
		return 1
	fi

	OS_echo "[$CMPT_NAME] Stop end."
	return 0
}

# check if the comonent is normal
function CheckStatus()
{
	OS_echo "[$CMPT_NAME] CheckStatus---step 1---check if processes online."
	if [ "$NODE_TYPE" != "DATA_NODE"  ]; then
		CheckIbaseOnline &
		CheckOmmOnline "omsync sa mmt alarm aa omales kmms kmm_server perf eagent info_collector oam_diagnose"
	else
		CheckOmmOnline "osd_omales osd_perf osd_info_collector osd_oam_diagnose"
	fi

	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] CheckStatus---step 1---check processed online failed."
		return 1
	fi

	OS_echo "[$CMPT_NAME] CheckStatus---end."

	return 0
}

# component online, nothing to do
function Online()
{
	OS_echo "[$CMPT_NAME] Online---start."
	OS_echo "[$CMPT_NAME] Online---end."
	return 0
}

# component offline, nothing to do
function Offline()
{
	OS_echo "[$CMPT_NAME] Offline---start."
	OS_echo "[$CMPT_NAME] Offline---end."
	return 0
}

# component pre_upgrade, nothing to do
function PreUpgrade()
{
	OS_echo "[$CMPT_NAME] PreUpgrade---start."
	
	OS_echo "[$CMPT_NAME] PreUpgrade---end."
	return 0
}

# component upgrade
function Upgrade()
{
	mkdir -p /var/lib/omm_rpm
	local SSHD_CONIFG="/etc/ssh/sshd_config"
	local CPU_ARCH=`uname -r`

	OS_echo "[$CMPT_NAME] Upgrade---step 1---stop processes. "
	Stop
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Upgrade---step 1---stop processes failed."
		return 1
	fi
	rpm -e --nodeps --dbpath=/var/lib/omm_rpm `rpm -qa --dbpath=/var/lib/omm_rpm`
	OS_echo "[$CMPT_NAME] Upgrade---step 2---uninstall rpm package. $?"
    mkdir -p /OSM/conf/omm_cert/
	mkdir -p /OSM/conf/omm_cert/default_cert
	mkdir -p /OSM/conf/omm_cert/export_cert
	OS_echo "[$CMPT_NAME] Upgrade---step 2---install rpms."
	# intall rpms
	for file in `ls $REPO_DIR/*.rpm`
	do
		rpm -ivh --nodeps --force --dbpath=/var/lib/omm_rpm $file &>/dev/null
		if [ $? -ne 0 ]; then
			OS_echo "[$CMPT_NAME] Upgrade---step 2---install rpms($file) failed."
			return 1
		fi
	done

	restoreModifiedFileAfterRPMInstall
	# fix dsa host key
	if [ "${CPU_ARCH##*.}" == "aarch64" ]; then
		sed -i '/^PubkeyAcceptedKeyTypes/d' $SSHD_CONIFG
		sed -i "/UsePAM yes/a PubkeyAcceptedKeyTypes=+ssh-dss" $SSHD_CONIFG
		systemctl restart sshd
	fi
	/OSM/bin/sqlite3 /OSM/data/omm/aa_cluster_data.dat "alter table tbl_onlineuserinfo add sz_serviceticket VARCHAR DEFAULT ''"
	/OSM/bin/sqlite3 /OSM/data/omm/aa_cluster_data.dat "alter table tbl_onlineuserinfo add sz_top VARCHAR DEFAULT ''"
	/OSM/bin/sqlite3 /OSM/data/omm/aa_cluster_data.dat "alter table tbl_onlineuserinfo add reauth_ticket VARCHAR DEFAULT ''"
	/OSM/bin/sqlite3 /OSM/data/omm/aa_cluster_data.dat "update tbl_version set version=3"
	/OSM/bin/sqlite3 /OSM/data/omm/aa_local_data.dat "CREATE TABLE tbl_login_history (ip char, name char, vstore_id int, login_time int)"
	/OSM/bin/sqlite3 /OSM/data/omm/aa_local_data.dat "CREATE TABLE tbl_suspect_ip (ip char primary key, recent_login_time int, login_num int);"
	/OSM/bin/sqlite3 /OSM/data/omm/aa_local_data.dat \
	"CREATE TRIGGER keep_one_record_per_name after insert on tbl_login_history \
	begin \
	delete from tbl_login_history where ip=new.ip and name=new.name and vstore_id=new.vstore_id and rowid!=(select rowid from tbl_login_history where ip=new.ip and name=new.name and vstore_id=new.vstore_id order by login_time desc limit 1); \
	delete from tbl_login_history where login_time<(select min(login_time) from (select login_time from tbl_login_history order by login_time desc limit 100)); \
	delete from tbl_login_history where login_time<((select max(login_time) from (select login_time from tbl_login_history where ip=new.ip))-300); \
	insert or replace into tbl_suspect_ip(ip, recent_login_time, login_num) select new.ip, max(login_time), count(ip) from tbl_login_history where ip=new.ip; \
	delete from tbl_login_history where (select count(*) from tbl_login_history where ip=new.ip)>=10 and ip=new.ip; \
	end;"
	
	OS_echo "[$CMPT_NAME] Upgrade---step 3---cp manifest.yml."
	cp $PKG_DIR/manifest.yml $CMPT_DIR/

	OS_echo "[$CMPT_NAME] Upgrade---step 4---delete redundent files."
	# clean redundent files
	DeleteRedundentFiles
	DeleteRedundentCertFiles

	SUDOER_STR_FOR_SUPER_ADMIN=`cat /OSM/conf/sudoers | grep -E '^_super_admin'`
	sed -i "/^_super_admin/c $SUDOER_STR_FOR_SUPER_ADMIN" /etc/sudoers
	sed -i "/^_super_admin/c $SUDOER_STR_FOR_SUPER_ADMIN" /startup_disk/conf/conf_local/sudoers
	SUDOER_STR_FOR_OCEANSTOR=`cat /OSM/conf/sudoers | grep -E '^OceanStorMgrUser'`
	sed -i "/^OceanStorMgrUser/c $SUDOER_STR_FOR_OCEANSTOR" /etc/sudoers
	sed -i "/^OceanStorMgrUser/c $SUDOER_STR_FOR_OCEANSTOR" /startup_disk/conf/conf_local/sudoers
	SUDOER_STR_FOR_UTOPUSERS=`cat /OSM/conf/sudoers | grep -E '^%UTOPUSERS'`
	sed -i "/^%UTOPUSERS/c $SUDOER_STR_FOR_UTOPUSERS" /etc/sudoers
	sed -i "/^%UTOPUSERS/c $SUDOER_STR_FOR_UTOPUSERS" /startup_disk/conf/conf_local/sudoers

	ln -s /OSM/component/omm/lib/libjsoncpp.so /OSM/component/omm/lib/libjsoncpp.so.23

	mkdir -p /OSM/coffer_data/omm/export_import_for_ibc
	chown ibc_os_hs:UTOPUSERS /OSM/coffer_data/omm/export_import_for_ibc
	chmod 750 /OSM/coffer_data/omm/export_import_for_ibc
	if [ -f /OSM/coffer_data/omm/export_import/license.dat ];then
		mv /OSM/coffer_data/omm/export_import/license.dat /OSM/coffer_data/omm/export_import_for_ibc/license.dat
		chown -h ibc_os_hs:root /OSM/coffer_data/omm/export_import_for_ibc/license.dat
		chmod 600 /OSM/coffer_data/omm/export_import_for_ibc/license.dat
	fi

	sed -i '/^\/OSM\/coffer_data\/omm\/export_import_for_ibc/d' /usr/local/etc/sftppermit.config
	sed -i '$a\/OSM/coffer_data/omm/export_import_for_ibc' /usr/local/etc/sftppermit.config
	sed -i '/^\/OSM\/coffer_data\/omm\/export_import_for_ibc/d' /usr/local/etc/other_sftppermit.config
	sed -i '$a\/OSM/coffer_data/omm/export_import_for_ibc' /usr/local/etc/other_sftppermit.config

	OS_echo "[$CMPT_NAME] Upgrade---step 5---dplog reinit."
	# 重新加载dplog配置之前，修改日志配置文件权限
	if [ -f /OSM/conf/unroot_flag ]; then
		chown -R :OceanStorCommonGroup /etc/dp_log
	fi
	LD_LIBRARY_PATH=/OSM/component/omm/lib /OSM/script/omm_dplog_reinit.py
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Upgrade---step 5---dplog reinit failed."
	fi
	if [ -f "/etc/esyslog/log-collect/merged_log_collet.xml" ];then
	  rm -rf /etc/esyslog/log-collect/merged_log_collet.xml
	fi

	OS_echo "[$CMPT_NAME] Upgrade---step 6---start processes."
	# start process
	Start
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Upgrade---step 6---start processes failed."
		return 1
	fi
	if [ "$NODE_TYPE" != "DATA_NODE"  ];then	
		chown root:UTOPUSERS /OSM/data/omm
	else
		/OSM/script/aa_create_group.sh -c
		usermod -a -G UTOPUSERS ibc_os_hs
	fi
	
	OS_echo "[$CMPT_NAME] Upgrade---end."
	return 0
}

# check component upgrade type (0:not support;1:none upgrade;2:hot upgrade;3:cold upgrade, need reboot)
function CheckUpgrade()
{
	OS_echo "[$CMPT_NAME] CheckUpgrade---start."

	OLD_VERSION=`cat $CMPT_DIR/manifest.yml | grep Version| awk '{print $2}'`
	NEW_VERSION=`cat $PKG_DIR/manifest.yml | grep Version| awk '{print $2}'`

	if [ "$OLD_VERSION" = "$NEW_VERSION" ]; then
		OS_echo "[$CMPT_NAME] CheckUpgrade---same version, no need to update."
		return 1
	fi

	OS_echo "[$CMPT_NAME] CheckUpgrade---end."
	return 2
}

# nothing to do
function PreRollback()
{
	OS_echo "[$CMPT_NAME] PreRollback---start."
	Stop
	OS_echo "[$CMPT_NAME] PreRollback---stop $?."
        rpm -e --nodeps --dbpath=/var/lib/omm_rpm `rpm -qa --dbpath=/var/lib/omm_rpm`
	OS_echo "[$CMPT_NAME] PreRollback---end $?."
	restoreModifiedFileAfterRPMInstall
	return 0
}

# same as upgrade
function RollBack()
{
	OS_echo "[$CMPT_NAME] RollBack---start."
	Upgrade
	if [ $? -ne 0 ]; then
		OS_echo "[$CMPT_NAME] Failed to rollback."
		return 1
	fi
	OS_echo "[$CMPT_NAME] RollBack---end."
	return 0
}


# **********************************Main************************************** #

# Check Param
if [ $# -ne 1 ]; then
	ShowHelp
	exit -1
fi

# Route Opt
case "$1" in
	"showhelp")
		ShowHelp
		;;
	"install")
		Install
		;;
	"uninstall")
		Uninstall
		;;
	"start")
		Start
		;;
	"stop")
		Stop
		;;
	"check_status")
		CheckStatus
		;;
	"online")
		Online
		;;
	"offline")
		Offline
		;;
	"pre_upgrade")
		PreUpgrade
		;;
	"upgrade")
		Upgrade
		;;
	"check_upgrade")
		CheckUpgrade
		;;
	"pre_rollback")
		PreRollback
		;;
	"rollback")
		RollBack
		;;
	*)
		ShowHelp
		exit -1
		;;
esac

exit $?
