diff --git a/mantle/cmd/kola/devshell.go b/mantle/cmd/kola/devshell.go index d217bc8a8d..4e4484884e 100644 --- a/mantle/cmd/kola/devshell.go +++ b/mantle/cmd/kola/devshell.go @@ -64,8 +64,11 @@ func displayStatusMsg(status, msg string, termMaxWidth int) { } func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *conf.Conf, sshCommand string) error { - if !term.IsTerminal(0) { - return fmt.Errorf("stdin is not a tty") + ontty := term.IsTerminal(0) + if sshCommand == "" { + if !ontty { + return fmt.Errorf("stdin is not a tty") + } } termMaxWidth, _, err := term.GetSize(0) if err != nil { @@ -171,6 +174,7 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co // Start the SSH client sc := newSshClient(ip, agent.Socket, sshCommand) + sc.ontty = ontty go sc.controlStartStop() ready := false @@ -187,8 +191,10 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co // handle console messages. If SSH is not ready, then display a // a status message on the console. case serialMsg := <-serialChan: - if !ready { - displayStatusMsg(statusMsg, serialMsg, termMaxWidth) + if ontty { + if !ready { + displayStatusMsg(statusMsg, serialMsg, termMaxWidth) + } } lastMsg = serialMsg // monitor the err channel @@ -202,7 +208,9 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co // monitor the instance state case <-qemuWaitChan: - displayStatusMsg("DONE", "QEMU instance terminated", termMaxWidth) + if ontty { + displayStatusMsg("DONE", "QEMU instance terminated", termMaxWidth) + } return nil // monitor the machine state events from console/serial logs @@ -233,17 +241,23 @@ func runDevShellSSH(ctx context.Context, builder *platform.QemuBuilder, conf *co statusMsg = "QEMU guest is booting" } } - displayStatusMsg(fmt.Sprintf("EVENT | %s", statusMsg), lastMsg, termMaxWidth) + if ontty { + displayStatusMsg(fmt.Sprintf("EVENT | %s", statusMsg), lastMsg, termMaxWidth) + } // monitor the SSH connection case err := <-sc.errChan: if err == nil { sc.controlChan <- sshNotReady - displayStatusMsg("SESSION", "Clean exit from SSH, terminating instance", termMaxWidth) + if ontty { + displayStatusMsg("SESSION", "Clean exit from SSH, terminating instance", termMaxWidth) + } return nil } else if sshCommand != "" { sc.controlChan <- sshNotReady - displayStatusMsg("SESSION", "SSH command exited, terminating instance", termMaxWidth) + if ontty { + displayStatusMsg("SESSION", "SSH command exited, terminating instance", termMaxWidth) + } return err } if ready { @@ -456,6 +470,7 @@ type sshClient struct { port string agent string cmd string + ontty bool controlChan chan sshControlMessage errChan chan error sshCmd *exec.Cmd @@ -512,8 +527,10 @@ func (sc *sshClient) start() { if sc.cmd != "" { sshArgs = append(sshArgs, "--", sc.cmd) } - fmt.Printf("\033[2K\r") // clear serial console line - fmt.Printf("[SESSION] Starting SSH\r") // and stage a status msg which will be erased + if sc.ontty { + fmt.Printf("\033[2K\r") // clear serial console line + fmt.Printf("[SESSION] Starting SSH\r") // and stage a status msg which will be erased + } sshCmd := exec.Command(sshArgs[0], sshArgs[1:]...) sshCmd.Stdin = os.Stdin sshCmd.Stdout = os.Stdout @@ -532,7 +549,9 @@ func (sc *sshClient) start() { for scanner.Scan() { msg := scanner.Text() if strings.Contains(msg, "Connection to 127.0.0.1 closed") { - displayStatusMsg("SSH", "connection closed", 0) + if sc.ontty { + displayStatusMsg("SSH", "connection closed", 0) + } } } }()