diff --git a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Commands/TenantCommand.cs b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Commands/TenantCommand.cs index 2122f2096..bab1323d4 100644 --- a/src/Orchard.Web/Modules/Orchard.MultiTenancy/Commands/TenantCommand.cs +++ b/src/Orchard.Web/Modules/Orchard.MultiTenancy/Commands/TenantCommand.cs @@ -14,12 +14,23 @@ namespace Orchard.MultiTenancy.Commands { } [OrchardSwitch] - public string Host { get; set; } - + public string DataProvider { get; set; } + [OrchardSwitch] + public string DataConnectionString { get; set; } + [OrchardSwitch] + public string DataTablePrefix { get; set; } + [OrchardSwitch] + public string UrlHost { get; set; } [OrchardSwitch] public string UrlPrefix { get; set; } + [OrchardSwitch] + public string Themes { get; set; } + [OrchardSwitch] + public string Modules { get; set; } + [OrchardSwitch] + public bool DropDatabaseTables { get; set; } - [CommandHelp("tenant list\r\n\t" + "Display current tenants of a site")] + [CommandHelp("tenant list\r\n\t" + "Display current tenants of the site.")] [CommandName("tenant list")] public void List() { Context.Output.WriteLine(T("List of tenants")); @@ -28,42 +39,23 @@ namespace Orchard.MultiTenancy.Commands { var tenants = _tenantService.GetTenants(); foreach (var tenant in tenants) { Context.Output.WriteLine(T("Name: ") + tenant.Name); - Context.Output.WriteLine(T("Provider: ") + tenant.DataProvider); - Context.Output.WriteLine(T("ConnectionString: ") + tenant.DataConnectionString); - Context.Output.WriteLine(T("Data Table Prefix: ") + tenant.DataTablePrefix); - Context.Output.WriteLine(T("Request Url Host: ") + tenant.RequestUrlHost); - Context.Output.WriteLine(T("Request Url Prefix: ") + tenant.RequestUrlPrefix); Context.Output.WriteLine(T("State: ") + tenant.State.ToString()); + Context.Output.WriteLine(T("Data provider: ") + tenant.DataProvider); + Context.Output.WriteLine(T("Connection string: ") + tenant.DataConnectionString); + Context.Output.WriteLine(T("Data table prefix: ") + tenant.DataTablePrefix); + Context.Output.WriteLine(T("Request URL host: ") + tenant.RequestUrlHost); + Context.Output.WriteLine(T("Request URL prefix: ") + tenant.RequestUrlPrefix); + Context.Output.WriteLine(T("Encryption algorithm: ") + tenant.EncryptionAlgorithm); + Context.Output.WriteLine(T("Encryption key: ") + tenant.EncryptionKey); + Context.Output.WriteLine(T("Hash algorithm: ") + tenant.HashAlgorithm); + Context.Output.WriteLine(T("Hash key: ") + tenant.HashKey); + Context.Output.WriteLine(T("Themes: ") + String.Join(";", tenant.Themes)); + Context.Output.WriteLine(T("Modules: ") + String.Join(";", tenant.Modules)); Context.Output.WriteLine(T("---------------------------")); } } - [CommandHelp("tenant add /Host: /UrlPrefix:\r\n\t" + - "Create new tenant named on the site")] - [CommandName("tenant add")] - [OrchardSwitches("Host,UrlPrefix")] - public void Create(string tenantName) { - Context.Output.WriteLine(T("Creating tenant")); - - if (string.IsNullOrWhiteSpace(tenantName) || !Regex.IsMatch(tenantName, @"^\w+$")) { - Context.Output.WriteLine(T("Invalid tenant name. Must contain characters only and no spaces.")); - return; - } - if (_tenantService.GetTenants().Any(tenant => string.Equals(tenant.Name, tenantName, StringComparison.OrdinalIgnoreCase))) { - Context.Output.WriteLine(T("Could not create tenant \"{0}\". A tenant with the same name already exists.", tenantName)); - return; - } - - _tenantService.CreateTenant( - new ShellSettings { - Name = tenantName, - RequestUrlHost = Host, - RequestUrlPrefix = UrlPrefix, - State = TenantState.Uninitialized - }); - } - - [CommandHelp("tenant info \r\n\t" + "Display settings for a tenant")] + [CommandHelp("tenant info \r\n\t" + "Display the current settings for a tenant.")] [CommandName("tenant info")] public void Info(string tenantName) { ShellSettings tenant = _tenantService.GetTenants().Where(x => x.Name == tenantName).FirstOrDefault(); @@ -72,17 +64,143 @@ namespace Orchard.MultiTenancy.Commands { Context.Output.Write(T("Tenant: ") + tenantName + T(" was not found")); } else { - Context.Output.WriteLine(T("Tenant Settings:")); + Context.Output.WriteLine(T("Tenant settings:")); Context.Output.WriteLine(T("---------------------------")); Context.Output.WriteLine(T("Name: ") + tenant.Name); - Context.Output.WriteLine(T("Provider: ") + tenant.DataProvider); - Context.Output.WriteLine(T("ConnectionString: ") + tenant.DataConnectionString); - Context.Output.WriteLine(T("Data Table Prefix: ") + tenant.DataTablePrefix); - Context.Output.WriteLine(T("Request Url Host: ") + tenant.RequestUrlHost); - Context.Output.WriteLine(T("Request Url Prefix: ") + tenant.RequestUrlPrefix); Context.Output.WriteLine(T("State: ") + tenant.State.ToString()); + Context.Output.WriteLine(T("Data provider: ") + tenant.DataProvider); + Context.Output.WriteLine(T("Connection string: ") + tenant.DataConnectionString); + Context.Output.WriteLine(T("Data table prefix: ") + tenant.DataTablePrefix); + Context.Output.WriteLine(T("Request URL host: ") + tenant.RequestUrlHost); + Context.Output.WriteLine(T("Request URL prefix: ") + tenant.RequestUrlPrefix); + Context.Output.WriteLine(T("Encryption algorithm: ") + tenant.EncryptionAlgorithm); + Context.Output.WriteLine(T("Encryption key: ") + tenant.EncryptionKey); + Context.Output.WriteLine(T("Hash algorithm: ") + tenant.HashAlgorithm); + Context.Output.WriteLine(T("Hash key: ") + tenant.HashKey); + Context.Output.WriteLine(T("Themes: ") + String.Join(";", tenant.Themes)); + Context.Output.WriteLine(T("Modules: ") + String.Join(";", tenant.Modules)); Context.Output.WriteLine(T("---------------------------")); } } + + [CommandHelp("tenant add /DataProvider: /DataConnectionString: /DataTablePrefix: /UrlHost: /UrlPrefix: /Themes: /Modules:\r\n\t" + "Create a new tenant named on the site.")] + [CommandName("tenant add")] + [OrchardSwitches("DataProvider,DataConnectionString,DataTablePrefix,UrlHost,UrlPrefix,Themes,Modules")] + public void Create(string tenantName) { + Context.Output.WriteLine(T("Creating tenant '{0}'...", tenantName)); + + if (string.IsNullOrWhiteSpace(tenantName) || !Regex.IsMatch(tenantName, @"^\w+$")) { + Context.Output.WriteLine(T("Invalid tenant name. Must contain characters only and no spaces.")); + return; + } + if (_tenantService.GetTenants().Any(tenant => String.Equals(tenant.Name, tenantName, StringComparison.OrdinalIgnoreCase))) { + Context.Output.WriteLine(T("Could not create tenant '{0}'. A tenant with the same name already exists.", tenantName)); + return; + } + + _tenantService.CreateTenant( + new ShellSettings { + Name = tenantName, + State = TenantState.Uninitialized, + DataProvider = DataProvider, + DataConnectionString = DataConnectionString, + DataTablePrefix = DataTablePrefix, + RequestUrlHost = UrlHost, + RequestUrlPrefix = UrlPrefix, + Themes = Themes.Split(';'), + Modules = Modules.Split(';') + }); + } + + [CommandHelp("tenant update /DataProvider: /DataConnectionString: /DataTablePrefix: /UrlHost: /UrlPrefix: /Themes: /Modules:\r\n\t" + "Update the settings of the existing tenant .")] + [CommandName("tenant update")] + [OrchardSwitches("DataProvider,DataConnectionString,DataTablePrefix,UrlHost,UrlPrefix,Themes,Modules")] + public void Edit(string tenantName) { + Context.Output.WriteLine(T("Updating tenant '{0}'...", tenantName)); + + if (string.IsNullOrWhiteSpace(tenantName) || !Regex.IsMatch(tenantName, @"^\w+$")) { + Context.Output.WriteLine(T("Invalid tenant name. Must contain characters only and no spaces.")); + return; + } + + var tenant = _tenantService.GetTenants().FirstOrDefault(t => String.Equals(t.Name, tenantName, StringComparison.OrdinalIgnoreCase)); + if (tenant == null) { + Context.Output.WriteLine(T("Could not update tenant '{0}'. No tenant with that name exists.", tenantName)); + return; + } + + _tenantService.UpdateTenant( + new ShellSettings { + Name = tenant.Name, + State = tenant.State, + DataProvider = DataProvider ?? tenant.DataProvider, + DataConnectionString = DataConnectionString ?? tenant.DataConnectionString, + DataTablePrefix = DataTablePrefix ?? tenant.DataTablePrefix, + RequestUrlHost = UrlHost ?? tenant.RequestUrlHost, + RequestUrlPrefix = UrlPrefix ?? tenant.RequestUrlPrefix, + Themes = Themes != null ? Themes.Split(';') : tenant.Themes, + Modules = Modules != null ? Modules.Split(';') : tenant.Modules + }); + } + + [CommandHelp("tenant disable \r\n\t" + "Disable the tenant .")] + [CommandName("tenant disable")] + public void Disable(string tenantName) { + Context.Output.WriteLine(T("Disabling tenant '{0}'...", tenantName)); + + if (string.IsNullOrWhiteSpace(tenantName) || !Regex.IsMatch(tenantName, @"^\w+$")) { + Context.Output.WriteLine(T("Invalid tenant name. Must contain characters only and no spaces.")); + return; + } + + var tenant = _tenantService.GetTenants().FirstOrDefault(t => String.Equals(t.Name, tenantName, StringComparison.OrdinalIgnoreCase)); + if (tenant == null) { + Context.Output.WriteLine(T("Could not disable tenant '{0}'. No tenant with that name exists.", tenantName)); + return; + } + + tenant.State = TenantState.Disabled; + _tenantService.UpdateTenant(tenant); + } + + [CommandHelp("tenant enable \r\n\t" + "Enable the tenant .")] + [CommandName("tenant enable")] + public void Enable(string tenantName) { + Context.Output.WriteLine(T("Enabling tenant '{0}'...", tenantName)); + + if (string.IsNullOrWhiteSpace(tenantName) || !Regex.IsMatch(tenantName, @"^\w+$")) { + Context.Output.WriteLine(T("Invalid tenant name. Must contain characters only and no spaces.")); + return; + } + + var tenant = _tenantService.GetTenants().FirstOrDefault(t => String.Equals(t.Name, tenantName, StringComparison.OrdinalIgnoreCase)); + if (tenant == null) { + Context.Output.WriteLine(T("Could not enable tenant '{0}'. No tenant with that name exists.", tenantName)); + return; + } + + tenant.State = TenantState.Running; + _tenantService.UpdateTenant(tenant); + } + + [CommandHelp("tenant reset /DropDatabaseTables:\r\n\t" + "Reset the tenant , optionally dropping its tables from the database.")] + [CommandName("tenant reset")] + [OrchardSwitches("DropDatabaseTables")] + public void Reset(string tenantName) { + Context.Output.WriteLine(T("Resetting tenant '{0}'...", tenantName)); + + if (string.IsNullOrWhiteSpace(tenantName) || !Regex.IsMatch(tenantName, @"^\w+$")) { + Context.Output.WriteLine(T("Invalid tenant name. Must contain characters only and no spaces.")); + return; + } + + var tenant = _tenantService.GetTenants().FirstOrDefault(t => String.Equals(t.Name, tenantName, StringComparison.OrdinalIgnoreCase)); + if (tenant == null) { + Context.Output.WriteLine(T("Could not reset tenant '{0}'. No tenant with that name exists.", tenantName)); + return; + } + + _tenantService.ResetTenant(tenant, DropDatabaseTables); + } } }