summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authortjpcc <tjp@ctrl-c.club>2023-09-08 14:54:50 -0600
committertjpcc <tjp@ctrl-c.club>2023-09-08 14:55:02 -0600
commit7517538d2fccd75dbfb4f8b5ac9194bf0bbbda76 (patch)
tree6e1e530beb0693119ef11a4a2d7062bf774ad5ec /main.go
parent62eb4353f72ad2fee2d5e30a6444c980ecf0d9ab (diff)
fixes & improvements
- refactored main.go to do everything which requires root *first*, before dropping privs. this includes binding to finger and gopher ports. - added gopher support! - fixed CGI handling - new cgi-bin/private directory handling in gemini which requires specific TLS client certs (can't do this in gopher, no TLS) - sliderule version bump brings in lots of fixes on the sliderule side
Diffstat (limited to 'main.go')
-rw-r--r--main.go87
1 files changed, 45 insertions, 42 deletions
diff --git a/main.go b/main.go
index 1d6efc0..69ec021 100644
--- a/main.go
+++ b/main.go
@@ -4,11 +4,12 @@ import (
"context"
"crypto/tls"
"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"
)
@@ -19,75 +20,77 @@ func main() {
log.Fatal(err)
}
- dropped, err := dropPrivileges()
+ ctx, _, info, warn, errlog := serverContext()
+
+ gopherSrv, err := buildGopher(ctx, conf, info, errlog)
if err != nil {
log.Fatal(err)
}
- ctx, _, info, warn, errlog := serverContext()
+ fingerSrv, err := buildFinger(ctx, conf, info, errlog)
+ if err != nil {
+ log.Fatal(err)
+ }
+ dropped, err := dropPrivileges()
+ if err != nil {
+ log.Fatal(err)
+ }
if !dropped {
_ = warn.Log("msg", "dropping privileges to 'nobody' failed")
}
+ gemSrv, err := buildGemini(ctx, conf, gemTLS, info, errlog)
+ if err != nil {
+ log.Fatal(err)
+ }
+
wg := &sync.WaitGroup{}
- go startGemini(ctx, conf, wg, gemTLS, info, errlog)
- go startFinger(ctx, conf, wg, info, errlog)
- wg.Add(2)
+
+ wg.Add(3)
+ go runServer(gemSrv, wg)
+ go runServer(gopherSrv, wg)
+ go runServer(fingerSrv, wg)
wg.Wait()
}
-func startGemini(
+func buildGemini(
ctx context.Context,
conf config,
- wg *sync.WaitGroup,
gemTLS *tls.Config,
infolog logging.Logger,
errlog logging.Logger,
-) {
- defer wg.Done()
-
+) (sr.Server, error) {
handler := logging.LogRequests(infolog)(geminiRouter(conf))
- server, err := gemini.NewServer(
- ctx,
- conf.hostname,
- "tcp",
- "",
- handler,
- errlog,
- gemTLS,
- )
- if err != nil {
- _ = errlog.Log("msg", "error building server", "error", err)
- os.Exit(1)
- }
-
- if err := server.Serve(); err != nil {
- _ = errlog.Log("msg", "error serving gemini", "error", err)
- os.Exit(1)
- }
+ infolog.Log("msg", "starting gemini server", "gemini_root", conf.geminiRoot)
+ return gemini.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog, gemTLS)
}
-func startFinger(
+func buildGopher(
ctx context.Context,
conf config,
- wg *sync.WaitGroup,
infolog logging.Logger,
errlog logging.Logger,
-) {
- defer wg.Done()
+) (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))
- server, err := finger.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog)
- if err != nil {
- _ = errlog.Log("msg", "error building server", "error", err)
- os.Exit(1)
- }
+ infolog.Log("msg", "starting finger server", "finger_users", len(conf.fingerResponses))
+ return finger.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog)
+}
- if err := server.Serve(); err != nil {
- _ = errlog.Log("msg", "error serving finger", "error", err)
- os.Exit(1)
- }
+func runServer(server sr.Server, wg *sync.WaitGroup) error {
+ defer wg.Done()
+ return server.Serve()
}