diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 103 |
1 files changed, 32 insertions, 71 deletions
@@ -1,96 +1,57 @@ package main import ( - "context" - "crypto/tls" + "fmt" + "io" "log" + "os" "sync" - - sr "tildegit.org/tjp/sliderule" - "tildegit.org/tjp/sliderule/finger" - "tildegit.org/tjp/sliderule/gemini" - "tildegit.org/tjp/sliderule/gopher" - "tildegit.org/tjp/sliderule/logging" ) func main() { - conf := configure() - gemTLS, err := gemini.FileTLS(conf.tlsCertFile, conf.tlsKeyFile) - if err != nil { - log.Fatal(err) + if len(os.Args) < 2 { + fmt.Fprintf(os.Stderr, "%s <configfile>\n", os.Args[0]) + os.Exit(1) } - ctx, _, info, warn, errlog := serverContext() - - gopherSrv, err := buildGopher(ctx, conf, info, errlog) - if err != nil { - log.Fatal(err) + var configfile io.ReadCloser + if os.Args[1] == "-" { + configfile = os.Stdin + } else { + var err error + configfile, err = os.Open(os.Args[1]) + if err != nil { + log.Fatal(err) + } } - fingerSrv, err := buildFinger(ctx, conf, info, errlog) + config, err := Parse(configfile) if err != nil { log.Fatal(err) } - dropped, err := dropPrivileges() + _, _, _, errlog := Loggers(config) + + servers, err := buildServers(config) if err != nil { - log.Fatal(err) - } - if !dropped { - _ = warn.Log("msg", "dropping privileges to 'nobody' failed") + _ = errlog.Log("msg", "error building servers", "err", err) + os.Exit(1) } - gemSrv, err := buildGemini(ctx, conf, gemTLS, info, errlog) - if err != nil { - log.Fatal(err) + if err := privdrop(config); err != nil { + _ = errlog.Log("msg", "failed to drop privileges", "err", err) + os.Exit(1) } wg := &sync.WaitGroup{} - - - wg.Add(3) - go runServer(gemSrv, wg) - go runServer(gopherSrv, wg) - go runServer(fingerSrv, wg) + wg.Add(len(servers)) + for i := range servers { + server := servers[i] + go func() { + defer wg.Done() + _ = server.Serve() + }() + } wg.Wait() } - -func buildGemini( - ctx context.Context, - conf config, - gemTLS *tls.Config, - infolog logging.Logger, - errlog logging.Logger, -) (sr.Server, error) { - handler := logging.LogRequests(infolog)(geminiRouter(conf)) - infolog.Log("msg", "starting gemini server", "gemini_root", conf.geminiRoot) - return gemini.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog, gemTLS) -} - -func buildGopher( - ctx context.Context, - conf config, - infolog logging.Logger, - errlog logging.Logger, -) (sr.Server, error) { - handler := logging.LogRequests(infolog)(gopherRouter(conf)) - infolog.Log("msg", "starting gopher server", "gopher_root", conf.gopherRoot) - return gopher.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog) -} - -func buildFinger( - ctx context.Context, - conf config, - infolog logging.Logger, - errlog logging.Logger, -) (sr.Server, error) { - handler := logging.LogRequests(infolog)(fingerHandler(conf)) - infolog.Log("msg", "starting finger server", "finger_users", len(conf.fingerResponses)) - return finger.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog) -} - -func runServer(server sr.Server, wg *sync.WaitGroup) error { - defer wg.Done() - return server.Serve() -} |
