1package sshcli
2
3import (
4 "context"
5 "fmt"
6 "os"
7 "os/signal"
8 "path/filepath"
9 "syscall"
10 "time"
11
12 "github.com/charmbracelet/wish"
13 "github.com/picosh/ptun"
14)
15
16func StartSshServer() {
17 host := os.Getenv("SSH_HOST")
18 if host == "" {
19 host = "0.0.0.0"
20 }
21 port := os.Getenv("SSH_PORT")
22 if port == "" {
23 port = "2222"
24 }
25
26 be := NewBackend()
27
28 s, err := wish.NewServer(
29 wish.WithAddress(
30 fmt.Sprintf("%s:%s", host, port),
31 ),
32 wish.WithHostKeyPath(
33 filepath.Join("ssh_data", "term_info_ed25519"),
34 ),
35 /* wish.WithMiddleware(
36 CliMdw(be),
37 ), */
38 wish.WithMiddleware(
39 AccessTokenMdw,
40 ),
41 ptun.WithTunnel(&handler{
42 logger: be.Logger,
43 }),
44 )
45
46 if err != nil {
47 be.Logger.Error("could not create server", "err", err)
48 }
49
50 done := make(chan os.Signal, 1)
51 signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
52 be.Logger.Info("starting SSH server", "host", host, "port", port)
53 go func() {
54 if err = s.ListenAndServe(); err != nil {
55 be.Logger.Error("serve error", "err", err)
56 os.Exit(1)
57 }
58 }()
59
60 <-done
61 be.Logger.Info("stopping SSH server")
62 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
63 defer func() { cancel() }()
64 if err := s.Shutdown(ctx); err != nil {
65 be.Logger.Error("shutdown", "err", err)
66 os.Exit(1)
67 }
68}