#!/bin/bash

# PC/SC服务安装脚本
# pcscd,pcsc-lite,UDKmgr,HIDmgr,CCIDmgr,PKSC11,WatchSafe
# WatchData
# 李勃???2011??????

# 注册到firefox的P11模块???
P11_MODEL_NAME=PROXKey_MODULE

# Java工具名称
JAVATOOL_NAME=Watchsafe_ProxKey
#检测工具jar包名称
REPAIRTOOL_NAME_JAR=ProxKeyDiagnose.jar
REPAIRTOOL_NAME=ProxKey_DiagnoseTool
# Java UISvr名称
JAVAUISer_NAME_JAR=ProxKeyUISvr.jar
JAVAUISer_NAME_SH=ui.sh

# daemon名称
DAEMON_NAME=pcscd_wd
DAEMON_NAME_TMP=pcscd_wd_tmp

# 后台启动脚本
WD_DAEMON_NAME=WDProxKeyDaemon
WD_DAEMON_NAME_SH=$WD_DAEMON_NAME.sh

# 
XDG_AUTOSTART_DIR=/etc/xdg/autostart

# pcsc-lite so库名???
PCSCLITE_LIB_NAME=libpcsclite_wd
PCSCLITE_LIB_NAME_TMP=libpcsclite_wd_tmp

# PKCS11 so库名???
PKCS_LIB_NAME=libwdpkcs_SignatureP11.so

# 系统字长 32/64
SYSLONGBIT=

# WatchData主目录目标位???
DDIR_WD=/usr/lib/WatchData

# PCSC目标目录
DDIR_PCSC=$DDIR_WD/pcsc

# 版本主目录目标位???
DDIR_SAFE=$DDIR_WD/ProxKey

# 证书目录目标位置
DDIR_CERT=$DDIR_SAFE/cert

# 库文件目标位???
DDIR_LIB=$DDIR_SAFE/lib

# 可执行文件目标位???
DDIR_BIN=$DDIR_SAFE/bin

# Java工具目标位置
DDIR_TOOLS=$DDIR_SAFE/tools

# desktop目录目标位置
DDIR_DESKTOP=$DDIR_SAFE/desktop

# 快捷方式路径
APP_START_DIR=/usr/share/applications

# 服务脚本位置
SERV_SCR=

# 安装包中的脚本名
SCR_NAME=

# 安装包位???
PackPath=

# 发行版信???
ReleaseInfo=

# 服务管理工具
BIN_update_rc_d='/usr/sbin/update-rc.d'
BIN_chkconfig='/sbin/chkconfig'
BIN_insserv='/sbin/insserv'

# getconf工具位置
BIN_getconf='/usr/bin/getconf'


ErrFail() {
	echo ''
	echo '	install failed.'
	echo ''
	exit -1
}


#获取系统信息
GetSystemInfo () {
	if [ -e /etc/os-release ]; then
		ReleaseInfo=$(cat /etc/os-release)
	elif [ -e /etc/issue ]; then
		ReleaseInfo=$(cat /etc/issue)
	fi
	case "$ReleaseInfo" in
	*'openSUSE'*)
		echo '	Linux Release is openSUSE ...'
		ReleaseInfo='openSUSE'
		;;
	*'Ubuntu'*)
		echo '	Linux Release is Ubuntu ...'
		ReleaseInfo='Ubuntu'
		;;
	*'Fedora'*)
		echo '	Linux Release is Fedora ...'
		ReleaseInfo='Fedora'
		;;
	*'Debian'*)
		echo '	Linux Release is Debian ...'
		ReleaseInfo='Debian'
		;;
	*'Red Hat'*)
		echo '	Linux Release is Red Hat ...'
		ReleaseInfo='Fedora'
		;;
	*'BOSS'*)
		echo '	Linux Release is BOSS ...'
		ReleaseInfo='Debian'
		;;
	*'CentOS'*)
		echo '	Linux Release is CentOS ...'
		ReleaseInfo='Fedora'
		;;
	*'Mint'*)
		echo '	Linux Release is Mint ...'
		ReleaseInfo='Ubuntu'
		;;

	*)
		echo "	!!! Can't get your Linux release info, WatchSAFE maybe don't work. !!!"
		echo "	"
	esac

	SYSLONGBIT=$($BIN_getconf LONG_BIT)
	echo "	System LONGBIT is $SYSLONGBIT ..."
	if [ ${SYSLONGBIT} -gt 32 ]; then
		SYSLONGBIT='64bit'
	else
		SYSLONGBIT='32bit'
	fi
}


