From 3bb6200b1c5008c0be52e6b13d830a5ea6e0aedf Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 17 Apr 2024 20:18:13 +0200 Subject: [PATCH] Added args and tasks to start and stop the sshx shell (#35) Co-authored-by: = <=> --- internal/tasks/tasks.go | 92 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/internal/tasks/tasks.go b/internal/tasks/tasks.go index 89fc848..5e0b3cc 100644 --- a/internal/tasks/tasks.go +++ b/internal/tasks/tasks.go @@ -100,6 +100,10 @@ type taskSetupBackupsArgs struct { RepositoryPassword string `json:"repository_password"` } +type taskStartShellArgs struct { + Timeout int `json:"timeout"` +} + const STATUS_CREATED int = 0 const STATUS_EXECUTING int = 1 @@ -240,6 +244,22 @@ func ExecuteTask(task Task) Task { taskResult := taskDisableTunnel() task.Result = sql.NullString{String: taskResult, Valid: true} + case "start_shell": + log.Println("Starting SSHX.io Shell") + var args taskStartShellArgs + err := json.Unmarshal([]byte(task.Args.String), &args) + if err != nil { + log.Printf("Error reading arguments or start_shell task: %s", err) + } else { + taskResult := taskStartShell(args) + task.Result = sql.NullString{String: taskResult, Valid: true} + } + + case "stop_shell": + log.Println("Stopping SSHX.io Shell...") + taskResult := taskStopShell() + task.Result = sql.NullString{String: taskResult, Valid: true} + case "install_edgeapp": log.Println("Installing EdgeApp...") @@ -931,6 +951,78 @@ func taskDisableTunnel() string { return "{\"status\": \"ok\"}" } +func taskStartShell(args taskStartShellArgs) string { + fmt.Println("Executing taskStartShell") + wsPath := utils.GetPath(utils.WsPath) + + // kill the process if its running + utils.Exec(wsPath, "killall", []string{"sshx"}) + + cmd := exec.Command("/usr/local/bin/sshx", "--quiet", "--shell", "bash") + stdout, err := cmd.StdoutPipe() + if err != nil { + panic(err) + } + scanner := bufio.NewScanner(stdout) + err = cmd.Start() + if err != nil { + panic(err) + } + url := "" + + timeout := args.Timeout + + for scanner.Scan() { + fmt.Println(scanner.Text()) + text := scanner.Text() + if strings.Contains(text, "https://") { + url = text + fmt.Println("Shell start is responding with URL: " + url) + utils.WriteOption("SHELL_URL", url) + utils.WriteOption("SHELL_STATUS", "running") + break + } + } + if scanner.Err() != nil { + cmd.Process.Kill() + cmd.Wait() + panic(scanner.Err()) + } + + go func() { + fmt.Println("Running shell async") + + // cmd.Wait() + + // Keep retrying to calculate timeout to know when to kill the process + for { + timeout = timeout - 1 + if timeout <= 0 { + fmt.Println("Timeout reached, killing process...") + utils.Exec(wsPath, "killall sshx", []string{}) + utils.WriteOption("SHELL_STATUS", "not_running") + break + } + fmt.Println("Active Shell Timeout is " + fmt.Sprint(timeout) + " seconds") + time.Sleep(1 * time.Second) + } + }() + + return "{\"status\": \"ok\"}" +} + +func taskStopShell() string { + fmt.Println("Executing taskStopShell") + wsPath := utils.GetPath(utils.WsPath) + + // kill the process if its running + utils.Exec(wsPath, "killall", []string{"sshx"}) + utils.WriteOption("SHELL_STATUS", "not_running") + + return "{\"status\": \"ok\"}" + +} + func taskInstallEdgeApp(args taskInstallEdgeAppArgs) string { fmt.Println("Executing taskInstallEdgeApp for " + args.ID)