Eric Bower
·
2025-05-25
ssh.go
1package feeds
2
3import (
4 "context"
5 "os"
6 "os/signal"
7 "syscall"
8
9 "github.com/picosh/pico/pkg/db/postgres"
10 "github.com/picosh/pico/pkg/filehandlers"
11 "github.com/picosh/pico/pkg/pssh"
12 "github.com/picosh/pico/pkg/send/auth"
13 "github.com/picosh/pico/pkg/send/list"
14 "github.com/picosh/pico/pkg/send/pipe"
15 "github.com/picosh/pico/pkg/send/protocols/rsync"
16 "github.com/picosh/pico/pkg/send/protocols/scp"
17 "github.com/picosh/pico/pkg/send/protocols/sftp"
18 "github.com/picosh/pico/pkg/shared"
19 "github.com/picosh/utils"
20)
21
22func StartSshServer() {
23 appName := "feeds-ssh"
24
25 host := utils.GetEnv("FEEDS_HOST", "0.0.0.0")
26 port := utils.GetEnv("FEEDS_SSH_PORT", "2222")
27 promPort := utils.GetEnv("FEEDS_PROM_PORT", "9222")
28 cfg := NewConfigSite(appName)
29 logger := cfg.Logger
30
31 ctx, cancel := context.WithCancel(context.Background())
32 defer cancel()
33
34 dbh := postgres.NewDB(cfg.DbURL, cfg.Logger)
35 defer func() {
36 _ = dbh.Close()
37 }()
38
39 hooks := &FeedHooks{
40 Cfg: cfg,
41 Db: dbh,
42 }
43
44 fileMap := map[string]filehandlers.ReadWriteHandler{
45 "fallback": filehandlers.NewScpPostHandler(dbh, cfg, hooks),
46 }
47 handler := filehandlers.NewFileHandlerRouter(cfg, dbh, fileMap)
48
49 sshAuth := shared.NewSshAuthHandler(dbh, logger)
50
51 // Create a new SSH server
52 server, err := pssh.NewSSHServerWithConfig(
53 ctx,
54 logger,
55 appName,
56 host,
57 port,
58 promPort,
59 "ssh_data/term_info_ed25519",
60 sshAuth.PubkeyAuthHandler,
61 []pssh.SSHServerMiddleware{
62 pipe.Middleware(handler, ".txt"),
63 list.Middleware(handler),
64 scp.Middleware(handler),
65 rsync.Middleware(handler),
66 auth.Middleware(handler),
67 Middleware(dbh, cfg),
68 pssh.LogMiddleware(handler, dbh),
69 },
70 []pssh.SSHServerMiddleware{
71 sftp.Middleware(handler),
72 pssh.LogMiddleware(handler, dbh),
73 },
74 nil,
75 )
76
77 if err != nil {
78 logger.Error("failed to create ssh server", "err", err.Error())
79 os.Exit(1)
80 }
81
82 done := make(chan os.Signal, 1)
83
84 signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
85 logger.Info("Starting SSH server", "addr", server.Config.ListenAddr)
86 go func() {
87 if err = server.ListenAndServe(); err != nil {
88 logger.Error("serve", "err", err.Error())
89 os.Exit(1)
90 }
91 }()
92
93 exit := func() {
94 logger.Info("stopping ssh server")
95 cancel()
96 }
97
98 <-done
99 exit()
100}