Ejemplo n.º 1
0
        private void Run(String[] args)
        {
            try
            {
                if (args.Length == 0)
                {
                    args = new[] { "-?" }
                }
                ;

                for (var i = 0; i < args.Length; i++)
                {
                    switch (args[i].ToUpper())
                    {
                    case "-DBRESET":
                    {
                        bResetDatabase = true;
                        if (i + 1 < args.Length && args[i + 1][0] != '-')
                        {
                            sSysopPassword = args[i + 1];
                            i++;
                        }

                        break;
                    }

                    case "-APIREPORT":
                        bApiReport = true;
                        break;

                    case "-M":
                        sInputModule = args[i + 1];
                        i++;
                        break;

                    case "-P":
                        sInputPath = args[i + 1];
                        i++;
                        break;

                    case "-?":
                        Console.WriteLine(new ResourceManager().GetString("MBBSEmu.Assets.commandLineHelp.txt"));
                        Console.WriteLine($"Version: {new ResourceManager().GetString("MBBSEmu.Assets.version.txt")}");
                        return;

                    case "-CONFIG":
                    case "-C":
                    {
                        bConfigFile = true;
                        //Is there a following argument that doesn't start with '-'
                        //If so, it's the config file name
                        if (i + 1 < args.Length && args[i + 1][0] != '-')
                        {
                            sConfigFile = args[i + 1];

                            if (!File.Exists(sConfigFile))
                            {
                                Console.Write($"Specified Module Configuration File not found: {sConfigFile}");
                                return;
                            }
                            i++;
                        }
                        else
                        {
                            Console.WriteLine("Please specify a Module Configuration File when using the -C command line option");
                        }

                        break;
                    }

                    case "-S":
                    {
                        //Is there a following argument that doesn't start with '-'
                        //If so, it's the config file name
                        if (i + 1 < args.Length && args[i + 1][0] != '-')
                        {
                            sSettingsFile = args[i + 1];

                            if (!File.Exists(sSettingsFile))
                            {
                                Console.WriteLine($"Specified MBBSEmu settings not found: {sSettingsFile}");
                                return;
                            }
                            i++;
                        }
                        else
                        {
                            Console.WriteLine("Please specify an MBBSEmu configuration file when using the -S command line option");
                        }

                        break;
                    }

                    default:
                        Console.WriteLine($"Unknown Command Line Argument: {args[i]}");
                        return;
                    }
                }

                ServiceResolver.Create(sSettingsFile ?? DefaultEmuSettingsFilename);

                _logger = ServiceResolver.GetService <ILogger>();
                var config      = ServiceResolver.GetService <IConfiguration>();
                var fileUtility = ServiceResolver.GetService <IFileUtility>();

                //Database Reset
                if (bResetDatabase)
                {
                    DatabaseReset();
                }

                //Setup Generic Database
                if (!File.Exists($"BBSGEN.DAT"))
                {
                    _logger.Warn($"Unable to find MajorBBS/WG Generic User Database, creating new copy of BBSGEN.VIR to BBSGEN.DAT");

                    var resourceManager = ServiceResolver.GetService <IResourceManager>();

                    File.WriteAllBytes($"BBSGEN.DAT", resourceManager.GetResource("MBBSEmu.Assets.BBSGEN.VIR").ToArray());
                }

                //Setup Modules
                var modules = new List <MbbsModule>();
                if (!string.IsNullOrEmpty(sInputModule))
                {
                    //Load Command Line
                    modules.Add(new MbbsModule(fileUtility, sInputModule, sInputPath));
                }
                else if (bConfigFile)
                {
                    //Load Config File
                    var moduleConfiguration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                                              .AddJsonFile(sConfigFile, optional: false, reloadOnChange: true).Build();

                    foreach (var m in moduleConfiguration.GetSection("Modules").GetChildren())
                    {
                        _logger.Info($"Loading {m["Identifier"]}");
                        modules.Add(new MbbsModule(fileUtility, m["Identifier"], m["Path"]));
                    }
                }
                else
                {
                    _logger.Warn($"You must specify a module to load either via Command Line or Config File");
                    _logger.Warn($"View help documentation using -? for more information");
                    return;
                }

                //API Report
                if (bApiReport)
                {
                    foreach (var m in modules)
                    {
                        var apiReport = new ApiReport(m);
                        apiReport.GenerateReport();
                    }
                    return;
                }

                //Database Sanity Checks
                var databaseFile = ServiceResolver.GetService <IConfiguration>()["Database.File"];
                if (string.IsNullOrEmpty(databaseFile))
                {
                    _logger.Fatal($"Please set a valid database filename (eg: mbbsemu.db) in the appsettings.json file before running MBBSEmu");
                    return;
                }
                if (!File.Exists($"{databaseFile}"))
                {
                    _logger.Warn($"SQLite Database File {databaseFile} missing, performing Database Reset to perform initial configuration");
                    DatabaseReset();
                }

                //Setup and Run Host
                var host = ServiceResolver.GetService <IMbbsHost>();
                foreach (var m in modules)
                {
                    host.AddModule(m);
                }

                host.Start();

                runningServices.Add(host);

                //Setup and Run Telnet Server
                if (bool.TryParse(config["Telnet.Enabled"], out var telnetEnabled) && telnetEnabled)
                {
                    if (string.IsNullOrEmpty("Telnet.Port"))
                    {
                        _logger.Error("You must specify a port via Telnet.Port in appconfig.json if you're going to enable Telnet");
                        return;
                    }

                    var telnetService = ServiceResolver.GetService <ISocketServer>();
                    telnetService.Start(EnumSessionType.Telnet, int.Parse(config["Telnet.Port"]));

                    _logger.Info($"Telnet listening on port {config["Telnet.Port"]}");

                    runningServices.Add(telnetService);
                }
                else
                {
                    _logger.Info("Telnet Server Disabled (via appsettings.json)");
                }

                //Setup and Run Rlogin Server
                if (bool.TryParse(config["Rlogin.Enabled"], out var rloginEnabled) && rloginEnabled)
                {
                    if (string.IsNullOrEmpty("Rlogin.Port"))
                    {
                        _logger.Error("You must specify a port via Rlogin.Port in appconfig.json if you're going to enable Rlogin");
                        return;
                    }

                    if (string.IsNullOrEmpty("Rlogin.RemoteIP"))
                    {
                        _logger.Error("For security reasons, you must specify an authorized Remote IP via Rlogin.Port if you're going to enable Rlogin");
                        return;
                    }

                    var rloginService = ServiceResolver.GetService <ISocketServer>();
                    rloginService.Start(EnumSessionType.Rlogin, int.Parse(config["Rlogin.Port"]));

                    _logger.Info($"Rlogin listening on port {config["Rlogin.Port"]}");

                    runningServices.Add(rloginService);

                    if (bool.Parse(config["Rlogin.PortPerModule"]))
                    {
                        var rloginPort = int.Parse(config["Rlogin.Port"]) + 1;
                        foreach (var m in modules)
                        {
                            _logger.Info($"Rlogin {m.ModuleIdentifier} listening on port {rloginPort}");
                            rloginService = ServiceResolver.GetService <ISocketServer>();
                            rloginService.Start(EnumSessionType.Rlogin, rloginPort++, m.ModuleIdentifier);
                            runningServices.Add(rloginService);
                        }
                    }
                }
                else
                {
                    _logger.Info("Rlogin Server Disabled (via appsettings.json)");
                }

                _logger.Info($"Started MBBSEmu Build #{new ResourceManager().GetString("MBBSEmu.Assets.version.txt")}");

                Console.CancelKeyPress += cancelKeyPressHandler;
            }
            catch (Exception e)
            {
                Console.WriteLine("Critical Exception has occured:");
                Console.WriteLine(e);
                Environment.Exit(0);
            }
        }