namespace Framework.Cli.Command { using Framework.Cli.Config; using Microsoft.Extensions.CommandLineUtils; using System; using System.Collections.Generic; using System.IO; /// /// Cli config command. /// internal class CommandConfig : CommandBase { public CommandConfig(AppCli appCli) : base(appCli, "config", "Read and write configuration") { } private CommandArgument argumentJson; private CommandArgument argumentDeployAzureGitUrl; private CommandArgument argumentConnectionString; private CommandArgument argumentConnectionStringFramework; private CommandArgument argumentConnectionStringApplication; private CommandArgument argumentWebsite; protected internal override void Register(CommandLineApplication configuration) { argumentJson = configuration.Argument("json", "Get or set ci server configuration."); argumentDeployAzureGitUrl = configuration.Argument("deployAzureGitUrl", "Get or set Azure git url for deployment."); argumentConnectionString = configuration.Argument("connectionString", "Set same database ConnectionString for Framework and Application."); argumentConnectionStringFramework = configuration.Argument("connectionStringFramework", "Get or set database ConnectionString for Framework."); argumentConnectionStringApplication = configuration.Argument("connectionStringApplication", "Get or set database ConnectionString for Application."); argumentWebsite = configuration.Argument("website", "Add (include) a layout website to ci build."); } private void ArgumentWebsite() { ConfigCli configCli = ConfigCli.Load(); // Input DomainName Console.WriteLine("Enter domain name. For example: 'example.com' or empty for default website:"); Console.Write(">"); string domainName = Console.ReadLine(); // Input AppTypeName Console.WriteLine("Enter AppTypeName. For example: 'Application.AppMain, Application':"); Console.Write(">"); string appTypeName = Console.ReadLine(); if (Type.GetType(appTypeName) == null) { UtilCliInternal.ConsoleWriteLineColor(string.Format("Warning! Type not found! ({0})", appTypeName), ConsoleColor.Yellow); // Warning } // Add Website ConfigCliWebsite website = new ConfigCliWebsite(); website.DomainNameList = new List(); website.DomainNameList.Add(new ConfigCliWebsiteDomain() { EnvironmentName = configCli.EnvironmentNameGet(), DomainName = domainName, AppTypeName = appTypeName }); configCli.WebsiteList.Add(website); ConfigCli.Save(configCli); } /// /// Write config ConnectionStringFramework and ConnectionStringApplication to ConfigCli.json and ConfigServer.json. /// private void ArgumentConnectionString() { ConfigCli configCli = ConfigCli.Load(); if (UtilCliInternal.ArgumentValue(this, argumentConnectionString, out string connectionString)) { // Write configCli.EnvironmentGet().ConnectionStringFramework = connectionString; configCli.EnvironmentGet().ConnectionStringApplication = connectionString; ConfigCli.Save(configCli); } } /// /// Read or write config ConnectionStringFramework. /// private void ArgumentConnectionStringFramework() { ConfigCli configCli = ConfigCli.Load(); if (UtilCliInternal.ArgumentValue(this, argumentConnectionStringFramework, out string connectionString)) { // Write configCli.EnvironmentGet().ConnectionStringFramework = connectionString; ConfigCli.Save(configCli); } else { // Read UtilCliInternal.ConsoleWriteLinePassword(argumentConnectionStringFramework.Name + "=" + configCli.EnvironmentGet().ConnectionStringFramework); } } /// /// Read or write config ConnectionStringApplication. /// private void ArgumentConnectionStringApplication() { ConfigCli configCli = ConfigCli.Load(); if (UtilCliInternal.ArgumentValue(this, argumentConnectionStringApplication, out string connectionString)) { // Write configCli.EnvironmentGet().ConnectionStringApplication = connectionString; ConfigCli.Save(configCli); } else { // Read UtilCliInternal.ConsoleWriteLinePassword(argumentConnectionStringApplication.Name + "=" + configCli.EnvironmentGet().ConnectionStringApplication); } } /// /// Removes ConnectionString from ConfigCli. Used for CI server if WebServer manages ConnectionString. /// private static void ConnectionStringRemove(ConfigCli configCli) { if (configCli.EnvironmentList != null) { foreach (var environment in configCli.EnvironmentList) { environment.ConnectionStringFramework = null; environment.ConnectionStringApplication = null; } } } protected internal override void Execute() { ConfigCli configCli = ConfigCli.Load(); // Command "json" if (UtilCliInternal.ArgumentValueIsDelete(this, argumentJson)) { if (UtilCliInternal.ArgumentValue(this, argumentJson, out string json)) { // Set ConfigCli.json with command: ".\cli.cmd config json='{}'" json = json.Trim('\"'); // Remove quotation marks at the begin and end. json = json.Replace("'", "\""); // To use it in command prompt. // Write try { configCli = UtilFramework.ConfigFromJson(json); } catch (Exception exception) { throw new Exception("ConfigCli invalid!", exception); } ConfigCli.Save(configCli); } } // Command "deployAzureGitUrl" if (UtilCliInternal.ArgumentValueIsDelete(this, argumentDeployAzureGitUrl)) { if (UtilCliInternal.ArgumentValue(this, argumentDeployAzureGitUrl, out string value)) { // Write configCli.EnvironmentGet().DeployAzureGitUrl = value; ConfigCli.Save(configCli); } else { // Read Console.WriteLine(argumentDeployAzureGitUrl.Name + "=" + configCli.EnvironmentGet().DeployAzureGitUrl); } return; } // Command "connectionString" if (UtilCliInternal.ArgumentValueIsDelete(this, argumentConnectionString)) { ArgumentConnectionString(); return; } // Command "connectionStringFramework" if (UtilCliInternal.ArgumentValueIsDelete(this, argumentConnectionStringFramework)) { ArgumentConnectionStringFramework(); return; } // Command "connectionStringApplication" if (UtilCliInternal.ArgumentValueIsDelete(this, argumentConnectionStringApplication)) { ArgumentConnectionStringApplication(); return; } // Command "website" if (UtilCliInternal.ArgumentValueIsDelete(this, argumentWebsite)) { ArgumentWebsite(); return; } // Print ConfigCli.json to screen { configCli = ConfigCli.Load(); Console.WriteLine(); UtilCliInternal.ConsoleWriteLineColor("Add the following environment variable to ci build server: (Value including double quotation marks!)", ConsoleColor.Green); // Remove ConnectionString if (UtilCliInternal.ArgumentValueIsDelete(this, argumentJson) == false) // No user interaction when json argument used. { if (UtilCliInternal.ConsoleReadYesNo("Include ConnectionString? (CI Server does not need it if managed by WebServer)") == false) { ConnectionStringRemove(configCli); } } string json = UtilFramework.ConfigToJson(configCli, isIndented: false); json = json.Replace("\"", "'"); // To use it in command prompt. UtilCliInternal.ConsoleWriteLineColor(configCli.EnvironmentGet().EnvironmentName + " " + "ConfigCli=", ConsoleColor.DarkGreen); UtilCliInternal.ConsoleWriteLineColor(string.Format("\"{0}\"", json), ConsoleColor.DarkGreen); Console.WriteLine(); } } } }