diff --git a/function/function.sh b/function/function.sh new file mode 100644 index 0000000..93a0f95 --- /dev/null +++ b/function/function.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +source ../main.sh + +show_file(){ + filer=$1 + ls /data/update/$filer/ | tr ' ' '\n' +} + +# 判断一个字符串是否是合法的IP地址 +is_valid_ip() { + local ip=$1 + local pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$" + + if [[ $ip =~ $pattern ]]; then + # 检查每个数字是否在0到255之间 + local IFS='.' + read -ra octets <<< "$ip" + for octet in "${octets[@]}"; do + if (( octet < 0 || octet > 255 )); then + return 1 + fi + done + return 0 + else + return 1 + fi +} + +mod_package(){ + ip=${1} + package=${2} + # 源服务器上的tar压缩包路径 + source_tar="/data/update/package/" + # 游戏服目标服务器上的目标目录路径 + destination_dir="/data/jieling/server" + + echo "正在处理服务器 $ip" + scp "$source_tar/$package" "$ip:$destination_dir" + ssh "$ip" "tar -zxvf $destination_dir/$package -C $destination_dir" + ssh "$ip" "rm -rf $destination_dir/$package" + echo "处理完成服务器 $ip " +} + +#正式服发送 +send_package_reboot(){ + package=${1}.tar.gz + ip_txt=${2} + reboot=${3} + if is_valid_ip "$ip_txt"; then + echo "$ip_txt 开始测试服更新" + mod_package $ip_txt $package + case $reboot in + 0) + echo "热更,不需要重启... $i" + ;; + 1) + ssh $i "bash /data/jieling/server/bin/reboot.sh core1" + echo "重启测试服服务器 $i" + ;; + esac + else + echo "$ip_txt 开始正式服更新" + for i in `awk '{print $2}' /data/update/script/txt/$ip_txt` + do + mod_package $i $package + case $reboot in + 0) + echo "热更,不需要重启... $i" + ;; + 1) + ssh $i "supervisorctl restart all" + echo "重启正式服服务器 $i" + ;; + esac + done + fi +} + +#gm重启 +gm_reboot(){ + ip=${1} + ssh $ip "bash /data/jieling/gm/config/script/gm_reboot.sh" + ssh $ip "ps -ef|grep gm_tw_admin" + echo "gm重启完毕" +} + +mod_gm_package(){ + ip=${1} + # 游戏服目标服务器上的目标目录路径 + destination_dir="/data/jieling/gm" + # 源服务器上的tar压缩包路径 + source_tar="/data/update/project/miduo_gm/gm/gm.tar.gz" + if [ -e source_tar ]; then + echo "正在处理服务器 $ip" + scp "$source_tar/$package" "$ip:$destination_dir" + ssh "$ip" "tar -zxvf $destination_dir/$package -C $destination_dir" + ssh "$ip" "rm -rf $destination_dir/$package" + echo "处理完成服务器 $ip " + else + echo "gm.tar.gz 不存在,请先去打包 " + gm + fi + +} + +gm_send_package(){ + ip_txt=${1} + if is_valid_ip "$ip_txt"; then + echo "$ip_txt 开始更新gm/ip" + mod_gm_package $ip_txt + + read -r -p "更新完毕,是否需要重启(Y/N): " input + case $input in + [yY][eE][sS]|[yY]) + gm_reboot $ip + ;; + *) + echo "over..." + exit 0 + ;; + esac + else + echo "$ip_txt 开始更新gm/txt" + for i in `awk '{print $2}' /data/update/script/txt/$ip_txt` + do + mod_gm_package $i + gm_reboot $i + done + fi +} \ No newline at end of file diff --git a/main.sh b/main.sh index ace901b..c54a5ce 100644 --- a/main.sh +++ b/main.sh @@ -3,6 +3,9 @@ #删除命令乱码解决 stty erase ^h +#引用其他文件 +source function/function.sh + # 定义ANSI颜色转义码 #red='\033[0;31m' #红色 #green='\033[0;32m' #绿色 @@ -31,11 +34,6 @@ show_menu() { echo -e "0. ${red}退出${NC}" } -show_file(){ - filer=$1 - ls /data/update/$filer/ | tr ' ' '\n' -} - # 定义函数,用于处理用户输入 handle_input() { read -p "请输入选项编号: " choice @@ -75,58 +73,23 @@ handle_input() { esac } - -# 源服务器上的tar压缩包路径 -source_tar="/data/update/package/" -# 目标服务器上的目标目录路径 -destination_dir="/data/" -#单服发送 -send_one_ip(){ - package=${1}.tar.gz - ip=${2} - # 单服务器更新 - echo "正在处理服务器 $ip " - scp "$source_tar/$package" "$ip:$destination_dir" - ssh "$ip" "tar -zxvf $destination_dir/$package -C $destination_dir/jieling/server/" - ssh "$ip" "rm -rf $destination_dir/$package" - echo "处理完成服务器 $ip " -} - -#多服发送 -send_many_ip(){ - package=${1}.tar.gz - iptxt=${2}.txt - reboot=$3 - for i in `awk '{print $2}' /data/update/script/txt/$iptxt` - do - echo "正在处理服务器 $i " - scp "$source_tar/$package" "$i:$destination_dir" - ssh "$i" "tar -zxvf $destination_dir/$package -C $destination_dir/jieling/server/" - ssh "$i" "rm -rf $destination_dir/$package" - echo "处理完成服务器 $i " - - if [ ! -z $reboot ];then - ssh "$i" "supervisorctl restart all" - echo "重启服务器 $i " - fi - done -} - #游戏服更新 game(){ echo -e "================================" echo -e "开始更新${green}游戏服${NC}" - echo -e "1. ${yellow}打包${NC}" - echo -e "2. ${yellow}单服更新发送${NC}" - echo -e "3. ${yellow}渠道更新发送${NC}" - echo -e "4. ${yellow}单服更新并重启${NC}" - echo -e "5. ${yellow}渠道更新并重启${NC}" + echo -e "1. ${yellow}打更新包${NC}" + echo -e "2. ${yellow}打热更包${NC}" + echo -e "3. ${yellow}正式服热更${NC}" + echo -e "4. ${yellow}正式服停服更新${NC}" + echo -e "5. ${yellow}测试服热更${NC}" + echo -e "6. ${yellow}测试服停服更新${NC}" echo -e "0. ${green}返回主菜单${NC}" echo -e "*. ${red}其他任意键退出程序${NC}" read -p "请输入选项编号: " choice case $choice in 1) - echo -e "${yellow}打包${NC}" + echo -e "${yellow}打更新包${NC}" + echo "==============================" show_file project read -p "请输入项目地址: " project show_file package @@ -136,42 +99,56 @@ game(){ game ;; 2) - echo -e "${yellow}单独发送${NC}" + echo -e "${yellow}打热更包${NC}" + echo "==============================" + show_file project + read -p "请输入项目地址: " project show_file package - read -p "请输入包名(不需要带文件后缀): " package - read -p "请输入游戏服ip: " ip - echo -e "开始发送 包名:$package, ip:$ip" - send_one_ip $package $ip + read -p "请输入包名(不需要带文件后缀): " package + echo -e "开始打包 项目:$project, 包名:$package" + bash hotfix_game.sh $project $package game ;; 3) - echo -e "${yellow}渠道发送${NC}" + echo -e "${yellow}正式服热更${NC}" + echo "==============================" show_file package read -p "请输入包名(不需要带文件后缀): " package show_file script/txt - read -p "请输入文件名称(不需要带文件后缀): " iptxt - echo -e "开始发送 包名:$package, 渠道:$iptxt" - send_many_ip $package $iptxt + read -p "请输入文件名称(不需要带文件后缀): " channel + echo -e "开始发送 包名:$package, channel:$channel" + send_package_update $package ${channel}.txt 0 game ;; 4) - echo -e "${yellow}单独发送并重启${NC}" + echo -e "${yellow}正式服停服更新${NC}" + echo "==============================" + show_file package + read -p "请输入包名(不需要带文件后缀): " package + show_file script/txt + read -p "请输入文件名称(不需要带文件后缀): " channel + echo -e "开始发送 包名:$package, channel:$channel" + send_package_update $package ${channel}.txt 1 + game + ;; + 5) + echo -e "${yellow}测试服热更${NC}" + echo "==============================" show_file package read -p "请输入包名(不需要带文件后缀): " package read -p "请输入游戏服ip: " ip echo -e "开始发送 包名:$package, ip:$ip" - send_one_ip $package $ip - ssh $ip "bash /data/jieling/server/bin/reboot.sh core1" + send_package_update $package $ip 0 game ;; - 5) - echo -e "${yellow}渠道发送并重启${NC}" + 6) + echo -e "${yellow}测试服停服更新${NC}" + echo "==============================" show_file package read -p "请输入包名(不需要带文件后缀): " package - show_file script/txt - read -p "请输入文件名称(不需要带文件后缀): " iptxt - echo -e "开始发送 包名:$package, 渠道:$iptxt" - send_many_ip $package $iptxt + read -p "请输入游戏服ip: " ip + echo -e "开始发送 包名:$package, ip:$ip" + send_package_update $package $ip 1 game ;; 0) @@ -187,30 +164,54 @@ game(){ #gm更新 gm(){ + txt=gm_ip.txt echo -e "================================" echo -e "开始更新${green}gm服${NC}" - echo -e "1. ${yellow}单渠道更新${NC}" - echo -e "2. ${yellow}多渠道更新${NC}" + echo -e "1. ${yellow}打包${NC}" + echo -e "2. ${yellow}单机器更新${NC}" + echo -e "3. ${yellow}批量更新${NC}" + echo -e "4. ${yellow}单机器重启${NC}" + echo -e "5. ${yellow}批量重启${NC}" echo -e "0. ${green}返回主菜单${NC}" echo -e "*. ${red}其他任意键退出程序${NC}" read -p "请输入选项编号: " choice case $choice in 1) - echo -e "${yellow}单渠道更新${NC}" + echo -e "${yellow}打包${NC}" show_file project read -p "请输入表所在游戏项目地址: " project - read -p "请输入gm服ip: " ip - echo -e "开始更新gm ip:$ip" - bash update_gm.sh $project $ip + bash update_gm.sh $project + echo -e "gm打包完成" gm ;; 2) - echo -e "${yellow}多渠道更新${NC}" - show_file project - - read -p "请输入项目地址: " project + echo -e "${yellow}单机器更新${NC}" + read -p "请输入游戏服ip: " ip echo -e "开始更新gm" - bash update_gm.sh $project + gm_send_package $ip + gm + ;; + 3) + echo -e "${yellow}批量更新${NC}" + echo -e "开始更新gm" + gm_send_package txt + gm + ;; + 4) + echo -e "${yellow}单机器重启${NC}" + read -p "请输入游戏服ip: " ip + echo -e "开始重启gm" + gm_reboot $ip + gm + ;; + 5) + echo -e "${yellow}单机器更新${NC}" + read -p "请输入游戏服ip: " ip + echo -e "开始更新gm" + for i in `awk '{print $2}' /data/update/script/txt/$txt` + do + gm_reboot $i + done gm ;; 0) diff --git a/update_gm.sh b/update_gm.sh index 63cf6ab..0eb3f9e 100644 --- a/update_gm.sh +++ b/update_gm.sh @@ -13,10 +13,6 @@ BASE_DIR="/data/update/project/miduo_gm" table=$1 TABLE_DIR="/data/update/project/${table}" -#更新服务器地址,可以为空,表示更新全部gm -ip=$2 -file=txt/gm_ip.txt - #excel cd ${TABLE_DIR}/data_excel/ || exit svn up @@ -27,33 +23,21 @@ java -Dfile.encoding=UTF-8 -Djava.ext.dirs=./lib ExcelUtils cd ${BASE_DIR}/ || exit git pull -mvn clean package +mvn clean -if [ ! -z ${ip} ];then - update ${ip} ${TABLE_DIR} ${BASE_DIR} -else - for i in `awk '{print $2}' /data/update/script/$file` - do - update $i ${TABLE_DIR} ${BASE_DIR} - done -fi +#删除旧文件 +rm -rf ${BASE_DIR}/gm/* +#创建新目录文件 +zip_dir=${BASE_DIR}/gm/config +mkdir -p ${zip_dir}/jsonconf +mkdir -p ${zip_dir}/script +#复制文件 +cp -rf ${TABLE_DIR}/miduo_server/conf/server/ItemConfig.txt ${zip_dir}/jsonconf/ItemConfig.txt +cp -rf ${TABLE_DIR}/miduo_server/conf/server/RechargeCommodityConfig.txt ${zip_dir}/jsonconf/RechargeCommodityConfig.txt +cp -rf ${BASE_DIR}/conf/jsonconf/Reason.txt ${zip_dir}/jsonconf/Reason.txt +cp -rf ${BASE_DIR}/target/gm_tw_admin-1.0-SNAPSHOT.jar ${BASE_DIR}/gm/gm_tw_admin-1.0-SNAPSHOT.jar +cp -rf ${BASE_DIR}/conf/script ${BASE_DIR}/gm/config/script -update(){ - ip=${1} - TABLE_DIR=${2} - BASE_DIR=${3} - echo "开始更新 ${ip} " - #表文件 - scp -r ${TABLE_DIR}/miduo_server/conf/server/ItemConfig.txt ${ip}:/data/jieling/gm/config/jsonconf/ - scp ${TABLE_DIR}/miduo_server/conf/server/RechargeCommodityConfig.txt ${ip}:/data/jieling/gm/config/jsonconf/ - scp ${BASE_DIR}/conf/jsonconf/Reason.txt ${ip}:/data/jieling/gm/config/jsonconf/ - #jar包 - scp ${BASE_DIR}/target/gm_tw_admin-1.0-SNAPSHOT.jar ${ip}:/data/jieling/gm/gm_tw_admin-1.0-SNAPSHOT.jar - #脚本 - ssh ${ip} "mkdir -p /data/jieling/gm/config/script" - scp -r ${BASE_DIR}/conf/script ${ip}:/data/jieling/gm/config/script - - echo "开始重启 ${ip} 服务器 " - ssh ${ip} "sh /data/jieling/gm/config/script/gm_reboot.sh" - ssh ${ip} "ps -ef|grep gm_tw_admin" -} +#打包 +cd ${BASE_DIR}/gm || exit +tar -czvf gm.tar.gz ./*