multiserver/multiserver.go

73 lines
1.1 KiB
Go
Raw Permalink Normal View History

2021-01-17 12:43:23 -08:00
/*
Multiserver is a multi-server minetest reverse proxy capable of
2021-02-13 08:54:30 -08:00
media and definition multiplexing
2021-01-17 12:43:23 -08:00
*/
2021-01-05 11:34:35 -08:00
package main
import (
2021-01-09 03:26:30 -08:00
"log"
"net"
2021-01-05 11:34:35 -08:00
)
func main() {
2021-03-09 13:23:41 -08:00
defaultSrv, ok := ConfKey("default_server").(string)
2021-01-19 09:57:58 -08:00
if !ok {
log.Fatal("Default server name not set or not a string")
}
2021-01-09 03:26:30 -08:00
2021-03-13 09:58:51 -08:00
_, ok = ConfKey("servers:" + defaultSrv + ":address").(string)
2021-01-19 09:57:58 -08:00
if !ok {
log.Fatal("Default server address not set or not a string")
2021-01-05 11:34:35 -08:00
}
2021-01-09 03:26:30 -08:00
2021-03-09 13:23:41 -08:00
host, ok := ConfKey("host").(string)
2021-01-19 09:57:58 -08:00
if !ok {
2021-03-13 10:17:27 -08:00
host = "0.0.0.0:33000"
2021-01-05 11:34:35 -08:00
}
2021-01-09 03:26:30 -08:00
2021-01-19 09:57:58 -08:00
lc, err := net.ListenPacket("udp", host)
2021-01-05 11:34:35 -08:00
if err != nil {
log.Fatal(err)
}
defer lc.Close()
2021-01-09 03:26:30 -08:00
2021-01-19 09:57:58 -08:00
log.Print("Listening on " + host)
2021-01-09 03:26:30 -08:00
2021-01-24 05:00:26 -08:00
l := Listen(lc)
2021-03-06 11:33:25 -08:00
Announce(AnnounceStart)
2021-01-05 11:34:35 -08:00
for {
clt, err := l.Accept()
if err != nil {
log.Print(err)
continue
}
2021-01-09 03:26:30 -08:00
2021-01-05 11:34:35 -08:00
log.Print(clt.Addr(), " connected")
2021-01-09 03:26:30 -08:00
2021-03-29 09:57:30 -07:00
fin := make(chan *Conn)
2021-03-13 09:58:51 -08:00
go Init(nil, clt, true, false, fin)
2021-01-09 03:26:30 -08:00
go func() {
2021-03-13 09:58:51 -08:00
srv := <-fin
2021-01-09 03:26:30 -08:00
2021-03-06 11:33:25 -08:00
if srv == nil {
select {
2021-03-29 09:57:30 -07:00
case <-clt.Closed():
2021-04-02 04:39:35 -07:00
clt.Close()
2021-03-06 11:33:25 -08:00
default:
2021-04-02 04:39:35 -07:00
clt.CloseWith(AccessDeniedServerFail, "", false)
2021-03-06 11:33:25 -08:00
}
return
}
clt.SetServer(srv)
2021-01-09 03:26:30 -08:00
2021-01-24 05:00:26 -08:00
go Proxy(clt, srv)
go Proxy(srv, clt)
}()
2021-01-05 11:34:35 -08:00
}
}