#!/bin/bash
################################################################
#@Authro Lijian
#@Date 2007-06-08
#@param1 -h target host
#@param2 -p ssh port for target host
#@param3 -v git pull version or commit
#@param4 -c if true, only change autoconfig, don't update source code
#@param5 -g git group, not null
#@param6 -b app branch for git
#@param7 -a app name 
#@param8 -e Deploy or  Rollback or other
#@param9 -s servers aws qcloud dev test
#@param10 -r rollback file
#@param11 -t tag
#/bin/sh deploy.sh -gyoho30 -p22 -bdev -ayoho-message -eDeploy -sdev


################################################################
BASE_BIN_DIR=`dirname $0`
#. $BASE_BIN_DIR/scripts/iptable/qcloud_gray/app-iptable.sh
#. $BASE_BIN_DIR/scripts/iptable/aws/app-iptable.sh
#. $BASE_BIN_DIR/scripts/iptable/qcloud/app-iptable.sh
#. $BASE_BIN_DIR/scripts/iptable/test/app-iptable.sh
#. $BASE_BIN_DIR/scripts/iptable/dev/app-iptable.sh
#. $BASE_BIN_DIR/scripts/iptable/test_nj_1/app-iptable.sh
#. $BASE_BIN_DIR/scripts/iptable/test_nj_2/app-iptable.sh
. $BASE_BIN_DIR/scripts/env.sh

################### Input parameter for user ###################################
SSH_HOST=""
SSH_PORT=22
CODE_VERSION=""
NOT_UPDATE="false"
GIT_GROUP=$DEFAULT_GIT_GROUP
APP_BRANCH=""
APP_NAME=""
EXE_COMMOND=""
SERVERS=""
ROLLBACK_FILE=""
TAG_NAME=""

param(){
	if [ $1 ]; then
		prefix=`expr substr $1 1 2`
		if [ $prefix = "-h" ]; then
			SSH_HOST=`echo $1|awk '{print substr($0, 3)}'`
		fi
		if [ $prefix = "-p" ]; then
			SSH_PORT=`echo $1|awk '{print substr($0, 3)}'`
		fi
		if [ $prefix = "-v" ]; then
			CODE_VERSION=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-c" ]; then
			NOT_UPDATE="true"
		fi
		if [ $prefix = "-g" ]; then
			GIT_GROUP=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-b" ]; then
			APP_BRANCH=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-a" ]; then
			APP_NAME=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-e" ]; then
			EXE_COMMOND=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-s" ]; then
			SERVERS=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-r" ]; then
			ROLLBACK_FILE=`echo $1|awk '{print substr($0,3)}'`
		fi
		if [ $prefix = "-t" ]; then
            TAG_NAME=`echo $1|awk '{print substr($0,3)}'`
        fi
	fi
}

#parse parameter
param $1
param $2
param $3
param $4
param $5
param $6
param $7
param $8
param $9
param ${10}
param ${11}

if [ -z $GIT_GROUP ]; then
    echo "**************************************************************************"
    echo "*Error: git group is null [$GIT_BASE_URL GIT_GROUP/$APP_NAME.git]*********"
	echo "*Please add -g args. For example: sh deploy -gyoho30, yoho30 is git group*"
    echo "**************************************************************************"    
    exit 1
fi

echo -e "\033[33m[INFO] GIT_BASE_URL=$GIT_BASE_URL$GIT_GROUP"
echo -e "\033[33m[INFO] APP_BRANCH=$APP_BRANCH"
echo -e "\033[33m[INFO] SSH_HOST=$SSH_HOST"
echo -e "\033[33m[INFO] SSH_PORT=$SSH_PORT"
echo -e "\033[33m[INFO] CODE_VERSION=$CODE_VERSION"
echo -e "\033[33m[INFO] NOT_UPDATE=$NOT_UPDATE"
echo -e "\033[33m[INFO] APP_NAME=$APP_NAME"
echo -e "\033[33m[INFO] EXE_COMMOND=$EXE_COMMOND"
echo -e "\033[33m[INFO] SERVERS=$SERVERS"
echo -e "\033[33m[INFO] ROLLBACK_FILE=$ROLLBACK_FILE"
echo -e "\033[33m[INFO] TAG_NAME=$TAG_NAME"



echo -ne "\033[0m"
################################################################################

