package main import ( "flag" "fmt" "log" "net/http" "os" "path/filepath" "strings" "github.com/pocka/legit/config" "github.com/pocka/legit/core" "github.com/pocka/legit/pages" ) var additionalAccessDirs string func main() { var cfg string var host string var port uint var scanPath string var compileTemplatesOnRequest bool var repoDiff string var staticDirOverride string var templatesDirOverride string flag.StringVar(&cfg, "config", "", "path to config file") flag.StringVar(&host, "server.host", "", "override server.host config") flag.UintVar(&port, "server.port", 0, "override server.port config") flag.StringVar(&scanPath, "repo.scanPath", "", "override repo.scanPath config") flag.StringVar(&repoDiff, "repo.diff", "", "override repo.diff config") flag.BoolVar(&compileTemplatesOnRequest, "compileTemplatesOnRequest", false, "override compileTemplatesOnRequest config") flag.StringVar(&staticDirOverride, "dirs.static", "", "override dirs.static config") flag.StringVar(&templatesDirOverride, "dirs.templates", "", "override dirs.templates config") flag.Parse() cwd, err := os.Getwd() if err != nil { log.Fatal(err) } c := config.NewWithDefaults() if cfg != "" { if err := c.ReadFromFile(cfg); err != nil { log.Fatalf("Unable to read config file: %s", err) } } if port > 0 { c.Server.Port = port } if host != "" { c.Server.Host = host } if scanPath != "" { c.Repo.ScanPath = scanPath } if repoDiff != "" { c.Repo.Diff = repoDiff } if compileTemplatesOnRequest { c.CompileTemplatesOnRequest = true } if staticDirOverride != "" { resolved, err := filepath.Abs(staticDirOverride) if err != nil { log.Fatalf("Cannot resolve -dirs.static") } c.Dirs.Static = resolved } if templatesDirOverride != "" { resolved, err := filepath.Abs(templatesDirOverride) if err != nil { log.Fatalf("Cannot resolve -dirs.templates") } c.Dirs.Templates = resolved } if err := c.Resolve(cwd); err != nil { log.Fatal(err) } var extraReadOnlyDirs []string if additionalAccessDirs != "" { for path := range strings.SplitSeq(additionalAccessDirs, ",") { extraReadOnlyDirs = append(extraReadOnlyDirs, strings.Trim(path, " ")) } } core, err := core.New(c) if err != nil { log.Fatal(err) } if err := core.Sandbox(extraReadOnlyDirs...); err != nil { log.Fatalf("Unable to restrict filesystem access: %s", err) } addr := fmt.Sprintf("%s:%d", c.Server.Host, c.Server.Port) log.Println("starting server on", addr) log.Fatal(http.ListenAndServe(addr, pages.New(core))) }