#复制主要文件
CopyFile () {
	#建立主目???	
	mkdir -p $DDIR_SAFE
	#检查一下是否成???	
	if [ -d $DDIR_SAFE ]; then

		echo -n
	else
		ErrFail
	fi

	#PCSC
	mkdir -p $DDIR_PCSC
	cp -fpR $PackPath/pcsc/$SYSLONGBIT/* $DDIR_PCSC
	chmod -R a+x $DDIR_PCSC
	
	#库文???
	mkdir -p $DDIR_LIB
	cp -fpR $PackPath/lib/$SYSLONGBIT/* $DDIR_LIB
	chmod -R a+x $DDIR_LIB
	
	#desktop
	mkdir -p $DDIR_DESKTOP
	cp -fpR $PackPath/desktop/* $DDIR_DESKTOP

	#证书
	mkdir -p $DDIR_CERT
	cp -fpR $PackPath/cert/* $DDIR_CERT

	#可执行文???
	mkdir -p $DDIR_BIN
	cp -fpR $PackPath/bin/$SYSLONGBIT/* $DDIR_BIN
	chmod -R a+x $DDIR_BIN

	#Java工具
	mkdir -p $DDIR_TOOLS
	cp -fpR $PackPath/tools/* $DDIR_TOOLS
	chmod -R a+wx $DDIR_TOOLS

	#建立符号链接
	ln -sf $DDIR_PCSC/$DAEMON_NAME /usr/sbin/$DAEMON_NAME
	ln -sf $DDIR_PCSC/$DAEMON_NAME /sbin/$DAEMON_NAME
	ln -sf $DDIR_PCSC/$PCSCLITE_LIB_NAME.so.1.0.0 $DDIR_PCSC/$PCSCLITE_LIB_NAME.so.1
	
	#Java工具需要的???
	ln -sf $DDIR_LIB/libpkcs11wrapper.so $DDIR_TOOLS/libpkcs11wrapper.so

	#Java工具的快捷方???	
	ln -sf $DDIR_DESKTOP/wdtokentool.desktop $APP_START_DIR/$JAVATOOL_NAME.desktop
	ln -sf $DDIR_TOOLS/tool.sh /usr/bin/$JAVATOOL_NAME
	#检测工具快捷方式
	ln -sf $DDIR_DESKTOP/ProxKeyrepairtool.desktop $APP_START_DIR/$REPAIRTOOL_NAME.desktop
	ln -sf $DDIR_TOOLS/repairtool.sh /usr/bin/$REPAIRTOOL_NAME
	
	#后台
	if [ -d "$XDG_AUTOSTART_DIR/" ];then
        ln -sf $DDIR_DESKTOP/$WD_DAEMON_NAME.desktop $XDG_AUTOSTART_DIR/$WD_DAEMON_NAME.desktop
        if [ -f "/etc/profile.d/$WD_DAEMON_NAME_SH" ];then
            rm -f /etc/profile.d/$WD_DAEMON_NAME_SH
        fi
	else
	    ln -sf $DDIR_TOOLS/$WD_DAEMON_NAME_SH /etc/profile.d/$WD_DAEMON_NAME_SH
	fi
}

#终止正在运行的工???
KillTool (){
	toollist=$(ps -ef | grep "$JAVATOOL_NAME.jar" | grep -v grep | awk '{print $2}')
	if [ -n "$toollist" ];then
		echo "	WatchSAFE tool is runing, will stop it ..."
		echo $toollist | while read pid; do
			kill -9 $pid
		done
	fi
}

#终止正在运行的检测工具
KillRepairTool (){
	toollist=$(ps -ef | grep "$REPAIRTOOL_NAME_JAR" | grep -v grep | awk '{print $2}')
	if [ -n "$toollist" ];then
		echo "	repair tool is runing, will stop it ..."
		echo $toollist | while read pid; do
			kill -9 $pid
		done
	fi
}

#终止正在运行的UISvr
KillUISvr (){
	toollist=$(ps -ef | grep "$JAVAUISer_NAME_JAR" | grep -v grep | awk '{print $2}')
	if [ -n "$toollist" ];then
		echo "	ProxKeyUISvr is runing, will stop it ..."
		echo $toollist | while read pid; do
			kill -9 $pid
		done
	fi
}

#终止正在运行的后台
KillDaemon (){
	toollist=$(ps -ef | grep "$WD_DAEMON_NAME" | grep -v grep | awk '$9=="" {print $2}')
	if [ -n "$toollist" ];then
		echo "	WatchSAFE Daemon is runing, will stop it ..."
		echo $toollist | while read pid; do
			kill -9 $pid
		done
	fi
}

#终止已运行的服务
KillService () {

	#终止服务
	pidlist=$(ps -ef | grep "$DAEMON_NAME" | grep -v grep | awk '{print $2}')
	if [ -n "$pidlist" ];then
		echo "	$DAEMON_NAME is runing, will stop it ..."
		if [ -e $BIN_update_rc_d ]; then
		    service $DAEMON_NAME stop
		    sleep 01s
	    elif [ -e $BIN_chkconfig ]; then
		    service $DAEMON_NAME stop
		    sleep 01s
		elif [ -e $BIN_insserv ]; then
		    service $DAEMON_NAME stop
		    sleep 01s
		fi

		#没有服务的话，直接终止进???	
 	    pidlist=$(ps -ef | grep "$DAEMON_NAME" | grep -v grep | awk '{print $2}')
		if [ -n "$pidlist" ];then
			echo $pidlist | while read pid; do
				kill -9 $pid
			done
			sleep 02s
		fi

		#检查结???	
	pidlist=$(ps -ef | grep "$DAEMON_NAME" | grep -v grep | awk '{print $2}')
		if [ -n "$pidlist" ];then
			echo "	can't stop $DAEMON_NAME."
			ErrFail
		else
			echo "	$DAEMON_NAME has been stoped."
		fi

	else
		echo "	there are no $DAEMON_NAME runing."
	fi

	#清理
	if [ -e /var/run/$DAEMON_NAME/$DAEMON_NAME.comm ]; then
		rm -f /var/run/$DAEMON_NAME/$DAEMON_NAME.comm
	fi
	if [ -e /var/run/$DAEMON_NAME/$DAEMON_NAME.pid ]; then
		rm -f /var/run/$DAEMON_NAME/$DAEMON_NAME.pid
	fi
	if [ -e /tmp/$DAEMON_NAME/$DAEMON_NAME.comm ]; then
		rm -f /tmp/$DAEMON_NAME/$DAEMON_NAME.comm
	fi
	if [ -e /tmp/$DAEMON_NAME/$DAEMON_NAME.pid ]; then
		rm -f /tmp/$DAEMON_NAME/$DAEMON_NAME.pid
	fi
}

#卸载服务
RemoveSrv() {
	if [ -e $BIN_update_rc_d ]; then
		echo "	using update-rc.d ..."
		$BIN_update_rc_d -f $DAEMON_NAME remove

	elif [ -e $BIN_chkconfig ]; then
		echo "	using chkconfig ..."
		$BIN_chkconfig --del $DAEMON_NAME

	elif [ -e $BIN_insserv ]; then
		echo "	using insserv ..."
		$BIN_insserv -r $DAEMON_NAME

	else
		echo " using WD sh..."      
	fi

	if [ -e /etc/init.d/$DAEMON_NAME ]; then
		rm -f /etc/init.d/$DAEMON_NAME
	fi
	if [ -e /etc/rc.d/init.d/$DAEMON_NAME ]; then
		rm -f /etc/rc.d/init.d/$DAEMON_NAME
	fi
}

#安装服务
InstallSrv() {
	cp -f $PackPath/srv/$SCR_NAME $SERV_SCR
	chmod a+x $SERV_SCR

	if [ -e $BIN_update_rc_d ]; then
		echo "	using update-rc.d ..."
		$BIN_update_rc_d $DAEMON_NAME defaults 99 01
		#启动
        echo "	launch $DAEMON_NAME service..."
        service $DAEMON_NAME start

	elif [ -e $BIN_chkconfig ]; then
		echo "	using chkconfig ..."
		$BIN_chkconfig --add $DAEMON_NAME
		#启动
        echo "	launch $DAEMON_NAME service..."
        service $DAEMON_NAME start

	elif [ -e $BIN_insserv ]; then
		echo "	using insserv ..."
		$BIN_insserv $DAEMON_NAME
		#启动
        echo "	launch $DAEMON_NAME service..."
        service $DAEMON_NAME start

	else
		echo "	using WD sh ..."
		mv $DDIR_PCSC/$DAEMON_NAME_TMP $DDIR_PCSC/$DAEMON_NAME
	    mv $DDIR_PCSC/$PCSCLITE_LIB_NAME_TMP.so.1.0.0 $DDIR_PCSC/$PCSCLITE_LIB_NAME.so.1.0.0		
		#启动
        echo "	launch $DAEMON_NAME service..."		
		$DDIR_PCSC/$DAEMON_NAME
	fi
}

getusername (){
	localuserName=$(w -h | awk 'NR==1' | awk '{print $1}')
	#echo $localuserName
}

# Begin Now !

echo ''
echo "	begin to install $DAEMON_NAME of WatchData ..."
echo ''


#获取脚本所在路???
PackPath=$(dirname $0)

#获取系统信息
GetSystemInfo

#关闭正在运行的工???
KillTool
KillRepairTool
#关闭正在运行的UISvr
KillUISvr
#关闭正在运行的后台
KillDaemon

#终止已运行的服务
echo "	find and kill $DAEMON_NAME in system ..."
KillService

#卸载已存在的服务
if [ -e /etc/init.d/$DAEMON_NAME ]; then
	echo "	remove old service ..."
	RemoveSrv
elif [ -e /etc/rc.d/init.d/$DAEMON_NAME ]; then
	echo "	remove old service ..."
	RemoveSrv
fi

#if [ -e /tmp/uilog.txt ]; then
#    sudo rm -f /tmp/uilog.txt
#fi

#if [ -d /tmp/~WDLOG ]; then
#    sudo rm -rf /tmp/~WDLOG
#fi

#复制文件
echo '	copy files ...'
CopyFile

#安装新服???#未知系统使用Ubuntu脚本
echo "	install $DAEMON_NAME service ..."
case "$ReleaseInfo" in
	'openSUSE')
		SERV_SCR=/etc/init.d/$DAEMON_NAME
		SCR_NAME=openSUSE
		;;
	'Ubuntu')
		SERV_SCR=/etc/init.d/$DAEMON_NAME
		SCR_NAME=Ubuntu
		;;
	'Fedora')
		SERV_SCR=/etc/rc.d/init.d/$DAEMON_NAME
		SCR_NAME=Fedora
		;;
	'Debian')
		SERV_SCR=/etc/init.d/$DAEMON_NAME
		SCR_NAME=Debian		
		;;
	*)
		SERV_SCR=/etc/rc.d/init.d/$DAEMON_NAME
		SCR_NAME=Fedora
		;;
esac
InstallSrv

sleep 02s

#注册P11模块
$DDIR_BIN/P11ModelTool -addP11 "PROXKey Module" $DDIR_LIB/$PKCS_LIB_NAME -allUsers

#注册证书
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/capricorn_ca_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/CCA_INDIA_2014_cer.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/eMudhra_CA_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/EMudhra_Sub_CA_for_Class_2_Individual_2014.crt -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/EMudhra_Sub_CA_for_Class_2_Org_2014.crt -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/EMudhra_Sub_CA_for_Class_3_Individual_2014.crt -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/EMudhra_Sub_CA_for_Class_3_Organisation_2014.crt -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/EMudhra_Sub_CA_for_DGFT_2014.crt -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/Code_CA_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_CA_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_DGFT_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_RCAI_Class3_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_RCAI_Class_2_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/CCAIndia2015.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/CCA_India_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/e-Mudhra_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/e-Mudhra_Sub_CA_for_Class_2_Document_Signer_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/e-Mudhra_Sub_CA_for_Class_3_Document_Signer_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/e-Mudhra_Sub_CA_for_Class_3_Individual_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/e-Mudhra_Sub_CA_for_Class_3_Organisation_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/e-Mudhra_Sub_CA_for_DGFT_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/IDRBT_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/IDSign_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/nCode_Solutions_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/PantaSign_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/RajComp_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_Class_3_Authorized_Signatory_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_Class_3_Individual_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_Class_3_Organization_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_DGFT_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_Document_Signer_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_IncomeTax_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScrypt_sub-CA_for_RA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SafeScryptCA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/Verasys_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/XtratrustCA2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/Capricorn_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/CapricornSubCAforDocumentSignerDSC2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/CapricornSubCAforIndividualDSC2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/CapricornSubCAforOrganisationDSC2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/C-DAC_CA_2014.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/IDSign_sub_CA_for_Consumers_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/PantaSign_Sub_CA_for_DSC_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/RajCOMP_sub-CA_for_Class_3_Authorized_Signatory_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/RajCOMP_sub-CA_for_Class_3_Individual_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/RajCOMP_sub-CA_for_Class_3_Organization_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/RajCOMP_sub-CA_for_Class_3_RA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/RajCOMP_sub-CA_for_Document_Signer_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/Verasys_Sub_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/XtraTrust_Sub_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SignX_CA_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SignX_sub-CA_for_Class_3_Individual_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SignX_sub-CA_for_Class_3_Organization_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SignX_sub-CA_for_DGFT_2022.cer -allUsers
$DDIR_BIN/P11ModelTool -addCert $DDIR_CERT/SignX_sub-CA_for_Document_Signer_2022.cer -allUsers

#启动后台
#$DDIR_LIB/$WD_DAEMON_NAME
nohup $DDIR_LIB/$WD_DAEMON_NAME > /dev/null 2>&1 &

#保存卸载脚本
cp -f $PackPath/uninstall $DDIR_SAFE
chmod a+x $DDIR_SAFE/uninstall

#修改pcscd目录权限
if [ -d /tmp/$DAEMON_NAME ]; then
    chmod -R 777 /tmp/$DAEMON_NAME
fi

#删除多余文件
if [ -e $DDIR_PCSC/$DAEMON_NAME_TMP ]; then
    rm -f $DDIR_PCSC/$DAEMON_NAME_TMP
fi
if [ -e $DDIR_PCSC/$PCSCLITE_LIB_NAME_TMP.so.1.0.0 ]; then
    rm -f $DDIR_PCSC/$PCSCLITE_LIB_NAME_TMP.so.1.0.0
fi

echo ''
echo '	install completed.'
echo ''

exit 0
