netris/cmd/netris-server/main.go

102 lines
2.2 KiB
Go

package main
import (
"flag"
"log"
"net/http"
_ "net/http/pprof"
"os"
"os/signal"
"syscall"
"time"
"code.rocketnine.space/tslocum/netris/pkg/event"
"code.rocketnine.space/tslocum/netris/pkg/game"
"code.rocketnine.space/tslocum/netris/pkg/game/ssh"
)
var (
listenAddressTCP string
listenAddressSocket string
listenAddressSSH string
netrisBinary string
debugAddress string
logDebug bool
logVerbose bool
done = make(chan bool)
)
func init() {
log.SetFlags(0)
flag.StringVar(&listenAddressTCP, "listen-tcp", "", "host server on network address")
flag.StringVar(&listenAddressSocket, "listen-socket", "", "host server on socket path")
flag.StringVar(&listenAddressSSH, "listen-ssh", "", "host SSH server on network address")
flag.StringVar(&netrisBinary, "netris", "", "path to netris client")
flag.StringVar(&debugAddress, "debug-address", "", "address to serve debug info")
flag.BoolVar(&logDebug, "debug", false, "enable debug logging")
flag.BoolVar(&logVerbose, "verbose", false, "enable verbose logging")
}
func main() {
flag.Parse()
if listenAddressTCP == "" && listenAddressSocket == "" {
log.Fatal("at least one listen path or address is required (--listen-tcp and/or --listen-socket)")
}
if debugAddress != "" {
go func() {
log.Fatal(http.ListenAndServe(debugAddress, nil))
}()
}
netrisAddress := listenAddressSocket
if netrisAddress == "" {
netrisAddress = listenAddressTCP
}
sshServer := &ssh.SSHServer{ListenAddress: listenAddressSSH, NetrisBinary: netrisBinary, NetrisAddress: netrisAddress}
logLevel := game.LogStandard
if logVerbose {
logLevel = game.LogVerbose
} else if logDebug {
logLevel = game.LogDebug
}
server := game.NewServer([]game.ServerInterface{sshServer}, logLevel)
logger := make(chan string, game.LogQueueSize)
go func() {
for msg := range logger {
log.Println(time.Now().Format(event.LogFormat) + " " + msg)
}
}()
server.Logger = logger
if listenAddressSocket != "" {
go server.Listen(listenAddressSocket)
}
if listenAddressTCP != "" {
go server.Listen(listenAddressTCP)
}
sigc := make(chan os.Signal, 1)
signal.Notify(sigc,
syscall.SIGINT,
syscall.SIGTERM)
go func() {
<-sigc
done <- true
}()
<-done
server.StopListening()
}