diff --git a/pslogin/src/main/scala/LoginConfig.scala b/pslogin/src/main/scala/LoginConfig.scala new file mode 100644 index 00000000..cf48398a --- /dev/null +++ b/pslogin/src/main/scala/LoginConfig.scala @@ -0,0 +1,6 @@ +// Copyright (c) 2016 PSForever.net to present +import java.net.InetAddress + +object LoginConfig { + var serverIpAddress : InetAddress = InetAddress.getLoopbackAddress +} diff --git a/pslogin/src/main/scala/LoginSessionActor.scala b/pslogin/src/main/scala/LoginSessionActor.scala index 9c03da40..84a074ba 100644 --- a/pslogin/src/main/scala/LoginSessionActor.scala +++ b/pslogin/src/main/scala/LoginSessionActor.scala @@ -89,8 +89,9 @@ class LoginSessionActor extends Actor with MDCContextAware { } } + // TODO: move to global configuration or database lookup val serverName = "PSForever" - val serverAddress = new InetSocketAddress(InetAddress.getLocalHost.getHostAddress, 51001) + val serverAddress = new InetSocketAddress(LoginConfig.serverIpAddress.getHostAddress, 51001) def handleGamePkt(pkt : PlanetSideGamePacket) = pkt match { case LoginMessage(majorVersion, minorVersion, buildDate, username, diff --git a/pslogin/src/main/scala/PsLogin.scala b/pslogin/src/main/scala/PsLogin.scala index 9e87e745..2780a4d2 100644 --- a/pslogin/src/main/scala/PsLogin.scala +++ b/pslogin/src/main/scala/PsLogin.scala @@ -84,12 +84,22 @@ object PsLogin { } } + def parseArgs(args : Array[String]) : Unit = { + if(args.length == 1) { + LoginConfig.serverIpAddress = InetAddress.getByName(args{0}) + } + else { + LoginConfig.serverIpAddress = InetAddress.getLocalHost + } + } + def main(args : Array[String]) : Unit = { // Early start up banner() println(systemInformation) initializeLogging("logback.xml") + parseArgs(args) /** Initialize the PSCrypto native library * @@ -149,11 +159,11 @@ object PsLogin { /** Create two actors for handling the login and world server endpoints */ val listener = system.actorOf(Props(new UdpListener(Props(new SessionRouter(loginTemplate)), "login-session-router", - InetAddress.getLocalHost, loginServerPort)), "login-udp-endpoint") + LoginConfig.serverIpAddress, loginServerPort)), "login-udp-endpoint") val worldListener = system.actorOf(Props(new UdpListener(Props(new SessionRouter(worldTemplate)), "world-session-router", - InetAddress.getLocalHost, worldServerPort)), "world-udp-endpoint") + LoginConfig.serverIpAddress, worldServerPort)), "world-udp-endpoint") - logger.info(s"NOTE: Set client.ini to point to ${InetAddress.getLocalHost.getHostAddress}:$loginServerPort") + logger.info(s"NOTE: Set client.ini to point to ${LoginConfig.serverIpAddress.getHostAddress}:$loginServerPort") // Wait forever until the actor system shuts down Await.result(system.whenTerminated, Duration.Inf) diff --git a/pslogin/src/main/scala/UdpListener.scala b/pslogin/src/main/scala/UdpListener.scala index f91c731f..38f70ef7 100644 --- a/pslogin/src/main/scala/UdpListener.scala +++ b/pslogin/src/main/scala/UdpListener.scala @@ -1,7 +1,7 @@ // Copyright (c) 2016 PSForever.net to present import java.net.{InetAddress, InetSocketAddress} -import akka.actor.SupervisorStrategy.{Restart, Stop} +import akka.actor.SupervisorStrategy.Stop import akka.actor.{Actor, ActorRef, OneForOneStrategy, Props, Terminated} import akka.io._ import scodec.bits._ @@ -34,6 +34,9 @@ class UdpListener(nextActorProps : Props, nextActorName : String, address : Inet createNextActor() context.become(ready(sender())) + case Udp.CommandFailed(Udp.Bind(_, address, _)) => + log.error("Failed to bind to the network interface: " + address) + context.system.terminate() case default => log.error(s"Unexpected message $default") }