Esempio n. 1
0
        public static int Run(string[] args)
        {
            try
            {
                if (!HandleArguments(ref args))
                {
                    return(0);
                }
            }
            catch (OptionException e)
            {
                Console.Error.WriteLine(e.Message);
                return(1);
            }

            if (args.Length != 1)
            {
                Console.Error.WriteLine("Expected exactly one input file argument.");
                return(1);
            }

            Log.Level           = LogLevel.Debug;
            Log.TimestampFormat = "HH:mm:ss:fff";

            var color = Console.ForegroundColor;

            Log.Loggers.Add(new ConsoleLogger(false,
                                              color, color, color, color, color));

            if (!Debugger.IsAttached)
            {
                AppDomain.CurrentDomain.UnhandledException += UnhandledException;
            }

            var input   = args[0];
            var output  = _output ?? Path.ChangeExtension(input, "txt");
            var regexes = _regexes.Select(x => new Regex(x, RegexOptions))
                          .DefaultIfEmpty(new Regex(".*", RegexOptions))
                          .ToArray();

            _log.Basic("Parsing {0}...", input);

            var stats = new PacketStatistics();

            using (var reader = new PacketLogReader(input))
            {
                if (_header)
                {
                    _log.Info(string.Empty);
                    _log.Info("Version: {0}", reader.Version);
                    _log.Info("Compressed: {0}", reader.Compressed);
                    _log.Info("Region: {0}", reader.Messages.Region);
                    _log.Info("Servers:");

                    foreach (var srv in reader.Servers.Values)
                    {
                        _log.Info("  {0} ({1}): {2} -> {3}", srv.Name, srv.Id,
                                  srv.RealEndPoint, srv.ProxyEndPoint);
                    }

                    _log.Info(string.Empty);
                }

                PacketSerializer serializer;

                switch (_backend)
                {
                case PacketSerializerBackend.Reflection:
                    serializer = new ReflectionPacketSerializer(
                        reader.Messages);
                    break;

                case PacketSerializerBackend.Compiler:
                    serializer = new CompilerPacketSerializer(
                        reader.Messages);
                    break;

                default:
                    throw Assert.Unreachable();
                }

                using (var result = new StreamWriter(new FileStream(output,
                                                                    FileMode.Create, FileAccess.Write)))
                    foreach (var entry in reader.EnumerateAll())
                    {
                        HandleEntry(reader, entry, regexes, stats, serializer,
                                    result);
                    }
            }

            _log.Basic("Parsed packets to {0}", output);

            PrintStats(stats);

            return(0);
        }
Esempio n. 2
0
        protected override int Invoke(string[] args)
        {
            if (args.Length != 1)
            {
                Console.Error.WriteLine("Expected exactly 1 argument");
                return(1);
            }

            var input = args[0];

            if (_output == null)
            {
                _output = Path.ChangeExtension(input, ParsedExtension);
            }

            if (_regexes.Count == 0)
            {
                _regexes.Add(new Regex(".*", FilterRegexOptions));
            }

            _log.Basic("Parsing {0}...", input);

            var stats = new PacketStatistics();

            using var reader = new PacketLogReader(input);

            if (_header)
            {
                _log.Info(string.Empty);
                _log.Info("Version: {0}", reader.Version);
                _log.Info("Compression: {0}", reader.CompressionLevel);
                _log.Info("Region: {0}", reader.Region);
                _log.Info("Client Version: {0}", reader.GameMessages.Version);
                _log.Info("Servers:");

                foreach (var srv in reader.Servers.Values)
                {
                    _log.Info("  {0} ({1}): {2} -> {3}", srv.Name, srv.Id, srv.RealEndPoint,
                              srv.ProxyEndPoint);
                }

                _log.Info(string.Empty);
            }

            PacketSerializer serializer;

            switch (_backend)
            {
            case PacketSerializerBackend.Reflection:
                serializer = new ReflectionPacketSerializer(reader.Region, reader.GameMessages,
                                                            reader.SystemMessages);
                break;

            case PacketSerializerBackend.Compiler:
                serializer = new CompilerPacketSerializer(reader.Region, reader.GameMessages,
                                                          reader.SystemMessages);
                break;

            default:
                throw Assert.Unreachable();
            }

            using var result = new StreamWriter(new FileStream(_output, FileMode.Create, FileAccess.Write));

            foreach (var entry in reader.EnumerateAll())
            {
                HandleEntry(reader, entry, stats, serializer, result);
            }

            _log.Basic("Parsed packets to {0}", _output);

            PrintStatistics(stats);

            return(0);
        }
Esempio n. 3
0
        static ServerInstance StartServer(Region region, HostsFileManager hosts)
        {
            _log.Basic("{0} proxy server starting...", region);

            var sls     = ServerListParameters.Uris[region];
            var slsPort = Configuration.ServerListPort;

            if (slsPort == 0)
            {
                slsPort = sls.Port;
            }

            var slsHost    = sls.Host;
            var slsAddress = Configuration.ServerListBaseAddress;

            hosts?.RemoveEntry(slsHost, slsAddress);

            var real = Dns.GetHostEntry(slsHost).AddressList[0];

            _log.Info("Resolved {0} server list address: {1} -> {2}", region, slsHost, real);

            hosts?.AddEntry(slsHost, slsAddress);

            var slsProxy = new ServerListProxy(new ServerListParameters(real,
                                                                        Configuration.ServerListBaseAddress, slsPort, Configuration.GameBaseAddress,
                                                                        Configuration.GameBasePort, region, Configuration.ServerListTimeout,
                                                                        Configuration.ServerListRetries));

            var pool = new ObjectPool <SocketAsyncEventArgs>(() => new SocketAsyncEventArgs(),
                                                             x => x.Reset(), Configuration.PoolLimit != 0 ? (int?)Configuration.PoolLimit : null);
            var version    = DataCenter.ClientVersions[region];
            var serializer = new CompilerPacketSerializer(region, new GameMessageTable(version),
                                                          new SystemMessageTable(version));
            var proxies = slsProxy.Servers.Select(x => new GameProxy(x, pool, serializer,
                                                                     Configuration.GameBacklog, Configuration.GameMaxClients, Configuration.GameTimeout))
                          .ToArray();

            var path = Path.ChangeExtension(Path.Combine(Configuration.AssetDirectory,
                                                         DataCenter.FileNames[region]), DataCenter.UnpackedExtension);

            using var file = File.Exists(path) ? File.OpenRead(path) : null;
            var dc = file == null ? new DataCenter(version) : new DataCenter(file,
                                                                             Configuration.DataCenterMode, Configuration.DataCenterStringOptions);
            var loader = new PluginLoader(new PluginContext(region, dc, proxies),
                                          Configuration.PluginDirectory, Configuration.PluginPattern, Configuration.DisablePlugins);

            loader.Start();

            if (Configuration.ServerListEnabled)
            {
                slsProxy.Start();
            }

            foreach (var proxy in proxies)
            {
                proxy.Start();
            }

            _log.Basic("{0} proxy server started", region);

            return(new ServerInstance(slsProxy, loader, proxies));
        }