版本更新

This commit is contained in:
hahwu 2025-01-08 15:48:40 +08:00
parent f0979ccc7e
commit 74df056d24
26 changed files with 489 additions and 1442 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
/log
/config
/Goleaf
/MergePet
Goleaf.tar
source/main
playbook/node_modules/*

View File

@ -40,6 +40,8 @@ func ProcessMsg(SqlDb *sqlx.DB, m kafka.Message) error {
err = login(SqlDb, m)
case "Login_Out":
err = login(SqlDb, m)
case "pay":
err = pay(SqlDb, m)
default:
err = event(SqlDb, m)
}
@ -74,6 +76,19 @@ func event(SqlDb *sqlx.DB, m kafka.Message) error {
return err
}
func pay(SqlDb *sqlx.DB, m kafka.Message) error {
var V map[string]interface{}
json.Unmarshal(m.Value, &V)
Param, err := json.Marshal(V["Param"])
Info := V["Param"].(map[string]interface{})
if err != nil {
return err
}
sql := "INSERT INTO log_order (`Uid`, `OrderId`, `Price`, `PayChannelOrderId`, `ProductId`, `CreateTime`, `PayTime`, `PayType`, `Param`, `Timestamp`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
_, err = SqlDb.Exec(sql, V["Uid"], Info["OrderId"], Info["Price"], Info["PayChannelOrderId"], Info["ProductId"], Info["CreateTime"], Info["PayTime"], Info["PayType"], string(Param), V["TimeStamp"])
return err
}
func offset(SqlDb *sqlx.DB, m kafka.Message) error {
sql := " INSERT INTO `log_var` (`Key` , `Value`, `Timestamp`) Values (?,?,?) ON DUPLICATE KEY UPDATE `key` = ? , `Value` = ? ,`Timestamp`=?"
Value := strconv.FormatInt(m.Offset+1, 10)

View File

@ -2,16 +2,18 @@ module kafka-comsumer
go 1.23.1
require github.com/segmentio/kafka-go v0.4.47
require (
github.com/go-sql-driver/mysql v1.8.1
github.com/jmoiron/sqlx v1.4.0
github.com/segmentio/kafka-go v0.4.47
gopkg.in/yaml.v2 v2.4.0
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/jmoiron/sqlx v1.4.0 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/stretchr/testify v1.9.0 // indirect
golang.org/x/net v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

View File

@ -10,7 +10,9 @@ github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
@ -75,6 +77,7 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

View File

@ -17,6 +17,8 @@ var (
WorkChan = make(chan *kafka.Message, 100)
Wait sync.WaitGroup
)
var c = make(chan os.Signal, 1)
var d = make(chan int, 1)
// GOOS=linux GOARCH=amd64 go build -o /data/devops/kafka/release/kafka_comsumer main.go
@ -35,9 +37,9 @@ func main() {
for _, game := range Games {
go comsumer(game)
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
sig := <-c
d <- 1
log.Printf("kafka comsumer closing down (signal: %v)\n", sig.String())
Wait.Wait()
}
@ -61,12 +63,24 @@ func comsumer(Game *config.Game) {
r.SetOffset(offset)
ctx := context.Background()
log.Println("comsumer start ", Game.Name)
ctx, cancel := context.WithCancel(ctx)
defer cancel()
go func() {
<-d
cancel()
}()
for {
// 读取消息
m, err := r.ReadMessage(ctx)
if err != nil {
log.Println("comsumer close ", Game.Name)
return
if ctx.Err() == context.Canceled {
log.Println("comsumer close ", Game.Name)
return
}
log.Printf("comsumer %s error :%v", Game.Name, err)
continue
}
Wait.Add(1)
err = db.ProcessMsg(sqlDb, m)

Binary file not shown.

View File

@ -33,7 +33,7 @@ elif [ $1 == "status" ]; then
elif [ $1 == "restart" ]; then
echo "Restarting kafka comsumer..."
PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}')
if [ -n $PID ]; then
if [ -n "$PID" ]; then
echo "kafka comsumer stoping."
kill $PID
fi
@ -43,7 +43,7 @@ elif [ $1 == "restart" ]; then
done
echo "kafka comsumer stoped."
> log/kafka-comsumer.log # 清空 logs 文件
nohup kafka_comsumer >> logs 2>&1 &
nohup ./kafka_comsumer >> logs 2>&1 &
echo "kafka comsumer restarted."
else
echo "Usage: $0 [start|stop|status|restart]"

View File

@ -4,8 +4,8 @@
/* Created on: 2014-10-16 10:00:00 */
/*==============================================================*/
create database if not exists Merge_Pet_online CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
use Merge_Pet_online;
create database if not exists pet_home CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
use pet_home;
CREATE TABLE IF NOT EXISTS `log_var` (
@ -34,4 +34,21 @@ CREATE TABLE IF NOT EXISTS `log_event` (
PRIMARY KEY (`id`),
KEY `Event` (`Event`),
KEY `Uid` (`Uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作事件';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作事件';
CREATE TABLE IF NOT EXISTS `log_order` (
`id` int unsigned AUTO_INCREMENT COMMENT '自增id',
`Uid` int unsigned NOT NULL COMMENT '玩家id',
`OrderId` varchar(128) DEFAULT '' COMMENT '订单号',
`Price` float NOT NULL DEFAULT '0' COMMENT '价格',
`PayChannelOrderId` varchar(128) DEFAULT '' COMMENT '支付渠道订单号',
`ProductId` int unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
`CreateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`PayTime` int unsigned NOT NULL DEFAULT '0' COMMENT '支付时间',
`PayType` int unsigned NOT NULL DEFAULT '0' COMMENT '支付类型',
`Param` text COMMENT '参数',
`Timestamp` int DEFAULT 0 COMMENT '时间',
PRIMARY KEY (`id`),
KEY `OrderId` (`OrderId`),
KEY `Uid` (`Uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单';

36
nginx/web.conf Normal file
View File

@ -0,0 +1,36 @@
server {
listen 80;
server_name admin.bywaystudios.com;
# 将 HTTP 请求重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name admin.bywaystudios.com;
ssl_certificate /etc/nginx/ssl/bywaystudios.com.pem;
ssl_certificate_key /etc/nginx/ssl/bywaystudios.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /data/admin/apps/web-antd/dist;
index index.html;
}
location /api {
proxy_pass http://localhost:5320;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 可选:配置日志文件
access_log /var/log/nginx/pethome_access.log;
error_log /var/log/nginx/pethome_error.log;
}

View File

@ -11,10 +11,22 @@
# src: /data/docs/tool/out/
# dest: /usr/local/Goleaf/config/
# mode: '0777'
- name: pack tool
shell: cd /data/devops/tool && GOOS=linux GOARCH=amd64 go build -o /data/devops/MergePet/tool/tool main.go
delegate_to: localhost
- name: reload tool
copy:
src: /data/devops/Goleaf/tool/tool
src: /data/devops/MergePet/tool/tool
dest: /usr/local/Goleaf/tool/tool
- name: pack main
shell: cd /data/pet_home_server/src/server && GOOS=linux GOARCH=amd64 go build -o /data/devops/MergePet/main main.go
delegate_to: localhost
- name: reload main
copy:
src: /data/devops/MergePet/main
dest: /usr/local/Goleaf/main

View File

@ -12,6 +12,9 @@ a2 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22
[google]
g1 ansible_ssh_host=47.254.83.25 ansible_ssh_user="root" ansible_ssh_port=22
[gitea]
gitea1 ansible_ssh_host=8.155.14.94 ansible_ssh_user="root" ansible_ssh_port=22
[release]
a1 ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22
g1 ansible_ssh_host=47.254.83.25 ansible_ssh_user="root" ansible_ssh_port=22

11
playbook/kafka.yml Normal file
View File

@ -0,0 +1,11 @@
---
- name: Deploy GoLeaf release
hosts: gitea
remote_user: root
tasks:
- name: copy main
copy:
src: /data/devops/kafka/release/kafka_comsumer
dest: /usr/local/release/kafka_comsumer

View File

@ -0,0 +1,81 @@
---
- name: Deploy GoLeaf release
hosts: test
remote_user: root
vars:
goleaf_src: /data/devops/source/main
goleaf_dest: /data/devops/MergePet/main
config_src: /data/docs/tool/out/
config_dest: /data/devops/MergePet/config/
pack_script: /data/devops/pack.sh
tar_file: /usr/local/MergePet.tar
tar_dest: /usr/local/game
branch: online
tasks:
- name: 拷贝mysql rpm包
copy:
src: /data/devops/source/mysql80-community-release-el7-11.noarch.rpm
dest: /usr/local
- name: 安装mysql rpm包
command: rpm -ivh /usr/local/mysql80-community-release-el7-11.noarch.rpm
ignore_errors: yes
- name: 安装mysql
yum:
name: mysql
state: present
- name: 删除mysql rpm包
command: rm -f /usr/local/mysql80-community-release-el7-11.noarch.rpm
- name: 切换分支 {{branch}}
shell: cd /codes/pet_home_server && git checkout {{branch}} && git pull
delegate_to: localhost
register: git_result
- name: 打包
shell: sh /data/devops/pack.sh
delegate_to: localhost
- name: 拷贝goleaf main
copy:
src: "{{ goleaf_src }}"
dest: "{{goleaf_dest}}"
delegate_to: localhost
- name: 拷贝配置文件
copy:
src: "{{ config_src }}"
dest: "{{config_dest}}"
delegate_to: localhost
- name: 打包项目
command: tar -cvf /usr/local/MergePet.tar -C /data/devops/MergePet .
delegate_to: localhost
- name: 拷贝项目到remote
copy:
src: /usr/local/MergePet.tar
dest: /usr/local
- name : mkdir
command: mkdir -p /usr/local/MergePet
- name : untar
command: tar -xvf /usr/local/MergePet.tar -C /usr/local/MergePet
- name : 删除tar包
command: rm -f /usr/local/MergePet.tar

View File

@ -5,14 +5,20 @@
remote_user: root
vars:
goleaf_src: /data/devops/source/main
goleaf_dest: /usr/local/game
goleaf_dest: /usr/local/games/MergePet
config_src: /data/docs/tool/out/
config_dest: /usr/local/game/gamedata/config/
config_dest: /usr/local/games/MergePet/gamedata/config/
pack_script: /data/devops/pack.sh
tar_file: /usr/local/Goleaf.tar
tar_dest: /usr/local/game
tasks:
- name: stop goleaf
command: "{{ goleaf_dest }}/tool/tool stop node 1"
register: stop_result
ignore_errors: yes
- name: show stop_result
debug:
var: stop_result.stdout_lines
- name: change git branch
shell: cd /codes/pet_home_server && git checkout sdk && git pull
delegate_to: localhost
@ -20,9 +26,6 @@
- name: sh pack.sh
shell: sh /data/devops/pack.sh
delegate_to: localhost
- name: restart goleaf
command: sh "{{ goleaf_dest }}"/Restart.sh stop
register: restart_result
- name: copy goleaf
copy:
@ -35,13 +38,13 @@
- name: copy tar
copy:
src: /usr/local/conf.tar
dest: /usr/local/game
dest: /usr/local/games/MergePet
- name : untar
command: tar -xvf /usr/local/game/conf.tar -C /usr/local/game/gamedata/config/
command: tar -xvf /usr/local/games/MergePet/conf.tar -C /usr/local/games/MergePet/config/
- name: restart goleaf
command: sh "{{ goleaf_dest }}"/Restart.sh start
- name: start goleaf
shell: nohup /usr/local/games/MergePet/tool/tool start node 1 &
register: restart_result
- name: show restart result

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +0,0 @@
{
"dependencies": {
"protobufjs-cli": "^1.1.3"
}
}

32
playbook/web.yml Normal file
View File

@ -0,0 +1,32 @@
---
- name: Deploy GoLeaf release
hosts: gitea
remote_user: root
tasks:
- name: tar web
command: tar -cvf /data/admin/apps/web-antd/dist.tar -C /data/admin/apps/web-antd/dist .
delegate_to: localhost
- name: copy tar
copy:
src: /data/admin/apps/web-antd/dist.tar
dest: /usr/local/admin
- name: untar
command: tar -xvf /usr/local/admin/dist.tar -C /usr/local/admin/web/
# - name: tar backend
# shell: tar -cvf /data/backend/release/backend.tar -C /data/backend/release .
# delegate_to: localhost
# - name: pack.sh
# shell: sh /data/backend/release/pack.sh
# delegate_to: localhost
# - name: copy tar
# copy:
# src: /data/backend/release/backend
# dest: /usr/local/admin/backend
# - name: untar
# shell: tar -xvf /usr/local/admin/backend.tar -C /usr/local/admin/backend/

5
script/install.sh Normal file
View File

@ -0,0 +1,5 @@
cd /usr/local
wget https://go.dev/dl/go1.23.4.linux-386.tar.gz
tar -C /usr/local -xzf go1.23.4.src.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
echo "export GOPATH=$HOME/go" >> /etc/profile

View File

@ -23,7 +23,7 @@ server.start()
db_host = server.local_bind_host
db_port = server.local_bind_port
print(db_host, db_port)
RID = 100014
RID = 200200121
MYRID = 100004
conn = pymysql.connect(
@ -31,7 +31,7 @@ conn = pymysql.connect(
port=db_port,
user="root",
password="Z4rf7eZZe500dxa",
database="pet_home_1"
database="Merge_Pet_sdk"
)
cursor = conn.cursor()
cursor.execute(("select * from t_player_mod where dwUin = {rid}").format(rid = RID))

View File

@ -39,14 +39,14 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
")VQbB(vpy=U(wcp)\n"
"3/Qr-g]ljJ&9@bM&\n"
]
}
],
@ -68,14 +68,14 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"日期时间: 2024-12-27 16:10:53\n"
"日期时间: 2024-12-26 20:39:44\n"
]
}
],
@ -83,7 +83,7 @@
"from datetime import datetime\n",
"\n",
"# 示例时间戳\n",
"timestamp = 1735216402\n",
"timestamp = 1735216784\n",
"\n",
"# 将时间戳转换为日期时间\n",
"dt_object = datetime.fromtimestamp(timestamp)\n",

62
source/docker-ce.repo Normal file
View File

@ -0,0 +1,62 @@
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg

Binary file not shown.

View File

@ -4,4 +4,12 @@ go 1.23.1
require gopkg.in/ini.v1 v1.67.0
require github.com/stretchr/testify v1.10.0 // indirect
require (
github.com/fatih/color v1.18.0 // indirect
github.com/gookit/color v1.5.4 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/stretchr/testify v1.10.0 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/sys v0.25.0 // indirect
)

View File

@ -1,9 +1,24 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

View File

@ -12,6 +12,7 @@ import (
"syscall"
"time"
"github.com/gookit/color"
"gopkg.in/ini.v1"
)
@ -23,14 +24,31 @@ start start the server
stop stop the server
restart restart the server
status get the server status
install install the server
uninstall uninstall the server
`
var cfg *ini.File
var FuncMap map[string]func() error
var dirPath string
var app_path string
var (
infoColor = color.New(color.FgGreen)
warn = color.New(color.FgYellow)
err = color.New(color.FgRed)
)
func info(format string, a ...interface{}) {
time := time.Now().Format("2006-01-02 15:04:05")
format = fmt.Sprintf("[%s] %s\n", time, format)
infoColor.Printf(format, a...)
}
func main() {
defer func() {
if err := recover(); err != nil {
info("%s", help)
}
}()
FuncMap = make(map[string]func() error)
// 检查是否提供了命令行参数
if len(os.Args) < 2 {
@ -61,6 +79,8 @@ func main() {
register("install", install)
register("status", status)
register("restart", restart)
register("uninstall", uninstall)
register("reload", reload)
funcName := os.Args[1]
if f, ok := FuncMap[funcName]; ok {
e := f()
@ -77,14 +97,14 @@ func register(name string, f func() error) {
}
func install() error {
fmt.Println("install")
// log.Println("install")
if len(os.Args) < 4 {
log.Fatal("请输入要安装的服务类型和区号 install [center|node] 区号")
err.Println("请输入要安装的服务类型和区号 install [center|node] 区号")
}
serverType := os.Args[2]
zone := os.Args[3]
if serverType != "center" && serverType != "node" {
log.Fatal("请输入正确的服务类型 center|node")
err.Println("请输入正确的服务类型 center|node")
}
AppName := cfg.Section("app").Key("app_name").String()
// 生成服务名
@ -96,9 +116,9 @@ func install() error {
if err != nil {
log.Fatal(err)
}
fmt.Printf("文件夹 %s 创建成功\n", folderPath)
info("文件夹 %s 创建成功\n", folderPath)
} else {
fmt.Printf("文件夹 %s 已存在\n", folderPath)
info("文件夹 %s 已存在\n", folderPath)
}
// 生成配置文件
@ -126,7 +146,6 @@ func install() error {
if err != nil {
log.Fatal(err)
}
// defer os.Remove(tempSQLFile.Name())
_, err = tempSQLFile.WriteString(modifiedSQL)
if err != nil {
log.Fatal(err)
@ -138,7 +157,7 @@ func install() error {
dbPassword := cfg.Section("mysql").Key("mysql_password").String()
dbHost := cfg.Section("mysql").Key("mysql_host").String()
dbPort := cfg.Section("mysql").Key("mysql_port").String()
fmt.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName))
// log.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName))
createDBCmd := exec.Command("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName))
createDBCmd.Stdout = os.Stdout
createDBCmd.Stderr = os.Stderr
@ -147,7 +166,7 @@ func install() error {
if err != nil {
log.Fatal(err)
}
fmt.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name()))
// log.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name()))
// 执行修改后的 SQL 文件
cmd := exec.Command("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name()))
cmd.Stdout = os.Stdout
@ -164,8 +183,38 @@ func install() error {
if err != nil {
log.Fatal(err)
}
fmt.Printf("SQL 文件 %s 执行成功\n", sqlFilePath)
fmt.Printf("配置文件 %s 创建成功\n", configPath)
info("SQL 文件 %s 执行成功\n", sqlFilePath)
info("配置文件 %s 创建成功\n", configPath)
return nil
}
func uninstall() error {
stop()
if len(os.Args) < 4 {
log.Fatal("请输入要卸载的服务类型和区号 uninstall [center|node] 区号")
}
serverType := os.Args[2]
zone := os.Args[3]
if serverType != "center" && serverType != "node" {
log.Fatal("请输入正确的服务类型 center|node")
}
AppName := cfg.Section("app").Key("app_name").String()
// 生成服务名
serviceName := fmt.Sprintf("%s_%s_%s", AppName, serverType, zone)
// 判断文件夹是否存在
folderPath := fmt.Sprintf("%s/zone/%s", app_path, serviceName)
if _, err := os.Stat(folderPath); os.IsNotExist(err) {
info("文件夹 %s 不存在\n", folderPath)
return nil
} else {
info("文件夹 %s 存在\n", folderPath)
}
// 删除文件夹
err := os.RemoveAll(folderPath)
if err != nil {
log.Fatal(err)
}
info("文件夹 %s 删除成功\n", folderPath)
return nil
}
@ -217,11 +266,16 @@ func createConfigFile(Id int, Type string) (map[string]interface{}, string) {
}
func start() error {
fmt.Println("start")
// log.Println("start")
if len(os.Args) < 4 {
log.Fatal("请输入要启动的服务类型和区号 start [center|node] 区号")
}
err := status()
if err == nil {
return err
}
info("正在启动服务server %s_%s ...", os.Args[2], os.Args[3])
NodeType := os.Args[2]
Zone := os.Args[3]
// 示例命令
@ -255,7 +309,7 @@ func start() error {
}
// 打印进程号
fmt.Printf("进程 %d 已启动\n", cmd.Process.Pid)
info("server %s_%s已启动, 进程号:%d", os.Args[2], os.Args[3], cmd.Process.Pid)
// 发送命令到子进程
go func() {
@ -275,12 +329,44 @@ func start() error {
return nil
}
func reload() error {
if len(os.Args) < 4 {
log.Fatal("请输入要重启的服务类型和区号 reload [center|node] 区号")
}
NodeType := os.Args[2]
Zone := os.Args[3]
args := fmt.Sprintf("%s_%s", NodeType, Zone)
pid, err := getPidByArgs(args)
if err != nil {
log.Fatal(err)
}
// 向进程发送SIGTERM信号
process, err := os.FindProcess(pid)
if err != nil {
log.Fatal(err)
}
err = process.Signal(syscall.SIGINT)
if err != nil {
log.Fatal(err)
}
fmt.Printf("server %s_%s 已发送SIGINT信号, 进程号: %d\n", NodeType, Zone, pid)
return nil
}
func stop() error {
fmt.Println("stop")
err := status()
if len(os.Args) < 4 {
log.Fatal("请输入要停止的服务类型和区号 stop [center|node] 区号")
}
err := statusInfo()
if err != nil {
return err
}
info("正在关闭服务server %s_%s ...", os.Args[2], os.Args[3])
NodeType := os.Args[2]
Zone := os.Args[3]
// 示例命令
@ -301,39 +387,15 @@ func stop() error {
}
// 关闭进程
err = process.Kill()
err = process.Signal(syscall.SIGTERM)
if err != nil {
log.Fatal(err)
}
// // 等待子进程退出
// _, err = process.Wait()
// if err != nil {
// log.Fatal(err)
// }
fmt.Printf("进程 %d 已关闭\n", pid)
info("server %s_%s 已关闭,进程号:%d", NodeType, Zone, pid)
return nil
}
// func getPidByName(name string) (int, error) {
// cmd := exec.Command("pgrep", name)
// output, err := cmd.Output()
// if err != nil {
// return 0, err
// }
// // 解析输出,获取第一个匹配的进程号
// outputStr := strings.TrimSpace(string(output))
// pidStr := strings.Split(outputStr, "\n")[0]
// pid, err := strconv.Atoi(pidStr)
// if err != nil {
// return 0, err
// }
// return pid, nil
// }
func getPidByArgs(args string) (int, error) {
cmd := exec.Command("pgrep", "-f", args)
output, err := cmd.Output()
@ -353,6 +415,10 @@ func getPidByArgs(args string) (int, error) {
}
func status() error {
if len(os.Args) < 4 {
log.Fatal("请输入要查询的服务类型和区号 status [center|node] 区号")
}
NodeType := os.Args[2]
Zone := os.Args[3]
// 示例命令
@ -372,33 +438,43 @@ func status() error {
return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone)
}
fmt.Printf("节点 %s_%s 启动中, 进程号 %d\n", NodeType, Zone, pid)
info("节点 %s_%s 启动中, 进程号 %d\n", NodeType, Zone, pid)
return nil
}
func statusInfo() error {
NodeType := os.Args[2]
Zone := os.Args[3]
// 示例命令
app_name := cfg.Section("app").Key("app_name").String()
processName := fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone)
// 示例进程名称
// 获取进程号
pid, err := getPidByArgs(processName)
if err != nil {
return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone)
}
// 查找进程
_, err = os.FindProcess(pid)
if err != nil {
return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone)
}
// info.Println("节点 %s_%s 启动中, 进程号 %d\n", NodeType, Zone, pid)
return nil
}
func restart() error {
fmt.Println("restart")
if len(os.Args) < 4 {
log.Fatal("请输入要重启的服务类型和区号 restart [center|node] 区号")
}
err := stop()
if err != nil {
fmt.Println(err)
log.Println(err)
}
for status() == nil {
time.Sleep(1 * time.Second)
}
err = start()
if err != nil {
return err
}
return nil
}
func restartAll() error {
fmt.Println("restartAll")
err := stop()
if err != nil {
fmt.Println(err)
}
for status() == nil {
for statusInfo() == nil {
time.Sleep(1 * time.Second)
}
err = start()