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 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 }