multiserver/multiserver.go

93 lines
1.5 KiB
Go

/*
Multiserver is a multi-server minetest reverse proxy capable of
media and definition multiplexing
*/
package main
import (
"log"
"net"
"time"
"github.com/anon55555/mt/rudp"
)
func main() {
defaultSrv, ok := GetConfKey("default_server").(string)
if !ok {
log.Fatal("Default server name not set or not a string")
}
defaultSrvAddr, ok := GetConfKey("servers:" + defaultSrv + ":address").(string)
if !ok {
log.Fatal("Default server address not set or not a string")
}
host, ok := GetConfKey("host").(string)
if !ok {
log.Fatal("Host not set or not a string")
}
srvaddr, err := net.ResolveUDPAddr("udp", defaultSrvAddr)
if err != nil {
log.Fatal(err)
}
lc, err := net.ListenPacket("udp", host)
if err != nil {
log.Fatal(err)
}
defer lc.Close()
log.Print("Listening on " + host)
l := Listen(lc)
SetListener(l)
for {
clt, err := l.Accept()
if err != nil {
log.Print(err)
continue
}
log.Print(clt.Addr(), " connected")
conn, err := net.DialUDP("udp", nil, srvaddr)
if err != nil {
log.Fatal(err)
}
srv, err := Connect(conn, conn.RemoteAddr())
if err != nil {
data := []byte{
0, ToClientAccessDenied,
AccessDeniedServerFail, 0, 0, 0, 0,
}
_, err := clt.Send(rudp.Pkt{Data: data})
if err != nil {
log.Print(err)
}
time.Sleep(250 * time.Millisecond)
clt.SendDisco(0, true)
clt.Close()
continue
}
fin := make(chan *Peer)
go Init(srv, clt, true, false, fin)
go func() {
srv = <-fin
clt.SetServer(srv)
go Proxy(clt, srv)
go Proxy(srv, clt)
}()
}
}