################################ Init path for app #############################
BASE_HOME=$HOME
#OPPS_HOME=$BASE_HOME/opps
OPPS_HOME=$BASE_HOME/auto_deploy
echo "OPPS_HOME=$OPPS_HOME"
OPPS_DEPLOY_HOME=$OPPS_HOME/deploy
IDENTITY_FILE="/home/dev/auto_deploy/apps/yoho-cobar/dev/master/server/target/cobar-server.zip"
echo "OPPS_DEPLOY_HOME=$OPPS_DEPLOY_HOME"
APPS_BASE_HOME=$OPPS_HOME/apps
echo "APPS_BASE_HOME=$APPS_BASE_HOME"
BACKUP_BASE_HOME=$OPPS_HOME/backup
echo "BACKUP_BASE_HOME=$BACKUP_BASE_HOME"
init(){
	REMOTE_BASE_HOME=/home/$USER_LOGIN
	echo "REMOTE_BASE_HOME=$REMOTE_BASE_HOME"
	PROJECT_TARGET=$APP_NAME.zip
	echo "PROJECT_TARGET=$PROJECT_TARGET"
	PROJECT_SOURCE_BASE_DIR=$APPS_BASE_HOME/$APP_NAME
	echo "PROJECT_SOURCE_BASE_DIR=$PROJECT_SOURCE_BASE_DIR"
	PROJECT_SOURCE_DIR=$PROJECT_SOURCE_BASE_DIR/$SERVERS
	echo "PROJECT_SOURCE_DIR=$PROJECT_SOURCE_DIR"
	ROJECT_SOURCE_BRANCH_DIR=$PROJECT_SOURCE_DIR/$APP_BRANCH
	echo "ROJECT_SOURCE_BRANCH_DIR=$ROJECT_SOURCE_BRANCH_DIR"
	WEB_APP_BACKUP_DIR_PARENT=$BACKUP_BASE_HOME/$APP_NAME
	echo "WEB_APP_BACKUP_DIR_PARENT=$WEB_APP_BACKUP_DIR_PARENT"
	WEB_APP_BACKUP_DIR=$WEB_APP_BACKUP_DIR_PARENT/$SERVERS
	echo "WEB_APP_BACKUP_DIR=$WEB_APP_BACKUP_DIR"
	WEB_APP_ROOT=$REMOTE_BASE_HOME/$APP_NAME
	echo "WEB_APP_ROOT=$WEB_APP_ROOT"
	#WEB_APP_HOME=$WEB_APP_ROOT/deploy
	AUTOCONFIG_HOME=$OPPS_DEPLOY_HOME/autoconfig/$SERVERS
	echo "AUTOCONFIG_HOME=$AUTOCONFIG_HOME"
	IPATBLE_HOME=$OPPS_DEPLOY_HOME/scripts/iptable/$SERVERS
	echo "IPATBLE_HOME=$IPATBLE_HOME"
	AUTOCONFIG_HOME_BASE=$OPPS_DEPLOY_HOME/autoconfig
	echo "AUTOCONFIG_HOME_BASE=$AUTOCONFIG_HOME_BASE"
	IPATBLE_HOME_BASE=$OPPS_DEPLOY_HOME/scripts/iptable
	echo "IPATBLE_HOME_BASE=$IPATBLE_HOME_BASE"
}


################################# main ######################################
main(){
			
		if [ $EXE_COMMOND = "Deploy" ]; then
			deploy
		elif [ $EXE_COMMOND = "Rollback" ]; then
			rollback
		elif [ $EXE_COMMOND = "Back" ]; then
			break
		else
			echo "EXE_COMMOND error!"
		fi	
}

