summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go103
1 files changed, 32 insertions, 71 deletions
diff --git a/main.go b/main.go
index 69ec021..b6bd5de 100644
--- a/main.go
+++ b/main.go
@@ -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()
-}