#!/bin/bash -
#===============================================================================
#
#          FILE: SKServer
#
#         USAGE: SKServer <Start/Stop/CheckAlive/CoreBackup> <Server1/ALL> [Server2] ....
#
#		 SKServer <Build/BuildIfNotExist> <SetDir> [Number]
#
#		 SKServer <Build/BuildIfNotExist> ACCOUNTDB
#		 SKServer <Build/BuildIfNotExist> GAMEDB [Set]
#                SKServer <Build/BuildIfNotExist> SOCIETYDB
#
#                SKServer <Build/BuildIfNotExist> <Mission/GameDBServer> [Set]
#                SKServer <Build/BuildIfNotExist> <SatelliteServer> [Set] [SAT Number]
#                SKServer <Build/BuildIfNotExist> <World/Zone> [Set] [Channel]
#                SKServer <Build/BuildIfNotExist> <Login> [Number of Servers]
#                SKServer <Build/BuildIfNotExist> <Ticket/Gateway/HTTPA/AcctDB/GameAgentServer/Society>
#                SKServer <Build/BuildIfNotExist> <CrossRouterServer> [Set]
#                SKServer <Build/BuildIfNotExist> <CentralServer> [Set]
#
#                SKServer LogRotate <Server1> [Server2] ....
#
#
#   DESCRIPTION: This is a drop-in replacement of SKServer with new features:
#                1.Monitor inside(CheckAlive)
#                2.Automatic build the server directory and symbolic link
#                3.CoreBackup inside and run in background
#                4.LogRotate inside
#                5.Using the environment variable $PATH
#                6.Logging
#
#       OPTIONS: Start
#                Stop
#                CheckAlive
#                CoreBackup
#                Build
#                LogRotate
#
#
#  REQUIREMENTS:  ---
#          BUGS:  ---
#         NOTES:  ---
#        AUTHOR: rickz (Rick Zhang), xlrickz@gmail.com
#       COMPANY: X-LEGEND Entertainment Corp.
#       CREATED: Mon Apr 11 10:55:01 CST 2011
#      REVISION: 1.0
#===============================================================================

#set -o nounset                              # Treat unset variables as an error
set -m                                      # Enable job control

#source ~/.gamerc
#if ! type function_loaded &> /dev/null; then
#	. $HOME/.gamerc
#fi
source ~/.gamerc
source ~/.functions
#echo "TICKETSERVER_PORT => $TICKETSERVER_PORT"
#echo "GATEWAYSERVER_PORT => $GATEWAYSERVER_PORT"
#echo "HTTPAGENT_PORT => $HTTPAGENT_PORT"
#echo "ACCOUNTDBSERVER_PORT => $ACCOUNTDBSERVER_PORT"
#exit
cd "$WORKING_DIRECTORY"

# The customized function file
CUSTFUNC="$(dirname $0)/customized_function"

# Log on begin
TTY="$(awk -F/dev/ '{print $2}' <<< "$SSH_TTY")"
SOURCEIP="$(try_to_get_full_hostname $(awk '{print $1}' <<< "$SSH_CLIENT"))"
LOGIN_USER=$(who -m|awk '{print $1}')
DATE_NOW="$(date +%Y/%m/%dT%H:%M:%S)"
[ "$ACTION" == "" ] && DO="NOTHING-TO-DO" || DO="$(head -c 12 <<< "$ACTION                 ")"
echo -e "$DATE_NOW\tBegin\t$DO\tAns:$ANSWER\tLogin:$LOGIN_USER\tUser:$USER\tTTY:$TTY\tIP:$SOURCEIP\tARGS: $*" >> "$SKSERVER_LOGFILE"

# Detect the ACTION right or not
grep "^[A-Za-z0-9_]* *(" "$0"|awk '{print $1}'|grep -q "^$ACTION$" || ACTION="show_help"
[ "$ACTION" == "" ] && ACTION="show_help"
[ "$ARG2" == "" ] && ACTION="show_help"

#############################
# Built-in script functions #
#############################
show_cmd () {
  for CMD in $(grep -h "^[a-zA-Z0-9_].*().* # " $CUSTFUNC $0|grep -v "##"|awk '{print $1}'|sort|uniq) ; do
          DESCRIPTION="$(grep -h "^$CMD .* # " $CUSTFUNC $0|awk -F"# " '{print $2}')"
          echo -n "$CMD" | colorize cyan black
          echo " -> $DESCRIPTION"
  done
}

show_help () {
  echo $"Usage: $0 <Command> <Server1/All> [Server2] ....

Example:
SKServer <Start/Stop/CheckAlive/CoreBackup> <Server1/ALL> [Server2] ....

SKServer <Build/BuildIfNotExist> <SetDir> [Number]

SKServer <Build/BuildIfNotExist> ACCOUNTDB
SKServer <Build/BuildIfNotExist> GAMEDB [Set]
SKServer <Build/BuildIfNotExist> SOCIETYDB

SKServer <Build/BuildIfNotExist> <Mission/GameDBServer> [Set]
SKServer <Build/BuildIfNotExist> <SatelliteServer> [Set] [SAT Number]
SKServer <Build/BuildIfNotExist> <WorldZone> [Set] [Channel]
SKServer <Build/BuildIfNotExist> <Login> [Number of Servers]
SKServer <Build/BuildIfNotExist> <Ticket/Gateway/HTTPA/AcctDB/GameAgentServer/Society>

SKServer LogRotate <Times to keep> <Server1> [Server2] ....

The flow of Build:
Build
     \_ SetDir
              \_ GAMEDB
              |        \_ Mission/GameDBServer
              |                  \_ SatelliteServer/WorldZone
              |                  \_ CrossRouterServer
              |                  \_ CentralServer
              |
              \_ ACCOUNTDB
              |
              |_ SOCIETYDB
	      |
              \_ Ticket/Gateway/HTTPAgent/AcctDB/GameAgentServer/SocietyServer
              |
              \_ Login

Commands:
$(show_cmd)
"
}

