public override int Handle(KSPManager manager, IUser user) { int exitCode = base.Handle(manager, user); if (exitCode == Exit.OK) { // User provided KSP instance if (KSPdir != null && KSP != null) { user.RaiseMessage("--ksp and --kspdir can't be specified at the same time"); return(Exit.BADOPT); } try { if (!string.IsNullOrEmpty(KSP)) { // Set a KSP directory by its alias. manager.SetCurrentInstance(KSP); } else if (!string.IsNullOrEmpty(KSPdir)) { // Set a KSP directory by its path manager.SetCurrentInstanceByPath(KSPdir); } } catch (NotKSPDirKraken k) { user.RaiseMessage("Sorry, {0} does not appear to be a KSP directory", k.path); return(Exit.BADOPT); } catch (InvalidKSPInstanceKraken k) { user.RaiseMessage("Invalid KSP installation specified \"{0}\", use '--kspdir' to specify by path, or 'ksp list' to see known KSP installations", k.instance); return(Exit.BADOPT); } } return(exitCode); }
/// <summary> /// Initialize the screen. /// </summary> /// <param name="mgr">KSP manager object for getting hte Instances</param> /// <param name="first">If true, this is the first screen after the splash, so Ctrl+Q exits, else Esc exits</param> public KSPListScreen(KSPManager mgr, bool first = false) { manager = mgr; AddObject(new ConsoleLabel( 1, 2, -1, () => "Select a game instance:" )); kspList = new ConsoleListBox <KSP>( 1, 4, -1, -2, manager.Instances.Values, new List <ConsoleListBoxColumn <KSP> >() { new ConsoleListBoxColumn <KSP>() { Header = "Default", Width = 7, Renderer = StatusSymbol }, new ConsoleListBoxColumn <KSP>() { Header = "Name", Width = 20, Renderer = k => k.Name }, new ConsoleListBoxColumn <KSP>() { Header = "Version", Width = 12, Renderer = k => k.Version()?.ToString() ?? noVersion, Comparer = (a, b) => a.Version()?.CompareTo(b.Version() ?? KspVersion.Any) ?? 1 }, new ConsoleListBoxColumn <KSP>() { Header = "Path", Width = 70, Renderer = k => k.GameDir() } }, 1, 0, ListSortDirection.Descending ); if (first) { AddTip("Ctrl+Q", "Quit"); AddBinding(Keys.AltX, (object sender) => false); AddBinding(Keys.CtrlQ, (object sender) => false); } else { AddTip("Esc", "Quit"); AddBinding(Keys.Escape, (object sender) => false); } AddTip("Enter", "Select"); AddBinding(Keys.Enter, (object sender) => { ConsoleMessageDialog d = new ConsoleMessageDialog( $"Loading instance {kspList.Selection.Name}...", new List <string>() ); if (TryGetInstance(kspList.Selection, () => { d.Run(() => {}); })) { try { manager.SetCurrentInstance(kspList.Selection.Name); } catch (Exception ex) { // This can throw if the previous current instance had an error, // since it gets destructed when it's replaced. RaiseError(ex.Message); } return(false); } else { return(true); } }); kspList.AddTip("A", "Add"); kspList.AddBinding(Keys.A, (object sender) => { LaunchSubScreen(new KSPAddScreen(manager)); kspList.SetData(manager.Instances.Values); return(true); }); kspList.AddTip("R", "Remove"); kspList.AddBinding(Keys.R, (object sender) => { manager.RemoveInstance(kspList.Selection.Name); kspList.SetData(manager.Instances.Values); return(true); }); kspList.AddTip("E", "Edit"); kspList.AddBinding(Keys.E, (object sender) => { ConsoleMessageDialog d = new ConsoleMessageDialog( $"Loading instance {kspList.Selection.Name}...", new List <string>() ); TryGetInstance(kspList.Selection, () => { d.Run(() => {}); }); // Still launch the screen even if the load fails, // because you need to be able to fix the name/path. LaunchSubScreen(new KSPEditScreen(manager, kspList.Selection)); return(true); }); kspList.AddTip("D", "Default"); kspList.AddBinding(Keys.D, (object sender) => { string name = kspList.Selection.Name; if (name == manager.AutoStartInstance) { manager.ClearAutoStart(); } else { try { manager.SetAutoStart(name); } catch (NotKSPDirKraken k) { ConsoleMessageDialog errd = new ConsoleMessageDialog( $"Error loading {k.path}:\n{k.Message}", new List <string>() { "OK" } ); errd.Run(); } } return(true); }); AddObject(kspList); mainMenu = kspList.SortMenu(); }
public static int Main(string[] args) { BasicConfigurator.Configure(); LogManager.GetRepository().Threshold = Level.Warn; log.Debug("CKAN started"); // If we're starting with no options then invoke the GUI instead. if (args.Length == 0) { return Gui(); } IUser user = new ConsoleUser(); Options cmdline; try { cmdline = new Options(args); } catch (BadCommandKraken) { // Our help screen will already be shown. Let's add some extra data. user.RaiseMessage("You are using CKAN version {0}", Meta.Version()); return Exit.BADOPT; } // Process commandline options. var options = (CommonOptions) cmdline.options; if (options.Debug) { LogManager.GetRepository().Threshold = Level.Debug; log.Info("Debug logging enabled"); } else if (options.Verbose) { LogManager.GetRepository().Threshold = Level.Info; log.Info("Verbose logging enabled"); } // TODO: Allow the user to specify just a directory. // User provided KSP instance if (options.KSPdir != null && options.KSP != null) { user.RaiseMessage("--ksp and --kspdir can't be specified at the same time"); return Exit.BADOPT; } KSPManager manager= new KSPManager(user); if (options.KSP != null) { // Set a KSP directory by its alias. try { manager.SetCurrentInstance(options.KSP); } catch (InvalidKSPInstanceKraken) { user.RaiseMessage("Invalid KSP installation specified \"{0}\", use '--kspdir' to specify by path, or 'list-installs' to see known KSP installations", options.KSP); return Exit.BADOPT; } } else if (options.KSPdir != null) { // Set a KSP directory by its path manager.SetCurrentInstanceByPath(options.KSPdir); } else if (! (cmdline.action == "ksp" || cmdline.action == "version")) { // Find whatever our preferred instance is. // We don't do this on `ksp/version` commands, they don't need it. CKAN.KSP ksp = manager.GetPreferredInstance(); if (ksp == null) { user.RaiseMessage("I don't know where KSP is installed."); user.RaiseMessage("Use 'ckan ksp help' for assistance on setting this."); return Exit.ERROR; } else { log.InfoFormat("Using KSP install at {0}",ksp.GameDir()); } } #region Aliases switch (cmdline.action) { case "add": cmdline.action = "install"; break; case "uninstall": cmdline.action = "remove"; break; default: break; } #endregion switch (cmdline.action) { case "gui": return Gui(); case "version": return Version(user); case "update": return Update((UpdateOptions)options, RegistryManager.Instance(manager.CurrentInstance), manager.CurrentInstance, user); case "available": return Available(manager.CurrentInstance, user); case "install": return Install((InstallOptions)cmdline.options, manager.CurrentInstance, user); case "scan": return Scan(manager.CurrentInstance); case "list": return List(user, manager.CurrentInstance); case "show": return Show((ShowOptions)cmdline.options, manager.CurrentInstance, user); case "remove": return Remove((RemoveOptions)cmdline.options, manager.CurrentInstance, user); case "upgrade": var upgrade = new Upgrade(user); return upgrade.RunCommand(manager.CurrentInstance, cmdline.options); case "clean": return Clean(manager.CurrentInstance); case "repair": var repair = new Repair(manager.CurrentInstance,user); return repair.RunSubCommand((SubCommandOptions) cmdline.options); case "ksp": var ksp = new KSP(manager, user); return ksp.RunSubCommand((SubCommandOptions) cmdline.options); default: user.RaiseMessage("Unknown command, try --help"); return Exit.BADOPT; } }
public void SetCurrentInstance_NameNotInRepo_Throws() { Assert.Throws <InvalidKSPInstanceKraken>(() => manager.SetCurrentInstance("invalid")); }
public static int RunCommandLine(string[] args, Func <string[], GuiOptions, int> showGuiFunc = null) { // Launch debugger if the "--debugger" flag is present in the command line arguments. // We want to do this as early as possible so just check the flag manually, rather than doing the // more robust argument parsing. if (args.Any(i => i == "--debugger")) { Debugger.Launch(); } if (args.Length == 1 && args.Any(i => i == "--verbose" || i == "--debug")) { // Start the gui with logging enabled #437 List <string> guiCommand = args.ToList(); guiCommand.Insert(0, "gui"); guiCommand.Add("--show-console"); args = guiCommand.ToArray(); } BasicConfigurator.Configure(); LogManager.GetRepository().Threshold = Level.Warn; log.Debug("CFAN started"); Options cmdline; // If we're starting with no options then invoke the GUI instead (if compiled with GUI) if (args.Length == 0) { if (showGuiFunc != null) { return(showGuiFunc(args, null)); } args = new[] { "--help" }; } IUser user; try { cmdline = new Options(args); } catch (BadCommandKraken) { // Our help screen will already be shown. Let's add some extra data. user = new ConsoleUser(false); user.RaiseMessage("You are using CFAN version {0}", Meta.Version()); return(Exit.BADOPT); } // Process commandline options. var options = (CommonOptions)cmdline.options; user = new ConsoleUser(options.Headless); CheckMonoVersion(user, 3, 1, 0); if ((Platform.IsUnix || Platform.IsMac) && CmdLineUtil.GetUID() == 0) { if (!options.AsRoot) { user.RaiseError(@"You are trying to run CFAN as root. This is a bad idea and there is absolutely no good reason to do it. Please run CFAN from a user account (or use --asroot if you are feeling brave)."); return(Exit.ERROR); } user.RaiseMessage("Warning: Running CFAN as root!"); } if (options.Debug) { LogManager.GetRepository().Threshold = Level.Debug; log.Info("Debug logging enabled"); } else if (options.Verbose) { LogManager.GetRepository().Threshold = Level.Info; log.Info("Verbose logging enabled"); } // Assign user-agent string if user has given us one if (options.NetUserAgent != null) { Net.UserAgentString = options.NetUserAgent; } // User provided KSP instance if (options.FactorioDirectory != null && options.FactorioInstallName != null) { user.RaiseMessage("--factorio and --factorio-dir can't be specified at the same time"); return(Exit.BADOPT); } KSPManager manager = new KSPManager(user); if (options.FactorioInstallName != null) { // Set a KSP directory by its alias. try { manager.SetCurrentInstance(options.FactorioInstallName); } catch (InvalidKSPInstanceKraken) { user.RaiseMessage("Invalid Factorio installation specified \"{0}\", use '--factorio-dir' to specify by path, or 'list-installs' to see known Factorio installations", options.FactorioInstallName); return(Exit.BADOPT); } } else if (options.FactorioDirectory != null) { // Set a KSP directory by its path manager.SetCurrentInstanceByPath(options.FactorioDirectory); } else if (cmdline.action != "factorio" && cmdline.action != "version" && cmdline.action != "gui") { // Find whatever our preferred instance is. // We don't do this on `ksp/version` commands, they don't need it. CKAN.KSP ksp = manager.GetPreferredInstance(); if (ksp == null) { user.RaiseMessage("I don't know where Factorio is installed."); user.RaiseMessage("Use 'cfan factorio help' for assistance on setting this."); return(Exit.ERROR); } log.InfoFormat("Using Factorio install at {0} with data dir set to {1}", ksp.GameDir(), ksp.GameData()); if (ksp.lacksFactorioAuthData()) { user.RaiseError( "Your config file located in {0} does not contain Factorio authorization data. Mods from official factorio.com mod portal will not be shown.\n\rYou can fix it by using in-game mod portal once. For headless you can copy values of service-username and service-token from your regular Factorio install.", new object[] { ksp.getFactorioAuthDataPath() } ); } } switch (cmdline.action) { case "gui": return(ShowGui(args, user, (GuiOptions)options, showGuiFunc)); case "version": return(Version(user)); case "update": return((new Update(user)).RunCommand(manager.CurrentInstance, (UpdateOptions)cmdline.options)); case "available": return(Available(manager.CurrentInstance, user)); case "install": Scan(manager.CurrentInstance, user, cmdline.action); return((new Install(user)).RunCommand(manager.CurrentInstance, (InstallOptions)cmdline.options)); case "scan": return(Scan(manager.CurrentInstance, user)); case "list": return((new List(user)).RunCommand(manager.CurrentInstance, (ListOptions)cmdline.options)); case "show": return((new Show(user)).RunCommand(manager.CurrentInstance, (ShowOptions)cmdline.options)); case "search": return((new Search(user)).RunCommand(manager.CurrentInstance, options)); case "remove": return((new Remove(user)).RunCommand(manager.CurrentInstance, cmdline.options)); case "upgrade": Scan(manager.CurrentInstance, user, cmdline.action); return((new Upgrade(user)).RunCommand(manager.CurrentInstance, cmdline.options)); case "clean": return(Clean(manager.CurrentInstance)); case "repair": var repair = new Repair(manager.CurrentInstance, user); return(repair.RunSubCommand((SubCommandOptions)cmdline.options)); case "factorio": var ksp = new KSP(manager, user); return(ksp.RunSubCommand((SubCommandOptions)cmdline.options)); case "repo": var repo = new Repo(manager, user); return(repo.RunSubCommand((SubCommandOptions)cmdline.options)); case "compare": return((new Compare(user)).RunCommand(manager.CurrentInstance, cmdline.options)); default: user.RaiseMessage("Unknown command, try --help"); return(Exit.BADOPT); } }
public static int Main(string[] args) { // Launch debugger if the "--debugger" flag is present in the command line arguments. // We want to do this as early as possible so just check the flag manually, rather than doing the // more robust argument parsing. if (args.Any(i => i == "--debugger")) { Debugger.Launch(); } BasicConfigurator.Configure(); LogManager.GetRepository().Threshold = Level.Warn; log.Debug("CKAN started"); Options cmdline; // If we're starting with no options then invoke the GUI instead. if (args.Length == 0) { return(Gui(new GuiOptions(), args)); } IUser user; try { cmdline = new Options(args); } catch (BadCommandKraken) { // Our help screen will already be shown. Let's add some extra data. user = new ConsoleUser(false); user.RaiseMessage("You are using CKAN version {0}", Meta.Version()); return(Exit.BADOPT); } // Process commandline options. var options = (CommonOptions)cmdline.options; user = new ConsoleUser(options.Headless); CheckMonoVersion(user, 3, 1, 0); if ((Platform.IsUnix || Platform.IsMac) && CmdLineUtil.GetUID() == 0) { if (!options.AsRoot) { user.RaiseError(@"You are trying to run CKAN as root. This is a bad idea and there is absolutely no good reason to do it. Please run CKAN from a user account (or use --asroot if you are feeling brave)."); return(Exit.ERROR); } else { user.RaiseMessage("Warning: Running CKAN as root!"); } } if (options.Debug) { LogManager.GetRepository().Threshold = Level.Debug; log.Info("Debug logging enabled"); } else if (options.Verbose) { LogManager.GetRepository().Threshold = Level.Info; log.Info("Verbose logging enabled"); } // Assign user-agent string if user has given us one if (options.NetUserAgent != null) { Net.UserAgentString = options.NetUserAgent; } // User provided KSP instance if (options.KSPdir != null && options.KSP != null) { user.RaiseMessage("--ksp and --kspdir can't be specified at the same time"); return(Exit.BADOPT); } KSPManager manager = new KSPManager(user); if (options.KSP != null) { // Set a KSP directory by its alias. try { manager.SetCurrentInstance(options.KSP); } catch (InvalidKSPInstanceKraken) { user.RaiseMessage("Invalid KSP installation specified \"{0}\", use '--kspdir' to specify by path, or 'list-installs' to see known KSP installations", options.KSP); return(Exit.BADOPT); } } else if (options.KSPdir != null) { // Set a KSP directory by its path manager.SetCurrentInstanceByPath(options.KSPdir); } else if (!(cmdline.action == "ksp" || cmdline.action == "version")) { // Find whatever our preferred instance is. // We don't do this on `ksp/version` commands, they don't need it. CKAN.KSP ksp = manager.GetPreferredInstance(); if (ksp == null) { user.RaiseMessage("I don't know where KSP is installed."); user.RaiseMessage("Use 'ckan ksp help' for assistance on setting this."); return(Exit.ERROR); } else { log.InfoFormat("Using KSP install at {0}", ksp.GameDir()); } } #region Aliases switch (cmdline.action) { case "add": cmdline.action = "install"; break; case "uninstall": cmdline.action = "remove"; break; } #endregion switch (cmdline.action) { case "gui": return(Gui((GuiOptions)options, args)); case "version": return(Version(user)); case "update": return((new Update(user)).RunCommand(manager.CurrentInstance, (UpdateOptions)cmdline.options)); case "available": return(Available(manager.CurrentInstance, user)); case "install": Scan(manager.CurrentInstance, user, cmdline.action); return((new Install(user)).RunCommand(manager.CurrentInstance, (InstallOptions)cmdline.options)); case "scan": return(Scan(manager.CurrentInstance, user)); case "list": return((new List(user)).RunCommand(manager.CurrentInstance, (ListOptions)cmdline.options)); case "show": return((new Show(user)).RunCommand(manager.CurrentInstance, (ShowOptions)cmdline.options)); case "search": return((new Search(user)).RunCommand(manager.CurrentInstance, options)); case "remove": return((new Remove(user)).RunCommand(manager.CurrentInstance, cmdline.options)); case "upgrade": Scan(manager.CurrentInstance, user, cmdline.action); return((new Upgrade(user)).RunCommand(manager.CurrentInstance, cmdline.options)); case "clean": return(Clean(manager.CurrentInstance)); case "repair": var repair = new Repair(manager.CurrentInstance, user); return(repair.RunSubCommand((SubCommandOptions)cmdline.options)); case "ksp": var ksp = new KSP(manager, user); return(ksp.RunSubCommand((SubCommandOptions)cmdline.options)); case "repo": var repo = new Repo(manager, user); return(repo.RunSubCommand((SubCommandOptions)cmdline.options)); case "compare": return((new Compare(user)).RunCommand(manager.CurrentInstance, cmdline.options)); default: user.RaiseMessage("Unknown command, try --help"); return(Exit.BADOPT); } }
public static int Main(string[] args) { // Launch debugger if the "--debugger" flag is present in the command line arguments. // We want to do this as early as possible so just check the flag manually, rather than doing the // more robust argument parsing. if (args.Any(i => i == "--debugger")) { Debugger.Launch(); } if (args.Length == 1 && args.Any(i => i == "--verbose" || i == "--debug")) { // Start the gui with logging enabled #437 var guiCommand = args.ToList(); guiCommand.Insert(0, "gui"); args = guiCommand.ToArray(); } Logging.Initialize(); log.Debug("CKAN started"); Options cmdline; // If we're starting with no options then invoke the GUI instead. if (args.Length == 0) { return(Gui(new GuiOptions(), args)); } IUser user; try { cmdline = new Options(args); } catch (BadCommandKraken) { // Our help screen will already be shown. Let's add some extra data. user = new ConsoleUser(false); user.RaiseMessage("You are using CKAN version {0}", Meta.GetVersion(VersionFormat.Full)); return(Exit.BADOPT); } // Process commandline options. var options = (CommonOptions)cmdline.options; user = new ConsoleUser(options.Headless); CheckMonoVersion(user, 3, 1, 0); // Processes in Docker containers normally run as root. // If we are running in a Docker container, do not require --asroot. // Docker creates a .dockerenv file in the root of each container. if ((Platform.IsUnix || Platform.IsMac) && CmdLineUtil.GetUID() == 0 && !File.Exists("/.dockerenv")) { if (!options.AsRoot) { user.RaiseError(@"You are trying to run CKAN as root. This is a bad idea and there is absolutely no good reason to do it. Please run CKAN from a user account (or use --asroot if you are feeling brave)."); return(Exit.ERROR); } else { user.RaiseMessage("Warning: Running CKAN as root!"); } } if (options.Debug) { LogManager.GetRepository().Threshold = Level.Debug; log.Info("Debug logging enabled"); } else if (options.Verbose) { LogManager.GetRepository().Threshold = Level.Info; log.Info("Verbose logging enabled"); } // Assign user-agent string if user has given us one if (options.NetUserAgent != null) { Net.UserAgentString = options.NetUserAgent; } // User provided KSP instance if (options.KSPdir != null && options.KSP != null) { user.RaiseMessage("--ksp and --kspdir can't be specified at the same time"); return(Exit.BADOPT); } var manager = new KSPManager(user); if (options.KSP != null) { // Set a KSP directory by its alias. try { manager.SetCurrentInstance(options.KSP); } catch (InvalidKSPInstanceKraken) { user.RaiseMessage("Invalid KSP installation specified \"{0}\", use '--kspdir' to specify by path, or 'list-installs' to see known KSP installations", options.KSP); return(Exit.BADOPT); } } else if (options.KSPdir != null) { // Set a KSP directory by its path manager.SetCurrentInstanceByPath(options.KSPdir); } else if (!(cmdline.action == "ksp" || cmdline.action == "version" || cmdline.action == "gui")) { // Find whatever our preferred instance is. // We don't do this on `ksp/version/gui` commands, they don't need it. CKAN.KSP ksp = manager.GetPreferredInstance(); if (ksp == null) { user.RaiseMessage("I don't know where KSP is installed."); user.RaiseMessage("Use 'ckan ksp help' for assistance on setting this."); return(Exit.ERROR); } else { log.InfoFormat("Using KSP install at {0}", ksp.GameDir()); } } #region Aliases switch (cmdline.action) { case "add": cmdline.action = "install"; break; case "uninstall": cmdline.action = "remove"; break; } #endregion //If we have found a preferred KSP instance, try to lock the registry if (manager.CurrentInstance != null) { try { using (var registry = RegistryManager.Instance(manager.CurrentInstance)) { log.InfoFormat("About to run action {0}", cmdline.action); return(RunAction(cmdline, options, args, user, manager)); } } catch (RegistryInUseKraken kraken) { log.Info("Registry in use detected"); user.RaiseMessage(kraken.ToString()); return(Exit.ERROR); } } else // we have no preferred KSP instance, so no need to lock the registry { return(RunAction(cmdline, options, args, user, manager)); } }
public static int Main(string[] args) { BasicConfigurator.Configure(); LogManager.GetRepository().Threshold = Level.Warn; log.Debug("CKAN started"); // If we're starting with no options, and this isn't // a stable build, then invoke the GUI instead. if (args.Length == 0) { if (Meta.IsStable()) { args = new string[] { "--help" }; } else { return(Gui()); } } Options cmdline; try { cmdline = new Options(args); } catch (BadCommandKraken) { // Our help screen will already be shown. Let's add some extra data. User.WriteLine("You are using CKAN version {0}", Meta.Version()); return(Exit.BADOPT); } // Process commandline options. var options = (CommonOptions)cmdline.options; if (options.Debug) { LogManager.GetRepository().Threshold = Level.Debug; log.Info("Debug logging enabled"); } else if (options.Verbose) { LogManager.GetRepository().Threshold = Level.Info; log.Info("Verbose logging enabled"); } // TODO: Allow the user to specify just a directory. // User provided KSP instance if (options.KSPdir != null && options.KSP != null) { User.WriteLine("--ksp and --kspdir can't be specified at the same time"); return(Exit.BADOPT); } if (options.KSP != null) { // Set a KSP directory by its alias. try { KSPManager.SetCurrentInstance(options.KSP); } catch (InvalidKSPInstanceKraken) { User.WriteLine("Invalid KSP installation specified \"{0}\", use '--kspdir' to specify by path, or 'list-installs' to see known KSP installations", options.KSP); return(Exit.BADOPT); } } else if (options.KSPdir != null) { // Set a KSP directory by its path KSPManager.SetCurrentInstanceByPath(options.KSPdir); } else if (!(cmdline.action == "ksp" || cmdline.action == "version")) { // Find whatever our preferred instance is. // We don't do this on `ksp/version` commands, they don't need it. CKAN.KSP ksp = KSPManager.GetPreferredInstance(); if (ksp == null) { User.WriteLine("I don't know where KSP is installed."); User.WriteLine("Use 'ckan ksp help' for assistance on setting this."); return(Exit.ERROR); } else { log.InfoFormat("Using KSP install at {0}", ksp.GameDir()); } } switch (cmdline.action) { case "gui": return(Gui()); case "version": return(Version()); case "update": return(Update((UpdateOptions)options)); case "available": return(Available()); case "install": return(Install((InstallOptions)cmdline.options)); case "scan": return(Scan()); case "list": return(List()); case "show": return(Show((ShowOptions)cmdline.options)); case "remove": return(Remove((RemoveOptions)cmdline.options)); case "upgrade": return(Upgrade((UpgradeOptions)cmdline.options)); case "clean": return(Clean()); case "repair": return(RunSubCommand <Repair>((SubCommandOptions)cmdline.options)); case "ksp": return(RunSubCommand <KSP>((SubCommandOptions)cmdline.options)); default: User.WriteLine("Unknown command, try --help"); return(Exit.BADOPT); } }
public static int Main(string[] args) { // Launch debugger if the "--debugger" flag is present in the command line arguments. // We want to do this as early as possible so just check the flag manually, rather than doing the // more robust argument parsing. if (args.Any(i => i == "--debugger")) { Debugger.Launch(); } if (args.Length == 1 && args.Any(i => i == "--verbose" || i == "--debug")) { // Start the gui with logging enabled #437 List<string> guiCommand = args.ToList(); guiCommand.Insert(0, "gui"); args = guiCommand.ToArray(); } BasicConfigurator.Configure(); LogManager.GetRepository().Threshold = Level.Warn; log.Debug("CKAN started"); Options cmdline; // If we're starting with no options then invoke the GUI instead. if (args.Length == 0) { return Gui(new GuiOptions(), args); } IUser user; try { cmdline = new Options(args); } catch (BadCommandKraken) { // Our help screen will already be shown. Let's add some extra data. user = new ConsoleUser(false); user.RaiseMessage("You are using CKAN version {0}", Meta.Version()); return Exit.BADOPT; } // Process commandline options. var options = (CommonOptions)cmdline.options; user = new ConsoleUser(options.Headless); CheckMonoVersion(user, 3, 1, 0); if ((Platform.IsUnix || Platform.IsMac) && CmdLineUtil.GetUID() == 0) { if (!options.AsRoot) { user.RaiseError(@"You are trying to run CKAN as root. This is a bad idea and there is absolutely no good reason to do it. Please run CKAN from a user account (or use --asroot if you are feeling brave)."); return Exit.ERROR; } else { user.RaiseMessage("Warning: Running CKAN as root!"); } } if (options.Debug) { LogManager.GetRepository().Threshold = Level.Debug; log.Info("Debug logging enabled"); } else if (options.Verbose) { LogManager.GetRepository().Threshold = Level.Info; log.Info("Verbose logging enabled"); } // Assign user-agent string if user has given us one if (options.NetUserAgent != null) { Net.UserAgentString = options.NetUserAgent; } // User provided KSP instance if (options.KSPdir != null && options.KSP != null) { user.RaiseMessage("--ksp and --kspdir can't be specified at the same time"); return Exit.BADOPT; } KSPManager manager= new KSPManager(user); if (options.KSP != null) { // Set a KSP directory by its alias. try { manager.SetCurrentInstance(options.KSP); } catch (InvalidKSPInstanceKraken) { user.RaiseMessage("Invalid KSP installation specified \"{0}\", use '--kspdir' to specify by path, or 'list-installs' to see known KSP installations", options.KSP); return Exit.BADOPT; } } else if (options.KSPdir != null) { // Set a KSP directory by its path manager.SetCurrentInstanceByPath(options.KSPdir); } else if (! (cmdline.action == "ksp" || cmdline.action == "version")) { // Find whatever our preferred instance is. // We don't do this on `ksp/version` commands, they don't need it. CKAN.KSP ksp = manager.GetPreferredInstance(); if (ksp == null) { user.RaiseMessage("I don't know where KSP is installed."); user.RaiseMessage("Use 'ckan ksp help' for assistance on setting this."); return Exit.ERROR; } else { log.InfoFormat("Using KSP install at {0}",ksp.GameDir()); } } #region Aliases switch (cmdline.action) { case "add": cmdline.action = "install"; break; case "uninstall": cmdline.action = "remove"; break; } #endregion switch (cmdline.action) { case "gui": return Gui((GuiOptions)options, args); case "version": return Version(user); case "update": return (new Update(user)).RunCommand(manager.CurrentInstance, (UpdateOptions)cmdline.options); case "available": return Available(manager.CurrentInstance, user); case "install": Scan(manager.CurrentInstance, user, cmdline.action); return (new Install(user)).RunCommand(manager.CurrentInstance, (InstallOptions)cmdline.options); case "scan": return Scan(manager.CurrentInstance,user); case "list": return (new List(user)).RunCommand(manager.CurrentInstance, (ListOptions)cmdline.options); case "show": return (new Show(user)).RunCommand(manager.CurrentInstance, (ShowOptions)cmdline.options); case "search": return (new Search(user)).RunCommand(manager.CurrentInstance, options); case "remove": return (new Remove(user)).RunCommand(manager.CurrentInstance, cmdline.options); case "upgrade": Scan(manager.CurrentInstance, user, cmdline.action); return (new Upgrade(user)).RunCommand(manager.CurrentInstance, cmdline.options); case "clean": return Clean(manager.CurrentInstance); case "repair": var repair = new Repair(manager.CurrentInstance,user); return repair.RunSubCommand((SubCommandOptions) cmdline.options); case "ksp": var ksp = new KSP(manager, user); return ksp.RunSubCommand((SubCommandOptions) cmdline.options); case "repo": var repo = new Repo (manager, user); return repo.RunSubCommand((SubCommandOptions) cmdline.options); case "compare": return (new Compare(user)).RunCommand(manager.CurrentInstance, cmdline.options); default: user.RaiseMessage("Unknown command, try --help"); return Exit.BADOPT; } }