fix(terminal): improve shell resolution with better error handling and ws proxy support
The `len(shell) <= 1` guard was too aggressive and provided no diagnostic info. Now trims whitespace, resolves path in all cases, falls back to /bin/sh, and logs detailed context for debugging. Also enable WebSocket proxying in Vite dev.
This commit is contained in:
@@ -56,13 +56,17 @@ func (s *Server) handleTerminalWS(w http.ResponseWriter, r *http.Request) {
|
|||||||
var initMsg wsMessage
|
var initMsg wsMessage
|
||||||
_, raw, err := conn.ReadMessage()
|
_, raw, err := conn.ReadMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Printf("terminal: read init message failed: %v", err)
|
||||||
conn.WriteJSON(wsMessage{Type: "error", Data: "failed to read init message"})
|
conn.WriteJSON(wsMessage{Type: "error", Data: "failed to read init message"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Printf("terminal: init message received: %s", string(raw))
|
||||||
if err := json.Unmarshal(raw, &initMsg); err != nil {
|
if err := json.Unmarshal(raw, &initMsg); err != nil {
|
||||||
|
log.Printf("terminal: unmarshal init message failed: %v", err)
|
||||||
conn.WriteJSON(wsMessage{Type: "error", Data: "invalid init message"})
|
conn.WriteJSON(wsMessage{Type: "error", Data: "invalid init message"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Printf("terminal: init type=%q data=%q", initMsg.Type, initMsg.Data)
|
||||||
|
|
||||||
var cmd *exec.Cmd
|
var cmd *exec.Cmd
|
||||||
|
|
||||||
@@ -96,23 +100,26 @@ func (s *Server) handleTerminalWS(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
cmd = exec.Command("ssh", sshArgs...)
|
cmd = exec.Command("ssh", sshArgs...)
|
||||||
} else {
|
} else {
|
||||||
shell := initMsg.Data
|
shell := strings.TrimSpace(initMsg.Data)
|
||||||
|
log.Printf("terminal: requested shell=%q, trimmed=%q", initMsg.Data, shell)
|
||||||
if shell == "" {
|
if shell == "" {
|
||||||
shell = detectShell()
|
shell = detectShell()
|
||||||
} else {
|
log.Printf("terminal: auto-detected shell=%q", shell)
|
||||||
if path, err := exec.LookPath(shell); err == nil {
|
|
||||||
shell = path
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ignore invalid shell paths (e.g., single characters from race condition)
|
if shell == "" {
|
||||||
if len(shell) <= 1 {
|
log.Printf("terminal: no shell detected, falling back to /bin/sh")
|
||||||
conn.WriteJSON(wsMessage{Type: "error", Data: "invalid shell config"})
|
shell = "/bin/sh"
|
||||||
return
|
}
|
||||||
|
|
||||||
|
if path, err := exec.LookPath(shell); err == nil {
|
||||||
|
shell = path
|
||||||
|
log.Printf("terminal: resolved shell path=%q", shell)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(shell); err != nil {
|
if _, err := os.Stat(shell); err != nil {
|
||||||
conn.WriteJSON(wsMessage{Type: "error", Data: fmt.Sprintf("shell not found: %s", shell)})
|
log.Printf("terminal: shell stat failed: %v for %q", err, shell)
|
||||||
|
conn.WriteJSON(wsMessage{Type: "error", Data: fmt.Sprintf("shell not found: %s (resolved from: %q)", shell, initMsg.Data)})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,12 +138,14 @@ func (s *Server) handleTerminalWS(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
cmd.Env = append(os.Environ(), "TERM=xterm-256color")
|
cmd.Env = append(os.Environ(), "TERM=xterm-256color")
|
||||||
|
|
||||||
|
log.Printf("terminal: starting pty with cmd=%q args=%v", cmd.Path, cmd.Args)
|
||||||
ptmx, err := pty.Start(cmd)
|
ptmx, err := pty.Start(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("pty start: %v", err)
|
log.Printf("terminal: pty start failed: %v", err)
|
||||||
conn.WriteJSON(wsMessage{Type: "error", Data: err.Error()})
|
conn.WriteJSON(wsMessage{Type: "error", Data: err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Printf("terminal: pty started successfully")
|
||||||
defer func() {
|
defer func() {
|
||||||
ptmx.Close()
|
ptmx.Close()
|
||||||
if cmd.Process != nil {
|
if cmd.Process != nil {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export default defineConfig({
|
|||||||
'/api': {
|
'/api': {
|
||||||
target: 'http://127.0.0.1:8095',
|
target: 'http://127.0.0.1:8095',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
ws: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user