videoplayer/service/shellService.go

115 lines
3.1 KiB
Go

package service
import (
"bytes"
"errors"
"log"
"os/exec"
"strings"
"videoplayer/dao"
"videoplayer/proto"
"videoplayer/worker"
)
func CreateShell(shellName, shellContent, server string, uid int) uint {
id := dao.CreateShell(shellName, shellContent, server, uint(uid))
return id
}
func FindShellByAuthID(id int) []dao.Shell {
return dao.FindShellByAuthID(id)
}
func DeleteShellByID(id, authId uint) bool {
user := GetUserByIDFromUserCenter(int(authId))
if user.Role == "admin" {
return dao.DeleteShellByIDV2(id)
}
return dao.DeleteShellByID(id, authId)
}
func UpdateShellByID(id, authId uint, shellName, shellContent, server string, status int, shellResult string) bool {
return dao.UpdateShellByID(id, authId, shellName, shellContent, status, shellResult)
}
func FindShellWillRunByServer(server string, uid int) ([]dao.Shell, error) {
var shells []dao.Shell
var err error
if server == "" {
//err设置为server为空
err = errors.New("server is empty")
return shells, err
}
shells = dao.FindShellWillRunByServer(server, uint(uid))
//设置状态为执行中
for _, v := range shells {
dao.UpdateShellByID(v.ID, uint(uid), v.ShellName, v.ShellContent, v.Status+1, v.ShellResult)
}
return shells, err
}
// 从服务器定时获取shell、执行并返回结果
func ShellWillRunFromServer() {
shells, err := GetShellWillRunFromMaster(proto.Config.SERVER_NAME)
if err != nil {
return
}
var resp []proto.UpdateShellReq
for _, v := range shells {
//执行shell脚本,go执行命令
res, err2 := RunShell(v.ShellContent)
if err2 != "" {
resp = append(resp, proto.UpdateShellReq{ID: v.ID, Server: v.Server, Status: 2, ShellResult: err2})
} else {
resp = append(resp, proto.UpdateShellReq{ID: v.ID, Server: v.Server, Status: 2, ShellResult: res})
}
}
if len(resp) == 0 {
return
}
//返回执行结果
url := "https://" + proto.Config.MASTER_SERVER_DOMAIN + "/shell/update?super_id=1"
var req proto.SyncUserShellResp
req.Token = worker.GetRedisSetMembers("super_permission_tokens")[0]
req.Shells = resp
resp_data, err := worker.SyncDataFromMasterShellReq3(url, req)
if err != nil {
return
}
//更新执行结果
for _, v := range resp_data {
if v.Status < 0 {
log.Fatalln("update shell failed:", v.ID, v.Status)
}
}
}
// 从服务器从主服务器获取待执行的shell
func GetShellWillRunFromMaster(server string) ([]dao.Shell, error) {
master := proto.Config.MASTER_SERVER_DOMAIN
//发起请求获取待执行的shell
url := "https://" + master + "/shell/server_will_run_list?super_id=1"
var req proto.SyncUserShellReq
req.Server = server
req.Token = worker.GetRedisSetMembers("super_permission_tokens")[0]
shells, err := worker.SyncDataFromMasterShellReq2(url, req)
if err != nil {
return nil, err
}
return shells, nil
}
func RunShell(script string) (res, err string) {
cmd := exec.Command("/bin/bash", "-c", script)
// 使用bytes.Buffer捕获输出
var out bytes.Buffer
cmd.Stdout = &out
err3 := cmd.Run()
err3_info := ""
if err3 != nil {
err3_info = err3.Error()
}
return strings.TrimSpace(out.String()), err3_info
}