mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-01-02 18:39:05 +01:00
run command submitted via run-command
This commit is contained in:
parent
22aa999a7b
commit
d80517caa0
@ -7,13 +7,16 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/fsnotify/fsnotify"
|
"github.com/fsnotify/fsnotify"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
|
|
||||||
"github.com/scripthaus-dev/sh2-runner/pkg/base"
|
"github.com/scripthaus-dev/sh2-runner/pkg/base"
|
||||||
"github.com/scripthaus-dev/sh2-runner/pkg/packet"
|
"github.com/scripthaus-dev/sh2-runner/pkg/packet"
|
||||||
|
"github.com/scripthaus-dev/sh2-server/pkg/sstore"
|
||||||
"github.com/scripthaus-dev/sh2-server/pkg/wsshell"
|
"github.com/scripthaus-dev/sh2-server/pkg/wsshell"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -144,12 +147,8 @@ func GetPtyOut(w http.ResponseWriter, r *http.Request) {
|
|||||||
io.Copy(w, fd)
|
io.Copy(w, fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
type runCommandParams struct {
|
|
||||||
SessionId string `json:"sessionid"`
|
|
||||||
Command string `json:"command"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func WriteJsonError(w http.ResponseWriter, errVal error) {
|
func WriteJsonError(w http.ResponseWriter, errVal error) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
errMap := make(map[string]interface{})
|
errMap := make(map[string]interface{})
|
||||||
errMap["error"] = errVal.Error()
|
errMap["error"] = errVal.Error()
|
||||||
@ -159,6 +158,7 @@ func WriteJsonError(w http.ResponseWriter, errVal error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func WriteJsonSuccess(w http.ResponseWriter, data interface{}) {
|
func WriteJsonSuccess(w http.ResponseWriter, data interface{}) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
rtnMap := make(map[string]interface{})
|
rtnMap := make(map[string]interface{})
|
||||||
rtnMap["success"] = true
|
rtnMap["success"] = true
|
||||||
if data != nil {
|
if data != nil {
|
||||||
@ -174,6 +174,15 @@ func WriteJsonSuccess(w http.ResponseWriter, data interface{}) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type runCommandParams struct {
|
||||||
|
SessionId string `json:"sessionid"`
|
||||||
|
Command string `json:"command"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type runCommandResponse struct {
|
||||||
|
Line *sstore.LineType `json:"line"`
|
||||||
|
}
|
||||||
|
|
||||||
func HandleRunCommand(w http.ResponseWriter, r *http.Request) {
|
func HandleRunCommand(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
|
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
|
||||||
w.Header().Set("Access-Control-Allow-Credentials", "true")
|
w.Header().Set("Access-Control-Allow-Credentials", "true")
|
||||||
@ -191,8 +200,27 @@ func HandleRunCommand(w http.ResponseWriter, r *http.Request) {
|
|||||||
WriteJsonError(w, fmt.Errorf("error decoding json: %w", err))
|
WriteJsonError(w, fmt.Errorf("error decoding json: %w", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("RUN COMMAND sessionid[%s] cmd[%s]\n", params.SessionId, params.Command)
|
if _, err = uuid.Parse(params.SessionId); err != nil {
|
||||||
WriteJsonSuccess(w, nil)
|
WriteJsonError(w, fmt.Errorf("invalid sessionid '%s': %w", params.SessionId, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
commandStr := strings.TrimSpace(params.Command)
|
||||||
|
if commandStr == "" {
|
||||||
|
WriteJsonError(w, fmt.Errorf("invalid emtpty command"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
rtnLine := sstore.MakeNewLineCmd(commandStr)
|
||||||
|
runPacket := packet.MakeRunPacket()
|
||||||
|
runPacket.SessionId = params.SessionId
|
||||||
|
runPacket.CmdId = rtnLine.CmdId
|
||||||
|
runPacket.ChDir = ""
|
||||||
|
runPacket.Env = nil
|
||||||
|
runPacket.Command = commandStr
|
||||||
|
fmt.Printf("run-packet %v\n", runPacket)
|
||||||
|
WriteJsonSuccess(w, &runCommandResponse{Line: rtnLine})
|
||||||
|
go func() {
|
||||||
|
GlobalRunnerProc.Input.SendPacket(runPacket)
|
||||||
|
}()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
46
pkg/sstore/sstore.go
Normal file
46
pkg/sstore/sstore.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package sstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
var NextLineId = 10
|
||||||
|
|
||||||
|
const LineTypeCmd = "cmd"
|
||||||
|
const LineTypeText = "text"
|
||||||
|
|
||||||
|
type LineType struct {
|
||||||
|
LineId int `json:"lineid"`
|
||||||
|
Ts int64 `json:"ts"`
|
||||||
|
UserId string `json:"userid"`
|
||||||
|
LineType string `json:"linetype"`
|
||||||
|
Text string `json:"text,omitempty"`
|
||||||
|
CmdId string `json:"cmdid,omitempty"`
|
||||||
|
CmdText string `json:"cmdtext,omitempty"`
|
||||||
|
CmdRemote string `json:"cmdremote,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeNewLineCmd(cmdText string) *LineType {
|
||||||
|
rtn := &LineType{}
|
||||||
|
rtn.LineId = NextLineId
|
||||||
|
NextLineId++
|
||||||
|
rtn.Ts = time.Now().UnixMilli()
|
||||||
|
rtn.UserId = "mike"
|
||||||
|
rtn.LineType = LineTypeCmd
|
||||||
|
rtn.CmdId = uuid.New().String()
|
||||||
|
rtn.CmdText = cmdText
|
||||||
|
return rtn
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeNewLineText(text string) *LineType {
|
||||||
|
rtn := &LineType{}
|
||||||
|
rtn.LineId = NextLineId
|
||||||
|
NextLineId++
|
||||||
|
rtn.Ts = time.Now().UnixMilli()
|
||||||
|
rtn.UserId = "mike"
|
||||||
|
rtn.LineType = LineTypeText
|
||||||
|
rtn.Text = text
|
||||||
|
return rtn
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user