1716569889145361179

· erock's pastes · raw

expires: 22 Aug, 2024

 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}