diff --git a/src/Orchard/Commands/CommandHostAgent.cs b/src/Orchard/Commands/CommandHostAgent.cs index 128401562..cf06a0ec5 100644 --- a/src/Orchard/Commands/CommandHostAgent.cs +++ b/src/Orchard/Commands/CommandHostAgent.cs @@ -16,21 +16,67 @@ namespace Orchard.Commands { /// executing a single command. /// public class CommandHostAgent { + private IContainer _hostContainer; + public int RunSingleCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary switches) { + int result = StartHost(input, output); + if (result != 0) + return result; + + result = RunCommand(input, output, tenant, args, switches); + if (result != 0) + return result; + + return StopHost(input, output); + } + + public int StartHost(TextReader input, TextWriter output) { try { - var hostContainer = OrchardStarter.CreateHostContainer(MvcSingletons); - var host = hostContainer.Resolve(); + _hostContainer = OrchardStarter.CreateHostContainer(MvcSingletons); + + var host = _hostContainer.Resolve(); host.Initialize(); + return 0; + } + catch (Exception e) { + for (; e != null; e = e.InnerException) { + output.WriteLine("Error: {0}", e.Message); + output.WriteLine("{0}", e.StackTrace); + } + return 5; + } + } + + + public int StopHost(TextReader input, TextWriter output) { + try { + // + _hostContainer.Dispose(); + _hostContainer = null; + return 0; + } + catch (Exception e) { + for (; e != null; e = e.InnerException) { + output.WriteLine("Error: {0}", e.Message); + output.WriteLine("{0}", e.StackTrace); + } + return 5; + } + } + + public int RunCommand(TextReader input, TextWriter output, string tenant, string[] args, Dictionary switches) { + try { + var host = _hostContainer.Resolve(); // Find tenant (or default) tenant = tenant ?? "default"; - var tenantManager = hostContainer.Resolve(); + var tenantManager = _hostContainer.Resolve(); var tenantSettings = tenantManager.LoadSettings().Single(s => String.Equals(s.Name, tenant, StringComparison.OrdinalIgnoreCase)); // Disptach command execution to ICommandManager using (var env = host.CreateStandaloneEnvironment(tenantSettings)) { var parameters = new CommandParameters { - Arguments = args, + Arguments = args, Switches = switches, Input = input, Output = output @@ -41,7 +87,7 @@ namespace Orchard.Commands { return 0; } catch (Exception e) { - for(; e != null; e = e.InnerException) { + for (; e != null; e = e.InnerException) { output.WriteLine("Error: {0}", e.Message); output.WriteLine("{0}", e.StackTrace); } diff --git a/src/Tools/Orchard/Host/CommandHost.cs b/src/Tools/Orchard/Host/CommandHost.cs index 52ef04877..5d3268db4 100644 --- a/src/Tools/Orchard/Host/CommandHost.cs +++ b/src/Tools/Orchard/Host/CommandHost.cs @@ -1,7 +1,10 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Web.Hosting; +using Orchard.Parameters; +using Orchard.ResponseFiles; namespace Orchard.Host { class CommandHost : MarshalByRefObject, IRegisteredObject { @@ -18,7 +21,7 @@ namespace Orchard.Host { //TODO } - public int RunCommand(TextReader input, TextWriter output, OrchardParameters args) { + public int RunCommand(TextReader input, TextWriter output, Logger logger, OrchardParameters args) { var agent = Activator.CreateInstance("Orchard.Framework", "Orchard.Commands.CommandHostAgent").Unwrap(); int result = (int)agent.GetType().GetMethod("RunSingleCommand").Invoke(agent, new object[] { input, @@ -29,5 +32,34 @@ namespace Orchard.Host { return result; } + + public int RunCommands(TextReader input, TextWriter output, Logger logger, IEnumerable responseLines) { + var agent = Activator.CreateInstance("Orchard.Framework", "Orchard.Commands.CommandHostAgent").Unwrap(); + + int result = (int)agent.GetType().GetMethod("StartHost").Invoke(agent, new object[] { input, output }); + if (result != 0) + return result; + + foreach (var line in responseLines) { + logger.LogInfo("{0} ({1}): Running command: {2}", line.Filename, line.LineNumber, line.LineText); + + var args = new OrchardParametersParser().Parse(new CommandParametersParser().Parse(line.Args)); + + result = (int)agent.GetType().GetMethod("RunCommand").Invoke(agent, new object[] { + input, + output, + args.Tenant, + args.Arguments.ToArray(), + args.Switches}); + + if (result != 0) { + output.WriteLine("{0} ({1}): Command returned error ({2})", line.Filename, line.LineNumber, result); + return result; + } + } + + result = (int)agent.GetType().GetMethod("StopHost").Invoke(agent, new object[] { input, output }); + return result; + } } -} \ No newline at end of file +} diff --git a/src/Tools/Orchard/Logger.cs b/src/Tools/Orchard/Logger.cs new file mode 100644 index 000000000..a5b685d47 --- /dev/null +++ b/src/Tools/Orchard/Logger.cs @@ -0,0 +1,21 @@ +using System; +using System.IO; + +namespace Orchard { + public class Logger : MarshalByRefObject { + private readonly bool _verbose; + private readonly TextWriter _output; + + public Logger(bool verbose, TextWriter output) { + _verbose = verbose; + _output = output; + } + + public void LogInfo(string format, params object[] args) { + if (_verbose) { + _output.Write("{0}: ", DateTime.Now); + _output.WriteLine(format, args); + } + } + } +} diff --git a/src/Tools/Orchard/Orchard.csproj b/src/Tools/Orchard/Orchard.csproj index 9a41e2e3b..dbc04e18d 100644 --- a/src/Tools/Orchard/Orchard.csproj +++ b/src/Tools/Orchard/Orchard.csproj @@ -48,6 +48,7 @@ + @@ -59,6 +60,8 @@ + +