Skip to content

Commit 05d45c5

Browse files
committed
gotty port申请依赖mysql
1 parent e75727b commit 05d45c5

File tree

7 files changed

+79
-68
lines changed

7 files changed

+79
-68
lines changed

library/core/cmd.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package core
33
import (
44
"app/library/types/convert"
55
"errors"
6+
"fmt"
67
"os/exec"
78
"regexp"
89
"sort"
@@ -37,6 +38,7 @@ func KillProcessGroup(options ...interface{}) error {
3738
if err != nil {
3839
return err
3940
}
41+
fmt.Println(string(bytes))
4042
re := regexp.MustCompile("[0-9]+")
4143
pidList := re.FindAllString(string(bytes), -1)
4244
if pidList != nil && len(pidList) > 0 {

local/create.sql

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-- 2022-07-12 11:17:46
1+
-- 2022-07-21 10:14:10
22

33

44

@@ -10,7 +10,7 @@ CREATE TABLE IF NOT EXISTS `d_cfg` (
1010
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
1111
`deleted_at` datetime DEFAULT NULL,
1212
PRIMARY KEY (`id`)
13-
) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8mb4;
13+
) ENGINE=InnoDB AUTO_INCREMENT=139 DEFAULT CHARSET=utf8mb4;
1414

1515
CREATE TABLE IF NOT EXISTS `d_history` (
1616
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -28,10 +28,12 @@ CREATE TABLE IF NOT EXISTS `d_history` (
2828
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
2929
`deleted_at` datetime DEFAULT NULL,
3030
`ci` varchar(1000) DEFAULT '',
31+
`nodes` text COMMENT '多个node',
32+
`rollback` int(11) DEFAULT NULL COMMENT 'rollback history id',
3133
PRIMARY KEY (`id`),
3234
KEY `idx_deleted_at` (`deleted_at`),
3335
KEY `idx_project_id` (`project_id`)
34-
) ENGINE=InnoDB AUTO_INCREMENT=264 DEFAULT CHARSET=utf8mb4;
36+
) ENGINE=InnoDB AUTO_INCREMENT=296 DEFAULT CHARSET=utf8mb4;
3537

3638
CREATE TABLE IF NOT EXISTS `d_node` (
3739
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -78,9 +80,10 @@ CREATE TABLE IF NOT EXISTS `d_project_cronjob` (
7880
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
7981
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
8082
`deleted_at` datetime DEFAULT NULL,
83+
`nodes` text COMMENT '多个node',
8184
PRIMARY KEY (`id`),
8285
UNIQUE KEY `unq_project_id` (`project_id`)
83-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
86+
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
8487

8588
CREATE TABLE IF NOT EXISTS `d_project_user` (
8689
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -113,7 +116,19 @@ CREATE TABLE IF NOT EXISTS `d_tag_rel` (
113116
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
114117
`deleted_at` datetime DEFAULT NULL,
115118
PRIMARY KEY (`id`)
116-
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
119+
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
120+
121+
CREATE TABLE IF NOT EXISTS `d_tty_port` (
122+
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
123+
`uid` int(11) NOT NULL DEFAULT '0',
124+
`port` int(11) NOT NULL DEFAULT '0',
125+
`cmd` varchar(10000) DEFAULT '',
126+
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
127+
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
128+
`deleted_at` datetime DEFAULT NULL,
129+
PRIMARY KEY (`id`),
130+
UNIQUE KEY `uniq_port` (`port`)
131+
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='Tty port use list';
117132

118133
CREATE TABLE IF NOT EXISTS `d_user` (
119134
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
@@ -134,4 +149,4 @@ CREATE TABLE IF NOT EXISTS `d_user` (
134149
`from` varchar(20) DEFAULT '' COMMENT 'user register from',
135150
PRIMARY KEY (`id`),
136151
UNIQUE KEY `unq_username` (`username`)
137-
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
152+
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

models/init_db.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ func initDBPreHeating() {
9898
} else {
9999
log.StdOut("init", "db.user.test.password:", userTest.Password)
100100
}
101+
//clear db
102+
_db.Unscoped().Delete(&TtyPort{}, "1=1")
101103
}
102104

103105
//如果传了db连接,使用传入的db连接(用于事务开启场景)

models/tty.go

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,56 +6,59 @@ import (
66
"app/library/types/jsonutil"
77
"errors"
88
"fmt"
9+
"github.com/gin-gonic/gin"
910
"github.com/imroc/req"
11+
"gorm.io/gorm"
1012
"net/http"
1113
"os/exec"
12-
"sync"
14+
"strings"
15+
"syscall"
1316
"time"
1417
)
1518

16-
var ttyPorts sync.Map
19+
const (
20+
TTY_PORT_START = 40000
21+
)
22+
23+
type TtyPort struct {
24+
ID uint32 `gorm:"primarykey;column:id" json:"id" form:"id"`
25+
Uid uint32 `gorm:"" json:"-" form:"-"`
26+
Port uint32 `gorm:"" json:"-" form:"-"`
27+
Cmd string `gorm:"" json:"-" form:"-"`
28+
CreatedAt time.Time `json:"createdAt"`
29+
UpdatedAt time.Time `json:"updatedAt"`
30+
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
31+
}
1732

18-
func KillPortProcess(port int) error {
19-
return nil
20-
//i, ok := ttyPorts.Load(port)
21-
//if !ok {
22-
// return nil
23-
//}
24-
//md5ID, ok := i.(string)
25-
//if !ok || md5ID == "" {
26-
// return nil
27-
//}
28-
//cmd := exec.Command("sh", "-c", fmt.Sprintf(`ps aux | grep -e "MD5=%s" | grep -v grep | awk '{print $1}' | sort -rn | sed -n '1p' | xargs kill`, md5ID))
29-
//bytes, err := cmd.CombinedOutput()
30-
//fmt.Println(cmd.Args, string(bytes))
31-
//return err
33+
func (t *TtyPort) TableName() string {
34+
return "d_tty_port"
3235
}
3336

34-
func CreateGoTTY(writeFlag bool, md5ID string, arg ...string) (port int, err error) {
35-
port = 40000
36-
for {
37-
if _, ok := ttyPorts.Load(port); ok {
38-
port++
37+
func CreateGoTTY(c *gin.Context, writeFlag bool, arg ...string) (port uint32, err error) {
38+
//gotty port save
39+
err = DB().Transaction(func(tx *gorm.DB) error {
40+
var find TtyPort
41+
if tx.Order("port DESC").First(&find).Error == nil {
42+
port = find.Port + 1
3943
} else {
40-
break
44+
port = TTY_PORT_START
4145
}
42-
}
43-
if port > 50000 {
44-
err = errors.New("TTY No Port Can Used")
46+
//create tty args
47+
var appendArg = []string{}
48+
if writeFlag {
49+
appendArg = append(appendArg, "-w")
50+
}
51+
appendArg = append(appendArg, "-p", convert.MustString(port), "--once", "--timeout", "15")
52+
arg = append(appendArg, arg...)
53+
//save tty port
54+
return tx.Save(&TtyPort{Uid: UID(c), Port: port, Cmd: strings.Join(append([]string{"gotty"}, arg...), " ")}).Error
55+
})
56+
if err != nil {
4557
return
4658
}
47-
ttyPorts.Store(port, md5ID)
48-
var appendArg = []string{}
49-
if writeFlag {
50-
appendArg = append(appendArg, "-w")
51-
}
52-
appendArg = append(appendArg, "-p", convert.MustString(port), "--once", "--timeout", "10")
53-
arg = append(appendArg, arg...)
54-
59+
//create gotty process
5560
var waitChan = make(chan int, 1)
5661
defer close(waitChan)
57-
58-
//create gotty process
5962
var cmd *exec.Cmd
6063
go func() {
6164
defer func() {
@@ -65,7 +68,8 @@ func CreateGoTTY(writeFlag bool, md5ID string, arg ...string) (port int, err err
6568
}()
6669
cmd = exec.Command("gotty", arg...)
6770
log.StdOut("gotty", port, "end", cmd.Run())
68-
ttyPorts.Delete(port) //delete port maps
71+
time.Sleep(time.Second) //wait for gotty process finish
72+
DB().Unscoped().Delete(&TtyPort{}, "port=?", port) //delete port maps
6973
}()
7074
//test connect
7175
var testing = true
@@ -80,10 +84,10 @@ func CreateGoTTY(writeFlag bool, md5ID string, arg ...string) (port int, err err
8084
waitChan <- 1
8185
return
8286
}
83-
if time.Now().After(startTime.Add(time.Second * 3)) { //timeout
84-
err = errors.New("timeout")
87+
if time.Now().After(startTime.Add(time.Second * 10)) { //timeout
88+
err = errors.New("wait gotty timeout")
8589
if cmd != nil && cmd.Process != nil {
86-
log.StdWarning("gotty", "timeout killed", cmd.Process.Kill())
90+
log.StdWarning("gotty", "timeout killed", cmd.Process.Signal(syscall.SIGINT), cmd.Process.Kill())
8791
}
8892
waitChan <- 1
8993
return

web/middleware/recovery.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ package middleware
66

77
import (
88
"app/library/g"
9-
"app/library/ginutil"
10-
"errors"
119
"fmt"
1210
"github.com/gin-gonic/gin"
1311
"runtime"
@@ -18,14 +16,10 @@ func Recovery() gin.HandlerFunc {
1816
defer func() {
1917
if re := recover(); re != nil {
2018
var errorContent string
21-
if ginutil.Input(c, "debug") == "1" {
22-
var buf [4096]byte
23-
n := runtime.Stack(buf[:], false)
24-
errorContent = string(buf[:n])
25-
} else {
26-
errorContent = fmt.Sprintf("%v", re)
27-
}
28-
g.WarningAsPanic(c, errors.New(errorContent))
19+
var buf [4096]byte
20+
n := runtime.Stack(buf[:], false)
21+
errorContent = string(buf[:n])
22+
g.WarningAsPanic(c, fmt.Errorf("%v\n%s", re, errorContent))
2923
}
3024
}()
3125

web/service/tty/create.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ package tty
22

33
import (
44
"app/library/ginutil"
5-
"app/library/uuid"
65
"app/models"
76
"errors"
87
"fmt"
98
"github.com/gin-gonic/gin"
10-
"strings"
119
)
1210

1311
type TTYCode string
@@ -33,11 +31,10 @@ func Create(c *gin.Context) (res gin.H, err error) {
3331
if err = ginutil.ShouldBind(c, &val); err != nil {
3432
return
3533
}
36-
var port int
37-
var md5ID = uuid.GetUUID(val.Code)
34+
var port uint32
3835
switch val.Code {
3936
case TTYCodeBash:
40-
port, err = models.CreateGoTTY(true, "", "bash")
37+
port, err = models.CreateGoTTY(c, true, "bash")
4138
//default: "--close-signal", "1", // SIGHUP
4239
case TTYCodeNode: //node
4340
//permission check
@@ -51,7 +48,7 @@ func Create(c *gin.Context) (res gin.H, err error) {
5148
if err != nil {
5249
return
5350
}
54-
port, err = models.CreateGoTTY(true, md5ID, append([]string{"--close-cmd", "exit"}, args...)...)
51+
port, err = models.CreateGoTTY(c, true, append([]string{"--close-cmd", "exit"}, args...)...)
5552
//"--close-signal", "9", // SIGKILL, kill -9
5653
}
5754
case TTYCodeExec: //docker exec
@@ -67,11 +64,10 @@ func Create(c *gin.Context) (res gin.H, err error) {
6764
} else {
6865
err = errors.New("pod not found")
6966
}
70-
fmt.Println(strings.Join(args, " "))
7167
if err != nil {
7268
return
7369
}
74-
port, err = models.CreateGoTTY(true, md5ID, append([]string{"--close-cmd", "exit"}, args...)...)
70+
port, err = models.CreateGoTTY(c, true, append([]string{"--close-cmd", "exit"}, args...)...)
7571
//"--close-signal", "9", // SIGKILL, kill -9
7672
}
7773
case TTYCodeLogs: //docker logs
@@ -87,11 +83,10 @@ func Create(c *gin.Context) (res gin.H, err error) {
8783
} else {
8884
err = errors.New("pod not found")
8985
}
90-
fmt.Println(strings.Join(args, " "))
9186
if err != nil {
9287
return
9388
}
94-
port, err = models.CreateGoTTY(true, md5ID, append([]string{"--close-cmd", "exit"}, args...)...)
89+
port, err = models.CreateGoTTY(c, true, append([]string{"--close-cmd", "exit"}, args...)...)
9590
//"--close-signal", "9", // SIGKILL, kill -9
9691
}
9792
case TTYCodeTail: //history apply tail
@@ -103,6 +98,7 @@ func Create(c *gin.Context) (res gin.H, err error) {
10398
}
10499
}
105100
port, err = models.CreateGoTTY(
101+
c,
106102
false, "",
107103
"--close-signal", "2", // SIGINT, ctrl-c
108104
"tail", "-f", "-n", "5000", logFilePath,

web/service/tty/index.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package tty
22

33
import (
44
"app/library/log"
5-
"app/library/types/convert"
6-
"app/models"
75
"github.com/gin-gonic/gin"
86
"github.com/gorilla/websocket"
97
"net/url"
@@ -97,7 +95,7 @@ func Proxy(c *gin.Context, port, assist string) {
9795
}
9896
defer func() {
9997
ws.Close()
100-
log.StdOut("gotty", "conn.closed", c.Request.RequestURI, models.KillPortProcess(convert.MustInt(port)))
98+
log.StdOut("gotty", "conn.closed", c.Request.RequestURI)
10199
}()
102100

103101
wsUrl := url.URL{Scheme: "ws", Host: "127.0.0.1:" + port, Path: "/ws"}

0 commit comments

Comments
 (0)