1package cmd
2
3import (
4 "context"
5 "fmt"
6
7 "github.com/charmbracelet/soft-serve/server/config"
8 "github.com/charmbracelet/wish"
9 "github.com/gliderlabs/ssh"
10)
11
12// Middleware is the Soft Serve middleware that handles SSH commands.
13func Middleware(cfg *config.Config) wish.Middleware {
14 return func(sh ssh.Handler) ssh.Handler {
15 return func(s ssh.Session) {
16 func() {
17 _, _, active := s.Pty()
18 if active {
19 return
20 }
21 ctx := context.WithValue(s.Context(), ConfigCtxKey, cfg)
22 ctx = context.WithValue(ctx, SessionCtxKey, s)
23
24 use := "ssh"
25 port := cfg.SSH.Port
26 if port != 22 {
27 use += fmt.Sprintf(" -p%d", port)
28 }
29 use += fmt.Sprintf(" %s", cfg.Host)
30 cmd := RootCommand()
31 cmd.Use = use
32 cmd.CompletionOptions.DisableDefaultCmd = true
33 cmd.SetIn(s)
34 cmd.SetOut(s)
35 cmd.SetErr(s.Stderr())
36 cmd.SetArgs(s.Command())
37 err := cmd.ExecuteContext(ctx)
38 if err != nil {
39 _, _ = s.Write([]byte(err.Error()))
40 _ = s.Exit(1)
41 return
42 }
43 }()
44 sh(s)
45 }
46 }
47}