622 lines
23 KiB
Bash
622 lines
23 KiB
Bash
|
|
#/bin/bash
|
||
|
|
# ---------------------------------------------------------
|
||
|
|
# 节点管理工具
|
||
|
|
# @author yeahoo2000@gmail.com
|
||
|
|
# ---------------------------------------------------------
|
||
|
|
|
||
|
|
DEBUG=1 # 开发模式设置(0:关闭 1:开启)
|
||
|
|
|
||
|
|
# 初始化
|
||
|
|
init(){
|
||
|
|
cfg_init
|
||
|
|
cfg_check
|
||
|
|
|
||
|
|
# 节点工作目录
|
||
|
|
ROOT=${cfg['root']}
|
||
|
|
# 代码库所处目录,例: /data/game.dev
|
||
|
|
CODE_PATH=${cfg['code_path']}/${cfg['ver']}
|
||
|
|
|
||
|
|
# nginx虚拟主机配置存放目录
|
||
|
|
if [ -d "/data/conf/nginx/vhost" ]; then
|
||
|
|
VHOST_PATH="/data/conf/nginx/vhost"
|
||
|
|
else
|
||
|
|
VHOST_PATH="/usr/local/webserver/nginx/conf/vhost"
|
||
|
|
fi
|
||
|
|
if [ "${cfg['combine']}" = "" ]; then
|
||
|
|
cfg['combine']='<<"game_23">>'
|
||
|
|
fi
|
||
|
|
# VHOST_PATH="/etc/nginx/sites-enabled"
|
||
|
|
if [ "${cfg['combine']}" = "" ]; then
|
||
|
|
cfg['combine']='<<"game_23">>'
|
||
|
|
fi
|
||
|
|
|
||
|
|
# erl程序所在路径
|
||
|
|
ERL=erl
|
||
|
|
if [ -f /opt/erlang/otp19.2/lib/erlang/bin/erl ]; then
|
||
|
|
ERL=/opt/erlang/otp19.2/lib/erlang/bin/erl
|
||
|
|
elif [ -f /usr/local/erlang/bin/erl ]; then
|
||
|
|
ERL=/usr/local/erlang/bin/erl
|
||
|
|
fi
|
||
|
|
# erl节点间连接端口范围
|
||
|
|
ERL_PORT_MIN=40100
|
||
|
|
# erl节点间连接端口范围
|
||
|
|
ERL_PORT_MAX=44000
|
||
|
|
|
||
|
|
# 进入节点根目录
|
||
|
|
cd ${ROOT} || exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# 配置信息检查
|
||
|
|
cfg_check(){
|
||
|
|
if [ -e "${cfg['root']}" ]; then
|
||
|
|
return
|
||
|
|
else if [ "${DEBUG}" != "1" ]; then
|
||
|
|
echo ">> [错误]脚本未进行正确配置,如果希望以开发模式工作请将DEBUG设置为'1',并填写关键配置"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
# 获取当前脚本文件所在路径,作为根目录
|
||
|
|
SOURCE="${BASH_SOURCE[0]}"
|
||
|
|
while [ -h "$SOURCE" ]; do
|
||
|
|
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||
|
|
SOURCE="$(readlink "$SOURCE")"
|
||
|
|
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
|
||
|
|
done
|
||
|
|
root="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||
|
|
|
||
|
|
# 调试模式下的默认配置,如有必要请手动修改
|
||
|
|
# cygwin下需使用dos格式才能正常,如:d:/game.dev/zone/mxfx_local_1
|
||
|
|
cfg['root']="${root}"
|
||
|
|
# cygwin下需使用dos格式才能正常,如:d:/game.dev
|
||
|
|
cfg['code_path']="/data/sszg_code"
|
||
|
|
cfg['nodename']="dg_game_23@10.148.0.3"
|
||
|
|
cfg['platform']="dg"
|
||
|
|
cfg['zone_id']="1"
|
||
|
|
cfg['type']="zone"
|
||
|
|
cfg['host']="0.0.0.0"
|
||
|
|
cfg['port']="7023"
|
||
|
|
cfg['cookie']="n2su1x83b16,2uw2"
|
||
|
|
cfg['srv_key']="a2bi2Zc89n129BaE3N0"
|
||
|
|
cfg['other_key']="a2bi2Zc89n129BaE3N0"
|
||
|
|
cfg['game_name']="DragonBall"
|
||
|
|
cfg['zone_name']="时空神域开发服"
|
||
|
|
cfg['lang']="zh_CN"
|
||
|
|
cfg['fcm']="0"
|
||
|
|
cfg['db_host']="34.126.183.36"
|
||
|
|
cfg['db_port']="3306"
|
||
|
|
cfg['db_name']="dg_game_23"
|
||
|
|
cfg['logdb_name']="dg_game_23_log"
|
||
|
|
cfg['oss_url']="10.148.0.7:8014"
|
||
|
|
cfg['db_user']="root"
|
||
|
|
cfg['db_pass']="Pass112358"
|
||
|
|
cfg['db_conn_min']="10"
|
||
|
|
cfg['db_conn_max']="30"
|
||
|
|
cfg['ip']="127.0.0.1"
|
||
|
|
cfg['open_time']="1384853886"
|
||
|
|
cfg['website']="http://sksy.cc"
|
||
|
|
|
||
|
|
# 替换空变量
|
||
|
|
for k in ${!cfg[@]}; do
|
||
|
|
cfg[$k]=${cfg[$k]/\{\{*\}\}/}
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
# 配置信息初始化
|
||
|
|
cfg_init(){
|
||
|
|
# 节点根目录
|
||
|
|
cfg['root']="/data/zone/dg_game_23"
|
||
|
|
# 代码存放路径,每一个版本一个目录保存到此路径下
|
||
|
|
cfg['code_path']="/data/sszg_code/"
|
||
|
|
# 平台标识
|
||
|
|
cfg['platform']="dg"
|
||
|
|
# 区号
|
||
|
|
cfg['zone_id']="1"
|
||
|
|
# 节点类型
|
||
|
|
cfg['type']="zone"
|
||
|
|
# magic cookie
|
||
|
|
cfg['cookie']="11cyx58dsdmxyTjl08Bxerycw"
|
||
|
|
# 主域名(这里不要带http://)
|
||
|
|
cfg['host']="0.0.0.0"
|
||
|
|
# 合服域名(这里不要带http://)
|
||
|
|
cfg['merge_host']=""
|
||
|
|
# 监听端口
|
||
|
|
cfg['port']="7023"
|
||
|
|
|
||
|
|
# 服务器密钥
|
||
|
|
cfg['srv_key']="713493d68fead22e15dbf0fc4d7b24ad"
|
||
|
|
|
||
|
|
# 机器所有者
|
||
|
|
cfg['owner']="诗悦"
|
||
|
|
# 是否禁用
|
||
|
|
cfg['disabled']="0"
|
||
|
|
# 机器所在地域
|
||
|
|
cfg['location']="腾讯云"
|
||
|
|
# 外网IP(一般为电信)
|
||
|
|
cfg['ip']="0.0.0.0"
|
||
|
|
# 外网IP1(一般为网通)
|
||
|
|
cfg['ip1']="{{ip1}}"
|
||
|
|
# 外网IP2(其它)
|
||
|
|
cfg['ip2']="{{ip2}}"
|
||
|
|
# 内网IP
|
||
|
|
cfg['ip_internal']="10.148.0.3"
|
||
|
|
# ssh用户名
|
||
|
|
cfg['ssh_user']="root"
|
||
|
|
# ssh访问端口
|
||
|
|
cfg['ssh_port']="22"
|
||
|
|
|
||
|
|
# 节点名称
|
||
|
|
cfg['nodename']="dg_game_23@10.148.0.3"
|
||
|
|
# 中央服节点名称
|
||
|
|
cfg['center_node']="dg_center_1@10.148.0.3"
|
||
|
|
# 所在物理机器编号
|
||
|
|
cfg['machine']="11007"
|
||
|
|
# 该类型节点的扩展信息
|
||
|
|
cfg['ext']="{{ext}}"
|
||
|
|
# 数据库地址(如果该节点不使用数据库则留空)
|
||
|
|
cfg['db_host']="34.126.183.36"
|
||
|
|
# 数据库端口
|
||
|
|
cfg['db_port']="3306"
|
||
|
|
# 数据库名称
|
||
|
|
cfg['db_name']="dg_game_23"
|
||
|
|
# 日志数据库名称
|
||
|
|
cfg['logdb_name']="dg_game_23_log"
|
||
|
|
# 数据库用户名
|
||
|
|
cfg['db_user']="root"
|
||
|
|
# 数据库密码
|
||
|
|
cfg['db_pass']="Pass112358"
|
||
|
|
# 数据库最小连接数
|
||
|
|
cfg['db_conn_min']="6"
|
||
|
|
# 数据库最大连接数
|
||
|
|
cfg['db_conn_max']="100"
|
||
|
|
cfg['oss_url']="10.148.0.7:8014"
|
||
|
|
# 当前版本(此版本号用于标识当前版本,由安装工具自动填写)
|
||
|
|
cfg['ver']="h5"
|
||
|
|
|
||
|
|
# 游戏代号
|
||
|
|
cfg['game_name']="DragonBall"
|
||
|
|
# 游戏区名称
|
||
|
|
cfg['zone_name']="Goku-23"
|
||
|
|
# 语言版本
|
||
|
|
cfg['lang']="zh-CN"
|
||
|
|
# 时区
|
||
|
|
cfg['timezone']="Asia/Shanghai"
|
||
|
|
# 合服信息
|
||
|
|
cfg['combine']=''
|
||
|
|
# 开服时间
|
||
|
|
cfg['open_time']="2021-08-18 16:00:00"
|
||
|
|
# 合服时间
|
||
|
|
cfg['merge_time']="0"
|
||
|
|
|
||
|
|
# ssl
|
||
|
|
cfg['ssl']=""
|
||
|
|
# 组ID
|
||
|
|
cfg['group_id']="1"
|
||
|
|
# 是否主服
|
||
|
|
cfg['is_main']="0"
|
||
|
|
# 是否发送注册码
|
||
|
|
cfg['need_register']="1"
|
||
|
|
# 是否维护中
|
||
|
|
cfg['is_maintain']="0"
|
||
|
|
# 日志组别(1:正式 2:海外 其它:测试)
|
||
|
|
cfg['flume_host_group']="1"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 启动节点
|
||
|
|
fun_start(){
|
||
|
|
if [ ! -e dets ]; then
|
||
|
|
echo ">> [错误]当前目录下未安装节点,请先执行安装操作"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -le 0 ]; then #停服更新时对日志做搬移处理
|
||
|
|
if [ $(cat screenlog.0 | wc -l ) -gt 200000 ]; then
|
||
|
|
echo ">> screenlog.0日志备份清理处理"
|
||
|
|
rm -f screenlog.1
|
||
|
|
mv screenlog.0 screenlog.1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
if $(in_cygwin); then
|
||
|
|
werl -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 204800 +K true -smp enable -hidden -config sys.config -pa ${CODE_PATH}/server/ebin -name ${cfg['nodename']} -s main start -extra ${cfg['type']} &
|
||
|
|
else
|
||
|
|
start_file=${ROOT}/start.sh
|
||
|
|
CMD="${ERL} -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 204800 +K true -smp enable -hidden -config sys.config -pa ${CODE_PATH}/server/ebin -name ${cfg['nodename']} -s main start -extra ${cfg['type']}"
|
||
|
|
cat > ${start_file} <<EOF
|
||
|
|
#!/bin/bash
|
||
|
|
cd ${ROOT}
|
||
|
|
ulimit -SHn 102400
|
||
|
|
${CMD}
|
||
|
|
EOF
|
||
|
|
chmod +x ${start_file}
|
||
|
|
screen -dmSL ${cfg['nodename']} -s ${start_file}
|
||
|
|
echo ">> 节点 ${cfg['nodename']} 正在启动中,如果想观察启动过程请使用以下命令进行启动:"
|
||
|
|
echo ">> ./ctl.sh start && ./ctl.sh shell"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 清理session
|
||
|
|
fun_clean_sess(){
|
||
|
|
rm -rf var/sess/*
|
||
|
|
echo "-------------------------------------------"
|
||
|
|
echo ">> php session清理完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 关闭节点
|
||
|
|
fun_stop(){
|
||
|
|
if $(in_cygwin); then
|
||
|
|
echo ">> cygwin下不支持此命令"
|
||
|
|
exit
|
||
|
|
fi
|
||
|
|
${ERL} -noshell -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} -hidden -pa ${CODE_PATH}/server/ebin -name stop_${cfg['nodename']} -setcookie ${cfg['cookie']} -eval "io:setopts([{encoding,unicode}])" -s main stop_from_shell -extra ${cfg['nodename']}
|
||
|
|
fun_clean_sess
|
||
|
|
echo "-------------------------------------------"
|
||
|
|
num=0
|
||
|
|
while(( $num<30 )); do
|
||
|
|
if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then
|
||
|
|
log=$(tail -n 10 ${ROOT}/screenlog.0)
|
||
|
|
if [ $(echo $log | grep "type: temporary" | wc -l ) -gt 0 ] || [ $(echo $log | grep "Application inets exited with reason: stopped" | wc -l ) -gt 0 ] || [ $(echo $log | grep "Application main exited with reason: stopped" | wc -l ) -gt 0 ]; then
|
||
|
|
pid=`ps aux | grep "\-name ${cfg['nodename']}"|grep erl|awk '{print $2}'`
|
||
|
|
if [ "$pid" != "" ]; then kill -9 $pid && echo "节点[${cfg['nodename']}]已关闭,直接kill掉进程:$log"; fi
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
sleep 0.5
|
||
|
|
let "num++"
|
||
|
|
else
|
||
|
|
echo ">> 节点 ${cfg['nodename']} 关闭完成"
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
echo -e ">> 节点 ${cfg['nodename']} \e[91m无法关闭节点,节点还在正常运行中...\e[0;0m"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 使用remsh方式进入控制台
|
||
|
|
fun_remsh(){
|
||
|
|
n=remsh_$1_${cfg['nodename']}
|
||
|
|
${ERL} -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} -hidden -pa ${CODE_PATH}/server/ebin -name $n -setcookie ${cfg['cookie']} -remsh ${cfg['nodename']}
|
||
|
|
}
|
||
|
|
|
||
|
|
# 进入该节点的控制台
|
||
|
|
fun_shell(){
|
||
|
|
if $(in_cygwin); then
|
||
|
|
echo ">> cygwin下不支持此命令"
|
||
|
|
exit
|
||
|
|
fi
|
||
|
|
screen -r "${cfg['nodename']}"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 刷新用户名
|
||
|
|
fun_set_db_user(){
|
||
|
|
if [ "${cfg['db_user']}" != "root" ]; then
|
||
|
|
echo "更新数据库[${cfg['db_name']}]用户[${cfg['db_user']}]权限"
|
||
|
|
sql="GRANT ALL PRIVILEGES ON ${cfg['db_name']}.* TO '${cfg['db_user']}'@'127.0.0.1' IDENTIFIED BY '${cfg['db_pass']}' WITH GRANT OPTION;"
|
||
|
|
sql="$sql GRANT ALL PRIVILEGES ON ${cfg['db_name']}.* TO '${cfg['db_user']}'@'localhost' IDENTIFIED BY '${cfg['db_pass']}' WITH GRANT OPTION;"
|
||
|
|
sql="$sql FLUSH PRIVILEGES;"
|
||
|
|
mysql -uroot -p$(cat /data/save/mysql_root) -e "$sql"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 安装节点
|
||
|
|
fun_install(){
|
||
|
|
if [ -e dets ]; then
|
||
|
|
echo ">> [错误]当前数据目录非空,可能是已经执行过安装过程,请删除后重试"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
# 处理模板
|
||
|
|
tpls=( 'env_zone.cfg' 'vhost.conf' 'main.app' 'env.php' 'default.cfg.php' 'zone.sql' 'log.sql' 'elog.config' 'emysql.app' 'lager.app' 'sys.config' 'goldrush.app' 'ranch.app' )
|
||
|
|
fun_set_db_user
|
||
|
|
fun_ssl
|
||
|
|
for v in ${tpls[*]};do
|
||
|
|
file="${CODE_PATH}/server/tpl/${v}"
|
||
|
|
if [ ! -e $file ]; then
|
||
|
|
echo ">> [错误]找不到模板文件: ${file}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
# 替换模板变量
|
||
|
|
lines=$(<"${file}")
|
||
|
|
for k in ${!cfg[@]}; do
|
||
|
|
lines=${lines//\{\{$k\}\}/${cfg[$k]}}
|
||
|
|
done
|
||
|
|
# 替换空变量并生成文件
|
||
|
|
echo "${lines}" | sed -e "s/{{.*}}//" > ${v}
|
||
|
|
done
|
||
|
|
# 安装数据库
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -e"create database ${cfg['db_name']}"
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]创建数据库时发生异常"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -e"create database ${cfg['logdb_name']}"
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]创建数据库时发生异常"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"source ${ROOT}/zone.sql"
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['logdb_name']} -e"source ${ROOT}/log.sql"
|
||
|
|
if [ -f "${CODE_PATH}/server/tpl/card.sql" ]; then
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"source ${CODE_PATH}/server/tpl/card.sql"
|
||
|
|
fi
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]导入数据库表结构时发生异常"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
# 处理相关文件
|
||
|
|
mkdir -p dets var/sess log/pack log_file role_face_photo/${cfg['platform']}_${cfg['zone_id']} ${CODE_PATH}/web/www/role_face_photo
|
||
|
|
mv env_zone.cfg env.cfg
|
||
|
|
ln -s ${CODE_PATH}/web/www .
|
||
|
|
# ln -s ${CODE_PATH}/server/priv .
|
||
|
|
fun_face_link
|
||
|
|
rm -f zone.sql
|
||
|
|
chmod -R 777 ${cfg['root']}/var
|
||
|
|
echo ">> 正在打开端口:${cfg['port']},如果失败可手动操作完成,无需重新安装"
|
||
|
|
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport ${cfg['port']} -j ACCEPT && service iptables save && service iptables restart && sysctl -p
|
||
|
|
rm -f sys_notice.sql
|
||
|
|
echo ">> 正在配置web服务器,如果失败可手动操作完成,无需重新安装"
|
||
|
|
rm -f ${VHOST_PATH}/${cfg['host']}.conf && ln -s ${cfg['root']}/vhost.conf ${VHOST_PATH}/${cfg['host']}.conf
|
||
|
|
/root/nginx_reload
|
||
|
|
echo ">> 节点安装完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 删除节点
|
||
|
|
fun_uninstall(){
|
||
|
|
fun_check_screen
|
||
|
|
role_num=$(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"select count(*) from role")
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]访问数据库失败,无法获取角色数量"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [ "$role_num" != "" ] && [ "$role_num" = "$1" ]; then
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"drop database ${cfg['db_name']}"
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"drop database ${cfg['db_log_name']}"
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]访问数据库失败,无法删除数据库,如需继续请手动操作"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo ">> 正在关闭端口:${cfg['port']}"
|
||
|
|
iptables -D RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport ${cfg['port']} -j ACCEPT && service iptables save && service iptables restart && sysctl -p
|
||
|
|
rm -rf screenlog.* face replay replay_share dets priv log log_file var www env.cfg env.php default.cfg.php emysql.app main.app vhost.conf start.sh ${VHOST_PATH}/${cfg['host']}.conf ${CODE_PATH}/web/www/face/${cfg['platform']}_${cfg['zone_id']} ${CODE_PATH}/web/www/replay/${cfg['platform']}_${cfg['zone_id']}
|
||
|
|
|
||
|
|
echo ">> 节点${cfg['nodename']}已经删除"
|
||
|
|
else
|
||
|
|
echo ">> [错误]删除参数中必须带有当前节点的角色数量,角色数量为[${role_num}]"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 热更新节点
|
||
|
|
fun_update_cfg(){
|
||
|
|
# 处理模板
|
||
|
|
tpls=( 'env_zone.cfg' 'vhost.conf' 'elog.config' 'main.app' 'env.php' 'default.cfg.php' )
|
||
|
|
fun_set_db_user
|
||
|
|
fun_ssl
|
||
|
|
for v in ${tpls[*]};do
|
||
|
|
file="${CODE_PATH}/server/tpl/${v}"
|
||
|
|
# 替换模板变量
|
||
|
|
lines=$(<"${file}")
|
||
|
|
for k in ${!cfg[@]}; do
|
||
|
|
lines=${lines//\{\{$k\}\}/${cfg[$k]}}
|
||
|
|
done
|
||
|
|
# 替换空变量并生成文件
|
||
|
|
echo "${lines}" | sed -e "s/{{.*}}//" > ${v}
|
||
|
|
done
|
||
|
|
rm -f env.cfg && mv env_zone.cfg env.cfg
|
||
|
|
rm -f www && ln -s ${CODE_PATH}/web/www .
|
||
|
|
mkdir -p ${cfg['root']}/role_face_photo/${cfg['platform']}_${cfg['zone_id']} ${CODE_PATH}/web/www/role_face_photo
|
||
|
|
fun_face_link
|
||
|
|
/root/nginx_reload
|
||
|
|
if [ $(cat /etc/sysconfig/iptables | grep -e "--dport ${cfg['port']}" | wc -l ) -eq 0 ]; then
|
||
|
|
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport ${cfg['port']} -j ACCEPT && service iptables save && service iptables restart && sysctl -p
|
||
|
|
fi
|
||
|
|
echo ">> 所有配置文件更新完成"
|
||
|
|
if [ "$1" != "false" ] && [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then
|
||
|
|
fun_exec "sys_env:reload:[]"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 创建所有全服平台目录
|
||
|
|
fun_create_combine(){
|
||
|
|
dir=${cfg['root']}/$1
|
||
|
|
# cfg['combine']='{<<"4399">>,1},{<<"4399">>,2},{<<"4399">>,3},{<<"4399">>,4},{<<"4399">>,5},{<<"4399">>,6},{<<"4399">>,7},{<<"4399">>,8},{<<"4399">>,9}'
|
||
|
|
combinestr=${cfg['combine']}
|
||
|
|
combinestr=${combinestr//\ /}
|
||
|
|
combinestr=${combinestr//\{\<\<\"/}
|
||
|
|
combinestr=${combinestr//\"\>\>\,/\_}
|
||
|
|
combinestr=${combinestr//\}\,/\ }
|
||
|
|
combinestr=( ${combinestr//\}/} )
|
||
|
|
for k in ${combinestr[@]}; do
|
||
|
|
# echo ${dir}/${k}
|
||
|
|
mkdir -p ${dir}/${k}
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
# 更新face链接
|
||
|
|
fun_face_link(){
|
||
|
|
for dir in $(ls ${cfg['root']}/role_face_photo); do
|
||
|
|
if [ -d "${cfg['root']}/role_face_photo/${dir}" ] && [ "${dir}" != "." ]; then
|
||
|
|
rm -f ${CODE_PATH}/web/www/role_face_photo/${dir}
|
||
|
|
ln -s ${cfg['root']}/role_face_photo/${dir} ${CODE_PATH}/web/www/role_face_photo/${dir}
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
# 热更新节点
|
||
|
|
fun_hotswap(){
|
||
|
|
noshell="" # shell后台多线程热更要求为noshell
|
||
|
|
if [ "$1" != "" ]; then
|
||
|
|
noshell=" -noshell"
|
||
|
|
fi
|
||
|
|
echo ${CODE_PATH}/server/ebin
|
||
|
|
|
||
|
|
${ERL}${noshell} -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 204800 +K true -smp enable -hidden -pa ${CODE_PATH}/server/ebin -name hotswap_${cfg['nodename']} -setcookie ${cfg['cookie']} -eval "io:setopts([{encoding,unicode}])" -s main hotswap_from_shell -extra ${cfg['nodename']}
|
||
|
|
echo ">> 热更新完成"
|
||
|
|
}
|
||
|
|
|
||
|
|
# 执行指定脚本
|
||
|
|
fun_exec(){
|
||
|
|
# 要求传入格式为 Mod:Fun:Args(中间不带空格符号)
|
||
|
|
line=$1
|
||
|
|
mod=$(echo $line | cut -d':' -f1)
|
||
|
|
fun=$(echo $line | cut -d':' -f2)
|
||
|
|
args=$(echo $line | cut -d':' -f3)
|
||
|
|
args=${args//\#/:}
|
||
|
|
if [[ $(echo $mod | grep "^[a-z0-9_]\{1,50\}$") = "" ]]; then
|
||
|
|
echo ">> [错误]模块名格式不正常:${mod}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [[ $(echo $fun | grep "^[a-z0-9_]\{1,50\}$") = "" ]]; then
|
||
|
|
echo ">> [错误]方法名格式不正常:${fun}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [[ $(echo $args | grep "^\[.*\]$") = "" ]]; then
|
||
|
|
echo ">> [错误]方法参数格式不正常:${args}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
echo ">> 准备执行方法调用 apply(${mod}, ${fun}, ${args})"
|
||
|
|
${ERL} -noshell -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} -hidden -pa ${CODE_PATH}/server/ebin -name exec_${cfg['nodename']} -setcookie ${cfg['cookie']} -eval "io:setopts([{encoding,unicode}]),io:format(\"return:~w~n\", [rpc:call('${cfg['nodename']}', ${mod}, ${fun}, ${args})])" -s c q
|
||
|
|
}
|
||
|
|
|
||
|
|
# 清档操作
|
||
|
|
fun_clean(){
|
||
|
|
fun_check_screen
|
||
|
|
role_num=$(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"select count(*) from role")
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]访问数据库失败,无法获取角色数量"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
if [ "$role_num" != "" ] && [ "$role_num" = "$1" ]; then
|
||
|
|
# 排除列表,注意在排除列表外的所有表将会被清空
|
||
|
|
exclude=( "mod_notice" "mod_holiday_son" "mod_holiday_total" "mod_white_ip" "sys_notice_board" "mod_white_acc" )
|
||
|
|
tabs=( $(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"show tables") )
|
||
|
|
for v in ${tabs[@]}; do
|
||
|
|
flag=0
|
||
|
|
for v1 in ${exclude[@]}; do
|
||
|
|
if [ "$v" = "$v1" ]; then
|
||
|
|
flag=1
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
if [ $flag = 0 ]; then
|
||
|
|
sql="${sql} truncate table ${v};"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"${sql}"
|
||
|
|
if [ $? -ne 0 ]; then
|
||
|
|
echo ">> [错误]访问数据库失败"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
rm -f ./env.dets
|
||
|
|
mv dets/env.dets ./
|
||
|
|
rm -f dets/*
|
||
|
|
mv ./env.dets dets/
|
||
|
|
rm -rf var/sess
|
||
|
|
rm -rf log
|
||
|
|
rm -rf log_file/*
|
||
|
|
rm -rf lager_log/*
|
||
|
|
rm -rf combat_replay/*
|
||
|
|
rm -f screenlog.*
|
||
|
|
rm -rf face/${cfg['platform']}_${cfg['zone_id']}/*
|
||
|
|
rm -rf replay/${cfg['platform']}_${cfg['zone_id']}/*
|
||
|
|
rm -rf replay_share/${cfg['platform']}_${cfg['zone_id']}/*
|
||
|
|
mkdir -p log/pack
|
||
|
|
mkdir -p var/sess
|
||
|
|
chmod -R 777 var/sess
|
||
|
|
echo "" > ./srv_clear_flag.txt
|
||
|
|
echo ">> 清档操作完成"
|
||
|
|
else
|
||
|
|
echo ">> [错误]清档时参数中必须带有当前节点的角色数量,角色数量为[${role_num}]"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 判断运行节点数据库是否还存在 维护辅助工具
|
||
|
|
fun_run_db(){
|
||
|
|
if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then
|
||
|
|
if [ $(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -e "show databases like '${cfg['db_name']}'" | wc -l ) -eq 0 ]; then
|
||
|
|
echo "服务器节点[${cfg['nodename']}]还在运行中,数据库[${cfg['db_name']}]不存在了"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
fun_check_screen() {
|
||
|
|
if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then
|
||
|
|
echo "服务器节点[${cfg['nodename']}]还在运行中,不能进行该操作"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# 收集并打包日志文件
|
||
|
|
fun_pack(){
|
||
|
|
cd ${ROOT}/log/pack
|
||
|
|
# 如果目录非空则进行打包
|
||
|
|
if [ $(ls -al | wc -l) -gt 3 ]; then
|
||
|
|
tar zcf ${ROOT}/log/log_${cfg['platform']}_${cfg['zone_id']}_$(date +"%y%m%d%H%M%S").tar.gz *.txt && rm -f *.txt
|
||
|
|
exit $?
|
||
|
|
fi
|
||
|
|
echo "没有文件可打包"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
##
|
||
|
|
fun_ssl(){
|
||
|
|
if [ "${cfg['platform']}" = "9388" ]; then
|
||
|
|
cfg['ssl']="listen 443 ssl;
|
||
|
|
ssl on;
|
||
|
|
ssl_certificate_key /usr/local/webserver/nginx/conf/wildcard_20131129.key;
|
||
|
|
ssl_certificate /usr/local/webserver/nginx/conf/wildcard.pem;"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
## 检测是否在cygwin环境中
|
||
|
|
in_cygwin(){
|
||
|
|
os=$(uname)
|
||
|
|
[[ "${os:0:3}" == "CYG" ]]; return $?
|
||
|
|
}
|
||
|
|
|
||
|
|
## 命令行帮助
|
||
|
|
help(){
|
||
|
|
echo "start 启动节点"
|
||
|
|
echo "stop 关闭节点(同时会自动清理php session)"
|
||
|
|
echo "shell 进入控制台,也可使用screen命令直接进入"
|
||
|
|
echo "remsh 以remsh方式进入控制台"
|
||
|
|
echo "install 安装节点"
|
||
|
|
echo "uninstall 删除节点"
|
||
|
|
echo "clean 清档操作"
|
||
|
|
echo "clean_sess 清理php session,关闭服务器后需清理,不然玩家刷新后可能进入服务器"
|
||
|
|
echo "update_cfg 更新所有配置文件"
|
||
|
|
echo "hotswap 热更新节点"
|
||
|
|
echo "exec 执行指定命令: Mod:Fun:Args"
|
||
|
|
echo "pack 收集并打包日志文件"
|
||
|
|
echo "log 查看控制台日志"
|
||
|
|
echo "check 判断切点是否还在运行中"
|
||
|
|
echo "ls 列出所有的erl节点"
|
||
|
|
echo "run_db 检查节点是否在运行状态但数据库已被删除(维护辅助工具)"
|
||
|
|
}
|
||
|
|
|
||
|
|
# ------------------------------------------------------
|
||
|
|
# 执行入口
|
||
|
|
# ------------------------------------------------------
|
||
|
|
declare -A cfg
|
||
|
|
init
|
||
|
|
case $1 in
|
||
|
|
start) fun_start;;
|
||
|
|
stop) fun_stop;;
|
||
|
|
shell) fun_shell;;
|
||
|
|
remsh) fun_remsh $2;;
|
||
|
|
install) fun_install;;
|
||
|
|
uninstall) fun_uninstall $2;;
|
||
|
|
clean) fun_clean $2;;
|
||
|
|
clean_sess) fun_clean_sess;;
|
||
|
|
update_cfg) fun_update_cfg $2;;
|
||
|
|
hotswap) fun_hotswap $2;;
|
||
|
|
exec) fun_exec "${2}";;
|
||
|
|
pack) fun_pack;;
|
||
|
|
check) fun_check_screen;;
|
||
|
|
log) less ./screenlog.0;;
|
||
|
|
ls) screen -ls;;
|
||
|
|
nodo) exit 0;;
|
||
|
|
create_dir) fun_create_combine;;
|
||
|
|
run_db) fun_run_db;;
|
||
|
|
*)
|
||
|
|
echo "未知指令,请使用以下有效指令"
|
||
|
|
echo "----------------------------------------------------------"
|
||
|
|
help
|
||
|
|
exit 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
exit 0
|