#####################
# Command functions #
#####################
Build () { # Build up the servers

   if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "GOOGLE-SUBMIT" -o "$HOST_NAME" == "APPLE-SUBMIT" -o "$HOST_NAME" == "DATA" -o "$HOST_NAME" == "SUBMIT" -o "$HOST_NAME" == "SUB" -o "$HOST_NAME" == "DLC" -o "$HOST_NAME" == "TIME1" -o "$HOST_NAME" == "MEDIA" ] ; then

	[ "$ARG3" == "" ] || SOURCE_TO_BUILD="-$ARG3"
	SET_NUM="$(get_world_num $ARG3)"
	CH_NUM="$ARG4"

	DATABASE_PASSWORD="$TEST_SERVER_DB_PASSWORD"
	GAME_DB="$GAME_DB_NAME$SET_NUM"

	GAME_DB_IP="127.0.0.1"
	ACCOUNT_DB_IP="127.0.0.1"
	SOCIETY_DB_IP="127.0.0.1"

	TicketServerIP="127.0.0.1"
	BillingGatewayIP="127.0.0.1"

	LoginHttpIP="127.0.0.1"

	#GAMEAGENT_IP="$(echo $(/sbin/ifconfig ${WZ_EXT_IF} | grep 'inet' | grep -v 'inet6' | awk -F' ' '{print $2}' | awk '{print $1}'))"
	GAMEAGENT_IP="127.0.0.1"
	MISSION_IP="127.0.0.1"

	if [ "$NAT" == "1" ] || [ "$ONLY_ONE_NETWORK_INTERFACE" == "1" ] ; then
		WZ_INT_IPADDR="$TEST_SERVER_PRIVATE_IP"
	else
	        WZ_INT_IPADDR="127.0.0.1"
	fi

        WZ_EXT_IPADDR="$TEST_SERVER_GLOBAL_IP"

	WZ_NUM="$(get_wz_num $SET_NUM $CH_NUM)"

        SOCIETY_INT_IPADDR="$TEST_SERVER_PRIVATE_IP"
        SOCIETY_EXT_IPADDR="$TEST_SERVER_GLOBAL_IP"

	SAT_EXIST=$(check_server_exist_from_hosts SAT)
	if [ "$SAT_EXIST" -eq 1 ]; then
		SAT_SET_NUM="$(get_world_num $ARG3)"
		SAT_ID_NUM="$ARG4"
		SATELLITE_EXT_IP="$(echo $(wget -q -O- --header="Metadata-Flavor: Google" http://icanhazip.com))"
		SATELLITE_INT_IP="$(echo $(/sbin/ifconfig ${WZ_EXT_IF} | grep 'inet' | grep -v 'inet6' | awk -F' ' '{print $2}' | awk '{print $1}'))"
	fi

	CROSS_ROUTER_IP="127.0.0.1"
   else
	SET_NUM="$ARG3"
	CH_NUM="$ARG4"

	DATABASE_PASSWORD="$LIVE_SERVER_DB_PASSWORD"
	GAME_DB="$GAME_DB_NAME$SET_NUM"

	GAME_DB_IP="$(print_serverip GAMEDB$SET_NUM)"
	ACCOUNT_DB_IP="$(print_serverip ACCOUNTDB)"
	SOCIETY_DB_IP="$(print_serverip SOCIETYDB)"

	TicketServerIP="$(print_serverip TICKET)"
	BillingGatewayIP="$(print_serverip_from_whole_hosts BGW)"

	LoginHttpIP=$(ssh HTTPA 'echo $(ifconfig -a|awk "/inet / {print \$2}"|grep -v 127.0.0.1|awk "{print \$1}")')

	GAMEAGENT_IP="$(echo $(/sbin/ifconfig ${WZ_EXT_IF} | grep 'inet' | grep -v 'inet6' | awk -F' ' '{print $2}' | awk '{print $1}'))"
	MISSION_IP="$(echo $(/sbin/ifconfig ${WZ_EXT_IF} | grep 'inet' | grep -v 'inet6' | awk -F' ' '{print $2}' | awk '{print $1}'))"

	WZ_INT_IPADDR="$(print_serverip WZ$SET_NUM$CH_NUM)"

	if [ "$NAT" == "1" ] || [ "$ONLY_ONE_NETWORK_INTERFACE" == "1" ] ; then
	    WZ_EXT_IPADDR="$(get_nat_ext_ip $(print_serverip WZ$SET_NUM$CH_NUM))"
	    SOCIETY_EXT_IPADDR="$(get_nat_ext_ip $(print_serverip SocietyS))"
	else
	    WZ_EXT_IPADDR="$(another_ip $(print_serverip WZ$SET_NUM$CH_NUM))"
	    SOCIETY_EXT_IPADDR="$(another_ip $(print_serverip SocietyS))"
	fi

	WZ_NUM="$(get_wz_num $SET_NUM $CH_NUM)"

	SOCIETY_INT_IPADDR="$(print_serverip SocietyS)"

	SAT_EXIST=$(check_server_exist_from_hosts SAT)
	if [ "$SAT_EXIST" -eq 1 ]; then
		SAT_SET_NUM="$ARG3"
		SAT_ID_NUM="$ARG4"
		SATELLITE_EXT_IP="$(echo $(wget -q -O- --header="Metadata-Flavor: Google" http://icanhazip.com))"
		SATELLITE_INT_IP="$(echo $(/sbin/ifconfig ${WZ_EXT_IF} | grep 'inet' | grep -v 'inet6' | awk -F' ' '{print $2}' | awk '{print $1}'))"
	fi

	CROSS_ROUTER_IP="$(echo $(/sbin/ifconfig ${WZ_EXT_IF} | grep 'inet' | grep -v 'inet6' | awk -F' ' '{print $2}' | awk '{print $1}'))"
   fi


   export PGUSER="spiritking"
   export PGPASSWORD="$DATABASE_PASSWORD"
   source ~/.gamerc
   source ~/.functions
   [ "$SERVER_DATA_COMMON_DIRECTORIES" == "" ] && SERVER_DATA_COMMON_DIRECTORIES="bin Data db"


# SetDir
   if [ "$ARG2" == "SetDir" ] ; then
	echo "Build up Set Directory for Set $SET_NUM" | colorize green
	mkdir -p "$WORKING_DIRECTORY/servers$SET_NUM"
	cd "$WORKING_DIRECTORY/servers$SET_NUM"

	for dir in $SERVER_DATA_COMMON_DIRECTORIES ; do
		ln -sf "../common$SOURCE_TO_BUILD/$dir"
	done

	if [ "$GAME_TYPE" == "UG1" -o "$GAME_TYPE" == "G1" ] ; then
		unlink db
		ln -s ../common$SOURCE_TO_BUILD/DBSchema db
	fi

	if [ "$MOBILE" == "1" ] ; then
		SR_FILE="s_rootcmds.ini"
	else
		SR_FILE="S_RootCmds.ini"
	fi

	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "GOOGLE-SUBMIT" -o "$HOST_NAME" == "APPLE-SUBMIT" ] ; then
		ln -sf ~/bin/S_RootCmds.ini_test_$GAME_TYPE_LOWER Data/db/${SR_FILE} 2>&1 > /dev/null
	else
		ln -sf ~/bin/S_RootCmds.ini_live_$GAME_TYPE_LOWER Data/db/${SR_FILE} 2>&1 > /dev/null
	fi
	#ln -sf ~/bin/S_GMToolCmds.ini_$GAME_TYPE_LOWER Data/db/S_GMToolCmds.ini 2>&1 > /dev/null

	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "GOOGLE-SUBMIT" -o "$HOST_NAME" == "APPLE-SUBMIT" ] ; then
	    [ -e $WORKING_DIRECTORY/servers$SET_NUM/setup.ini ] \
	    || generate_setup_ini > $WORKING_DIRECTORY/servers$SET_NUM/setup.ini
	else
	    generate_setup_ini > $WORKING_DIRECTORY/servers$SET_NUM/setup.ini
	fi

	[ "$GAME_TYPE" == "LH" ] && generate_config00_ini > $WORKING_DIRECTORY/servers$SET_NUM/config00.ini
	[ "$GAME_TYPE" == "DS" ] && generate_config00_ini > $WORKING_DIRECTORY/servers$SET_NUM/config00.ini

	[ "$GAME_TYPE" == "LH" ] && ln -sf bin/config.ini
	[ "$GAME_TYPE" == "DJ" ] && ln -sf bin/config.ini
        [ "$GAME_TYPE" == "FF" ] && ln -sf bin/config.ini
        [ "$GAME_TYPE" == "DS" ] && ln -sf bin/config.ini
        [ "$GAME_TYPE" == "AK" ] && ln -sf bin/config.ini
        [ "$GAME_TYPE" == "FN" ] && ln -sf bin/config.ini
        [ "$GAME_TYPE" == "AR" ] && ln -sf bin/config.ini
	[ "$GAME_TYPE" == "GD" ] && ln -sf bin/config.ini
        [ "$MOBILE" == "1" -a "$GAME_TYPE" != "UG1" ] && ln -sf bin/config.ini

	if ! [ -f $WORKING_DIRECTORY/.min_ports ] ; then
		if [ -f ~/bin/min_ports.$COUNTRY_CODE_LOWER ] ; then
			cat ~/bin/min_ports.$COUNTRY_CODE_LOWER > $WORKING_DIRECTORY/.min_ports
		else
			cat ~/bin/min_ports.default > $WORKING_DIRECTORY/.min_ports
		fi
	fi

	echo "SetDir for Set $SET_NUM built" | colorize green

# GAMEDB
   elif [ "$ARG2" == "GAMEDB" ] ; then
	cd servers$SET_NUM

	which psql > /dev/null 2>&1 || exec echo "Error: psql not installed."

	if ! check_db_exist $GAME_DB ; then
	        cat > db/createdb_${GAME_DB}.sql << __EOF__
CREATE USER spiritking WITH SUPERUSER PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking WITH PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking SUPERUSER;
CREATE DATABASE "$GAME_DB" ENCODING 'SQL_ASCII' template=template0;
__EOF__
	        psql -U postgres < db/createdb_${GAME_DB}.sql
		psql -U postgres $GAME_DB <<< "CREATE OR REPLACE LANGUAGE plpgsql;"
	        psql $GAME_DB postgres < db/sk_schema

                #[ "$(psql -U postgres $GAME_DB <<< "copy (select * from configuration) to stdout csv;" | wc -l)" == "0" ] \
                #&& echo "INSERT INTO configuration VALUES (1105251799, '0', 0);" | psql -U postgres $GAME_DB

	        cd db
	        perl dbalter :$GAME_DB
		[ -e ~/bin/createdb_post_GAME_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql ] \
		&& psql $GAME_DB postgres < ~/bin/createdb_post_GAME_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql

		#if [ "$GAME_TYPE" == "GD" ] ; then
		#	NODE_STREAM_WORLD_ID="$(get_server_id $SET_NUM $CROSS_CHANNEL world)"
		#	for((node=301;node<=999;node++));do
		#		echo "insert into node_stream values ($node, $NODE_STREAM_WORLD_ID);"
		#	done|psql $GAME_DB_NAME$SET_NUM|sort|uniq -c
		#fi

		if [ "$GAME_TYPE" == "UG1" ] ; then
			/bin/bash $HOME/bin/insert_serverstatus_ug1
		fi
    else
                echo "Warning: Game database($GAME_DB) already exist." | colorize cyan
	fi