################################Update source code & package####################
package(){
	echo "package beging"
	####update autoconfig
	# if [ -d "$AUTOCONFIG_HOME" ]; then
	# 	echo "[INFO] start to update config..."
	# 	cd $AUTOCONFIG_HOME_BASE
	# 	echo `pwd`
	# 	git pull origin master
	# fi
	
	####update ipyables
	if [ -d "$IPATBLE_HOME" ]; then
		echo "[INFO] start to update ips..."
		cd $IPATBLE_HOME_BASE
		echo `pwd`
		git pull origin master
	fi
	
	## always remove old code 
    echo " start to remove existed src folder:  $ROJECT_SOURCE_BRANCH_DIR "
    rm -rf  $ROJECT_SOURCE_BRANCH_DIR
	
	###update source code
	if [ ! -d "$PROJECT_SOURCE_DIR" ]; then
		echo "[INFO] git clone -b $APP_BRANCH $GIT_BASE_URL$GIT_GROUP/$APP_NAME.git $APP_BRANCH"
		if [ ! -d "$APPS_BASE_HOME" ]; then
			echo "[INFO] make APPS_BASE_HOME :" $APPS_BASE_HOME 
			mkdir $APPS_BASE_HOME
		fi		
		if [ ! -d "$PROJECT_SOURCE_BASE_DIR" ]; then
			echo "[INFO] make PROJECT_SOURCE_BASE_DIR :" $PROJECT_SOURCE_BASE_DIR 
			mkdir $PROJECT_SOURCE_BASE_DIR
		fi
		if [ ! -d "$PROJECT_SOURCE_DIR" ]; then
			echo "[INFO] make PROJECT_SOURCE_DIR :" $PROJECT_SOURCE_DIR 
			mkdir $PROJECT_SOURCE_DIR
		fi
	fi
	cd $PROJECT_SOURCE_DIR
	git clone -b $APP_BRANCH $GIT_BASE_URL$GIT_GROUP/$APP_NAME.git $APP_BRANCH
	
	## finaly, checkout to tags
    if [ "$TAG_NAME" != "" ]; then    
        echo "start to checkout out to : $TAG_NAME"
            cd $ROJECT_SOURCE_BRANCH_DIR
            git tag -l
            git checkout tags/$TAG_NAME -b  branch-$TAG_NAME
    fi
		 
		
	cd $ROJECT_SOURCE_BRANCH_DIR/server
	###package app
	echo "[INFO] start to package application..."
	# if [ ! -d $AUTOCONFIG_HOME ]; then
	# 	mkdir -p $AUTOCONFIG_HOME
	# fi
	#sh $ROJECT_SOURCE_BRANCH_DIR/bin/mvn-package.sh $AUTOCONFIG_HOME/${APP_NAME}-autoconfig.properties $AUTOCONFIG_HOME/global-autoconfig.properties
	/usr/local/maven/bin/mvn package -P $SERVERS -Dmaven.test.skip=true
	echo "[INFO] package application finish."
	
}



####################################Backup app########################################
backup(){
	echo "backup beging"
	if [ -d $BACKUP_BASE_HOME ]; then
		echo "[INFO] BACKUP_BASE_HOME dir exist."
	else
		mkdir $BACKUP_BASE_HOME
	fi
	if [ -d $WEB_APP_BACKUP_DIR_PARENT ]; then
		echo "[INFO] WEB_APP_BACKUP_DIR_PARENT dir exist."
	else
		mkdir $WEB_APP_BACKUP_DIR_PARENT
	fi
	if [ -d $WEB_APP_BACKUP_DIR ]; then
		echo "[INFO] backup dir exist."
	else
		mkdir $WEB_APP_BACKUP_DIR
	fi
	
	echo "[INFO] backup dir is [$WEB_APP_BACKUP_DIR]"

	if [ -f $IDENTITY_FILE ]; then
		echo "[INFO] cp -f $IDENTITY_FILE $WEB_APP_BACKUP_DIR/$PROJECT_TARGET.$TIMESTAMP"
		cp -f $IDENTITY_FILE $WEB_APP_BACKUP_DIR/$PROJECT_TARGET.$TIMESTAMP
	fi
}

######################################synch app########################################
synch(){
	echo "[INFO] synch " $1
	if [ $1 = "localhost" ]; then
		echo "[INFO] mkdir $OPPS_DEPLOY_HOME/$APP_NAME"
		mkdir $OPPS_DEPLOY_HOME/$APP_NAME
		
		echo "[INFO] cp -r $OPPS_DEPLOY_HOME/$APP_NAME $BASE_HOME"
		cp -r $OPPS_DEPLOY_HOME/$APP_NAME $BASE_HOME
		
		echo "[INFO] rm -rf $OPPS_DEPLOY_HOME/$APP_NAME"
		rm -rf $OPPS_DEPLOY_HOME/$APP_NAME
	
		echo "[INFO] cp $IDENTITY_FILE $BASE_HOME/$APP_NAME"
		cp $IDENTITY_FILE $BASE_HOME/$APP_NAME
		
	else
		if [ -z $USER_HOME ]; then
			USER_LOGIN=`awk -v item=$1 'BEGIN{ split (item, host, "@"); print host[1]}'`
			init
		fi
		
		echo "[INFO]synch scp -p $IDENTITY_FILE  $1:$WEB_APP_ROOT"
		scp -p $IDENTITY_FILE  $1:$WEB_APP_ROOT

	fi
	echo "synch end"
}

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

