repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / pkg / apps / feeds
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}