# ACCOUNTDB
   elif [ "$ARG2" == "ACCOUNTDB" ] ; then
	cd servers*

	which psql > /dev/null 2>&1 || exec echo "Error: psql not installed."

        # ACCOUNT DB
	if ! check_db_exist $ACCOUNT_DB_NAME ; then
                # Account DB not exist
	        cat > db/createdb_accountdb.sql << __EOF__
CREATE USER spiritking WITH SUPERUSER PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking WITH PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking SUPERUSER;
CREATE DATABASE "$ACCOUNT_DB_NAME" ENCODING 'SQL_ASCII' template=template0;
__EOF__
	        psql -U postgres < db/createdb_accountdb.sql
		psql -U postgres $ACCOUNT_DB_NAME <<< "CREATE OR REPLACE LANGUAGE plpgsql;"
	        psql $ACCOUNT_DB_NAME postgres < db/ska_schema
	        cd db
	        perl db_account_alter :$ACCOUNT_DB_NAME
	        cd -
		[ -e ~/bin/createdb_post_ACCOUNT_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql ] \
		&& psql $ACCOUNT_DB_NAME postgres < ~/bin/createdb_post_ACCOUNT_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql
         else
                # Account DB existed
                echo "Warning: Account database($ACCOUNT_DB_NAME) already exist." | colorize cyan

         fi

         # MEMBER DB
	 if [ "$GAME_TYPE" != "UG1" ]; then
         	if ! check_db_exist $MEMBER_DB_NAME ; then
         	       # Member DB not exist
	 	       cat > db/createdb_memberdb.sql << __EOF__
CREATE USER spiritking WITH SUPERUSER PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking WITH PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking SUPERUSER;
CREATE DATABASE "$MEMBER_DB_NAME" ENCODING 'SQL_ASCII' template=template0;
__EOF__
	 	       psql -U postgres < db/createdb_memberdb.sql
	 	       psql -U postgres $MEMBER_DB_NAME  <<< "CREATE OR REPLACE LANGUAGE plpgsql;"
	 	       [ -e ~/bin/$GAME_TYPE-Member_schema.sql_$COUNTRY_CODE_LOWER ] \
	 	       && psql $MEMBER_DB_NAME postgres < ~/bin/$GAME_TYPE-Member_schema.sql_$COUNTRY_CODE_LOWER \
	 	       || psql $MEMBER_DB_NAME postgres < ~/bin/$GAME_TYPE-Member_schema.sql
	 	       [ -e ~/bin/createdb_post_MEMBER_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql ] \
	 	       && psql $MEMBER_DB_NAME postgres < ~/bin/createdb_post_MEMBER_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql
         	else
         	       # Member DB existed
         	       echo "Warning: Member database($MEMBER_DB_NAME) already exist." | colorize cyan
         	fi
	 fi

# SOCIETYDB
   elif [ "$ARG2" == "SOCIETYDB" ] ; then
        cd servers*

        which psql > /dev/null 2>&1 || exec echo "Error: psql not installed."

        if ! check_db_exist $SOCIETY_DB_NAME ; then
                cat > db/createdb_societydb.sql << __EOF__
CREATE USER spiritking WITH SUPERUSER PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking WITH PASSWORD '$DATABASE_PASSWORD';
ALTER USER spiritking SUPERUSER;
CREATE DATABASE "$SOCIETY_DB_NAME" ENCODING 'SQL_ASCII' template=template0;
__EOF__
                psql -U postgres < db/createdb_societydb.sql
                psql -U postgres $SOCIETY_DB_NAME <<< "CREATE OR REPLACE LANGUAGE plpgsql;"
                psql $SOCIETY_DB_NAME postgres < db/sks_schema

                cd db
                perl db_society_alter :$SOCIETY_DB_NAME
                [ -e ~/bin/createdb_post_SOCIETY_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql ] \
                && psql $SOCIETY_DB_NAME postgres < ~/bin/createdb_post_SOCIETY_DB-$GAME_TYPE_LOWER-$COUNTRY_CODE_LOWER.sql
        else
                # Society DB existed
                echo "Warning: Society database($SOCIETY_DB_NAME) already exist." | colorize cyan
        fi


# MissionServer
   elif [ "$ARG2" == "Mission" ] ; then
	cd servers$SET_NUM
	GAME_DB="$GAME_DB_NAME$SET_NUM"
	echo "Build up MissionServer for Set $SET_NUM" | colorize green
	[ -d "MissionServer$SET_NUM" ] && echo "Warning: MissionServer$SET_NUM already exist." | colorize cyan
	mkdir -p "MissionServer$SET_NUM"
	MISSION_PORT="$(get_port Mission)"
	echo $MISSION_PORT > MissionServer$SET_NUM/.port
	if [ "$GAME_TYPE" == "UG1" ]; then
		ACCOUNT_DB_IP=$(cat /etc/hosts | grep ACCOUNTDB | awk -F" " '{print $1}')
		cat > MissionServer$SET_NUM/.serverstatus.sql << __EOS__
INSERT INTO serverstatus (id, name, ext_address, ext_port, int_address, int_port) values ('-2', 'MissionServer$SET_NUM', 'none', '-1', '$ACCOUNT_DB_IP', $MISSION_PORT);
__EOS__
	else
		cat > MissionServer$SET_NUM/.serverstatus.sql << __EOS__
INSERT INTO serverstatus (id, name, ext_address, ext_port, int_address, int_port) values ('-2', 'MissionServer$SET_NUM', 'none', '-1', '$MISSION_IP', $MISSION_PORT);
__EOS__
	fi
	psql -h $GAME_DB_IP $GAME_DB < MissionServer$SET_NUM/.serverstatus.sql 2>&1 | sed 's/^/serverstatus: /g'
	if [ "$GAME_TYPE" == "UG1" ] ; then
		/bin/bash $HOME/bin/insert_serverstatus_ug1
	fi
	if [ "$GAME_TYPE" == "G2" ] ; then
		initialize_node_stream $SET_NUM
	fi
	ln -sf ../bin/MissionServer MissionServer$SET_NUM/MissionServer$SET_NUM
	echo MissionServer$SET_NUM > MissionServer$SET_NUM/auto_start
	echo "MissionServer for Set $SET_NUM built" | colorize green

# WorldServer/ZoneServer
   elif [ "$ARG2" == "WorldZone" ] ; then
	cd servers$SET_NUM
	echo "Build up WorldServer/ZoneServer for Set $SET_NUM Channel $CH_NUM" | colorize green
	[ -d "WorldServer$WZ_NUM" ] && echo "Warning: WorldServer$WZ_NUM already exist." | colorize cyan
	if [ "$GAME_TYPE" != "UG1" ] ; then
		mkdir -p "WorldServer$WZ_NUM" "ZoneServer$WZ_NUM"
	else
		mkdir -p "WorldServer$WZ_NUM"
	fi
	WID="$(get_server_id $SET_NUM $CH_NUM world)"
	ZID="$(get_server_id $SET_NUM $CH_NUM zone)"
	GMTOOL_PORT="$(get_port GMToolPort)"
	WORLD_PORT="$(get_port World)"
	ZONE_PORT="$(get_port Zone)"
	CGI_PORT="$(get_port CGIPort)"

	if [ "$NAT" == "1" ] ; then
		INT_WORLD_PORT="$(get_port World)"
		INT_ZONE_PORT="$(get_port Zone)"
	else
            if [ "$ONLY_ONE_NETWORK_INTERFACE" == "1" ] ; then
		INT_WORLD_PORT="$(get_port World)"
		INT_ZONE_PORT="$(get_port Zone)"
                echo $WORLD_PORT >> ~/.ports_allow
                echo $ZONE_PORT >> ~/.ports_allow
                echo $GMTOOL_PORT >> ~/.ports_internal_only
                echo $CGI_PORT >> ~/.ports_internal_only
            else
		INT_WORLD_PORT=$WORLD_PORT
		INT_ZONE_PORT=$ZONE_PORT
            fi
	fi

	#[ "$GAME_TYPE" == "DJ" ] && [ "$CH_NUM" == "0" ] && CH_NUM=$(($CH_NUM+1))

	echo $WORLD_PORT > WorldServer$WZ_NUM/.port
	if [ "$GAME_TYPE" != "UG1" ] ; then
		echo $ZONE_PORT > ZoneServer$WZ_NUM/.port
	fi

	# setup.ini
	if [ "$GAME_TYPE" == "UG1" ] ; then
		cat > WorldServer$WZ_NUM/setup.ini << __EOF__