##################################deploy app########################################
deploy(){
	init
	package
	backup
	
	#后加载ips
	. $IPATBLE_HOME/app-iptable.sh
	
	app_ips=${APP_NAME//-/_}_${SERVERS}_ips
	
		if [ -z $SSH_HOST ]; then
			if [ -z `eval echo \\${$app_ips[@]}` ]; then
				app_ips=DEV_DEFAULT_SERVER
			fi
			echo "[INFO] app_ips = ${app_ips[*]}"
			for var in `eval echo \\${$app_ips[@]}`; do
				synch $var
				if [ $var = "localhost" ]; then
					sh $BASE_HOME/$APP_NAME/deploy/bin/function.sh $BASE_HOME $APP_NAME
				else
					ssh  -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server"
					echo "ssh  -p $SSH_PORT $var unzip $REMOTE_BASE_HOME/$APP_NAME/cobar-server.zip"
					ssh  -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/cobar-server.zip -d $REMOTE_BASE_HOME/$APP_NAME/"
					echo "ssh  -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
					ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
					ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh "
				fi
			done
		else
			echo "[INFO] SSH_HOST = $SSH_HOST"
			arr=(${SSH_HOST//,/ })  
			for var in ${arr[@]}; do
				synch $var
				    ssh  -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server"
				    ssh  -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/cobar-server.zip -d $REMOTE_BASE_HOME/$APP_NAME/"
				    echo "ssh  -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
					ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
					ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh "
			done
		fi
}

#################################rollback app########################################
rollback(){
	init
	
	#后加载ips
	. $IPATBLE_HOME/app-iptable.sh
	
	echo "[INFO] App start to rollback[$WEB_APP_BACKUP_DIR]......."
	echo -e "\033[33mPlease choose a version to rollback..."
	echo -ne "\033[0m"
	
			echo "[INFO] ROLLBACK_FILE=$ROLLBACK_FILE"
			app_ips=${APP_NAME//-/_}_${SERVERS}_ips
			
		if [ -z $SSH_HOST ]; then
			if [ -z `eval echo \\${$app_ips[@]}` ]; then
				app_ips=DEV_DEFAULT_SERVER
			fi
			echo "[INFO] app_ips = ${app_ips[*]}"
			for var in `eval echo \\${$app_ips[@]}`; do
				synch $var
				if [ $var = "localhost" ]; then
					echo "cp $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $BASE_HOME/$APP_NAME/$PROJECT_TARGET"
					cp $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $BASE_HOME/$APP_NAME/$PROJECT_TARGET
					# echo "cp $OPPS_DEPLOY_HOME/scripts/function.sh $BASE_HOME/$APP_NAME"
					# cp $OPPS_DEPLOY_HOME/scripts/function.sh $BASE_HOME/$APP_NAME
					echo "sh $BASE_HOME/$APP_NAME/function.sh $BASE_HOME $APP_NAME"
					sh $BASE_HOME/$APP_NAME/deploy/bin/function.sh $BASE_HOME $APP_NAME
				else
					if [ -z $USER_HOME ]; then
						USER_LOGIN=`awk -v item=$var 'BEGIN{ split (item, host, "@"); print host[1]}'`
						init
					fi
					echo "scp -p  $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT"
					scp -p $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT

					ssh  -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server"
				    ssh  -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/$ROLLBACK_FILE -d $REMOTE_BASE_HOME/$APP_NAME/"
				    echo "ssh  -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
					ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
					ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh "
				fi
			done
		else
			echo "[INFO] SSH_HOST = $SSH_HOST"
			arr=(${SSH_HOST//,/ })  
			for var in ${arr[@]}; do
				if [ -z $USER_HOME ]; then
					USER_LOGIN=`awk -v item=$var 'BEGIN{ split (item, host, "@"); print host[1]}'`
					init
				fi
				echo "scp -p $IDENTITY_FILE -P $SSH_PORT $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT"
				scp -p  $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT
				 
				ssh  -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server"
			    ssh  -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/$ROLLBACK_FILE -d $REMOTE_BASE_HOME/$APP_NAME/"
			    echo "ssh  -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
				ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh "
				ssh  -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh "
			done
		fi
}

main