private void CheckPlatformDisconnect() { // marker to signify disconnect if (m_platformClient.LoginId == 0) { if (!m_reconnecting) { if (m_platformConnectingTime == null || (DateTime.UtcNow - m_platformConnectingTime.Value).TotalSeconds > 5) { this.Log().Warn("Disconnected from Terminal - reconnecting..."); m_reconnecting = true; Task.Run(() => { if (m_platformClient.Connect()) { this.Log().Warn("Authenticating to Terminal during reconnect."); m_platformClient.AuthenticateWithLicenseKey("").ContinueWith(success => { m_platformConnectingTime = null; m_reconnecting = false; this.Log().Warn("Terminal reauthentication complete!"); }); } else { this.Log().Warn("Reconnecting to Terminal failed."); // throw an exception for capture in the continuation throw new Exception("Failed to connect to Terminal"); } }).ContinueWith(task => { if (task.Exception != null) { m_platformConnectingTime = DateTime.UtcNow; m_reconnecting = false; } }); } } } }
private static void Main(string[] args) { // log4net setup if (Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX) { var appender = new ConsoleAppender { #if DEBUG Threshold = Level.Debug, #else Threshold = Level.Info, #endif Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), }; BasicConfigurator.Configure(new IAppender[] { appender, new DebugAppender { Layout = appender.Layout, Threshold = Level.All } }); } else { var appender = new ColoredConsoleAppender { #if DEBUG Threshold = Level.Debug, #else Threshold = Level.Info, #endif Layout = new PatternLayout("<%d{HH:mm:ss}> [%logger:%thread] %level: %message%newline"), }; appender.AddMapping(new ColoredConsoleAppender.LevelColors { Level = Level.Debug, ForeColor = ColoredConsoleAppender.Colors.Cyan | ColoredConsoleAppender.Colors.HighIntensity }); appender.AddMapping(new ColoredConsoleAppender.LevelColors { Level = Level.Info, ForeColor = ColoredConsoleAppender.Colors.Green | ColoredConsoleAppender.Colors.HighIntensity }); appender.AddMapping(new ColoredConsoleAppender.LevelColors { Level = Level.Warn, ForeColor = ColoredConsoleAppender.Colors.Purple | ColoredConsoleAppender.Colors.HighIntensity }); appender.AddMapping(new ColoredConsoleAppender.LevelColors { Level = Level.Error, ForeColor = ColoredConsoleAppender.Colors.Red | ColoredConsoleAppender.Colors.HighIntensity }); appender.AddMapping(new ColoredConsoleAppender.LevelColors { Level = Level.Fatal, ForeColor = ColoredConsoleAppender.Colors.White | ColoredConsoleAppender.Colors.HighIntensity, BackColor = ColoredConsoleAppender.Colors.Red }); appender.ActivateOptions(); BasicConfigurator.Configure(new IAppender[] { appender, new DebugAppender { Layout = appender.Layout, Threshold = Level.All } }); } var log = LogManager.GetLogger("Main"); // Arguments if (args.Length < 4) { log.ErrorFormat("Needs 4 arguments: hostname port username password"); return; } var hostname = args[0]; var port = ushort.Parse(args[1]); var username = args[2]; var password = args[3]; // NP connection setup log.DebugFormat("Connecting to {0}:{1}...", hostname, port); var np = new NPClient(hostname, port); if (!np.Connect()) { log.Error("Connection to NP server failed."); return; } // Get session token var ah = new SessionAuthenticationClient(hostname); try { ah.Authenticate(username, password); } catch (Exception err) { np.Disconnect(); #if DEBUG log.ErrorFormat("Could not authenticate: {0}", err); #else log.ErrorFormat("Could not authenticate: {0}", err.Message); #endif return; } // Validate authentication using session token try { np.AuthenticateWithToken(ah.SessionToken).Wait(); } catch (Exception err) { #if DEBUG log.ErrorFormat("Authenticated but session token was invalid. {0}", err); #else log.ErrorFormat("Authenticated but session token was invalid ({0}).", err.Message); #endif return; } try { log.InfoFormat("Server says: {0}", Encoding.UTF8.GetString(np.GetPublisherFile("motd-english.txt").Result)); np.Disconnect(); } catch { log.ErrorFormat("Could not read MOTD from NP server."); } }
private async Task Start(string configFileName) { Configuration config; try { config = Configuration.Load(configFileName ?? "citmp-server.yml"); // if running on WinNT default to using windowed logger if (Environment.OSVersion.Platform == PlatformID.Win32NT && !config.DisableWindowedLogger) { WindowedLogger.Initialize(config.DebugLog); } if (config.AutoStartResources == null) { this.Log().Fatal("No auto-started resources were configured."); return; } if (config.ListenPort == 0) { this.Log().Fatal("No port was configured."); return; } if (config.Downloads == null) { config.Downloads = new Dictionary<string, DownloadConfiguration>(); } } catch (System.IO.IOException) { this.Log().Fatal("Could not open the configuration file {0}.", configFileName ?? "citmp-server.yml"); return; } var platformServer = config.PlatformServer ?? "iv-platform.prod.citizen.re"; var client = new NPClient(platformServer, (config.PlatformPort == 0) ? (ushort)3036 : (ushort)config.PlatformPort); this.Log().Info("Connecting to Terminal platform server at {0}.", platformServer); var connectResult = client.Connect(); if (!connectResult) { this.Log().Fatal("Could not connect to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Authenticating to Terminal with anonymous license key."); // authenticate anonymously var task = client.AuthenticateWithLicenseKey(""); if (!task.Wait(15000)) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}) - operation timed out.", platformServer); return; } if (!task.Result) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Creating initial server instance."); var commandManager = new Commands.CommandManager(); var resManager = new Resources.ResourceManager(config); // create the game server (as resource scanning needs it now) var gameServer = new Game.GameServer(config, resManager, commandManager, client); // preparse resources if (config.PreParseResources != null) { this.Log().Info("Pre-parsing resources: {0}", string.Join(", ", config.PreParseResources)); foreach (var resource in config.PreParseResources) { resManager.ScanResources("resources/", resource); var res = resManager.GetResource(resource); if (res != null) { await res.Start(); } } } else { this.Log().Warn("No PreParseResources defined. This usually means you're using an outdated configuration file. Please consider this."); } // scan resources resManager.ScanResources("resources/"); // start the game server gameServer.Start(); // and initialize the HTTP server var httpServer = new HTTP.HttpServer(config, resManager); httpServer.Start(); // start resources foreach (var resource in config.AutoStartResources) { var res = resManager.GetResource(resource); if (res == null) { this.Log().Error("Could not find auto-started resource {0}.", resource); } else { await res.Start(); } } // start synchronizing the started resources resManager.StartSynchronization(); // main loop int lastTickCount = Environment.TickCount; while (true) { Thread.Sleep(5); var tc = Environment.TickCount; gameServer.Tick(tc - lastTickCount); lastTickCount = tc; } }
private async Task Start(string configFileName) { Configuration config; try { config = Configuration.Load(configFileName ?? "citmp-server.yml"); // if running on WinNT default to using windowed logger if (Environment.OSVersion.Platform == PlatformID.Win32NT && !config.DisableWindowedLogger) { WindowedLogger.Initialize(config.DebugLog); } if (config.AutoStartResources == null) { this.Log().Fatal("No auto-started resources were configured."); return; } if (config.ListenPort == 0) { this.Log().Fatal("No port was configured."); return; } if (config.Downloads == null) { config.Downloads = new Dictionary <string, DownloadConfiguration>(); } } catch (System.IO.IOException) { this.Log().Fatal("Could not open the configuration file {0}.", configFileName ?? "citmp-server.yml"); return; } var platformServer = config.PlatformServer ?? "iv-platform.prod.citizen.re"; var client = new NPClient(platformServer, (config.PlatformPort == 0) ? (ushort)3036 : (ushort)config.PlatformPort); this.Log().Info("Connecting to Terminal platform server at {0}.", platformServer); var connectResult = client.Connect(); if (!connectResult) { this.Log().Fatal("Could not connect to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Authenticating to Terminal with anonymous license key."); // authenticate anonymously var task = client.AuthenticateWithLicenseKey(""); if (!task.Wait(15000)) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}) - operation timed out.", platformServer); return; } if (!task.Result) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Creating initial server instance."); var commandManager = new Commands.CommandManager(); var resManager = new Resources.ResourceManager(config); // create the game server (as resource scanning needs it now) var gameServer = new Game.GameServer(config, resManager, commandManager, client); // preparse resources if (config.PreParseResources != null) { this.Log().Info("Pre-parsing resources: {0}", string.Join(", ", config.PreParseResources)); foreach (var resource in config.PreParseResources) { resManager.ScanResources("resources/", resource); var res = resManager.GetResource(resource); if (res != null) { await res.Start(); } } } else { this.Log().Warn("No PreParseResources defined. This usually means you're using an outdated configuration file. Please consider this."); } // scan resources resManager.ScanResources("resources/"); // start the game server gameServer.Start(); // and initialize the HTTP server var httpServer = new HTTP.HttpServer(config, resManager); httpServer.Start(); // start resources foreach (var resource in config.AutoStartResources) { var res = resManager.GetResource(resource); if (res == null) { this.Log().Error("Could not find auto-started resource {0}.", resource); } else { await res.Start(); } } // start synchronizing the started resources resManager.StartSynchronization(); // main loop int lastTickCount = Environment.TickCount; while (true) { Thread.Sleep(5); var tc = Environment.TickCount; gameServer.Tick(tc - lastTickCount); lastTickCount = tc; } }
private static void Main(string[] args) { // log4net setup SetupLog4Net(); var log = LogManager.GetLogger("Main"); // Arguments if (args.Length < 4) { log.ErrorFormat("Needs 4 arguments: nphostname npport username password [httpport]"); return; } var hostname = args[0]; var port = ushort.Parse(args[1]); var username = args[2]; var password = args[3]; var hport = args.Length > 4 ? ushort.Parse(args[4]) : 5680; // Get session token var ah = new SessionAuthenticationClient(hostname); try { ah.Authenticate(username, password); log.Info("NP authentication successful."); } catch (Exception err) { #if DEBUG log.ErrorFormat("Could not authenticate: {0}", err); #else log.ErrorFormat("Could not authenticate: {0}", err.Message); #endif return; } // NP connection setup log.DebugFormat("Connecting to {0}:{1}...", hostname, port); var np = new NPClient(hostname, port); if (!np.Connect()) { log.Error("Connection to NP server failed."); return; } log.Info("NP connection successful, authenticating..."); // ??? if (!np.AuthenticateWithToken(ah.SessionToken).Result) { np.Disconnect(); log.Error("Authentication to NP server failed."); return; } // HTTP server using (var httpServer = new HttpServer(new HttpRequestProvider())) { log.Info("Starting up HTTP server..."); httpServer.Use(new TcpListenerAdapter(new TcpListener(IPAddress.Any, hport))); httpServer.Use(new HttpRouter() .With("user", new NP2HTTPUserFileHandler(np)) .With("pub", new NP2HTTPPublisherFileHandler(np)) ); httpServer.Use(new AnonymousHttpRequestHandler((context, next) => { context.Response = new HttpResponse(HttpResponseCode.NotFound, "File not found", context.Request.Headers.KeepAliveConnection()); return(Task.Factory.GetCompleted()); })); httpServer.Start(); log.InfoFormat("HTTP server now running on port {0}.", hport); log.InfoFormat("Access publisher files through http://{0}:{1}/pub/<file>", IPAddress.Any, hport); log.InfoFormat("Access user files through http://{0}:{1}/user/<file>", IPAddress.Any, hport); log.Info("You can shut down the HTTP server by pressing any key."); Console.ReadKey(); } }