| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #!/bin/bash
- set -euo pipefail # 严格模式:错误退出、未定义变量检测、管道错误检测
- # 配置常量
- MYSQL_ROOT="root"
- MYSQL_PWD="123456"
- SQL_FILE="/data/shell/ro.sql"
- SVN_BASE="/root/svn/open_server/yamlrel" # SVN路径,测试服用的是 /root/baseconfig (改了redis配置),另外,测试服204行要改为101r
- CONFIG_SOURCE="/data/server" # 源配置目录
- BUILD_DATA="/root/build_data" # 服务器列表路径
- JENKINS_PATH="/data/shell/jenkins"
- # 参数解析
- usage() {
- echo "Usage: $0 -x <server_id> -p <port> -r <redis_id>"
- exit 1
- }
- while getopts ":s:p:r:" opt; do
- case ${opt} in
- s )
- SERVER_ID=$OPTARG
- ;;
- p )
- PORT=$OPTARG
- ;;
- r )
- REDIS_ID=$OPTARG
- ;;
- \? )
- usage
- ;;
- : )
- echo "Invalid option: -$OPTARG requires an argument" >&2
- usage
- ;;
- esac
- done
- # 检查必要参数
- [ -z "$SERVER_ID" ] && { echo "Error: Missing server_id"; usage; }
- [ -z "$PORT" ] && { echo "Error: Missing port"; usage; }
- [ -z "$REDIS_ID" ] && { echo "Error: Missing redis_id"; usage; }
- # 颜色输出
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- NC='\033[0m' # No Color
- # 1. MySQL数据库操作
- echo -e "${GREEN}Step 1: MySQL Database Setup...${NC}"
- DB_NAME="ro${SERVER_ID}"
- mysql -u${MYSQL_ROOT} -p${MYSQL_PWD} -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME};"
- if [ $? -ne 0 ]; then
- echo -e "${RED}Error: Failed to create database${NC}"
- exit 1
- fi
- mysql -u${MYSQL_ROOT} -p${MYSQL_PWD} ${DB_NAME} < ${SQL_FILE}
- if [ $? -ne 0 ]; then
- echo -e "${RED}Error: Failed to import SQL file${NC}"
- exit 1
- fi
- # 2. 创建服务器目录
- SERVER_DIR="/data/server${SERVER_ID}"
- echo -e "${GREEN}Step 2: Creating server directory...${NC}"
- mkdir -p ${SERVER_DIR} || { echo "Error: Failed to create directory"; exit 1; }
- # 3. 导入YAML配置
- echo -e "${GREEN}Step 3: Importing YAML configuration...${NC}"
- SVN_SOURCE="${SVN_BASE}"
- cp -r ${SVN_SOURCE}/. ${SERVER_DIR}
- if [ $? -ne 0 ]; then
- echo -e "${RED}Error: Failed to copy SVN files${NC}"
- exit 1
- fi
- chmod +x ${SERVER_DIR}/start.sh ${SERVER_DIR}/stop.sh
- # 执行版本号修改脚本
- cd ${SERVER_DIR}
- chmod +x changeNum.sh
- sh changeNum.sh ${PORT} ${REDIS_ID} || { echo "Error: changeNum failed"; exit 1; }
- cd -
- # 4. 复制基础配置
- echo -e "${GREEN}Step 4: Copying base configurations...${NC}"
- cp -r ${CONFIG_SOURCE}/config ${SERVER_DIR}/
- cp -r ${CONFIG_SOURCE}/cleanpid.sh ${SERVER_DIR}/
- for file in /data/baseserver/*; do
- ln -sf "$file" ${SERVER_DIR}/
- done
- # 5. 修改游戏配置文件
- echo -e "${GREEN}Step 5: Change base configurations...${NC}"
- GAME_CONFIG="${SERVER_DIR}/game_config.yaml"
- PUBLIC_IP=$(curl -s ifconfig.me)
- [ -z "$PUBLIC_IP" ] && { echo "Error: Failed to get public IP"; exit 1; }
- HTTP_PORT=$(awk -F': ' '/httpaddr:/ {print $2}' ${SERVER_DIR}/gmweb_config.yaml | grep -oE '[0-9]+$')
- [ -z "$HTTP_PORT" ] && { echo "Error: Invalid httpaddr format"; exit 1; }
- #TARGET_VALUE="http://${PUBLIC_IP}:${HTTP_PORT}/pay/gnQucik"
- #sed -i "s/^loglevel:.*/loglevel: debug/" ${GAME_CONFIG}
- #sed -i "s/^authmode:.*/authmode: 2/" ${GAME_CONFIG}
- #sed -i "/^paycallback:/c \ paycallback: $TARGET_VALUE" "$GAME_CONFIG"
- sed -i "s/152.32.220.85:8003/${PUBLIC_IP}:${HTTP_PORT}/g" "$GAME_CONFIG"
- sed -i "s/hwQucik/gnQucik/g" "$GAME_CONFIG"
- # 5. 启动服务器
- echo -e "${GREEN}Step 5: Starting server...${NC}"
- cd ${SERVER_DIR}
- ./start.sh
- sleep 3
- # 检查PID文件
- PID_COUNT=$(ls ${SERVER_DIR}/*.pid* 2>/dev/null | wc -l)
- if [ "$PID_COUNT" -ne 13 ]; then
- echo -e "${RED}Error: Failed to start all services (found ${PID_COUNT}/13 PIDs)${NC}"
- exit 1
- fi
- # 6. 更新服务器列表
- echo -e "${GREEN}Step 6: Updating server list...${NC}"
- SERVERLIST_FILE="${BUILD_DATA}/serverlist.yaml"
- INSERT_CONTENT="{serverid: $((SERVER_ID + 1)), servername: 冒险${SERVER_ID}服, ip: $PUBLIC_IP, port: [$((PORT + 21000))], type: 0, stime: \"2024-12-25 12:00:00\", state: 0, invisible: 0},"
- #sed -i "/serverlist:/a \ \ - name: server${SERVER_ID}\n id: ${SERVER_ID}\n ip: 0.0.0.0\n port: ${PORT}" ${SERVERLIST_FILE}
- # 启用安全模式
- set -uo pipefail
- # 第二行插入操作(保留原内容)
- awk -v new="$INSERT_CONTENT" '
- BEGIN {
- inserted=0
- line_count=0
- }
- {
- line_count++
- # 处理第二行
- if (line_count == 2) {
- # 保留原行内容
- print $0
- # 插入新内容(不调整缩进)
- print new
- inserted=1
- next
- }
- print $0
- }
- ' "$SERVERLIST_FILE" > "${SERVERLIST_FILE}.tmp" && mv "${SERVERLIST_FILE}.tmp" "$SERVERLIST_FILE"
- # 7. GM/Jenkins配置
- # 这里脚本不太好处理,暂时手动
- echo -e "${GREEN}Step 7: Configuring GM and Jenkins...${NC}"
- PHP_CONFIG_PATH="/www/wwwroot/game/ht/gm/user/config.php"
- name_zone=$((REDIS_ID + 1000))
- content_config=$(printf "'%s' => array(
- 'name' => '%s区',
- 'db_ip' => '127.0.0.1',
- 'db_port' => 3306,
- 'db_name' => 'ro%s',
- 'db_user' => 'root',
- 'db_pswd' => '123456',
- 'hidde' => false // false是开 true是关
- ),\n" "$name_zone" "$REDIS_ID" "$REDIS_ID")
- # 获取文件总行数
- total_lines=$(wc -l < "$PHP_CONFIG_PATH")
- # 检查文件是否有足够行数
- if [ "$total_lines" -lt 3 ]; then
- echo "错误:文件行数不足,无法插入到倒数第四行。"
- exit 1
- fi
- # 计算目标行号(倒数第四行)
- target_line=$((total_lines - 2))
- # 使用ed编辑器插入内容
- ed -s "$PHP_CONFIG_PATH" <<EOF
- ${target_line}i
- $content_config
- .
- w
- q
- EOF
- echo -e "${GREEN} 文件 $PHP_CONFIG_PATH 已修改成功!${NC}"
- PHP_GMQUERY_PATH="/www/wwwroot/game/ht/gm/user/gmquery.php"
- case_number=$((1000 + REDIS_ID))
- port=$((8000 + PORT))
- tmpfile=$(mktemp)
- cat > "$tmpfile" <<'EOF'
- case "CASENUMBER":
- $mailurl = 'http://126.0.0.1:PORT/gm/mail?type=add&uid='.$userid.'&title='.$title.'&content='.$content.'&reward='.$reward.'&senddate=2023-03-28%2014:04:00';
- break;
- EOF
- # 替换占位符并保留原有$符号
- sed -i "s/CASENUMBER/$case_number/g; s/PORT/$port/g" "$tmpfile"
- # 使用ed精确插入到第188行(保留原内容)测试服是101行,0.1是188行
- ed -s "$PHP_GMQUERY_PATH" <<ED_SCRIPT
- 188r $tmpfile
- w
- q
- ED_SCRIPT
- # 清理临时文件
- rm "$tmpfile"
- echo -e "${GREEN} 文件 $PHP_GMQUERY_PATH 已修改成功!${NC}"
- # Jenkins配置
- JENKINS_FILE="${JENKINS_PATH}/serverlist"
- echo "${SERVER_ID},http://$PUBLIC_IP:${port},ro${REDIS_ID}" >> ${JENKINS_FILE}
- echo -e "${GREEN}✅ Server ${SERVER_ID} setup completed successfully!${NC}"
|