#!/bin/bash

#启动云解析客户端，并将启动后的PID保存在文件
function StartYunDNS
{
	CheckFiles 
	$WorkingDir/$ProgName -v 2 $USERNAME $PWD > $WorkingDir/GNTCPRPClient.log 2>&1 &
	CheckMqtt
	sleep 1s
	CheckStatus
	
	ProgPID=`ps -ef | grep -v "grep" | grep "GNTCPRPClient" | awk '{printf $2}'`
	echo $ProgPID > $WorkingDir/"YunDns.pid"
}

function CheckMqtt
{
        local needRun=true
        local localProgName=""
        localProgName=`ps -ef | grep -v "grep" | grep "$ProgMqttName" | awk '{printf $8}'`

        if [ "$localProgName" == "$WorkingDir/$ProgMqttName" ]; then
                needRun=false
		echo "mqtt is running..."
	else
		echo "mqtt is not running..."
		StartMqtt
        fi

}

function StartMqtt
{
	local LinuxUserName="LINUX_$USERNAME"
	local Instance="SKJX"

	local current_time=$(date "+%Y%m%d%H%M")

	local tmp_buf="g${LinuxUserName}n${Instance}wa${current_time}y#2023!"
	local md5_value=$(echo -n "$tmp_buf" | md5sum | awk '{print $1}')

	#echo "$tmp_buf $md5_value"

	$WorkingDir/$ProgMqttName $Instance LINUX $USERNAME $md5_value > $WorkingDir/GNMqtt.log 2>&1 &
}

#停止云解析客户端，将pid写0
function StopYunDns
{
	echo "Stop YunDns GNTcp..."
	
	killall -9 "$WorkingDir/$ProgName" > /dev/null 2>&1
	# echo "Stop YunDns mqtt... $WorkingDir/$ProgMqttName"
	# killall -9 "$WorkingDir/$ProgMqttName" > /dev/null 2>&1
	sleep 1s
	CheckStatusItem $ProgName
	echo "0" > $WorkingDir/"YunDns.pid"
}

function StopYunMqtt
{       
        echo "Stop YunDns mqtt... $WorkingDir/$ProgMqttName"
        killall -9 "$WorkingDir/$ProgMqttName" > /dev/null 2>&1
        sleep 1s
	CheckStatusItem $ProgMqttName
        echo "0" > $WorkingDir/"YunDns.pid"
}


function CheckStatus
{
	CheckStatusItem $ProgName
	CheckStatusItem $ProgMqttName
}

function CheckStatusItem
{	
	local localProgName=""
	localProgName=`ps -ef | grep -v "grep" | grep "$1" | awk '{printf $8}'`
	if [ "$localProgName" == "$WorkingDir/$1" ]; then
		echo "$1 is running..."
	else
		echo "$1 is not running..."
	fi

}

function GenerateConfFile
{
	if [ -e "$WorkingDir/$ConfFile" ]; then
		echo "Conf already exist!"
		read -p "Do you want to config new Conf File? (y|n): "
		if [ $REPLY != "y" ] && [ $REPLY != "Y" ]; then
			echo "exit..."
			exit
		fi
	fi

	StopYunDns	
	StopYunMqtt
	USERNAME=""
	while [ ! $USERNAME ]; 
	do
		read -p "please input username: " USERNAME
	done

	PWD=""
	while [ ! $PWD ]; 
	do
		read -p "please input password: " PWD	 
	done

	ENCRYTPWD=`echo -n "$PWD" | md5sum | cut -d ' ' -f1`
	ENCRYTPWD="\x01$ENCRYTPWD"
	
	echo -e "[User]\nname=$USERNAME\npassword=$ENCRYTPWD" > "$WorkingDir/$ConfFile"
}

function CheckFiles
{
	if [ ! -f "$WorkingDir/$ConfFile" ]; then
		echo "ConfFile Not Exist!"
		exit
	fi

	SECTION="User"
	KEY="name"
	USERNAME="" 
	USERNAME=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$KEY'/{print $2;exit}' "$WorkingDir/$ConfFile"`
	
	KEY="password"
	PWD=""
        PWD=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$KEY'/{print $2;exit}' "$WorkingDir/$ConfFile"`

	if [ $USERNAME ] &&  [ $PWD ]; then
		echo "get parameters OK!"
	else
		echo -e "paras in conf error !\n please config it again!" && exit
	fi
}