[WorldServer]
WorldServerID=$WID
ExtWorldServerIP=$WZ_EXT_IPADDR
HttpAgentServerIP=$ACCOUNT_DB_IP
HttpAgentServerPort=20020
CGIPort=$CGI_PORT
CGIKey=$CGI_KEY
__EOF__
		sed -i "s/CGIPort=20060/CGIPort=$CGI_PORT/" setup.ini
		ssh GAMEDB$SET_NUM -o StrictHostKeyChecking=no "sed -i 's/CGIPort=20060/CGIPort=$CGI_PORT/' $HOME/servers$SET_NUM/setup.ini"
	else
		cat > WorldServer$WZ_NUM/setup.ini << __EOF__
[WorldServer]
WorldServerID=$WID
__EOF__
	fi
	if [ "$GAME_TYPE" != "UG1" ] ; then
		cat > ZoneServer$WZ_NUM/setup.ini << __EOF__
[ZoneServer]
ZoneServerID=$ZID
ZoneServerLogLevel=2
ZoneServerAssert=0
GMToolPort=$GMTOOL_PORT
CGIPort=$CGI_PORT
CGIKey=$CGI_KEY
__EOF__
	fi

egrep -q "[[:blank:]]$WZ_NUM[[:blank:]]|^$WZ_NUM[[:blank:]]|[[:blank:]]$WZ_NUM$" <<< "$PVP_CHANNEL_WZ_NUMBER" \
&& echo "PVPServer=1" >> ZoneServer$WZ_NUM/setup.ini

	# serverstatus
	if [ "$GAME_TYPE" == "UG1" ] ; then
		cat > WorldServer$WZ_NUM/.serverstatus.sql << __EOS__
INSERT INTO serverstatus (id, name, ext_address, ext_port, int_address, int_port) values ('$WID', 'WorldServer$WZ_NUM', '$WZ_EXT_IPADDR', $WORLD_PORT, '$WZ_INT_IPADDR', $INT_WORLD_PORT);
__EOS__
	else
		cat > WorldServer$WZ_NUM/.serverstatus.sql << __EOS__
INSERT INTO serverstatus (id, name, ext_address, ext_port, int_address, int_port) values ('$WID', 'WorldServer$WZ_NUM', '$WZ_EXT_IPADDR', $WORLD_PORT, '$WZ_INT_IPADDR', $INT_WORLD_PORT);
INSERT INTO serverstatus (id, name, ext_address, ext_port, int_address, int_port) values ('$ZID', 'ZoneServer$WZ_NUM', '$WZ_EXT_IPADDR', $ZONE_PORT, '$WZ_INT_IPADDR', $INT_ZONE_PORT);
__EOS__
	fi
	psql -h $GAME_DB_IP $GAME_DB spiritking < WorldServer$WZ_NUM/.serverstatus.sql 2>&1 | sed 's/^/serverstatus: /g'

	# worlds
	if [ "$HIDDEN_CHANNEL" == "$CH_NUM" ] ; then
		if [ "$GAME_TYPE" == "DJ" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT);
__EOS__
		elif [ "$GAME_TYPE" == "FN" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT);
__EOS__
		elif [ "$GAME_TYPE" == "GD" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, 0);
__EOS__
		elif [ "$GAME_TYPE" == "LH" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, 0);
__EOS__
		elif [ "$GAME_TYPE" == "FF" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, 0);
__EOS__
		elif [ "$GAME_TYPE" == "DS" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, 0);
