diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2021-09-06 18:26:24 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2021-09-06 18:26:24 +0200 |
commit | d87cc0484f99882b26f7cc2de2220459b58339ca (patch) | |
tree | 7e492028150e6a5f8d2aa1531754fbbcfb7ca683 /cmd/mt-multiserver-proxy/proxy.go | |
parent | 18a80c7a57639a540965f9b101db18c6490cd804 (diff) |
Only load plugins once + memory optimisations
Diffstat (limited to 'cmd/mt-multiserver-proxy/proxy.go')
-rw-r--r-- | cmd/mt-multiserver-proxy/proxy.go | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/cmd/mt-multiserver-proxy/proxy.go b/cmd/mt-multiserver-proxy/proxy.go new file mode 100644 index 0000000..71c1f33 --- /dev/null +++ b/cmd/mt-multiserver-proxy/proxy.go @@ -0,0 +1,145 @@ +package main + +import ( + "errors" + "log" + "net" + "os" + "os/signal" + "sync" + "syscall" + + "github.com/HimbeerserverDE/mt-multiserver-proxy" + "github.com/anon55555/mt" +) + +func main() { + if err := proxy.LoadConfig(); err != nil { + log.Fatal("{←|⇶} ", err) + } + + if !proxy.Conf().NoPlugins { + proxy.LoadPlugins() + } + + var err error + switch proxy.Conf().AuthBackend { + case "sqlite3": + proxy.SetAuthBackend(proxy.AuthSQLite3{}) + default: + log.Fatal("{←|⇶} invalid auth backend") + } + + addr, err := net.ResolveUDPAddr("udp", proxy.Conf().BindAddr) + if err != nil { + log.Fatal("{←|⇶} ", err) + } + + pc, err := net.ListenUDP("udp", addr) + if err != nil { + log.Fatal("{←|⇶} ", err) + } + + l := proxy.Listen(pc) + defer l.Close() + + log.Print("{←|⇶} listen ", l.Addr()) + + go func() { + sig := make(chan os.Signal, 1) + signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP) + <-sig + + clts := l.Clts() + + var wg sync.WaitGroup + wg.Add(len(clts)) + + for cc := range clts { + go func(cc *proxy.ClientConn) { + ack, _ := cc.SendCmd(&mt.ToCltDisco{Reason: mt.Shutdown}) + select { + case <-cc.Closed(): + case <-ack: + cc.Close() + } + + wg.Done() + }(cc) + } + + wg.Wait() + os.Exit(0) + }() + + for { + cc, err := l.Accept() + if err != nil { + if errors.Is(err, net.ErrClosed) { + log.Print("{←|⇶} stop listening") + break + } + + log.Print("{←|⇶} ", err) + continue + } + + go func() { + <-cc.Init() + cc.Log("<->", "handshake completed") + + if len(proxy.Conf().Servers) == 0 { + cc.Log("<--", "no servers") + ack, _ := cc.SendCmd(&mt.ToCltDisco{ + Reason: mt.Custom, + Custom: "No servers are configured.", + }) + select { + case <-cc.Closed(): + case <-ack: + cc.Close() + } + + return + } + + addr, err := net.ResolveUDPAddr("udp", proxy.Conf().Servers[0].Addr) + if err != nil { + cc.Log("<--", "address resolution fail") + ack, _ := cc.SendCmd(&mt.ToCltDisco{ + Reason: mt.Custom, + Custom: "Server address resolution failed.", + }) + select { + case <-cc.Closed(): + case <-ack: + cc.Close() + } + + return + } + + conn, err := net.DialUDP("udp", nil, addr) + if err != nil { + cc.Log("<--", "connection fail") + + ack, _ := cc.SendCmd(&mt.ToCltDisco{ + Reason: mt.Custom, + Custom: "Server connection failed.", + }) + + select { + case <-cc.Closed(): + case <-ack: + cc.Close() + } + + return + } + + proxy.Connect(conn, proxy.Conf().Servers[0].Name, cc) + }() + } + + select {} +} |