#若pid文件中的PID为0，说明用户手动停止了客户端，此时crontab任务不再检测重启客户端
function Check
{	
	ProgPID=`cat $WorkingDir/"YunDns.pid"` 
	if [ "$ProgPID" == "0" ];then
		return
	fi

	local needRun=true
	local localProgName=""
	localProgName=`ps -ef | grep -v "grep" | grep "GNTCPRPClient" | awk '{printf $8}'`
	
 	if [ "$localProgName" == "$WorkingDir/$ProgName" ]; then
		needRun=false
	fi

	if [ $needRun == true ];then
		StartYunDNS
	fi
}

function Install
{
	AddCrontabEntry
	GenerateConfFile
	CheckFiles
	StartYunDNS
}

function Uninstall
{
	StopYunDns	
	StopYunMqtt
	RemoveCrontabEntry
	rm -rf $WorkingDir/$ConfFile
}

#安装时添加crontab任务，卸载时删除任务
function AddCrontabEntry
{
	local TmpCrontabFile=`mktemp /tmp/tmp.XXXXXXXXXX`
        crontab -l >$TmpCrontabFile
        local CrontabEntry=`crontab  -l | grep "$SelfName" | awk '{print $6}'`
        if [ "$CrontabEntry" ]; then
                if [ "$CrontabEntry" != "$WorkingDir/$SelfName" ]; then
                        echo -e "\nThere is already a crontab entry for \"$CrontabEntry\"."
                        echo -n "Do you want to delete this one?[y|n]:"
                        read
                        if [ "$REPLY" = "" ] || [ $REPLY = "y" ] || [ $REPLY = 'Y' ]; then
                                #Delete crontab entry from temporiry file
                                sed -i -e "/$SelfName/d" $TmpCrontabFile
                        fi
                else
                        echo -e "\nCrontab entry \"$CrontabEntry\" already exists, we will use the existing one."
                        echo "Done!"
                        rm -fr $TmpCrontabFile
                        return
                fi
        fi

        #Now real install the crontab entry
	    echo "*/5 * * * * sh $WorkingDir/$SelfName check > /dev/null 2>&1 &" >> $TmpCrontabFile
        crontab $TmpCrontabFile
        rm -fr $TmpCrontabFile

        echo -e "\nCrontabl entry for \"$WorkingDir/$SelfName\" created:"
        crontab -l | grep "$WorkingDir/$SelfName"
        echo "Add Crontab Entry Done!"
}

function RemoveCrontabEntry
{
	#Create crontab entry
	echo "Now deleting crontab entry..."

        local TmpCrontabFile=`mktemp /tmp/tmp.XXXXXXXXXX`	
	crontab -l >$TmpCrontabFile
	
	local CrontabEntry=`crontab  -l | grep "$WorkingDir/$SelfName" | awk '{print $6}'`
	if [ "$CrontabEntry" ]; then
		#Delete crontab entry from temporiry file 
		sed -i -e "/$SelfName/d" $TmpCrontabFile
	fi

	crontab $TmpCrontabFile
	rm -fr $TmpCrontabFile
	echo "Remove Crontab Done!"
}

#导出客户端运行中产生的日志
function ExportLog
{
	$WorkingDir/$LogProg -p yundnsclient -l 0 -d > $WorkingDir/"YunDns_`date +%Y%m%d%H%M%S`.log"
}


function main
{

script_abs=$(readlink -f "$0")
script_dir=$(dirname $script_abs)


ProgName="GNTCPRPClient"
ProgMqttName="GNMQTTClient"
LogProg="GNLogReader"
SelfName="YunDnsCtl"
ConfFile="YunDns.Conf"
WorkingDir=$script_dir

	case "$1" in
		start)
			StartYunDNS
			;;
		stop)	
			StopYunDns
			;;
		status)
			CheckStatus
			;;
		check)
			Check
			;;
		install)
			Install
			;;
		uninstall)
			Uninstall
			;;
		restart)
			StopYunDns
			StartYunDNS
			;;
		config)
			GenerateConfFile
			;;
		exportlog)
			ExportLog
			;;
		*)
			echo "Usage: $0 {start|stop|status|restart|install|uninstall|config|exportlog}"
	esac
}

main $*