__EOS__

		else
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT);
__EOS__
		fi
	else # if [ "$HIDDEN_CHANNEL" == "$CH_NUM" ] ; then
		if [ "$GAME_TYPE" == "DJ" ] ; then
                        if egrep -q "[[:blank:]]$WZ_NUM[[:blank:]]|^$WZ_NUM[[:blank:]]|[[:blank:]]$WZ_NUM$" <<< "$PVP_CHANNEL_WZ_NUMBER" ; then
                             cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$PVP_CHANNEL_NAME_PREFIX$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX$PVP_CHANNEL_NAME_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
                        else
			     cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
                        fi
		elif [ "$GAME_TYPE" == "FN" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
		elif [ "$GAME_TYPE" == "GD" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
		elif [ "$GAME_TYPE" == "LH" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
		elif [ "$GAME_TYPE" == "FF" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
		elif [ "$GAME_TYPE" == "DS" ] ; then
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
		else
			cat > WorldServer$WZ_NUM/.worlds.sql << __EOS__ | psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking
INSERT INTO worlds (id, name, ip, port, maxnum_user) values ('$WID', '$(get_world_name $SET_NUM|sed 's/\\/\\\\/g')-$CHANNEL_PREFIX$CH_NUM$CHANNEL_SUFFIX', '$WZ_EXT_IPADDR', $WORLD_PORT, $MAX_PLAYER_PER_CHANNEL);
__EOS__
		fi
	fi

	psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking < WorldServer$WZ_NUM/.worlds.sql 2>&1 | sed 's/^/worlds: /g'

	ln -sf ../bin/WorldServer WorldServer$WZ_NUM/WorldServer$WZ_NUM
	if [ "$XignCodeEnable" == "1" ] ; then
		ln -sf ../bin/XignCodeLib WorldServer$WZ_NUM/
	fi
	if [ "$GAME_TYPE" != "UG1" ] ; then
		ln -sf ../bin/ZoneServer ZoneServer$WZ_NUM/ZoneServer$WZ_NUM
	fi
	echo WorldServer$WZ_NUM > WorldServer$WZ_NUM/auto_start
	if [ "$GAME_TYPE" != "UG1" ] ; then
		echo ZoneServer$WZ_NUM > ZoneServer$WZ_NUM/auto_start
	fi
	if [ "$XIGNCODE_ENABLE" == "1" ] ; then
		cd WorldServer$WZ_NUM; ln -s ../bin/XignCodeLib
	fi
	echo "WorldServer/ZoneServer for Set $SET_NUM Channel $CH_NUM built" | colorize green

# LoginServer
   elif [ "$ARG2" == "Login" ] ; then
	SET_NUM="1"
	cd servers$SET_NUM
	for((LOGIN_SERVER_COUNT=1;LOGIN_SERVER_COUNT<=$ARG3;LOGIN_SERVER_COUNT++));do
		echo "Build up LoginServer$LOGIN_SERVER_COUNT" | colorize green
		[ -d "LoginServer$LOGIN_SERVER_COUNT" ] && echo "Warning: LoginServer$LOGIN_SERVER_COUNT already exist." | colorize cyan
		mkdir -p "LoginServer$LOGIN_SERVER_COUNT"
		LOGIN_PORT="$(get_port Login)"
		echo $LOGIN_PORT > LoginServer$LOGIN_SERVER_COUNT/.port
		ln -sf ../bin/LoginServer LoginServer$LOGIN_SERVER_COUNT/LoginServer$LOGIN_SERVER_COUNT
		if [ "$GAME_TYPE" == "UG1" ] ; then
			cat > LoginServer$LOGIN_SERVER_COUNT/setup.ini << __EOF__
[LoginServer]
LoginServerPort=$LOGIN_PORT
LoginHttpIP=$LoginHttpIP
LoginHttpPort=20021
__EOF__
		elif [ "$GAME_TYPE" == "G2" ] ; then
			cat > LoginServer$LOGIN_SERVER_COUNT/setup.ini << __EOF__
[LoginServer]
LoginServerPort=$LOGIN_PORT
MaxAID=20000000
MinAID=1000000
BlockByPopulation=0
__EOF__
		else
			cat > LoginServer$LOGIN_SERVER_COUNT/setup.ini << __EOF__
[LoginServer]
LoginServerPort=$LOGIN_PORT
__EOF__
		fi
		echo LoginServer$LOGIN_SERVER_COUNT > LoginServer$LOGIN_SERVER_COUNT/auto_start
		echo "LoginServer$LOGIN_SERVER_COUNT built" | colorize green
	done
	sed -i -e 's/^Login [0-9]*/Login 6543/g' $WORKING_DIRECTORY/.min_ports

# TicketServer
   elif [ "$ARG2" == "Ticket" ] ; then
	SET_NUM="1"
	cd servers$SET_NUM
	echo "Build up TicketServer" | colorize green
	[ -d "TicketServer" ] && echo "Warning: TicketServer already exist." | colorize cyan
	mkdir -p TicketServer
	ln -sf ../bin/TicketServer TicketServer/TicketServer
	echo $TICKETSERVER_PORT > TicketServer/.port
	cat > TicketServer/setup.ini << __EOF__
TicketServerIP=$TicketServerIP
TicketServerPort=$TICKETSERVER_PORT
__EOF__
	echo TicketServer > TicketServer/auto_start
	echo "TicketServer built" | colorize green

# GatewayServer
   elif [ "$ARG2" == "Gateway" ] ; then
	if [ "$GAME_TYPE" != "UG1" ] ; then
		SET_NUM="1"
		cd servers$SET_NUM
		echo "Build up GatewayServer" | colorize green
		[ -d "GatewayServer" ] && echo "Warning: GatewayServer already exist." | colorize cyan
		mkdir -p GatewayServer
		ln -sf ../bin/GatewayServer GatewayServer/GatewayServer
		echo $GATEWAYSERVER_PORT > GatewayServer/.port
		# DO NOT overwrite gateway config
		[ -e GatewayServer/setup.ini ] || cat > GatewayServer/setup.ini << __EOF__
[Common]
AccountDBIP=$ACCOUNT_DB_IP
AccountDBName=$MEMBER_DB_NAME
AccountDBUser=spiritking
AccountDBPW=$DATABASE_PASSWORD
BillingGatewayPort=$GATEWAYSERVER_PORT
HttpServerPort=$HTTPAGENT_PORT
__EOF__
		echo GatewayServer > GatewayServer/auto_start
		echo "GatewayServer built" | colorize green
	fi

# HTTPAgent/HTTPAServer
   elif [ "$ARG2" == "HTTPA" ] ; then
	SET_NUM="1"
	cd servers$SET_NUM
	echo "Build up HTTPAServer" | colorize green
	[ -d "HTTPAServer" ] && echo "Warning: HTTPAServer already exist." | colorize cyan
	mkdir -p HTTPAServer
	if [ "$GAME_TYPE" == "UG1" ] ; then
		ln -sf ../bin/HTTPAServer HTTPAServer/HTTPAServer
	else
		ln -sf ../bin/HTTPAgent HTTPAServer/HTTPAServer
	fi
	echo $HTTPAGENT_PORT > HTTPAServer/.port
	# DO NOT overwrite httpa config
	if [ "$GAME_TYPE" == "UG1" ] ; then
		[ -e HTTPAServer/setup.ini ] || cat > HTTPAServer/setup.ini << __EOF__
[Common]
XLURL=$XLURL
XLAppKey=$SDK_APP_KEY
XLSecretkey=abcdefg
EventHttpTime=0.5
HttpAgentServerPort=20020
LoginHttpAgentServerPort=20021
__EOF__
	else
		[ -e HTTPAServer/setup.ini ] || cat > HTTPAServer/setup.ini << __EOF__
[Common]
BillingGatewayIP=$ACCOUNT_DB_IP
HttpServerPort=$HTTPAGENT_PORT
MaxThreadNum=100
XLURL=$XLURL
XLAppKey=$SDK_APP_KEY
XLSecretkey=abcdefg
EventHttpTime=0.5
__EOF__
	fi
	echo HTTPAServer > HTTPAServer/auto_start
	echo "HTTPAServer built" | colorize green

# AccountDBServer
   elif [ "$ARG2" == "AcctDB" ] ; then
	SET_NUM="1"
	cd servers$SET_NUM
	echo "Build up AccountDBServer" | colorize green
	[ -d "AccountDBServer" ] && echo "Warning: AccountDBServer already exist." | colorize cyan
	mkdir -p AccountDBServer
	ln -sf ../bin/AccountDBServer AccountDBServer/AccountDBServer
	echo AccountDBServer > AccountDBServer/auto_start
	echo "AccountDBServer built" | colorize green

# SocietyServer
   elif [ "$ARG2" == "Society" ] ; then
        SET_NUM="1"
        cd servers$SET_NUM
        echo "Build up SocietyServer" | colorize green
        [ -d "SocietyServer" ] && echo "Warning: SocietyServer already exist." | colorize cyan
        mkdir -p SocietyServer
        ln -sf ../bin/SocietyServer SocietyServer/SocietyServer
        # DO NOT overwrite Society config
        [ -e SocietyServer/setup.ini ] || cat > SocietyServer/setup.ini << __EOF__
[SocietyServer]
SocietyDBIP=$SOCIETY_DB_IP
SocietyDBName=$SOCIETY_DB_NAME
SocietyDBUser=spiritking
SocietyDBPW=$DATABASE_PASSWORD
TicketServerIP=$TicketServerIP
TicketServerPort=7777
ExtSocietyServerIP=$SOCIETY_EXT_IPADDR
ExtSocietyServerPort=9487
IntSocietyServerIP=$SOCIETY_INT_IPADDR
IntSocietyServerPort=9488
SocietyServerLogLevel=4
SocietyServerAssert=0
OnlinePlayersMaxCount=10000
PhotoBuffersMaxCount=1000
PhotoBufferSize=2097152
EventHttpTime=0.05
PhotoAPIOnline=1
SkipPhotoAPIVerify=1
ReserveDeletedCharDays=30
NAT=1
SDKNormVersion=1001.2.8

[SDKServerLog]
SocietyServerID=0
SDKAppKey=g1
SDKLogPath=./

[PhotoUpload]
PUURL=localhost:3031/upload/image
__EOF__
        echo SocietyServer > SocietyServer/auto_start
        echo "SocietyServer built" | colorize green

# GameDBServer
   elif [ "$ARG2" == "GameDBServer" ] ; then
	yes|$0 BuildIfNotExist SetDir $SET_NUM

	cd servers$SET_NUM
	echo "Build up GameDBServer for Set $SET_NUM" | colorize green
	[ -d "GameDBServer$SET_NUM" ] && echo "Warning: GameDBServer$SET_NUM already exist." | colorize cyan
	mkdir -p GameDBServer$SET_NUM
	ln -sf ../bin/GameDBServer GameDBServer$SET_NUM/GameDBServer$SET_NUM
	GAMEDBSERVER_PORT="$(get_port GameDBS)"
	sed -i -E "s/(GameDBServerPort=)(.*)/\1$GAMEDBSERVER_PORT/" setup.ini
	echo $GAMEDBSERVER_PORT > GameDBServer$SET_NUM/.port
	[ -e GameDBServer$SET_NUM/setup.ini ] || cat > GameDBServer$SET_NUM/setup.ini << __EOF__
[Common]
SourceDBIP=$GAME_DB_IP
SourceDBName=$GAME_DB_NAME$SET_NUM
AccountDBIP=$ACCOUNT_DB_IP
AccountDBName=$ACCOUNT_DB_NAME
ThreadNumber=4
IgnorServerID=

[GameDBServer]
GameDBServerPort=$GAMEDBSERVER_PORT
__EOF__

	echo GameDBServer$SET_NUM > GameDBServer$SET_NUM/auto_start
	echo "GameDBServer for Set $SET_NUM built" | colorize green

	if [ "$ENABLE_SPLIT_ID" -eq 1 ]; then
		#SEGMENT_CNT=$(ssh GAMEDB$SET_NUM "psql ${GAME_DB_NAME}${SET_NUM} -c 'COPY (SELECT COUNT(*) FROM segment_status) TO STDOUT'")
		#if [ "$SEGMENT_CNT" -eq 0 ]; then
		#	ssh GAMEDB$SET_NUM "cd $HOME/servers$SET_NUM/GameDBServer$SET_NUM/; ./GameDBServer$SET_NUM -rs"
		#fi
		SEGMENT_CNT=$(psql ${GAME_DB_NAME}${SET_NUM} -c "COPY (SELECT COUNT(*) FROM segment_status) TO STDOUT")
		if [ "$SEGMENT_CNT" -eq 0 ]; then
			cd $HOME/servers$SET_NUM/GameDBServer$SET_NUM/; ./GameDBServer$SET_NUM -rs
		fi
	fi

# GameAgentServer
   elif [ "$ARG2" == "GameAgentServer" ] ; then
	yes|$0 BuildIfNotExist SetDir $SET_NUM

	cd servers$SET_NUM
	echo "Build up GameAgentServer for Set $SET_NUM" | colorize green
	[ -d "GameAgentServer$SET_NUM" ] && echo "Warning: GameAgentServer$SET_NUM already exist." | colorize cyan
	mkdir -p GameAgentServer$SET_NUM
	ln -sf ../bin/GameAgent GameAgentServer$SET_NUM/GameAgentServer$SET_NUM
	[ -e GameAgentServer$SET_NUM/setup.ini ] || cat > GameAgentServer$SET_NUM/setup.ini << __EOF__
[ChannelMessageCheck]
CMCURL=localhost:3031/spam

[Common]
EventHttpTime=0.05
__EOF__

	echo GameAgentServer$SET_NUM > GameAgentServer$SET_NUM/auto_start
	echo "GameAgentServer for Set $NET_NUM built" | colorize green

# SatelliteServer
   elif [ "$ARG2" == "SatelliteServer" ] ; then
	cd servers$SAT_SET_NUM
	echo "Build up SatelliteServer for Set $SAT_SET_NUM ID $SAT_ID_NUM" | colorize green
	[ -d "SatelliteServer$SAT_SET_NUM$SAT_ID_NUM" ] && echo "Warning: SatelliteServer$SAT_SET_NUM$SAT_ID_NUM already exist." | colorize cyan
	mkdir -p SatelliteServer$SAT_SET_NUM$SAT_ID_NUM
	ln -sf ../bin/SatelliteServer SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/SatelliteServer$SAT_SET_NUM$SAT_ID_NUM

	SATELLITE_INT_PORT=$(get_satellite_port INT)
	SATELLITE_EXT_W_PORT=$(get_satellite_port EXT)
	SATELLITE_EXT_Z_PORT=$(get_satellite_port EXT)

	echo $SATELLITE_INT_PORT > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/.port_int
	echo $SATELLITE_EXT_W_PORT > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/.port_ext_w
	echo $SATELLITE_EXT_Z_PORT > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/.port_ext_z

	# setup.ini
   	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "GOOGLE-SUBMIT" -o "$HOST_NAME" == "APPLE-SUBMIT" -o "$HOST_NAME" == "DATA" -o "$HOST_NAME" == "SUBMIT" -o "$HOST_NAME" == "SUB" -o "$HOST_NAME" == "DLC" -o "$HOST_NAME" == "TIME1" -o "$HOST_NAME" == "MEDIA" ] ; then
		[ -e SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/setup.ini ] || cat > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/setup.ini << __EOF__
[SatelliteServer]
SatelliteID=$SAT_SET_NUM$SAT_ID_NUM
SatelliteServerAssert=1
SatelliteDebugLog=1
SatelliteProtocolLog=1
HeartBeatPerSec=5000
SatelliteSocketBoost=0
__EOF__
	else
		[ -e SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/setup.ini ] || cat > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/setup.ini << __EOF__
[SatelliteServer]
SatelliteID=$SAT_SET_NUM$SAT_ID_NUM
SatelliteServerAssert=0
SatelliteDebugLog=0
SatelliteProtocolLog=0
HeartBeatPerSec=7500
SatelliteSocketBoost=1
__EOF__
	fi

	# satellite_servers
	cat > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/.satellite_servers.sql << __EOS__
INSERT INTO satellite_servers (id, set_id, ip, ext_ip, int_port, world_ext_port, zone_ext_port) values ($SAT_SET_NUM$SAT_ID_NUM, $SAT_SET_NUM, '$SATELLITE_INT_IP', '$SATELLITE_EXT_IP', $SATELLITE_INT_PORT, $SATELLITE_EXT_W_PORT, $SATELLITE_EXT_Z_PORT);
__EOS__

	psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking < SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/.satellite_servers.sql 2>&1 | sed 's/^/satellite_servers: /g'

	echo SatelliteServer$SAT_SET_NUM$SAT_ID_NUM > SatelliteServer$SAT_SET_NUM$SAT_ID_NUM/auto_start
	echo "SatelliteServer for Set $SAT_SET_NUM ID $SAT_ID_NUM built" | colorize green

# CrossRouterServer
   elif [ "$ARG2" == "CrossRouterServer" ] ; then
	yes|$0 BuildIfNotExist SetDir $SET_NUM

	cd servers$SET_NUM
	echo "Build up CrossRouterServer ($SET_NUM)" | colorize green
	[ -d "CrossRouterServer$SET_NUM" ] && echo "Warning: CrossRouterServer$SET_NUM already exist." | colorize cyan
	mkdir -p CrossRouterServer$SET_NUM
	ln -sf ../bin/CrossRouter CrossRouterServer$SET_NUM/CrossRouterServer$SET_NUM
	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "SUB" -o "$HOST_NAME" == "SUBMIT" -o "$HOST_NAME" == "DATA" -o "$HOST_NAME" == "DLC" -o "$HOST_NAME" == "TIME1" -o "$HOST_NAME" == "MEDIA" ] ; then
		CROSS_ROUTER_SID=$CROSS_ROUTER_SID_TEST
	else
		CROSS_ROUTER_SID=$CROSS_ROUTER_SID_LIVE
	fi
	[ -e CrossRouterServer$SET_NUM/setup.ini ] || cat > CrossRouterServer$SET_NUM/setup.ini << __EOF__
[CrossRouter]
CrossRouterIP=$CROSS_ROUTER_IP
CrossRouterPort=7823
CrossWorldServerID=${CROSS_ROUTER_SID}990
CrossRouterAssert=0
__EOF__

	# crossrouter::worlds
	cat > CrossRouterServer$SET_NUM/.crossrouter_worlds.sql << __EOCRW__
UPDATE worlds SET maxnum_user = 0, id = ${SET_NUM}990, name = 'CROSS-01' WHERE id = ${SET_NUM}0${CROSS_CHANNEL}0;
__EOCRW__

	psql -h $ACCOUNT_DB_IP $ACCOUNT_DB_NAME spiritking < CrossRouterServer$SET_NUM/.crossrouter_worlds.sql 2>&1 | sed 's/^/worlds: /g'

	# crossrouter::serverstatus
	GAME_DB_NAME="$GAME_DB_NAME$SET_NUM"
	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "SUB" -o "$HOST_NAME" == "SUBMIT" -o "$HOST_NAME" == "DATA" -o "$HOST_NAME" == "DLC" -o "$HOST_NAME" == "TIME1" -o "$HOST_NAME" == "MEDIA" ] ; then
		GAME_DB_IP="127.0.0.1"
	else
		GAME_DB_IP=$(print_serverip_from_whole_hosts GAMEDB$SET_NUM)
	fi
	cat > CrossRouterServer$SET_NUM/.crossrouter_serverstatus.sql << __EOCRW__
UPDATE serverstatus SET id = ${SET_NUM}990 WHERE id = ${SET_NUM}0${CROSS_CHANNEL}0;
UPDATE serverstatus SET id = ${SET_NUM}991 WHERE id = ${SET_NUM}0${CROSS_CHANNEL}1;
__EOCRW__
	cat > CrossRouterServer$SET_NUM/.crossrouter_node_stream.sql << __EOCRW__
UPDATE node_stream SET world_id = '${SET_NUM}990' WHERE world_id = '${SET_NUM}010';
__EOCRW__
	sed -i "s/WorldServerID=${SET_NUM}0${CROSS_CHANNEL}0/WorldServerID=${SET_NUM}990/" WorldServer${SET_NUM}0${CROSS_CHANNEL}/setup.ini
	sed -i "s/ZoneServerID=${SET_NUM}0${CROSS_CHANNEL}1/ZoneServerID=${SET_NUM}991/" ZoneServer${SET_NUM}0${CROSS_CHANNEL}/setup.ini

	psql -h $GAME_DB_IP $GAME_DB_NAME spiritking < CrossRouterServer$SET_NUM/.crossrouter_serverstatus.sql 2>&1 | sed 's/^/serverstatus: /g'
	psql -h $GAME_DB_IP $GAME_DB_NAME spiritking < CrossRouterServer$SET_NUM/.crossrouter_node_stream.sql 2>&1 | sed 's/^/node_stream: /g'


	echo CrossRouterServer$SET_NUM > CrossRouterServer$SET_NUM/auto_start
	echo "CrossRouterServer ($SET_NUM) built" | colorize green

# CentralServer
   elif [ "$ARG2" == "CentralServer" ] ; then
	yes|$0 BuildIfNotExist SetDir $SET_NUM

	cd servers$SET_NUM
	echo "Build up CentralServer ($SET_NUM)" | colorize green
	[ -d "CentralServer$SET_NUM" ] && echo "Warning: CentralServer$SET_NUM already exist." | colorize cyan
	mkdir -p CentralServer$SET_NUM
	ln -sf ../bin/CentralServer CentralServer$SET_NUM/CentralServer$SET_NUM
	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "SUB" -o "$HOST_NAME" == "SUBMIT" -o "$HOST_NAME" == "DATA" -o "$HOST_NAME" == "DLC" -o "$HOST_NAME" == "TIME1" -o "$HOST_NAME" == "MEDIA" ] ; then
		CENTRAL_SID=$CENTRAL_SID_TEST
	else
		CENTRAL_SID=$CENTRAL_SID_LIVE
	fi
	[ -e CentralServer$SET_NUM/setup.ini ] || cat > CentralServer$SET_NUM/setup.ini << __EOF__
