版本更新
This commit is contained in:
parent
f0979ccc7e
commit
74df056d24
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,6 +1,7 @@
|
||||
/log
|
||||
/config
|
||||
/Goleaf
|
||||
/MergePet
|
||||
Goleaf.tar
|
||||
source/main
|
||||
playbook/node_modules/*
|
||||
|
||||
@ -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)
|
||||
|
||||
10
kafka/go.mod
10
kafka/go.mod
@ -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
|
||||
)
|
||||
|
||||
@ -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=
|
||||
|
||||
@ -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.
@ -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]"
|
||||
|
||||
@ -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
36
nginx/web.conf
Normal 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;
|
||||
}
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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
11
playbook/kafka.yml
Normal 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
|
||||
81
playbook/merge_pet_install.yml
Normal file
81
playbook/merge_pet_install.yml
Normal 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
|
||||
|
||||
@ -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
|
||||
|
||||
1344
playbook/package-lock.json
generated
1344
playbook/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,5 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"protobufjs-cli": "^1.1.3"
|
||||
}
|
||||
}
|
||||
32
playbook/web.yml
Normal file
32
playbook/web.yml
Normal 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
5
script/install.sh
Normal 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
|
||||
@ -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))
|
||||
|
||||
@ -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
62
source/docker-ce.repo
Normal 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
|
||||
BIN
source/libcgroup-0.41-19.el8.i686.rpm
Normal file
BIN
source/libcgroup-0.41-19.el8.i686.rpm
Normal file
Binary file not shown.
BIN
source/nodejs-20.18.1-1.module_el9+1145+0c321386.x86_64.rpm
Normal file
BIN
source/nodejs-20.18.1-1.module_el9+1145+0c321386.x86_64.rpm
Normal file
Binary file not shown.
10
tool/go.mod
10
tool/go.mod
@ -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
|
||||
)
|
||||
|
||||
15
tool/go.sum
15
tool/go.sum
@ -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=
|
||||
|
||||
198
tool/main.go
198
tool/main.go
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user