main.go

 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}