[CentralServer]
CentralDBIP=$ACCOUNT_DB_IP
CentralDBName=$ACCOUNT_DB_NAME
CentralDBUser=$PGUSER
CentralDBPW=$DATABASE_PASSWORD
CentralServerPort=2984
__EOF__

	# crossrouter::match_node_stream
	GAME_DB_NAME="$GAME_DB_NAME$SET_NUM"
	if [ "$HOST_NAME" == "TEST" -o "$HOST_NAME" == "SUB" -o "$HOST_NAME" == "SUBMIT" -o "$HOST_NAME" == "DATA" -o "$HOST_NAME" == "DLC" -o "$HOST_NAME" == "TIME1" -o "$HOST_NAME" == "MEDIA" ] ; then
		GAME_DB_IP="127.0.0.1"
	else
		GAME_DB_IP=$(print_serverip_from_whole_hosts GAMEDB$SET_NUM)
	fi
	cat > CentralServer$SET_NUM/.centralserver_match_node_stream.sql << __EOCRW__
INSERT INTO match_node_stream (node_id, world_id, cross_world_id) VALUES (-1, ${SET_NUM}990, ${SET_NUM}990);
__EOCRW__
	psql -h $GAME_DB_IP $GAME_DB_NAME spiritking < CentralServer$SET_NUM/.centralserver_match_node_stream.sql 2>&1 | sed 's/^/match_node_stream: /g'

	echo CentralServer$SET_NUM > CentralServer$SET_NUM/auto_start
	echo "CentralServer ($SET_NUM) built" | colorize green

