package main import ( "flag" "fmt" "log/slog" "os" "os/signal" "syscall" "github.com/lain/larc/internal/server" ) /* larcs - larc server * Serves repositories over HTTP with README rendering and Basic Auth. */ var ( version = "0.1.0" ) func main() { configPath := flag.String("config", "", "path to config file") showVersion := flag.Bool("version", false, "show version") host := flag.String("host", "", "override server host") port := flag.Int("port", 0, "override server port") flag.Parse() if *showVersion { fmt.Printf("larcs version %s\n", version) return } /* load config */ var cfg *server.Config var err error if *configPath != "" { cfg, err = server.LoadConfig(*configPath) if err != nil { slog.Error("failed to load config", "path", *configPath, "error", err) os.Exit(1) } } else { /* try default paths */ paths := []string{ "./larcs.yaml", "./config.yaml", "/etc/larcs/config.yaml", os.ExpandEnv("$HOME/.larcs/config.yaml"), } for _, p := range paths { if _, err := os.Stat(p); err == nil { cfg, err = server.LoadConfig(p) if err == nil { slog.Info("loaded config", "path", p) break } } } if cfg == nil { slog.Info("no config file found, using defaults") cfg = server.DefaultConfig() } } /* apply overrides */ if *host != "" { cfg.Server.Host = *host } if *port != 0 { cfg.Server.Port = *port } /* create server */ srv, err := server.New(cfg) if err != nil { slog.Error("failed to create server", "error", err) os.Exit(1) } /* handle shutdown */ sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) go func() { <-sigChan slog.Info("shutting down...") srv.Shutdown() }() /* start server */ if err := srv.Start(); err != nil { slog.Error("server error", "error", err) os.Exit(1) } }