#!/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 -p -r " 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" < "$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" <> ${JENKINS_FILE} echo -e "${GREEN}✅ Server ${SERVER_ID} setup completed successfully!${NC}"