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 cfg, err = config.NewConfig(scfg.Host, scfg.Port, scfg.InitKey, rs)
37 if err != nil {
38 log.Fatalln(err)
39 }
40 s, err := wish.NewServer(
41 ssh.PublicKeyAuth(cfg.PublicKeyHandler),
42 ssh.PasswordAuth(cfg.PasswordHandler),
43 wish.WithAddress(fmt.Sprintf("%s:%d", scfg.Host, scfg.Port)),
44 wish.WithHostKeyPath(scfg.KeyPath),
45 wish.WithMiddlewares(
46 bm.Middleware(tui.SessionHandler(cfg)),
47 gm.Middleware(scfg.RepoPath, cfg),
48 lm.Middleware(),
49 ),
50 )
51 if err != nil {
52 log.Fatalln(err)
53 }
54 log.Printf("Starting SSH server on %s:%d\n", scfg.Host, scfg.Port)
55 err = s.ListenAndServe()
56 if err != nil {
57 log.Fatalln(err)
58 }
59}