jolheiser
·
2025-04-17
main.go
1package main
2
3import (
4 "context"
5 "flag"
6 "fmt"
7 "log/slog"
8 "net/http"
9 "os"
10 "os/signal"
11 "syscall"
12 "time"
13
14 git "github.com/picosh/git-pr"
15)
16
17func main() {
18 fpath := flag.String("config", "git-pr.toml", "configuration toml file")
19 flag.Parse()
20 opts := &slog.HandlerOptions{
21 AddSource: true,
22 }
23 logger := slog.New(
24 slog.NewTextHandler(os.Stdout, opts),
25 )
26 git.LoadConfigFile(*fpath, logger)
27 cfg := git.NewGitCfg(logger)
28
29 // SSH Server
30 ssh := git.GitSshServer(cfg)
31 cfg.Logger.Info("starting SSH server", "host", cfg.Host, "port", cfg.SshPort)
32 go func() {
33 if err := ssh.ListenAndServe(); err != nil {
34 cfg.Logger.Error("serve error", "err", err)
35 }
36 }()
37
38 // Web Server
39 addr := fmt.Sprintf("%s:%s", cfg.Host, cfg.WebPort)
40 web := git.GitWebServer(cfg)
41 cfg.Logger.Info("starting web server", "addr", addr)
42 go func() {
43 if err := http.ListenAndServe(addr, web); err != nil {
44 cfg.Logger.Error("listen", "err", err)
45 }
46 }()
47
48 done := make(chan os.Signal, 1)
49 signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
50 <-done
51 cfg.Logger.Info("stopping SSH server")
52 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
53 defer func() { cancel() }()
54 if err := ssh.Shutdown(ctx); err != nil {
55 cfg.Logger.Error("shutdown", "err", err)
56 }
57}