aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2021-08-27 18:59:27 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2021-08-27 18:59:27 +0200
commitb21345fba99d38c5e5ade695e32fc9e23ea48e98 (patch)
tree3d90d8abd9d356109d8690c5babd481abb363b55 /main.go
parentca7c62308867f27a607fd17d72f926fcda05bb32 (diff)
Basic authentication server and content multiplexer
Diffstat (limited to 'main.go')
-rw-r--r--main.go94
1 files changed, 94 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..74ba45b
--- /dev/null
+++ b/main.go
@@ -0,0 +1,94 @@
+package main
+
+import (
+ "errors"
+ "log"
+ "net"
+ "os"
+ "os/signal"
+ "sync"
+ "syscall"
+
+ "github.com/anon55555/mt"
+)
+
+func main() {
+ if err := loadConfig(); err != nil {
+ log.Fatal("{←|⇶} ", err)
+ }
+
+ var err error
+ switch conf.AuthBackend {
+ case "sqlite3":
+ authIface = authSQLite3{}
+ default:
+ log.Fatal("{←|⇶} invalid auth backend")
+ }
+
+ addr, err := net.ResolveUDPAddr("udp", conf.BindAddr)
+ if err != nil {
+ log.Fatal("{←|⇶} ", err)
+ }
+
+ pc, err := net.ListenUDP("udp", addr)
+ if err != nil {
+ log.Fatal("{←|⇶} ", err)
+ }
+
+ l := listen(pc)
+ defer l.close()
+
+ log.Print("{←|⇶} listening on ", l.addr())
+
+ clts := make(map[*clientConn]struct{})
+ var mu sync.Mutex
+
+ go func() {
+ sig := make(chan os.Signal)
+ signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)
+ <-sig
+
+ mu.Lock()
+ defer mu.Unlock()
+
+ for cc := range clts {
+ ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.Shutdown})
+ <-ack
+ cc.Close()
+ }
+
+ os.Exit(0)
+ }()
+
+ for {
+ cc, err := l.accept()
+ if err != nil {
+ if errors.Is(err, net.ErrClosed) {
+ break
+ }
+
+ log.Print("{←|⇶} ", err)
+ continue
+ }
+
+ mu.Lock()
+ clts[cc] = struct{}{}
+ mu.Unlock()
+
+ go func() {
+ <-cc.Closed()
+
+ mu.Lock()
+ defer mu.Unlock()
+
+ delete(clts, cc)
+ }()
+
+ go func() {
+ <-cc.init()
+ cc.log("<->", "handshake completed")
+ // ToDo: establish serverConn
+ // and start handler goroutines
+ }()
+ }
+}