middleware.go

 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}