Compare commits
10 Commits
fd71cc85c4
...
36e0fdb797
| Author | SHA1 | Date |
|---|---|---|
|
|
36e0fdb797 | |
|
|
4178bf0622 | |
|
|
25581bcbf9 | |
|
|
1578be6b4b | |
|
|
a0e2415370 | |
|
|
07d8e6c489 | |
|
|
7d98cb19ae | |
|
|
dc72a8e3a6 | |
|
|
55eaea79be | |
|
|
d4877d283d |
11
dao/cid.go
11
dao/cid.go
|
|
@ -90,11 +90,16 @@ func FindRunLogByAuthID(auth_id int) []CIDRunLog {
|
||||||
return cidRunLogs
|
return cidRunLogs
|
||||||
}
|
}
|
||||||
|
|
||||||
func FindRunLogByID(auth_id, cid_id int) CIDRunLog {
|
func FindRunLogByID(auth_id, cid_id int) []CIDRunLog {
|
||||||
var cidRunLog CIDRunLog
|
var cidRunLog []CIDRunLog
|
||||||
DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).First(&cidRunLog)
|
DB.Debug().Where("cid_id = ? and auth_id = ?", cid_id, auth_id).Order("created_at desc").Find(&cidRunLog)
|
||||||
return cidRunLog
|
return cidRunLog
|
||||||
}
|
}
|
||||||
|
func FindRunLogByCIDLogID(id, auth_id int) []CIDRunLog {
|
||||||
|
var cidRunLogs []CIDRunLog
|
||||||
|
DB.Debug().Where("id = ? and auth_id = ?", id, auth_id).Order("created_at desc").Find(&cidRunLogs)
|
||||||
|
return cidRunLogs
|
||||||
|
}
|
||||||
|
|
||||||
func FindCIDByIDAndToken(id int, token string) CID {
|
func FindCIDByIDAndToken(id int, token string) CID {
|
||||||
var cid CID
|
var cid CID
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,12 @@ func FindUserByID(id int) []proto.User {
|
||||||
return users
|
return users
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FindUserByUserID(id int) User {
|
||||||
|
var user User
|
||||||
|
DB.Debug().Where("id = ?", id).First(&user)
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
|
||||||
func FindUserByName(name string) User {
|
func FindUserByName(name string) User {
|
||||||
var user User
|
var user User
|
||||||
fmt.Println("name:", name)
|
fmt.Println("name:", name)
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ type CIDRunReq struct {
|
||||||
ID int `json:"id" form:"id"`
|
ID int `json:"id" form:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CIDLogReq struct {
|
||||||
|
ID int `json:"id" form:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
type CIDUpdateReq struct {
|
type CIDUpdateReq struct {
|
||||||
ID int `json:"id" form:"id"`
|
ID int `json:"id" form:"id"`
|
||||||
Name string `json:"name" form:"name"`
|
Name string `json:"name" form:"name"`
|
||||||
|
|
@ -50,6 +54,7 @@ func RunCID(c *gin.Context) {
|
||||||
// 获取用户ID
|
// 获取用户ID
|
||||||
id, _ := c.Get("id")
|
id, _ := c.Get("id")
|
||||||
authID := int(id.(float64))
|
authID := int(id.(float64))
|
||||||
|
username, _ := c.Get("username")
|
||||||
cid := dao.FindCIDByID(req.ID, authID)
|
cid := dao.FindCIDByID(req.ID, authID)
|
||||||
if cid.ID == 0 {
|
if cid.ID == 0 {
|
||||||
c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"})
|
c.JSON(200, gin.H{"error": "CID not found", "code": proto.OperationFailed, "message": "failed"})
|
||||||
|
|
@ -60,28 +65,32 @@ func RunCID(c *gin.Context) {
|
||||||
names := strings.Split(name, ".")
|
names := strings.Split(name, ".")
|
||||||
name = names[0]
|
name = names[0]
|
||||||
|
|
||||||
//脚本内容
|
//脚本内容,不同用户的持续集成、部署目录不同
|
||||||
scriptContent := `#!/bin/bash
|
scriptContent := `
|
||||||
TARGET_DIR = ` + proto.CID_BASE_DIR + `/workspace` + name + `
|
echo "start"
|
||||||
if [ ! -d $TARGET_DIR ]; then
|
TARGET_DIR=` + proto.CID_BASE_DIR + username.(string) + `/workspace/` + name + `
|
||||||
git clone ` + cid.Url + `
|
if [ ! -d $TARGET_DIR ]; then
|
||||||
cd $TARGET_DIR/` + name + `
|
git clone ` + cid.Url + `
|
||||||
else
|
cd $TARGET_DIR
|
||||||
cd $TARGET_DIR/` + name + `
|
else
|
||||||
git pull
|
cd $TARGET_DIR
|
||||||
fi
|
git pull
|
||||||
` + cid.Script
|
fi
|
||||||
|
` + cid.Script + `
|
||||||
|
pwd
|
||||||
|
ls -lh
|
||||||
|
echo "end"`
|
||||||
//执行脚本
|
//执行脚本
|
||||||
cmd := exec.Command("/bin/bash", "-c", scriptContent)
|
cmd := exec.Command("/bin/bash", "-c", scriptContent)
|
||||||
|
// 使用bytes.Buffer捕获输出
|
||||||
|
var out bytes.Buffer
|
||||||
|
cmd.Stdout = &out
|
||||||
err3 := cmd.Run()
|
err3 := cmd.Run()
|
||||||
err3_info := ""
|
err3_info := ""
|
||||||
if err3 != nil {
|
if err3 != nil {
|
||||||
err3_info = err3.Error()
|
err3_info = err3.Error()
|
||||||
}
|
}
|
||||||
fmt.Println("bash content:", scriptContent)
|
fmt.Println("bash content:", scriptContent)
|
||||||
// 使用bytes.Buffer捕获输出
|
|
||||||
var out bytes.Buffer
|
|
||||||
cmd.Stdout = &out
|
|
||||||
dao.CreateRunLog(req.ID, authID, scriptContent, out.String(), err3_info) //添加执行日志
|
dao.CreateRunLog(req.ID, authID, scriptContent, out.String(), err3_info) //添加执行日志
|
||||||
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
|
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
|
||||||
|
|
||||||
|
|
@ -161,7 +170,7 @@ func GetCIDLog(c *gin.Context) {
|
||||||
// 获取用户ID
|
// 获取用户ID
|
||||||
id, _ := c.Get("id")
|
id, _ := c.Get("id")
|
||||||
authID := int(id.(float64))
|
authID := int(id.(float64))
|
||||||
cidLogs := dao.FindRunLogByID(req.ID, authID)
|
cidLogs := dao.FindRunLogByCIDLogID(req.ID, authID)
|
||||||
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cidLogs})
|
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cidLogs})
|
||||||
} else {
|
} else {
|
||||||
c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"})
|
c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"})
|
||||||
|
|
@ -172,8 +181,13 @@ func GetCIDLogList(c *gin.Context) {
|
||||||
// 获取用户ID
|
// 获取用户ID
|
||||||
id, _ := c.Get("id")
|
id, _ := c.Get("id")
|
||||||
authID := int(id.(float64))
|
authID := int(id.(float64))
|
||||||
cidLogs := dao.FindRunLogByAuthID(authID)
|
var req CIDLogReq
|
||||||
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cidLogs})
|
if err := c.ShouldBind(&req); err == nil {
|
||||||
|
cidLogs := dao.FindRunLogByID(authID, req.ID)
|
||||||
|
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": cidLogs})
|
||||||
|
} else {
|
||||||
|
c.JSON(200, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CIDCallback(c *gin.Context) {
|
func CIDCallback(c *gin.Context) {
|
||||||
|
|
@ -193,26 +207,31 @@ func CIDCallback(c *gin.Context) {
|
||||||
name := strs[len(strs)-1]
|
name := strs[len(strs)-1]
|
||||||
names := strings.Split(name, ".")
|
names := strings.Split(name, ".")
|
||||||
name = names[0]
|
name = names[0]
|
||||||
scriptContent := `#!/bin/bash
|
user := dao.FindUserByUserID(res.Auth_id)
|
||||||
TARGET_DIR = ` + proto.CID_BASE_DIR + `/workspace` + name + `
|
scriptContent := `
|
||||||
if [ ! -d $TARGET_DIR ]; then
|
echo "start"
|
||||||
git clone ` + res.Url + `
|
TARGET_DIR=` + proto.CID_BASE_DIR + user.Name + `workspace/` + name + `
|
||||||
cd $TARGET_DIR/` + name + `
|
if [ ! -d $TARGET_DIR ]; then
|
||||||
else
|
git clone ` + res.Url + `
|
||||||
cd $TARGET_DIR/` + name + `
|
cd $TARGET_DIR
|
||||||
git pull
|
else
|
||||||
fi
|
cd $TARGET_DIR
|
||||||
` + res.Script
|
git pull
|
||||||
|
fi
|
||||||
|
` + res.Script + `
|
||||||
|
pwd
|
||||||
|
ls -lh
|
||||||
|
echo "end"`
|
||||||
//执行脚本
|
//执行脚本
|
||||||
cmd := exec.Command("/bin/bash", "-c", scriptContent)
|
cmd := exec.Command("/bin/bash", "-c", scriptContent)
|
||||||
|
// 使用bytes.Buffer捕获输出
|
||||||
|
var out bytes.Buffer
|
||||||
|
cmd.Stdout = &out
|
||||||
err3 := cmd.Run()
|
err3 := cmd.Run()
|
||||||
err3_info := ""
|
err3_info := ""
|
||||||
if err3 != nil {
|
if err3 != nil {
|
||||||
err3_info = err3.Error()
|
err3_info = err3.Error()
|
||||||
}
|
}
|
||||||
// 使用bytes.Buffer捕获输出
|
|
||||||
var out bytes.Buffer
|
|
||||||
cmd.Stdout = &out
|
|
||||||
dao.CreateRunLog(cid, res.Auth_id, scriptContent, out.String(), err3_info) //添加执行日志
|
dao.CreateRunLog(cid, res.Auth_id, scriptContent, out.String(), err3_info) //添加执行日志
|
||||||
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
|
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": "success"})
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,7 @@ func SRMessage(c *gin.Context) {
|
||||||
var res3 []byte
|
var res3 []byte
|
||||||
var msg proto.Message
|
var msg proto.Message
|
||||||
if res2 != "" {
|
if res2 != "" {
|
||||||
|
//若有消息则发送消息
|
||||||
msg.Type = "msg"
|
msg.Type = "msg"
|
||||||
msg.Msg = res2
|
msg.Msg = res2
|
||||||
msg.From_user_id = id1
|
msg.From_user_id = id1
|
||||||
|
|
@ -194,12 +195,25 @@ func SRMessage(c *gin.Context) {
|
||||||
msg.Session = res
|
msg.Session = res
|
||||||
res3, _ = json.Marshal(msg)
|
res3, _ = json.Marshal(msg)
|
||||||
}
|
}
|
||||||
|
//判断对方是否在线,若不在线则发送离线消息,否则正常发送消息
|
||||||
|
if worker.IsContainKey(to_user_id+"_status") == true {
|
||||||
|
if worker.GetRedis(to_user_id+"_status") == "0" {
|
||||||
|
msg.Type = "offline"
|
||||||
|
msg.Msg = "offline"
|
||||||
|
msg.From_user_id = -1
|
||||||
|
msg.Session = res
|
||||||
|
res3, _ = json.Marshal(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
err2 := ws.WriteMessage(websocket.TextMessage, res3)
|
err2 := ws.WriteMessage(websocket.TextMessage, res3)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
|
worker.SetRedisWithExpire("user_"+id.(string)+"_status", "0", time.Second*120) //设置用户在线状态,1为在线,0为离线,5秒后过期
|
||||||
clientsMux.Lock()
|
clientsMux.Lock()
|
||||||
delete(clients, ws)
|
delete(clients, ws)
|
||||||
clientsMux.Unlock()
|
clientsMux.Unlock()
|
||||||
break
|
break
|
||||||
|
} else {
|
||||||
|
worker.SetRedisWithExpire("user_"+id.(string)+"_status", "1", time.Second*5) //设置用户在线状态,1为在线,0为离线,5秒后过期
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second * 1) // 每1秒查询一次
|
time.Sleep(time.Second * 1) // 每1秒查询一次
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,7 @@ func loginHandler(c *gin.Context) {
|
||||||
func registerHandler(c *gin.Context) {
|
func registerHandler(c *gin.Context) {
|
||||||
var req_data RLReq
|
var req_data RLReq
|
||||||
tokenString := ""
|
tokenString := ""
|
||||||
|
var id uint
|
||||||
if err := c.ShouldBindJSON(&req_data); err == nil {
|
if err := c.ShouldBindJSON(&req_data); err == nil {
|
||||||
if len(req_data.Password) != 32 {
|
if len(req_data.Password) != 32 {
|
||||||
hasher := md5.New()
|
hasher := md5.New()
|
||||||
|
|
@ -263,7 +264,7 @@ func registerHandler(c *gin.Context) {
|
||||||
c.JSON(200, gin.H{"error": "user already exists", "code": proto.UsernameExists, "message": "error"})
|
c.JSON(200, gin.H{"error": "user already exists", "code": proto.UsernameExists, "message": "error"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
id := service.CreateUser(req_data.User, req_data.Password, req_data.Email, req_data.Gender, req_data.Age)
|
id = service.CreateUser(req_data.User, req_data.Password, req_data.Email, req_data.Gender, req_data.Age)
|
||||||
if id == 0 {
|
if id == 0 {
|
||||||
c.JSON(200, gin.H{"error": "create user error", "code": proto.OperationFailed, "message": "error"})
|
c.JSON(200, gin.H{"error": "create user error", "code": proto.OperationFailed, "message": "error"})
|
||||||
return
|
return
|
||||||
|
|
@ -290,6 +291,11 @@ func registerHandler(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 返回令牌
|
// 返回令牌
|
||||||
c.JSON(200, gin.H{"token": tokenString, "username": req_data.User, "code": proto.SuccessCode, "message": "success"})
|
data := make(map[string]interface{})
|
||||||
|
data["id"] = id
|
||||||
|
data["username"] = req_data.User
|
||||||
|
data["email"] = req_data.Email
|
||||||
|
data["token"] = tokenString
|
||||||
|
c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "date": data})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3
main.go
3
main.go
|
|
@ -17,6 +17,7 @@ var signingKey = []byte(proto.TOKEN_SECRET)
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
|
gin.SetMode(gin.ReleaseMode)
|
||||||
dao.Init()
|
dao.Init()
|
||||||
worker.InitRedis()
|
worker.InitRedis()
|
||||||
r.Use(handler.CrosHandler())
|
r.Use(handler.CrosHandler())
|
||||||
|
|
@ -69,7 +70,7 @@ func JWTAuthMiddleware() gin.HandlerFunc {
|
||||||
}
|
}
|
||||||
|
|
||||||
//如果请求为login或register,则不需要验证token
|
//如果请求为login或register,则不需要验证token
|
||||||
if strings.Contains(c.Request.URL.Path, "/login") || strings.Contains(c.Request.URL.Path, "/register") || strings.Contains(c.Request.URL.Path, "/uuid") || strings.Contains(c.Request.URL.Path, "/gqr") {
|
if strings.Contains(c.Request.URL.Path, "/login") || strings.Contains(c.Request.URL.Path, "/register") || strings.Contains(c.Request.URL.Path, "/uuid") || strings.Contains(c.Request.URL.Path, "/gqr") || strings.Contains(c.Request.URL.Path, "/cid/callback") {
|
||||||
c.Next()
|
c.Next()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue