1package main
2
3import (
4 "fmt"
5 "log"
6 "soft-serve/config"
7 "soft-serve/git"
8 "soft-serve/tui"
9
10 "github.com/charmbracelet/wish"
11 bm "github.com/charmbracelet/wish/bubbletea"
12 gm "github.com/charmbracelet/wish/git"
13 lm "github.com/charmbracelet/wish/logging"
14 "github.com/gliderlabs/ssh"
15
16 "github.com/meowgorithm/babyenv"
17)
18
19type serverConfig struct {
20 Port int `env:"SOFT_SERVE_PORT" default:"23231"`
21 Host string `env:"SOFT_SERVE_HOST" default:""`
22 InitKey string `env:"SOFT_SERVE_REPO_KEY" default:""`
23 KeyPath string `env:"SOFT_SERVE_KEY_PATH" default:".ssh/soft_serve_server_ed25519"`
24 RepoPath string `env:"SOFT_SERVE_REPO_PATH" default:".repos"`
25}
26
27func main() {
28 var scfg serverConfig
29 var cfg *config.Config
30 var err error
31 err = babyenv.Parse(&scfg)
32 if err != nil {
33 log.Fatalln(err)
34 }
35 rs := git.NewRepoSource(scfg.RepoPath)
36 if scfg.InitKey == "" {
37 cfg, err = config.NewConfig(scfg.Host, scfg.Port, true, "", rs)
38 if err != nil {
39 log.Fatalln(err)
40 }
41 } else {
42 cfg, err = config.NewConfig(scfg.Host, scfg.Port, false, scfg.InitKey, rs)
43 if err != nil {
44 log.Fatalln(err)
45 }
46 }
47 s, err := wish.NewServer(
48 ssh.PublicKeyAuth(cfg.PublicKeyHandler),
49 ssh.PasswordAuth(cfg.PasswordHandler),
50 wish.WithAddress(fmt.Sprintf("%s:%d", scfg.Host, scfg.Port)),
51 wish.WithHostKeyPath(scfg.KeyPath),
52 wish.WithMiddlewares(
53 bm.Middleware(tui.SessionHandler(cfg)),
54 gm.MiddlewareWithPushCallback(scfg.RepoPath, cfg, cfg.Pushed),
55 lm.Middleware(),
56 ),
57 )
58 if err != nil {
59 log.Fatalln(err)
60 }
61 log.Printf("Starting SSH server on %s:%d\n", scfg.Host, scfg.Port)
62 err = s.ListenAndServe()
63 if err != nil {
64 log.Fatalln(err)
65 }
66}