# Other Server
   elif grep -q "Server" <<< "$ARG2"; then
	SET_NUM="1"
	cd servers$SET_NUM
	echo "Build up $ARG2" | colorize green
	[ -d "$ARG2" ] && echo "Warning: $ARG2 already exist." | colorize cyan
	mkdir -p $ARG2
	#if grep -q HTTPA <<< "$ARG2" ; then
	#    ln -s ../bin/HTTPAServer $ARG2/$ARG2
	#else
	#    ln -sf ../bin/$ARG2 $ARG2/$ARG2
	#fi
	ln -sf ../bin/$ARG2 $ARG2/$ARG2
	touch $ARG2/setup.ini
	echo $ARG2 > $ARG2/auto_start
	echo "$ARG2 built" | colorize green

   else
	exec echo "Error: No server type specified" | colorize red
   fi
}

start () { # Start servers
   # --- V1: allzoneserver / allworldserver / all ---
   # NOTE: allzoneserver and allworldserver both contain the word "all",
   # so these must be checked BEFORE the generic grep-i-all branch.
   if grep -qi "^allzoneserver$" <<< "$ARG2" ; then

	echo "=== allzoneserver: starting ZoneServers with auto_start ===" | colorize cyan black
	ZONE_LIST=$(ls servers*/*ZoneServer*/auto_start 2>/dev/null | awk -F/ '{print $2}' | grep "^ZoneServer[0-9]" | sort -u)

	if [ -z "$ZONE_LIST" ] ; then
		echo "No ZoneServer with auto_start found." | colorize cyan
	else
		echo "ZoneServers to start: $ZONE_LIST" | colorize green
		for server in $ZONE_LIST ; do
			echo "--- Starting $server ---" | colorize yellow
			cd $WORKING_DIRECTORY/servers$(get_set $server)
			start_server $server
			if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then open_perf_single ${server}; fi
		done
	fi

   elif grep -qi "^allworldserver$" <<< "$ARG2" ; then

	echo "=== allworldserver: starting WorldServers with auto_start ===" | colorize cyan black
	WORLD_LIST=$(ls servers*/*WorldServer*/auto_start 2>/dev/null | awk -F/ '{print $2}' | grep "^WorldServer[0-9]" | sort -u)

	if [ -z "$WORLD_LIST" ] ; then
		echo "No WorldServer with auto_start found." | colorize cyan
	else
		echo "WorldServers to start: $WORLD_LIST" | colorize green
		for server in $WORLD_LIST ; do
			echo "--- Starting $server ---" | colorize yellow
			cd $WORKING_DIRECTORY/servers$(get_set $server)
			start_server $server
		done
	fi

   elif grep -i all <<< "$ARG2" > /dev/null ; then
	for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep "Ticket|Gateway") ;do
		cd $WORKING_DIRECTORY/servers$(get_set $server)
		start_server $server
		sleep 1
	done
	cd $WORKING_DIRECTORY
	sleep 5
	for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep -v "Ticket|Gateway|CrossRouter|CentralServer") ;do
		cd $WORKING_DIRECTORY/servers$(get_set $server)
		start_server $server
		if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then open_perf_single ${server}; fi; fi
		if [[ ${server} =~ ^Mission.*$ ]]; then set_ms_fix_cpuid; fi
	done
	CROSSROUTER_EXIST=$(check_server_exist_from_hosts CRS)
	if [ "$CROSSROUTER_EXIST" -eq 1 ]; then
		sleep 30
		cd $WORKING_DIRECTORY
		for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep "CrossRouter") ;do
			cd $WORKING_DIRECTORY/servers$(get_set $server)
			start_server $server
		done
	fi
	CENTRALSERVER_EXIST=$(check_server_exist_from_hosts CES)
	if [ "$CENTRALSERVER_EXIST" -eq 1 ]; then
		sleep 30
		cd $WORKING_DIRECTORY
		for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep "CentralServer") ;do
			cd $WORKING_DIRECTORY/servers$(get_set $server)
			start_server $server
		done
	fi
   else
	for server in $ARG2 $ARG3 $ARG4 $ARG5 $ARG6 $ARG7 $ARG8 $ARG9 $ARG10 $ARG11 $ARG12 $ARG13 $ARG14 $ARG15 $ARG16 $ARG17 $ARG18 $ARG19;do
		start_server $server
		if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then open_perf_single ${server}; fi; fi
		if [[ ${server} =~ ^Mission.*$ ]]; then set_ms_fix_cpuid; fi
	done
   fi
}

start_if_auto_start_exist () {
   if grep -i all <<< "$ARG2" > /dev/null ; then
	for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep "Ticket|Gateway") ;do
		cd $WORKING_DIRECTORY/servers$(get_set $server)
		start_server $server
		sleep 1
	done
	cd $WORKING_DIRECTORY
	sleep 5
	for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep -v "Ticket|Gateway|CrossRouter|CentralServer") ;do
		cd $WORKING_DIRECTORY/servers$(get_set $server)
		start_server $server
		if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then open_perf_single ${server}; fi; fi
		if [[ ${server} =~ ^Mission.*$ ]]; then set_ms_fix_cpuid; fi
	done
	CROSSROUTER_EXIST=$(check_server_exist_from_hosts CRS)
	if [ "$CROSSROUTER_EXIST" -eq 1 ]; then
		sleep 30
		cd $WORKING_DIRECTORY
		for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep "CrossRouter") ;do
			cd $WORKING_DIRECTORY/servers$(get_set $server)
			start_server $server
		done
	fi
	CENTRALSERVER_EXIST=$(check_server_exist_from_hosts CES)
	if [ "$CENTRALSERVER_EXIST" -eq 1 ]; then
		sleep 30
		cd $WORKING_DIRECTORY
		for server in $(ls servers*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep "CentralServer") ;do
			cd $WORKING_DIRECTORY/servers$(get_set $server)
			start_server $server
		done
	fi
   else
	for server in $ARG2 $ARG3 $ARG4 $ARG5 $ARG6 $ARG7 $ARG8 $ARG9 $ARG10 $ARG11 $ARG12 $ARG13 $ARG14 $ARG15 $ARG16 $ARG17 $ARG18 $ARG19;do
		cd $WORKING_DIRECTORY/servers$(get_set $server)/
		[ -e $server/auto_start ] \
		&& start_server $server; if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then open_perf_single ${server}; fi; fi; if [[ ${server} =~ ^Mission.*$ ]]; then set_ms_fix_cpuid; fi \
		|| echo "Notice: $server/auto_start does not exist, $server will not start." | colorize cyan black
	done
   fi
}

