From a791689ceb2b502929fa526d595465d36a22ac07 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Tue, 8 Jun 2010 22:03:08 +0200 Subject: [PATCH] Make the text mode remote console really work. It can now be used to send multi-word commands with proper quoting, handles arguments with spaces and allows interactive use, e.g. user creation. --- OpenSim/ConsoleClient/ConsoleClient.cs | 38 ++++++++++++++---- OpenSim/Framework/Console/RemoteConsole.cs | 46 +++++++++++++--------- OpenSim/Server/Base/ServicesServerBase.cs | 5 +++ 3 files changed, 62 insertions(+), 27 deletions(-) diff --git a/OpenSim/ConsoleClient/ConsoleClient.cs b/OpenSim/ConsoleClient/ConsoleClient.cs index 8c616e0271..f4605da0b8 100644 --- a/OpenSim/ConsoleClient/ConsoleClient.cs +++ b/OpenSim/ConsoleClient/ConsoleClient.cs @@ -29,6 +29,7 @@ using Nini.Config; using log4net; using System.Reflection; using System; +using System.IO; using System.Xml; using System.Collections.Generic; using OpenSim.Server.Base; @@ -73,9 +74,18 @@ namespace OpenSim.ConsoleClient Requester.MakeRequest("http://"+m_Host+":"+m_Port.ToString()+"/StartSession/", String.Format("USER={0}&PASS={1}", m_User, m_Pass), LoginReply); - int res = m_Server.Run(); + string pidFile = serverConfig.GetString("PIDFile", String.Empty); - Environment.Exit(res); + while (m_Server.Running) + { + System.Threading.Thread.Sleep(500); + // MainConsole.Instance.Prompt(); + } + + if (pidFile != String.Empty) + File.Delete(pidFile); + + Environment.Exit(0); return 0; } @@ -83,13 +93,14 @@ namespace OpenSim.ConsoleClient private static void SendCommand(string module, string[] cmd) { string sendCmd = ""; + string[] cmdlist = new string[cmd.Length - 1]; + + sendCmd = cmd[0]; + if (cmd.Length > 1) { - sendCmd = cmd[0]; - - Array.Copy(cmd, 1, cmd, 0, cmd.Length-1); - Array.Resize(ref cmd, cmd.Length-1); - sendCmd += "\"" + String.Join("\" \"", cmd) + "\""; + Array.Copy(cmd, 1, cmdlist, 0, cmd.Length - 1); + sendCmd += " \"" + String.Join("\" \"", cmdlist) + "\""; } Requester.MakeRequest("http://"+m_Host+":"+m_Port.ToString()+"/SessionCommand/", String.Format("ID={0}&COMMAND={1}", m_SessionID, sendCmd), CommandReply); @@ -183,16 +194,27 @@ namespace OpenSim.ConsoleClient while (lines.Count > 100) lines.RemoveAt(0); + string prompt = String.Empty; + foreach (string l in lines) { string[] parts = l.Split(new char[] {':'}, 3); if (parts.Length != 3) continue; - MainConsole.Instance.Output(parts[2].Trim(), parts[1]); + if (parts[2].StartsWith("+++") || parts[2].StartsWith("-++")) + prompt = parts[2]; + else + MainConsole.Instance.Output(parts[2].Trim(), parts[1]); } + Requester.MakeRequest(requestUrl, requestData, ReadResponses); + + if (prompt.StartsWith("+++")) + MainConsole.Instance.ReadLine(prompt.Substring(3), true, true); + else if (prompt.StartsWith("-++")) + SendCommand(String.Empty, new string[] { MainConsole.Instance.ReadLine(prompt.Substring(3), false, true) }); } public static void CommandReply(string requestUrl, string requestData, string replyData) diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index 6f8348de66..a46a6cb86f 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs @@ -106,8 +106,15 @@ namespace OpenSim.Framework.Console public override string ReadLine(string p, bool isCommand, bool e) { + if (isCommand) + Output("+++"+p); + else + Output("-++"+p); + m_DataEvent.WaitOne(); + string cmdinput; + lock (m_InputData) { if (m_InputData.Count == 0) @@ -116,29 +123,30 @@ namespace OpenSim.Framework.Console return ""; } - string cmdinput = m_InputData[0]; + cmdinput = m_InputData[0]; m_InputData.RemoveAt(0); if (m_InputData.Count == 0) m_DataEvent.Reset(); - if (isCommand) - { - string[] cmd = Commands.Resolve(Parser.Parse(cmdinput)); - - if (cmd.Length != 0) - { - int i; - - for (i=0 ; i < cmd.Length ; i++) - { - if (cmd[i].Contains(" ")) - cmd[i] = "\"" + cmd[i] + "\""; - } - return String.Empty; - } - } - return cmdinput; } + + if (isCommand) + { + string[] cmd = Commands.Resolve(Parser.Parse(cmdinput)); + + if (cmd.Length != 0) + { + int i; + + for (i=0 ; i < cmd.Length ; i++) + { + if (cmd[i].Contains(" ")) + cmd[i] = "\"" + cmd[i] + "\""; + } + return String.Empty; + } + } + return cmdinput; } private void DoExpire() @@ -308,7 +316,7 @@ namespace OpenSim.Framework.Console return reply; } - if (post["COMMAND"] == null || post["COMMAND"].ToString() == String.Empty) + if (post["COMMAND"] == null) return reply; lock (m_InputData) diff --git a/OpenSim/Server/Base/ServicesServerBase.cs b/OpenSim/Server/Base/ServicesServerBase.cs index 63ba67310d..a5bebb859f 100644 --- a/OpenSim/Server/Base/ServicesServerBase.cs +++ b/OpenSim/Server/Base/ServicesServerBase.cs @@ -236,6 +236,11 @@ namespace OpenSim.Server.Base Initialise(); } + public bool Running + { + get { return m_Running; } + } + public virtual int Run() { while (m_Running)