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 {
|
2021-01-10 11:18:12 -08:00
|
|
|
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 {
|
2021-01-10 11:18:12 -08:00
|
|
|
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
|
|
|
|
2021-01-08 12:26:23 -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
|
|
|
|
}
|
|
|
|
|
2021-01-08 12:26:23 -08:00
|
|
|
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-08 12:26:23 -08:00
|
|
|
}()
|
2021-01-05 11:34:35 -08:00
|
|
|
}
|
|
|
|
}
|