stop () { # Stop servers
   # --- V1: allzoneserver / allworldserver / all ---
   # NOTE: allzoneserver and allworldserver both contain the word "all",
   # so these must be checked BEFORE the generic grep-i-all branch.
   if grep -qi "^allzoneserver$" <<< "$ARG2" ; then

	echo "=== allzoneserver: detecting running ZoneServers via ps ===" | colorize cyan black
	ZONE_LIST=$(ps -ef | grep "ZoneServer[0-9]" | grep -v grep \
		| awk '{for(i=8;i<=NF;i++) if($i~/ZoneServer[0-9]/) {gsub(".*/","",$i); print $i; break}}' \
		| grep "^ZoneServer[0-9]" | sort -u)

	if [ -z "$ZONE_LIST" ] ; then
		echo "No running ZoneServer found." | colorize cyan
	else
		echo "Detected ZoneServers: $ZONE_LIST" | colorize green
		for server in $ZONE_LIST ; do
			echo "--- Stopping $server ---" | colorize yellow
			stop_server $server
			if [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
			sleep 1
		done
	fi

   elif grep -qi "^allworldserver$" <<< "$ARG2" ; then

	echo "=== allworldserver: detecting running WorldServers via ps ===" | colorize cyan black
	WORLD_LIST=$(ps -ef | grep "WorldServer[0-9]" | grep -v grep \
		| awk '{for(i=8;i<=NF;i++) if($i~/WorldServer[0-9]/) {gsub(".*/","",$i); print $i; break}}' \
		| grep "^WorldServer[0-9]" | sort -u)

	if [ -z "$WORLD_LIST" ] ; then
		echo "No running WorldServer found." | colorize cyan
	else
		echo "Detected WorldServers: $WORLD_LIST" | colorize green
		for server in $WORLD_LIST ; do
			echo "--- Stopping $server ---" | colorize yellow
			stop_server $server
			sleep 1
		done
	fi

   elif grep -i all <<< "$ARG2" > /dev/null ; then

	rm -f $WORKING_DIRECTORY/server*/*Server*/pid

	for server in $(all_running_servers|grep CentralServer);do
		stop_server $server &
		wait
	done

	for server in $(all_running_servers|grep CrossRouterServer);do
		#stop_server $server &
		kill_server_process $server &
		wait
	done

	for server in $(all_running_servers|grep ZoneServer);do
		stop_server $server &
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
		wait
	done

	for server in $(all_running_servers|grep WorldServer);do
		stop_server $server &
		wait
	done

        for server in $(all_running_servers|grep SocietyServer);do
                stop_server $server &
                wait
        done

	for server in $(all_running_servers|grep SatelliteServer);do
		stop_server $server &
		wait
	done

	for server in $(all_running_servers|grep MissionServer);do
		stop_server $server &
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
		wait
	done

	for server in $(all_running_servers|grep GameDBServer);do
		stop_server $server &
		wait
	done

	for server in $(all_running_servers|grep LoginServer);do
		stop_server $server &
		wait
	done

	for server in $(all_running_servers|grep GameAgentServer);do
		stop_server $server &
		wait
	done

	for server in $(all_running_servers|grep AccountDBServer);do
		stop_server $server &
		wait
	done

	for server in $(all_running_servers|grep GatewayServer);do
		stop_server $server
	done

	for server in $(all_running_servers|grep TicketServer);do
		stop_server $server
	done

	for server in $(all_running_servers);do
		stop_server $server
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
	done

   elif grep -i wz <<< "$ARG2" > /dev/null ; then

	rm -f $WORKING_DIRECTORY/server*/{World,Zone}Server*/pid

	for server in $(all_running_servers|grep ZoneServer);do
		stop_server $server &
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
		wait
	done

	for server in $(all_running_servers|grep WorldServer);do
		stop_server $server &
		wait
	done

   elif grep -i sat <<< "$ARG2" > /dev/null ; then

	rm -f $WORKING_DIRECTORY/server*/SatelliteServer*/pid

	for server in $(all_running_servers|grep SatelliteServer);do
		stop_server $server &
		wait
	done

   elif grep -i gag <<< "$ARG2" > /dev/null ; then

	rm -f $WORKING_DIRECTORY/server*/GameAgentServer*/pid

	for server in $(all_running_servers|grep GameAgentServer);do
		stop_server $server &
		wait
	done

   elif grep -i soc <<< "$ARG2" > /dev/null ; then

        rm -f $WORKING_DIRECTORY/server*/SocietyServer*/pid

        for server in $(all_running_servers|grep SocietyServer);do
                stop_server $server &
                wait
        done

   else

	for server in $ARG2 $ARG3 $ARG4 $ARG5 $ARG6 $ARG7 $ARG8 $ARG9 $ARG10 $ARG11 $ARG12 $ARG13 $ARG14 $ARG15 $ARG16 $ARG17 $ARG18 $ARG19;do
		stop_server $server
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
	done

   fi
}

CheckAlive () { # Check the server is alive or not
   if grep -i all <<< "$ARG2" > /dev/null ; then
	[ -f "$WORKING_DIRECTORY/servers1/GatewayServer/pid" ] \
	&& check_and_restart GatewayServer
	[ -f "$WORKING_DIRECTORY/servers1/TicketServer/pid" ] \
	&& check_and_restart TicketServer
	for server in $(servers_should_running|egrep -v "Gateway|Ticket") ; do
		check_and_restart $server
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
		if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then open_perf_single ${server}; fi; fi
		if [[ ${server} =~ ^Mission.*$ ]]; then set_ms_fix_cpuid; fi
		sleep 2
	done
   else
	for server in $ARG2 $ARG3 $ARG4 $ARG5 $ARG6 $ARG7 $ARG8 $ARG9 $ARG10 $ARG11 $ARG12 $ARG13 $ARG14 $ARG15 $ARG16 $ARG17 $ARG18 $ARG19;do
		check_and_restart $server
		if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then close_perf_single ${server}; fi
		if [ "${ENABLE_PERF_MONITOR}" -eq "1" ]; then if [[ ${server} =~ ^Mission.*$ ]] || [[ ${server} =~ ^Zone.*$ ]]; then open_perf_single ${server}; fi; fi
		if [[ ${server} =~ ^Mission.*$ ]]; then set_ms_fix_cpuid; fi
	done
   fi
}

CoreBackup () { # Automatically backup the coredump file
   if grep -i all <<< "$ARG2" > /dev/null ; then
	for server in $(servers_should_running|egrep -v "Gateway|Ticket") ; do
		core_backup $server
	done
   else
	for server in $ARG2 $ARG3 $ARG4 $ARG5 $ARG6 $ARG7 $ARG8 $ARG9 $ARG10 $ARG11 $ARG12 $ARG13 $ARG14 $ARG15 $ARG16 $ARG17 $ARG18 $ARG19;do
		core_backup $server
	done
   fi
}

LogRotate () { # Log Rotate
   if grep -i all <<< "$ARG2" > /dev/null ; then
	for server in $(ls server*/*Server*/auto_start 2> /dev/null|awk -F/ '{print $2}'|egrep -v "Ticket") ;do
		log_rotate $server
	done
	check_log_files_date
   else
	for server in $ARG2 $ARG3 $ARG4 $ARG5 $ARG6 $ARG7 $ARG8 $ARG9 $ARG10 $ARG11 $ARG12 $ARG13 $ARG14 $ARG15 $ARG16 $ARG17 $ARG18 $ARG19;do
		log_rotate $server
	done
	check_log_files_date
   fi
}

BuildIfNotExist () { # Build up the server if not exist
   [ "$ARG2" == "" ] && exec show_help
   check_server_exist $ARG2 $ARG3 $ARG4 \
   && echo "WARNING: Server($ARG2 $ARG3 $ARG4) already exist, will not build again." | colorize cyan \
   || yes | $0 Build $ARG2 $ARG3 $ARG4
}

demofunc () { ## demo function, doing nothing
   echo "demo, doing nothing"
}


# Read customized function if exist
#[ -f "$CUSTFUNC" ] && source $CUSTFUNC

###################################
# Start run the Command from here #
###################################
if [ "$ACTION" == "show_help" ] ; then
        show_help
else
        if grep -q "$ACTION" <<< "$DONT_ASK_YES_NO" ; then
                $ACTION
        else
                yesno2 $ACTION
        fi
fi


# Log the time on the end
DATE_NOW="$(date +%Y/%m/%dT%H:%M:%S)"
echo -e "$DATE_NOW\t=End=\t$DO\tAns:$ANSWER\tLogin:$LOGIN_USER\tUser:$USER\tTTY:$TTY\tIP:$SOURCEIP\tARGS: $*" >> "$SKSERVER_LOGFILE"
