aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorMelanie Thielker2009-02-07 12:25:39 +0000
committerMelanie Thielker2009-02-07 12:25:39 +0000
commit54c6a920baa0ef02a9ea09e08cc1effcef3b0a3a (patch)
treef606cbdbc383ec21fee28f0a1454140a1c714278
parentThank you dslake for a patch that: (diff)
downloadopensim-SC_OLD-54c6a920baa0ef02a9ea09e08cc1effcef3b0a3a.zip
opensim-SC_OLD-54c6a920baa0ef02a9ea09e08cc1effcef3b0a3a.tar.gz
opensim-SC_OLD-54c6a920baa0ef02a9ea09e08cc1effcef3b0a3a.tar.bz2
opensim-SC_OLD-54c6a920baa0ef02a9ea09e08cc1effcef3b0a3a.tar.xz
Replace the console for all OpenSim apps with a new console featuring command
line editing, context sensitive help (press ? at any time), command line history, a new plugin command system and new appender features thet let you type while the console is scrolling. Seamlessly integrates the ICommander interfaces.
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/Console/ConsoleBase.cs661
-rw-r--r--OpenSim/Framework/Console/ConsoleCallbacksBase.cs35
-rw-r--r--OpenSim/Framework/Console/OpenSimAppender.cs16
-rw-r--r--OpenSim/Framework/IScene.cs3
-rw-r--r--OpenSim/Framework/Servers/BaseOpenSimServer.cs119
-rw-r--r--OpenSim/Grid/AssetServer/Main.cs6
-rw-r--r--OpenSim/Grid/GridServer/GridServerBase.cs63
-rw-r--r--OpenSim/Grid/InventoryServer/Main.cs21
-rw-r--r--OpenSim/Grid/MessagingServer/Main.cs42
-rw-r--r--OpenSim/Grid/UserServer/Main.cs94
-rw-r--r--OpenSim/Region/Application/Application.cs15
-rw-r--r--OpenSim/Region/Application/HGOpenSimNode.cs27
-rw-r--r--OpenSim/Region/Application/OpenSim.cs1033
-rw-r--r--OpenSim/Region/Application/OpenSimBase.cs40
-rw-r--r--OpenSim/Region/ClientStack/RegionApplicationBase.cs2
-rw-r--r--OpenSim/Region/Environment/Modules/Framework/InterfaceCommander/Command.cs12
-rw-r--r--OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs148
-rw-r--r--OpenSim/Region/Framework/Interfaces/ICommand.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs18
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs6
-rw-r--r--OpenSim/TestSuite/BotManager.cs51
-rw-r--r--OpenSim/Tools/pCampBot/BotManager.cs85
23 files changed, 1471 insertions, 1035 deletions
diff --git a/OpenSim/Framework/Console/ConsoleBase.cs b/OpenSim/Framework/Console/ConsoleBase.cs
index 30af23a..f990748 100644
--- a/OpenSim/Framework/Console/ConsoleBase.cs
+++ b/OpenSim/Framework/Console/ConsoleBase.cs
@@ -26,22 +26,250 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Text;
30using System.Diagnostics;
31using System.Net;
32using System.Reflection; 30using System.Reflection;
33using System.Text.RegularExpressions; 31using System.Diagnostics;
32using System.Collections.Generic;
34using log4net; 33using log4net;
35 34
36namespace OpenSim.Framework.Console 35namespace OpenSim.Framework.Console
37{ 36{
37 public delegate void CommandDelegate(string module, string[] cmd);
38
39 public class Commands
40 {
41 private class CommandInfo
42 {
43 public string module;
44 public string help_text;
45 public string long_help;
46 public CommandDelegate fn;
47 }
48
49 private Dictionary<string, Object> tree =
50 new Dictionary<string, Object>();
51
52 public List<string> GetHelp()
53 {
54 List<string> help = new List<string>();
55
56 help.AddRange(CollectHelp(tree));
57
58 help.Sort();
59
60 return help;
61 }
62
63 private List<string> CollectHelp(Dictionary<string, Object> dict)
64 {
65 List<string> result = new List<string>();
66
67 foreach (KeyValuePair<string, object> kvp in dict)
68 {
69 if (kvp.Value is Dictionary<string, Object>)
70 {
71 result.AddRange(CollectHelp((Dictionary<string, Object>)kvp.Value));
72 }
73 else
74 {
75 if (((CommandInfo)kvp.Value).long_help != String.Empty)
76 result.Add(((CommandInfo)kvp.Value).help_text+" - "+
77 ((CommandInfo)kvp.Value).long_help);
78 }
79 }
80 return result;
81 }
82
83 public void AddCommand(string module, string command, string help, string longhelp, CommandDelegate fn)
84 {
85 string[] parts = Parser.Parse(command);
86
87 Dictionary<string, Object> current = tree;
88 foreach (string s in parts)
89 {
90 if (current.ContainsKey(s))
91 {
92 if (current[s] is Dictionary<string, Object>)
93 {
94 current = (Dictionary<string, Object>)current[s];
95 }
96 else
97 return;
98 }
99 else
100 {
101 current[s] = new Dictionary<string, Object>();
102 current = (Dictionary<string, Object>)current[s];
103 }
104 }
105
106 if (current.ContainsKey(String.Empty))
107 return;
108 CommandInfo info = new CommandInfo();
109 info.module = module;
110 info.help_text = help;
111 info.long_help = longhelp;
112 info.fn = fn;
113 current[String.Empty] = info;
114 }
115
116 public string[] FindNextOption(string[] cmd, bool term)
117 {
118 Dictionary<string, object> current = tree;
119
120 int remaining = cmd.Length;
121
122 foreach (string s in cmd)
123 {
124 remaining--;
125
126 List<string> found = new List<string>();
127
128 foreach (string opt in current.Keys)
129 {
130 if (opt.StartsWith(s))
131 {
132 found.Add(opt);
133 }
134 }
135
136 if (found.Count == 1 && (remaining != 0 || term))
137 {
138 current = (Dictionary<string, object>)current[found[0]];
139 }
140 else if (found.Count > 0)
141 {
142 return found.ToArray();
143 }
144 else
145 {
146 break;
147// return new string[] {"<cr>"};
148 }
149 }
150
151 if (current.Count > 1)
152 {
153 List<string> choices = new List<string>();
154
155 bool addcr = false;
156 foreach (string s in current.Keys)
157 {
158 if (s == String.Empty)
159 {
160 CommandInfo ci = (CommandInfo)current[String.Empty];
161 if (ci.fn != null)
162 addcr = true;
163 }
164 else
165 choices.Add(s);
166 }
167 if (addcr)
168 choices.Add("<cr>");
169 return choices.ToArray();
170 }
171
172 if (current.ContainsKey(String.Empty))
173 return new string[] { "Command help: "+((CommandInfo)current[String.Empty]).help_text};
174
175 return new string[] { new List<string>(current.Keys)[0] };
176 }
177
178 public string[] Resolve(string[] cmd)
179 {
180 string[] result = cmd;
181 int index = -1;
182
183 Dictionary<string, object> current = tree;
184
185 foreach (string s in cmd)
186 {
187 index++;
188
189 List<string> found = new List<string>();
190
191 foreach (string opt in current.Keys)
192 {
193 if (opt.StartsWith(s))
194 {
195 found.Add(opt);
196 }
197 }
198
199 if (found.Count == 1)
200 {
201 result[index] = found[0];
202 current = (Dictionary<string, object>)current[found[0]];
203 }
204 else if (found.Count > 0)
205 {
206 return new string[0];
207 }
208 else
209 {
210 break;
211 }
212 }
213
214 if (current.ContainsKey(String.Empty))
215 {
216 CommandInfo ci = (CommandInfo)current[String.Empty];
217 if (ci.fn == null)
218 return new string[0];
219 ci.fn(ci.module, result);
220 return result;
221 }
222 return new string[0];
223 }
224 }
225
226 public class Parser
227 {
228 public static string[] Parse(string text)
229 {
230 List<string> result = new List<string>();
231
232 int index;
233
234 string[] unquoted = text.Split(new char[] {'"'});
235
236 for (index = 0 ; index < unquoted.Length ; index++)
237 {
238 if (index % 2 == 0)
239 {
240 string[] words = unquoted[index].Split(new char[] {' '});
241 foreach (string w in words)
242 {
243 if (w != String.Empty)
244 result.Add(w);
245 }
246 }
247 else
248 {
249 result.Add(unquoted[index]);
250 }
251 }
252
253 return result.ToArray();
254 }
255 }
256
38 public class ConsoleBase 257 public class ConsoleBase
39 { 258 {
40 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 259 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41 260
42 private readonly object m_syncRoot = new object(); 261 private readonly object m_syncRoot = new object();
43 262
44 public conscmd_callback m_cmdParser; 263 private int y = -1;
264 private int cp = 0;
265 private int h = 1;
266 private string prompt = "# ";
267 private StringBuilder cmdline = new StringBuilder();
268 public Commands Commands = new Commands();
269 private bool echo = true;
270 private List<string> history = new List<string>();
271
272 public object ConsoleScene = null;
45 273
46 /// <summary> 274 /// <summary>
47 /// The default prompt text. 275 /// The default prompt text.
@@ -53,15 +281,19 @@ namespace OpenSim.Framework.Console
53 } 281 }
54 protected string m_defaultPrompt; 282 protected string m_defaultPrompt;
55 283
56 /// <summary> 284 public ConsoleBase(string defaultPrompt)
57 /// Constructor.
58 /// </summary>
59 /// <param name="defaultPrompt"></param>
60 /// <param name="cmdparser"></param>
61 public ConsoleBase(string defaultPrompt, conscmd_callback cmdparser)
62 { 285 {
63 DefaultPrompt = defaultPrompt; 286 DefaultPrompt = defaultPrompt;
64 m_cmdParser = cmdparser; 287
288 Commands.AddCommand("console", "help", "help", "Get command list", Help);
289 }
290
291 private void AddToHistory(string text)
292 {
293 while (history.Count >= 100)
294 history.RemoveAt(0);
295
296 history.Add(text);
65 } 297 }
66 298
67 /// <summary> 299 /// <summary>
@@ -95,8 +327,7 @@ namespace OpenSim.Framework.Console
95 /// <param name="args">WriteLine-style message arguments</param> 327 /// <param name="args">WriteLine-style message arguments</param>
96 public void Warn(string sender, string format, params object[] args) 328 public void Warn(string sender, string format, params object[] args)
97 { 329 {
98 WritePrefixLine(DeriveColor(sender), sender); 330 WriteNewLine(DeriveColor(sender), sender, ConsoleColor.Yellow, format, args);
99 WriteNewLine(ConsoleColor.Yellow, format, args);
100 } 331 }
101 332
102 /// <summary> 333 /// <summary>
@@ -117,10 +348,8 @@ namespace OpenSim.Framework.Console
117 /// <param name="args">WriteLine-style message arguments</param> 348 /// <param name="args">WriteLine-style message arguments</param>
118 public void Notice(string sender, string format, params object[] args) 349 public void Notice(string sender, string format, params object[] args)
119 { 350 {
120 WritePrefixLine(DeriveColor(sender), sender); 351 WriteNewLine(DeriveColor(sender), sender, ConsoleColor.White, format, args);
121 WriteNewLine(ConsoleColor.White, format, args);
122 } 352 }
123
124 /// <summary> 353 /// <summary>
125 /// Sends an error to the current console output 354 /// Sends an error to the current console output
126 /// </summary> 355 /// </summary>
@@ -139,8 +368,7 @@ namespace OpenSim.Framework.Console
139 /// <param name="args">WriteLine-style message arguments</param> 368 /// <param name="args">WriteLine-style message arguments</param>
140 public void Error(string sender, string format, params object[] args) 369 public void Error(string sender, string format, params object[] args)
141 { 370 {
142 WritePrefixLine(DeriveColor(sender), sender); 371 WriteNewLine(DeriveColor(sender), sender, ConsoleColor.Red, format, args);
143 Error(format, args);
144 } 372 }
145 373
146 /// <summary> 374 /// <summary>
@@ -161,8 +389,7 @@ namespace OpenSim.Framework.Console
161 /// <param name="args">WriteLine-style message arguments</param> 389 /// <param name="args">WriteLine-style message arguments</param>
162 public void Status(string sender, string format, params object[] args) 390 public void Status(string sender, string format, params object[] args)
163 { 391 {
164 WritePrefixLine(DeriveColor(sender), sender); 392 WriteNewLine(DeriveColor(sender), sender, ConsoleColor.Blue, format, args);
165 WriteNewLine(ConsoleColor.Blue, format, args);
166 } 393 }
167 394
168 [Conditional("DEBUG")] 395 [Conditional("DEBUG")]
@@ -174,12 +401,60 @@ namespace OpenSim.Framework.Console
174 [Conditional("DEBUG")] 401 [Conditional("DEBUG")]
175 public void Debug(string sender, string format, params object[] args) 402 public void Debug(string sender, string format, params object[] args)
176 { 403 {
177 WritePrefixLine(DeriveColor(sender), sender); 404 WriteNewLine(DeriveColor(sender), sender, ConsoleColor.Gray, format, args);
178 WriteNewLine(ConsoleColor.Gray, format, args); 405 }
406
407 private void WriteNewLine(ConsoleColor senderColor, string sender, ConsoleColor color, string format, params object[] args)
408 {
409 lock (cmdline)
410 {
411 if (y != -1)
412 {
413 System.Console.CursorTop = y;
414 System.Console.CursorLeft = 0;
415
416 int count = cmdline.Length;
417
418 System.Console.Write(" ");
419 while (count-- > 0)
420 System.Console.Write(" ");
421
422 System.Console.CursorTop = y;
423 System.Console.CursorLeft = 0;
424 }
425 WritePrefixLine(senderColor, sender);
426 WriteConsoleLine(color, format, args);
427 if (y != -1)
428 y = System.Console.CursorTop;
429 }
179 } 430 }
180 431
181 private void WriteNewLine(ConsoleColor color, string format, params object[] args) 432 private void WriteNewLine(ConsoleColor color, string format, params object[] args)
182 { 433 {
434 lock (cmdline)
435 {
436 if (y != -1)
437 {
438 System.Console.CursorTop = y;
439 System.Console.CursorLeft = 0;
440
441 int count = cmdline.Length;
442
443 System.Console.Write(" ");
444 while (count-- > 0)
445 System.Console.Write(" ");
446
447 System.Console.CursorTop = y;
448 System.Console.CursorLeft = 0;
449 }
450 WriteConsoleLine(color, format, args);
451 if (y != -1)
452 y = System.Console.CursorTop;
453 }
454 }
455
456 private void WriteConsoleLine(ConsoleColor color, string format, params object[] args)
457 {
183 try 458 try
184 { 459 {
185 lock (m_syncRoot) 460 lock (m_syncRoot)
@@ -240,108 +515,150 @@ namespace OpenSim.Framework.Console
240 } 515 }
241 } 516 }
242 517
243 public string ReadLine() 518 private void Help(string module, string[] cmd)
244 { 519 {
245 try 520 List<string> help = Commands.GetHelp();
246 { 521
247 string line = System.Console.ReadLine(); 522 foreach (string s in help)
523 Output(s);
524 }
248 525
249 while (line == null) 526 private void Show()
527 {
528 lock (cmdline)
529 {
530 if (y == -1 || System.Console.BufferWidth == 0)
531 return;
532
533 int xc = prompt.Length + cp;
534 int new_x = xc % System.Console.BufferWidth;
535 int new_y = y + xc / System.Console.BufferWidth;
536 int end_y = y + (cmdline.Length + prompt.Length) / System.Console.BufferWidth;
537 if (end_y / System.Console.BufferWidth >= h)
538 h++;
539 if (end_y >= System.Console.BufferHeight) // wrap
250 { 540 {
251 line = System.Console.ReadLine(); 541 y--;
542 new_y--;
543 System.Console.CursorLeft = 0;
544 System.Console.CursorTop = System.Console.BufferHeight-1;
545 System.Console.WriteLine(" ");
252 } 546 }
253 547
254 return line; 548 System.Console.CursorTop = y;
255 } 549 System.Console.CursorLeft = 0;
256 catch (Exception e)
257 {
258 m_log.Error("[Console]: System.Console.ReadLine exception " + e.ToString());
259 return String.Empty;
260 }
261 }
262 550
263 public int Read() 551 if (echo)
264 { 552 System.Console.Write("{0}{1}", prompt, cmdline);
265 return System.Console.Read(); 553 else
554 System.Console.Write("{0}", prompt);
555
556 System.Console.CursorLeft = new_x;
557 System.Console.CursorTop = new_y;
558 }
266 } 559 }
267 560
268 public IPAddress CmdPromptIPAddress(string prompt, string defaultvalue) 561 public void LockOutput()
269 { 562 {
270 IPAddress address; 563 System.Threading.Monitor.Enter(cmdline);
271 string addressStr; 564 try
272
273 while (true)
274 { 565 {
275 addressStr = CmdPrompt(prompt, defaultvalue); 566 if (y != -1)
276 if (IPAddress.TryParse(addressStr, out address))
277 { 567 {
278 break; 568 System.Console.CursorTop = y;
279 } 569 System.Console.CursorLeft = 0;
280 else 570
281 { 571 int count = cmdline.Length + prompt.Length;
282 m_log.Error("Illegal address. Please re-enter."); 572
573 while (count-- > 0)
574 System.Console.Write(" ");
575
576 System.Console.CursorTop = y;
577 System.Console.CursorLeft = 0;
578
283 } 579 }
284 } 580 }
285 581 catch (Exception)
286 return address; 582 {
583 }
287 } 584 }
288 585
289 public uint CmdPromptIPPort(string prompt, string defaultvalue) 586 public void UnlockOutput()
290 { 587 {
291 uint port; 588 if (y != -1)
292 string portStr; 589 {
590 y = System.Console.CursorTop;
591 Show();
592 }
593 System.Threading.Monitor.Exit(cmdline);
594 }
293 595
294 while (true) 596 public void Output(string text)
597 {
598 lock (cmdline)
295 { 599 {
296 portStr = CmdPrompt(prompt, defaultvalue); 600 if (y == -1)
297 if (uint.TryParse(portStr, out port))
298 { 601 {
299 if (port >= IPEndPoint.MinPort && port <= IPEndPoint.MaxPort) 602 System.Console.WriteLine(text);
300 { 603
301 break; 604 return;
302 }
303 } 605 }
304 606
305 m_log.Error("Illegal address. Please re-enter."); 607 System.Console.CursorTop = y;
306 } 608 System.Console.CursorLeft = 0;
307 609
308 return port; 610 int count = cmdline.Length + prompt.Length;
309 }
310 611
311 // Displays a prompt and waits for the user to enter a string, then returns that string 612 while (count-- > 0)
312 // (Done with no echo and suitable for passwords - currently disabled) 613 System.Console.Write(" ");
313 public string PasswdPrompt(string prompt) 614
314 { 615 System.Console.CursorTop = y;
315 // FIXME: Needs to be better abstracted 616 System.Console.CursorLeft = 0;
316 System.Console.WriteLine(String.Format("{0}: ", prompt)); 617
317 //ConsoleColor oldfg = System.Console.ForegroundColor; 618 System.Console.WriteLine(text);
318 //System.Console.ForegroundColor = System.Console.BackgroundColor; 619
319 string temp = System.Console.ReadLine(); 620 y = System.Console.CursorTop;
320 //System.Console.ForegroundColor = oldfg; 621
321 return temp; 622 Show();
623 }
322 } 624 }
323 625
324 // Displays a command prompt and waits for the user to enter a string, then returns that string 626 private void ContextHelp()
325 public string CmdPrompt(string prompt)
326 { 627 {
327 System.Console.WriteLine(String.Format("{0}: ", prompt)); 628 string[] words = Parser.Parse(cmdline.ToString());
328 return ReadLine(); 629
630 string[] opts = Commands.FindNextOption(words, cmdline.ToString().EndsWith(" "));
631
632 if (opts[0].StartsWith("Command help:"))
633 Output(opts[0]);
634 else
635 Output(String.Format("Options: {0}", String.Join(" ", opts)));
329 } 636 }
330 637
331 // Displays a command prompt and returns a default value if the user simply presses enter 638 public void Prompt()
332 public string CmdPrompt(string prompt, string defaultresponse)
333 { 639 {
334 string temp = CmdPrompt(String.Format("{0} [{1}]", prompt, defaultresponse)); 640 string line = ReadLine(m_defaultPrompt, true, true);
335 if (temp == String.Empty) 641
336 { 642 if (line != String.Empty)
337 return defaultresponse;
338 }
339 else
340 { 643 {
341 return temp; 644 m_log.Info("Invalid command");
342 } 645 }
343 } 646 }
344 647
648 public string CmdPrompt(string p)
649 {
650 return ReadLine(String.Format("{0}: ", p), false, true);
651 }
652
653 public string CmdPrompt(string p, string def)
654 {
655 string ret = ReadLine(String.Format("{0} [{1}]: ", p, def), false, true);
656 if (ret == String.Empty)
657 ret = def;
658
659 return ret;
660 }
661
345 // Displays a command prompt and returns a default value, user may only enter 1 of 2 options 662 // Displays a command prompt and returns a default value, user may only enter 1 of 2 options
346 public string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) 663 public string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB)
347 { 664 {
@@ -362,85 +679,137 @@ namespace OpenSim.Framework.Console
362 return temp; 679 return temp;
363 } 680 }
364 681
365 // Runs a command with a number of parameters 682 // Displays a prompt and waits for the user to enter a string, then returns that string
366 public Object RunCmd(string Cmd, string[] cmdparams) 683 // (Done with no echo and suitable for passwords)
367 { 684 public string PasswdPrompt(string p)
368 m_cmdParser.RunCmd(Cmd, cmdparams);
369 return null;
370 }
371
372 // Shows data about something
373 public void ShowCommands(string ShowWhat)
374 { 685 {
375 m_cmdParser.Show(new string[] { ShowWhat }); 686 return ReadLine(p, false, false);
376 } 687 }
377 688
378 public void Prompt() 689 public void RunCommand(string cmd)
379 { 690 {
380 string tempstr = CmdPrompt(m_defaultPrompt); 691 string[] parts = Parser.Parse(cmd);
381 RunCommand(tempstr); 692 Commands.Resolve(parts);
382 } 693 }
383 694
384 public void RunCommand(string cmdline) 695 public string ReadLine(string p, bool isCommand, bool e)
385 { 696 {
386 Regex Extractor = new Regex(@"(['""][^""]+['""])\s*|([^\s]+)\s*", RegexOptions.Compiled); 697 h = 1;
387 char[] delims = {' ', '"'}; 698 cp = 0;
388 MatchCollection matches = Extractor.Matches(cmdline); 699 prompt = p;
389 // Get matches 700 echo = e;
701 int historyLine = history.Count;
390 702
391 if (matches.Count == 0) 703 System.Console.CursorLeft = 0; // Needed for mono
392 return; 704 System.Console.Write(" "); // Needed for mono
393 705
394 string cmd = matches[0].Value.Trim(delims); 706 y = System.Console.CursorTop;
395 string[] cmdparams = new string[matches.Count - 1]; 707 cmdline = new StringBuilder();
396 708
397 for (int i = 1; i < matches.Count; i++) 709 while(true)
398 { 710 {
399 cmdparams[i-1] = matches[i].Value.Trim(delims); 711 Show();
400 }
401 712
402 try 713 ConsoleKeyInfo key = System.Console.ReadKey(true);
403 { 714 char c = key.KeyChar;
404 RunCmd(cmd, cmdparams);
405 }
406 catch (Exception e)
407 {
408 m_log.ErrorFormat("[Console]: Command [{0}] failed with exception {1}", cmdline, e.ToString());
409 m_log.Error(e.StackTrace);
410 }
411 }
412 715
413 public string LineInfo 716 if (!Char.IsControl(c))
414 { 717 {
415 get 718 if (cp >= 318)
416 { 719 continue;
417 string result = String.Empty;
418 720
419 string stacktrace = Environment.StackTrace; 721 if (c == '?' && isCommand)
420 List<string> lines = new List<string>(stacktrace.Split(new string[] {"at "}, StringSplitOptions.None)); 722 {
723 ContextHelp();
724 continue;
725 }
421 726
422 if (lines.Count > 4) 727 cmdline.Insert(cp, c);
728 cp++;
729 }
730 else
423 { 731 {
424 lines.RemoveRange(0, 4); 732 switch (key.Key)
733 {
734 case ConsoleKey.Backspace:
735 if (cp == 0)
736 break;
737 cmdline.Remove(cp-1, 1);
738 cp--;
425 739
426 string tmpLine = lines[0]; 740 System.Console.CursorLeft = 0;
741 System.Console.CursorTop = y;
427 742
428 int inIndex = tmpLine.IndexOf(" in "); 743 System.Console.Write("{0}{1} ", prompt, cmdline);
429 744
430 if (inIndex > -1) 745 break;
431 { 746 case ConsoleKey.End:
432 result = tmpLine.Substring(0, inIndex); 747 cp = cmdline.Length;
748 break;
749 case ConsoleKey.Home:
750 cp = 0;
751 break;
752 case ConsoleKey.UpArrow:
753 if (historyLine < 1)
754 break;
755 historyLine--;
756 LockOutput();
757 cmdline = new StringBuilder(history[historyLine]);
758 cp = cmdline.Length;
759 UnlockOutput();
760 break;
761 case ConsoleKey.DownArrow:
762 if (historyLine >= history.Count)
763 break;
764 historyLine++;
765 LockOutput();
766 if (historyLine == history.Count)
767 cmdline = new StringBuilder();
768 else
769 cmdline = new StringBuilder(history[historyLine]);
770 cp = cmdline.Length;
771 UnlockOutput();
772 break;
773 case ConsoleKey.LeftArrow:
774 if (cp > 0)
775 cp--;
776 break;
777 case ConsoleKey.RightArrow:
778 if (cp < cmdline.Length)
779 cp++;
780 break;
781 case ConsoleKey.Enter:
782 System.Console.CursorLeft = 0;
783 System.Console.CursorTop = y;
784
785 System.Console.WriteLine("{0}{1}", prompt, cmdline);
433 786
434 int lineIndex = tmpLine.IndexOf(":line "); 787 y = -1;
435 788
436 if (lineIndex > -1) 789 if (isCommand)
437 { 790 {
438 lineIndex += 6; 791 string[] cmd = Commands.Resolve(Parser.Parse(cmdline.ToString()));
439 result += ", line " + tmpLine.Substring(lineIndex, (tmpLine.Length - lineIndex) - 5); 792
793 if (cmd.Length != 0)
794 {
795 int i;
796
797 for (i=0 ; i < cmd.Length ; i++)
798 {
799 if (cmd[i].Contains(" "))
800 cmd[i] = "\"" + cmd[i] + "\"";
801 }
802 AddToHistory(String.Join(" ", cmd));
803 return String.Empty;
804 }
440 } 805 }
806
807 AddToHistory(cmdline.ToString());
808 return cmdline.ToString();
809 default:
810 break;
441 } 811 }
442 } 812 }
443 return result;
444 } 813 }
445 } 814 }
446 } 815 }
diff --git a/OpenSim/Framework/Console/ConsoleCallbacksBase.cs b/OpenSim/Framework/Console/ConsoleCallbacksBase.cs
deleted file mode 100644
index d37c47a..0000000
--- a/OpenSim/Framework/Console/ConsoleCallbacksBase.cs
+++ /dev/null
@@ -1,35 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28namespace OpenSim.Framework.Console
29{
30 public interface conscmd_callback
31 {
32 void RunCmd(string cmd, string[] cmdparams);
33 void Show(string[] showParams);
34 }
35}
diff --git a/OpenSim/Framework/Console/OpenSimAppender.cs b/OpenSim/Framework/Console/OpenSimAppender.cs
index b07617f..6193bac 100644
--- a/OpenSim/Framework/Console/OpenSimAppender.cs
+++ b/OpenSim/Framework/Console/OpenSimAppender.cs
@@ -37,6 +37,14 @@ namespace OpenSim.Framework.Console
37 /// </summary> 37 /// </summary>
38 public class OpenSimAppender : AnsiColorTerminalAppender 38 public class OpenSimAppender : AnsiColorTerminalAppender
39 { 39 {
40 private ConsoleBase m_console = null;
41
42 public ConsoleBase Console
43 {
44 get { return m_console; }
45 set { m_console = value; }
46 }
47
40 private static readonly ConsoleColor[] Colors = { 48 private static readonly ConsoleColor[] Colors = {
41 // the dark colors don't seem to be visible on some black background terminals like putty :( 49 // the dark colors don't seem to be visible on some black background terminals like putty :(
42 //ConsoleColor.DarkBlue, 50 //ConsoleColor.DarkBlue,
@@ -55,6 +63,9 @@ namespace OpenSim.Framework.Console
55 63
56 override protected void Append(LoggingEvent le) 64 override protected void Append(LoggingEvent le)
57 { 65 {
66 if (m_console != null)
67 m_console.LockOutput();
68
58 try 69 try
59 { 70 {
60 string loggingMessage = RenderLoggingEvent(le); 71 string loggingMessage = RenderLoggingEvent(le);
@@ -96,6 +107,11 @@ namespace OpenSim.Framework.Console
96 { 107 {
97 System.Console.WriteLine("Couldn't write out log message: {0}", e.ToString()); 108 System.Console.WriteLine("Couldn't write out log message: {0}", e.ToString());
98 } 109 }
110 finally
111 {
112 if (m_console != null)
113 m_console.UnlockOutput();
114 }
99 } 115 }
100 116
101 private void WriteColorText(ConsoleColor color, string sender) 117 private void WriteColorText(ConsoleColor color, string sender)
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs
index ce74b46..493c626 100644
--- a/OpenSim/Framework/IScene.cs
+++ b/OpenSim/Framework/IScene.cs
@@ -27,6 +27,7 @@
27 27
28using System.Collections.Generic; 28using System.Collections.Generic;
29using OpenMetaverse; 29using OpenMetaverse;
30using OpenSim.Framework.Console;
30 31
31namespace OpenSim.Framework 32namespace OpenSim.Framework
32{ 33{
@@ -88,5 +89,7 @@ namespace OpenSim.Framework
88 89
89 T RequestModuleInterface<T>(); 90 T RequestModuleInterface<T>();
90 T[] RequestModuleInterfaces<T>(); 91 T[] RequestModuleInterfaces<T>();
92
93 void AddCommand(string module, string command, string shorthelp, string longhelp, CommandDelegate callback);
91 } 94 }
92} 95}
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 473991a..cc75df4 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -98,7 +98,45 @@ namespace OpenSim.Framework.Servers
98 /// <summary> 98 /// <summary>
99 /// Must be overriden by child classes for their own server specific startup behaviour. 99 /// Must be overriden by child classes for their own server specific startup behaviour.
100 /// </summary> 100 /// </summary>
101 protected abstract void StartupSpecific(); 101 protected virtual void StartupSpecific()
102 {
103 if (m_console != null)
104 {
105 SetConsoleLogLevel(new string[] { "ALL" });
106
107 m_console.Commands.AddCommand("base", "quit",
108 "quit",
109 "Quit the application", HandleQuit);
110
111 m_console.Commands.AddCommand("base", "shutdown",
112 "shutdown",
113 "Quit the application", HandleQuit);
114
115 m_console.Commands.AddCommand("base", "set log level",
116 "set log level <level>",
117 "Set the console logging level", HandleLogLevel);
118
119 m_console.Commands.AddCommand("base", "show info",
120 "show info",
121 "Show general information", HandleShow);
122
123 m_console.Commands.AddCommand("base", "show stats",
124 "show stats",
125 "Show statistics", HandleShow);
126
127 m_console.Commands.AddCommand("base", "show threads",
128 "show threads",
129 "Show thread status", HandleShow);
130
131 m_console.Commands.AddCommand("base", "show uptime",
132 "show uptime",
133 "Show server uptime", HandleShow);
134
135 m_console.Commands.AddCommand("base", "show version",
136 "show version",
137 "Show server version", HandleShow);
138 }
139 }
102 140
103 /// <summary> 141 /// <summary>
104 /// Should be overriden and referenced by descendents if they need to perform extra shutdown processing 142 /// Should be overriden and referenced by descendents if they need to perform extra shutdown processing
@@ -212,6 +250,8 @@ namespace OpenSim.Framework.Servers
212 return; 250 return;
213 } 251 }
214 252
253 consoleAppender.Console = m_console;
254
215 if (setParams.Length > 0) 255 if (setParams.Length > 0)
216 { 256 {
217 Level consoleLevel = repository.LevelMap[setParams[0]]; 257 Level consoleLevel = repository.LevelMap[setParams[0]];
@@ -261,56 +301,18 @@ namespace OpenSim.Framework.Servers
261 Environment.Exit(0); 301 Environment.Exit(0);
262 } 302 }
263 303
264 /// <summary> 304 private void HandleQuit(string module, string[] args)
265 /// Runs commands issued by the server console from the operator
266 /// </summary>
267 /// <param name="command">The first argument of the parameter (the command)</param>
268 /// <param name="cmdparams">Additional arguments passed to the command</param>
269 public virtual void RunCmd(string command, string[] cmdparams)
270 { 305 {
271 switch (command) 306 Shutdown();
272 {
273 case "help":
274 ShowHelp(cmdparams);
275 Notice("");
276 break;
277
278 case "set":
279 Set(cmdparams);
280 break;
281
282 case "show":
283 if (cmdparams.Length > 0)
284 {
285 Show(cmdparams);
286 }
287 break;
288
289 case "quit":
290 case "shutdown":
291 Shutdown();
292 break;
293 }
294 } 307 }
295 308
296 /// <summary> 309 private void HandleLogLevel(string module, string[] cmd)
297 /// Set an OpenSim parameter
298 /// </summary>
299 /// <param name="setArgs">
300 /// The arguments given to the set command.
301 /// </param>
302 public virtual void Set(string[] setArgs)
303 { 310 {
304 // Temporary while we only have one command which takes at least two parameters 311 if (cmd.Length > 3)
305 if (setArgs.Length < 2)
306 return;
307
308 if (setArgs[0] == "log" && setArgs[1] == "level")
309 { 312 {
310 string[] setParams = new string[setArgs.Length - 2]; 313 string level = cmd[3];
311 Array.Copy(setArgs, 2, setParams, 0, setArgs.Length - 2);
312 314
313 SetConsoleLogLevel(setParams); 315 SetConsoleLogLevel(new string[] { level });
314 } 316 }
315 } 317 }
316 318
@@ -324,18 +326,6 @@ namespace OpenSim.Framework.Servers
324 326
325 if (helpArgs.Length == 0) 327 if (helpArgs.Length == 0)
326 { 328 {
327 List<string> helpTopics = GetHelpTopics();
328
329 if (helpTopics.Count > 0)
330 {
331 Notice(
332 "As well as the help information below, you can also type help <topic> to get more information on the following areas:");
333 Notice(string.Format(" {0}", string.Join(", ", helpTopics.ToArray())));
334 Notice("");
335 }
336
337 Notice("quit - equivalent to shutdown.");
338
339 Notice("set log level [level] - change the console logging level only. For example, off or debug."); 329 Notice("set log level [level] - change the console logging level only. For example, off or debug.");
340 Notice("show info - show server information (e.g. startup path)."); 330 Notice("show info - show server information (e.g. startup path).");
341 331
@@ -345,21 +335,20 @@ namespace OpenSim.Framework.Servers
345 Notice("show threads - list tracked threads"); 335 Notice("show threads - list tracked threads");
346 Notice("show uptime - show server startup time and uptime."); 336 Notice("show uptime - show server startup time and uptime.");
347 Notice("show version - show server version."); 337 Notice("show version - show server version.");
348 Notice("shutdown - shutdown the server.");
349 Notice(""); 338 Notice("");
350 339
351 return; 340 return;
352 } 341 }
353 } 342 }
354 343
355 /// <summary> 344 public virtual void HandleShow(string module, string[] cmd)
356 /// Outputs to the console information about the region
357 /// </summary>
358 /// <param name="showParams">
359 /// What information to display (valid arguments are "uptime", "users", ...)
360 /// </param>
361 public virtual void Show(string[] showParams)
362 { 345 {
346 List<string> args = new List<string>(cmd);
347
348 args.RemoveAt(0);
349
350 string[] showParams = args.ToArray();
351
363 switch (showParams[0]) 352 switch (showParams[0])
364 { 353 {
365 case "info": 354 case "info":
diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs
index 060c473..c71e53f 100644
--- a/OpenSim/Grid/AssetServer/Main.cs
+++ b/OpenSim/Grid/AssetServer/Main.cs
@@ -43,7 +43,7 @@ namespace OpenSim.Grid.AssetServer
43 /// <summary> 43 /// <summary>
44 /// An asset server 44 /// An asset server
45 /// </summary> 45 /// </summary>
46 public class OpenAsset_Main : BaseOpenSimServer, conscmd_callback 46 public class OpenAsset_Main : BaseOpenSimServer
47 { 47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49 49
@@ -76,7 +76,7 @@ namespace OpenSim.Grid.AssetServer
76 76
77 public OpenAsset_Main() 77 public OpenAsset_Main()
78 { 78 {
79 m_console = new ConsoleBase("Asset", this); 79 m_console = new ConsoleBase("Asset");
80 80
81 MainConsole.Instance = m_console; 81 MainConsole.Instance = m_console;
82 } 82 }
@@ -99,6 +99,8 @@ namespace OpenSim.Grid.AssetServer
99 AddHttpHandlers(); 99 AddHttpHandlers();
100 100
101 m_httpServer.Start(); 101 m_httpServer.Start();
102
103 base.StartupSpecific();
102 } 104 }
103 105
104 protected void AddHttpHandlers() 106 protected void AddHttpHandlers()
diff --git a/OpenSim/Grid/GridServer/GridServerBase.cs b/OpenSim/Grid/GridServer/GridServerBase.cs
index 68edbd2..3fb07b5 100644
--- a/OpenSim/Grid/GridServer/GridServerBase.cs
+++ b/OpenSim/Grid/GridServer/GridServerBase.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Grid.GridServer
39{ 39{
40 /// <summary> 40 /// <summary>
41 /// </summary> 41 /// </summary>
42 public class GridServerBase : BaseOpenSimServer, conscmd_callback 42 public class GridServerBase : BaseOpenSimServer
43 { 43 {
44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45 45
@@ -59,43 +59,34 @@ namespace OpenSim.Grid.GridServer
59 59
60 public GridServerBase() 60 public GridServerBase()
61 { 61 {
62 m_console = new ConsoleBase("Grid", this); 62 m_console = new ConsoleBase("Grid");
63 MainConsole.Instance = m_console; 63 MainConsole.Instance = m_console;
64 } 64 }
65 65
66 public override void RunCmd(string cmd, string[] cmdparams) 66 private void HandleRegistration(string module, string[] cmd)
67 { 67 {
68 base.RunCmd(cmd, cmdparams); 68 switch (cmd[0])
69
70 switch (cmd)
71 { 69 {
72 case "disable-reg": 70 case "enable":
73 m_config.AllowRegionRegistration = false; 71 m_config.AllowRegionRegistration = true;
74 m_log.Info("Region registration disabled"); 72 m_log.Info("Region registration enabled");
75 break; 73 break;
76 case "enable-reg": 74 case "disable":
77 m_config.AllowRegionRegistration = true; 75 m_config.AllowRegionRegistration = false;
78 m_log.Info("Region registration enabled"); 76 m_log.Info("Region registration disabled");
79 break; 77 break;
80 } 78 }
81 } 79 }
82
83 public override void Show(string[] showParams)
84 {
85 base.Show(showParams);
86 80
87 switch (showParams[0]) 81 private void HandleShowStatus(string module, string[] cmd)
82 {
83 if (m_config.AllowRegionRegistration)
88 { 84 {
89 case "status": 85 m_log.Info("Region registration enabled.");
90 if (m_config.AllowRegionRegistration) 86 }
91 { 87 else
92 m_log.Info("Region registration enabled."); 88 {
93 } 89 m_log.Info("Region registration disabled.");
94 else
95 {
96 m_log.Info("Region registration disabled.");
97 }
98 break;
99 } 90 }
100 } 91 }
101 92
@@ -120,6 +111,20 @@ namespace OpenSim.Grid.GridServer
120// Timer simCheckTimer = new Timer(3600000 * 3); // 3 Hours between updates. 111// Timer simCheckTimer = new Timer(3600000 * 3); // 3 Hours between updates.
121// simCheckTimer.Elapsed += new ElapsedEventHandler(CheckSims); 112// simCheckTimer.Elapsed += new ElapsedEventHandler(CheckSims);
122// simCheckTimer.Enabled = true; 113// simCheckTimer.Enabled = true;
114
115 base.StartupSpecific();
116
117 m_console.Commands.AddCommand("gridserver", "enable registration",
118 "enable registration",
119 "Enable new regions to register", HandleRegistration);
120
121 m_console.Commands.AddCommand("gridserver", "disable registration",
122 "disable registration",
123 "Disable registering new regions", HandleRegistration);
124
125 m_console.Commands.AddCommand("gridserver", "show status",
126 "show status",
127 "Show registration status", HandleShowStatus);
123 } 128 }
124 129
125 protected void AddHttpHandlers() 130 protected void AddHttpHandlers()
diff --git a/OpenSim/Grid/InventoryServer/Main.cs b/OpenSim/Grid/InventoryServer/Main.cs
index 81a6a03..4727f6e 100644
--- a/OpenSim/Grid/InventoryServer/Main.cs
+++ b/OpenSim/Grid/InventoryServer/Main.cs
@@ -38,7 +38,7 @@ using OpenSim.Framework.Servers;
38 38
39namespace OpenSim.Grid.InventoryServer 39namespace OpenSim.Grid.InventoryServer
40{ 40{
41 public class OpenInventory_Main : BaseOpenSimServer, conscmd_callback 41 public class OpenInventory_Main : BaseOpenSimServer
42 { 42 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 44
@@ -58,7 +58,7 @@ namespace OpenSim.Grid.InventoryServer
58 58
59 public OpenInventory_Main() 59 public OpenInventory_Main()
60 { 60 {
61 m_console = new ConsoleBase("Inventory", this); 61 m_console = new ConsoleBase("Inventory");
62 MainConsole.Instance = m_console; 62 MainConsole.Instance = m_console;
63 } 63 }
64 64
@@ -77,6 +77,12 @@ namespace OpenSim.Grid.InventoryServer
77 m_httpServer.Start(); 77 m_httpServer.Start();
78 78
79 m_log.Info("[" + LogName + "]: Started HTTP server"); 79 m_log.Info("[" + LogName + "]: Started HTTP server");
80
81 base.StartupSpecific();
82
83 m_console.Commands.AddCommand("inventoryserver", "add user",
84 "add user",
85 "Add a random user inventory", HandleAddUser);
80 } 86 }
81 87
82 protected void AddHttpHandlers() 88 protected void AddHttpHandlers()
@@ -146,16 +152,9 @@ namespace OpenSim.Grid.InventoryServer
146 } 152 }
147 } 153 }
148 154
149 public override void RunCmd(string cmd, string[] cmdparams) 155 private void HandleAddUser(string module, string[] args)
150 { 156 {
151 base.RunCmd(cmd, cmdparams); 157 m_inventoryService.CreateUsersInventory(UUID.Random().Guid);
152
153 switch (cmd)
154 {
155 case "add-user":
156 m_inventoryService.CreateUsersInventory(UUID.Random().Guid);
157 break;
158 }
159 } 158 }
160 } 159 }
161} 160}
diff --git a/OpenSim/Grid/MessagingServer/Main.cs b/OpenSim/Grid/MessagingServer/Main.cs
index e83da7a..9b7e731 100644
--- a/OpenSim/Grid/MessagingServer/Main.cs
+++ b/OpenSim/Grid/MessagingServer/Main.cs
@@ -41,7 +41,7 @@ namespace OpenSim.Grid.MessagingServer
41{ 41{
42 /// <summary> 42 /// <summary>
43 /// </summary> 43 /// </summary>
44 public class OpenMessage_Main : BaseOpenSimServer, conscmd_callback 44 public class OpenMessage_Main : BaseOpenSimServer
45 { 45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
@@ -64,7 +64,7 @@ namespace OpenSim.Grid.MessagingServer
64 64
65 public OpenMessage_Main() 65 public OpenMessage_Main()
66 { 66 {
67 m_console = new ConsoleBase("Messaging", this); 67 m_console = new ConsoleBase("Messaging");
68 MainConsole.Instance = m_console; 68 MainConsole.Instance = m_console;
69 } 69 }
70 70
@@ -124,6 +124,16 @@ namespace OpenSim.Grid.MessagingServer
124 registerWithUserServer(); 124 registerWithUserServer();
125 125
126 m_log.Info("[SERVER]: Messageserver 0.5 - Startup complete"); 126 m_log.Info("[SERVER]: Messageserver 0.5 - Startup complete");
127
128 base.StartupSpecific();
129
130 m_console.Commands.AddCommand("messageserver", "clear cache",
131 "clear cache",
132 "Clear presence cache", HandleClearCache);
133
134 m_console.Commands.AddCommand("messageserver", "register",
135 "register",
136 "Re-register with user server(s)", HandleRegister);
127 } 137 }
128 138
129 public void do_create(string what) 139 public void do_create(string what)
@@ -154,29 +164,17 @@ namespace OpenSim.Grid.MessagingServer
154 } 164 }
155 } 165 }
156 166
157 public override void RunCmd(string cmd, string[] cmdparams) 167 private void HandleClearCache(string module, string[] cmd)
158 { 168 {
159 base.RunCmd(cmd, cmdparams); 169 int entries = msgsvc.ClearRegionCache();
160 170 m_console.Notice("Region cache cleared! Cleared " +
161 switch (cmd) 171 entries.ToString() + " entries");
162 {
163 case "clear-cache":
164 int entries = msgsvc.ClearRegionCache();
165 m_console.Notice("Region cache cleared! Cleared " + entries.ToString() + " entries");
166 break;
167 case "register":
168 deregisterFromUserServer();
169 registerWithUserServer();
170 break;
171 }
172 } 172 }
173 173
174 protected override void ShowHelp(string[] helpArgs) 174 private void HandleRegister(string module, string[] cmd)
175 { 175 {
176 base.ShowHelp(helpArgs); 176 deregisterFromUserServer();
177 177 registerWithUserServer();
178 m_console.Notice("clear-cache - Clears region cache. Should be done when regions change position. The region cache gets stale after a while.");
179 m_console.Notice("register - (Re-)registers with user-server. This might be necessary if the userserver crashed/restarted");
180 } 178 }
181 179
182 public override void ShutdownSpecific() 180 public override void ShutdownSpecific()
diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs
index be26ab3..0b0bee1 100644
--- a/OpenSim/Grid/UserServer/Main.cs
+++ b/OpenSim/Grid/UserServer/Main.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Grid.UserServer
46 /// <summary> 46 /// <summary>
47 /// Grid user server main class 47 /// Grid user server main class
48 /// </summary> 48 /// </summary>
49 public class OpenUser_Main : BaseOpenSimServer, conscmd_callback 49 public class OpenUser_Main : BaseOpenSimServer
50 { 50 {
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 52
@@ -73,7 +73,7 @@ namespace OpenSim.Grid.UserServer
73 73
74 public OpenUser_Main() 74 public OpenUser_Main()
75 { 75 {
76 m_console = new ConsoleBase("User", this); 76 m_console = new ConsoleBase("User");
77 MainConsole.Instance = m_console; 77 MainConsole.Instance = m_console;
78 } 78 }
79 79
@@ -119,6 +119,37 @@ namespace OpenSim.Grid.UserServer
119 m_httpServer = new BaseHttpServer(Cfg.HttpPort); 119 m_httpServer = new BaseHttpServer(Cfg.HttpPort);
120 AddHttpHandlers(); 120 AddHttpHandlers();
121 m_httpServer.Start(); 121 m_httpServer.Start();
122
123 base.StartupSpecific();
124
125 m_console.Commands.AddCommand("userserver", "create user",
126 "create user [<first> [<last> [<x> <y> [email]]]]",
127 "Create a new user account", RunCommand);
128
129 m_console.Commands.AddCommand("userserver", "reset user password",
130 "reset user password [<first> [<last> [<new password>]]]",
131 "Reset a user's password", RunCommand);
132
133 m_console.Commands.AddCommand("userserver", "login level",
134 "login level <level>",
135 "Set the minimum user level to log in", HandleLoginCommand);
136
137 m_console.Commands.AddCommand("userserver", "login reset",
138 "login reset",
139 "Reset the login level to allow all users",
140 HandleLoginCommand);
141
142 m_console.Commands.AddCommand("userserver", "login text",
143 "login text <text>",
144 "Set the text users will see on login", HandleLoginCommand);
145
146 m_console.Commands.AddCommand("userserver", "test-inventory",
147 "test-inventory",
148 "Perform a test inventory transaction", RunCommand);
149
150 m_console.Commands.AddCommand("userserver", "logoff-user",
151 "logoff-user <first> <last> <message>",
152 "Log off a named user", RunCommand);
122 } 153 }
123 154
124 /// <summary> 155 /// <summary>
@@ -301,39 +332,54 @@ namespace OpenSim.Grid.UserServer
301 m_userManager.ResetUserPassword(firstName, lastName, newPassword); 332 m_userManager.ResetUserPassword(firstName, lastName, newPassword);
302 } 333 }
303 334
304 public override void RunCmd(string cmd, string[] cmdparams) 335 private void HandleLoginCommand(string module, string[] cmd)
305 { 336 {
306 base.RunCmd(cmd, cmdparams); 337 string subcommand = cmd[1];
307 switch (cmd) 338
339 switch (subcommand)
308 { 340 {
309 case "create": 341 case "level":
310 do_create(cmdparams); 342 // Set the minimal level to allow login
311 break; 343 // Useful to allow grid update without worrying about users.
312 344 // or fixing critical issues
313 case "reset": 345 //
314 Reset(cmdparams); 346 if (cmd.Length > 2)
315 break;
316
317
318 case "login-level":
319 // Set the minimal level to allow login
320 // Usefull to allow grid update without worrying about users.
321 // or fixing critical issue
322 if (cmdparams.Length == 1)
323 { 347 {
324 int level = Convert.ToInt32(cmdparams[0]); 348 int level = Convert.ToInt32(cmd[2]);
325 m_loginService.setloginlevel(level); 349 m_loginService.setloginlevel(level);
326 } 350 }
327 break; 351 break;
328 case "login-reset": 352 case "reset":
329 m_loginService.setloginlevel(0); 353 m_loginService.setloginlevel(0);
330 break; 354 break;
331 case "login-text": 355 case "text":
332 if (cmdparams.Length == 1) 356 if (cmd.Length > 2)
333 { 357 {
334 m_loginService.setwelcometext(cmdparams[0]); 358 m_loginService.setwelcometext(cmd[2]);
335 } 359 }
336 break; 360 break;
361 }
362 }
363
364 public void RunCommand(string module, string[] cmd)
365 {
366 List<string> args = new List<string>(cmd);
367 string command = cmd[0];
368
369 args.RemoveAt(0);
370
371 string[] cmdparams = args.ToArray();
372
373 switch (command)
374 {
375 case "create":
376 do_create(cmdparams);
377 break;
378
379 case "reset":
380 Reset(cmdparams);
381 break;
382
337 383
338 case "test-inventory": 384 case "test-inventory":
339 // RestObjectPosterResponse<List<InventoryFolderBase>> requester = new RestObjectPosterResponse<List<InventoryFolderBase>>(); 385 // RestObjectPosterResponse<List<InventoryFolderBase>> requester = new RestObjectPosterResponse<List<InventoryFolderBase>>();
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
index a8e1499..7a427dc 100644
--- a/OpenSim/Region/Application/Application.cs
+++ b/OpenSim/Region/Application/Application.cs
@@ -34,6 +34,7 @@ using log4net.Config;
34using Nini.Config; 34using Nini.Config;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Console; 36using OpenSim.Framework.Console;
37using OpenSim.Region.Framework.Scenes;
37 38
38namespace OpenSim 39namespace OpenSim
39{ 40{
@@ -46,6 +47,8 @@ namespace OpenSim
46 public static bool m_saveCrashDumps = false; 47 public static bool m_saveCrashDumps = false;
47 public static string m_crashDir = "crashes"; 48 public static string m_crashDir = "crashes";
48 49
50 protected static OpenSimBase m_sim = null;
51
49 //could move our main function into OpenSimMain and kill this class 52 //could move our main function into OpenSimMain and kill this class
50 public static void Main(string[] args) 53 public static void Main(string[] args)
51 { 54 {
@@ -93,18 +96,18 @@ namespace OpenSim
93 96
94 if (background) 97 if (background)
95 { 98 {
96 OpenSimBase sim = new OpenSimBackground(configSource); 99 m_sim = new OpenSimBackground(configSource);
97 sim.Startup(); 100 m_sim.Startup();
98 } 101 }
99 else 102 else
100 { 103 {
101 OpenSimBase sim = null; 104 m_sim = null;
102 if (hgrid) 105 if (hgrid)
103 sim = new HGOpenSimNode(configSource); 106 m_sim = new HGOpenSimNode(configSource);
104 else 107 else
105 sim = new OpenSim(configSource); 108 m_sim = new OpenSim(configSource);
106 109
107 sim.Startup(); 110 m_sim.Startup();
108 111
109 while (true) 112 while (true)
110 { 113 {
diff --git a/OpenSim/Region/Application/HGOpenSimNode.cs b/OpenSim/Region/Application/HGOpenSimNode.cs
index 4941fb4..2de9ddf 100644
--- a/OpenSim/Region/Application/HGOpenSimNode.cs
+++ b/OpenSim/Region/Application/HGOpenSimNode.cs
@@ -77,6 +77,9 @@ namespace OpenSim
77 m_log.Info("===================================================================="); 77 m_log.Info("====================================================================");
78 78
79 base.StartupSpecific(); 79 base.StartupSpecific();
80
81 MainConsole.Instance.Commands.AddCommand("hypergrid", "link-mapping", "link-mapping [<x> <y>] <cr>", "Set local coordinate to map HG regions to", RunCommand);
82 MainConsole.Instance.Commands.AddCommand("hypergrid", "link-region", "link-region <Xloc> <Yloc> <HostName> <HttpPort> <LocalName> <cr>", "Link a hypergrid region", RunCommand);
80 } 83 }
81 84
82 protected override void InitialiseStandaloneServices(LibraryRootFolder libraryRootFolder) 85 protected override void InitialiseStandaloneServices(LibraryRootFolder libraryRootFolder)
@@ -143,11 +146,18 @@ namespace OpenSim
143 m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version); 146 m_configSettings.See_into_region_from_neighbor, m_config.Source, m_version);
144 } 147 }
145 148
146 public override void RunCmd(string command, string[] cmdparams) 149 public void RunCommand(string module, string[] cp)
147 { 150 {
151 List<string> cmdparams = new List<string>(cp);
152 if (cmdparams.Count < 1)
153 return;
154
155 string command = cmdparams[0];
156 cmdparams.RemoveAt(0);
157
148 if (command.Equals("link-mapping")) 158 if (command.Equals("link-mapping"))
149 { 159 {
150 if (cmdparams.Length == 2) 160 if (cmdparams.Count == 2)
151 { 161 {
152 try 162 try
153 { 163 {
@@ -166,11 +176,11 @@ namespace OpenSim
166 else if (command.Equals("link-region")) 176 else if (command.Equals("link-region"))
167 { 177 {
168 // link-region <Xloc> <Yloc> <HostName> <HttpPort> <LocalName> 178 // link-region <Xloc> <Yloc> <HostName> <HttpPort> <LocalName>
169 if (cmdparams.Length < 4) 179 if (cmdparams.Count < 4)
170 { 180 {
171 if ((cmdparams.Length == 1) || (cmdparams.Length ==2)) 181 if ((cmdparams.Count == 1) || (cmdparams.Count ==2))
172 { 182 {
173 LoadXmlLinkFile(cmdparams); 183 LoadXmlLinkFile(cmdparams.ToArray());
174 } 184 }
175 else 185 else
176 { 186 {
@@ -201,19 +211,16 @@ namespace OpenSim
201 211
202 if (TryCreateLink(xloc, yloc, externalPort, externalHostName, out regInfo)) 212 if (TryCreateLink(xloc, yloc, externalPort, externalHostName, out regInfo))
203 { 213 {
204 if (cmdparams.Length >= 5) 214 if (cmdparams.Count >= 5)
205 { 215 {
206 regInfo.RegionName = ""; 216 regInfo.RegionName = "";
207 for (int i = 4; i < cmdparams.Length; i++) 217 for (int i = 4; i < cmdparams.Count; i++)
208 regInfo.RegionName += cmdparams[i] + " "; 218 regInfo.RegionName += cmdparams[i] + " ";
209 } 219 }
210 } 220 }
211 221
212 return; 222 return;
213 } 223 }
214
215 base.RunCmd(command, cmdparams);
216
217 } 224 }
218 225
219 private void LoadXmlLinkFile(string[] cmdparams) 226 private void LoadXmlLinkFile(string[] cmdparams)
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index af42a3d..37066c2 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -49,7 +49,7 @@ namespace OpenSim
49 /// <summary> 49 /// <summary>
50 /// Interactive OpenSim region server 50 /// Interactive OpenSim region server
51 /// </summary> 51 /// </summary>
52 public class OpenSim : OpenSimBase, conscmd_callback 52 public class OpenSim : OpenSimBase
53 { 53 {
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 55
@@ -59,11 +59,6 @@ namespace OpenSim
59 private string m_timedScript = "disabled"; 59 private string m_timedScript = "disabled";
60 private Timer m_scriptTimer; 60 private Timer m_scriptTimer;
61 61
62 /// <summary>
63 /// List of Console Plugin Commands
64 /// </summary>
65 private static List<ConsolePluginCommand> m_PluginCommandInfos = new List<ConsolePluginCommand>();
66
67 public OpenSim(IConfigSource configSource) : base(configSource) 62 public OpenSim(IConfigSource configSource) : base(configSource)
68 { 63 {
69 } 64 }
@@ -97,9 +92,189 @@ namespace OpenSim
97 //GCSettings.LatencyMode = GCLatencyMode.Batch; 92 //GCSettings.LatencyMode = GCLatencyMode.Batch;
98 //m_log.InfoFormat("[OPENSIM MAIN]: GC Latency Mode: {0}", GCSettings.LatencyMode.ToString()); 93 //m_log.InfoFormat("[OPENSIM MAIN]: GC Latency Mode: {0}", GCSettings.LatencyMode.ToString());
99 94
100 m_console = new ConsoleBase("Region", this); 95 m_console = new ConsoleBase("Region");
101 MainConsole.Instance = m_console; 96 MainConsole.Instance = m_console;
102 97
98 m_console.Commands.AddCommand("region", "clear assets",
99 "clear assets",
100 "Clear the asset cache", HandleClearAssets);
101
102 m_console.Commands.AddCommand("region", "force update",
103 "force update",
104 "Force the update of all objects on clients",
105 HandleForceUpdate);
106
107 m_console.Commands.AddCommand("region", "debug packet",
108 "debug packet <level>",
109 "Turn on packet debugging", Debug);
110
111 m_console.Commands.AddCommand("region", "debug scene",
112 "debug scene <cripting> <collisions> <physics>",
113 "Turn on scene debugging", Debug);
114
115 m_console.Commands.AddCommand("region", "change region",
116 "change region <region name>",
117 "Change current console region", ChangeSelectedRegion);
118
119 m_console.Commands.AddCommand("region", "save xml",
120 "save xml",
121 "Save a region's data in XML format", SaveXml);
122
123 m_console.Commands.AddCommand("region", "save xml2",
124 "save xml2",
125 "Save a region's data in XML2 format", SaveXml2);
126
127 m_console.Commands.AddCommand("region", "load xml",
128 "load xml [-newIDs [<x> <y> <z>]]",
129 "Load a region's data from XML format", LoadXml);
130
131 m_console.Commands.AddCommand("region", "load xml2",
132 "load xml2",
133 "Load a region's data from XML2 format", LoadXml2);
134
135 m_console.Commands.AddCommand("region", "save prims xml2",
136 "save prims xml2 [<prim name> <file name>]",
137 "Save named prim to XML2", SavePrimsXml2);
138
139 m_console.Commands.AddCommand("region", "load oar",
140 "load oar <oar name>",
141 "Load a region's data from OAR archive", LoadOar);
142
143 m_console.Commands.AddCommand("region", "save oar",
144 "save oar <oar name>",
145 "Save a region's data to an OAR archive", SaveOar);
146
147 m_console.Commands.AddCommand("region", "save inventory",
148 "save inventory <first> <last> <path> <file>",
149 "Save user inventory data", SaveInv);
150
151 m_console.Commands.AddCommand("region", "load inventory",
152 "load inventory <first> <last> <path> <file>",
153 "Load user inventory data", LoadInv);
154
155 m_console.Commands.AddCommand("region", "edit scale",
156 "edit scale <name> <x> <y> <z>",
157 "Change the scale of a named prim", HandleEditScale);
158
159 m_console.Commands.AddCommand("region", "kick user",
160 "kick user <first> <last>",
161 "Kick a user off the simulator", HandleEditScale);
162
163 m_console.Commands.AddCommand("region", "show assets",
164 "show assets",
165 "Show asset data", HandleShow);
166
167 m_console.Commands.AddCommand("region", "show users",
168 "show users [full]",
169 "Show user data", HandleShow);
170
171 m_console.Commands.AddCommand("region", "show users full",
172 "show users full",
173 String.Empty, HandleShow);
174
175 m_console.Commands.AddCommand("region", "show modules",
176 "show modules",
177 "Show module data", HandleShow);
178
179 m_console.Commands.AddCommand("region", "show regions",
180 "show regions",
181 "Show region data", HandleShow);
182
183 m_console.Commands.AddCommand("region", "show queues",
184 "show queues",
185 "Show queue data", HandleShow);
186
187 m_console.Commands.AddCommand("region", "alert",
188 "alert <first> <last> <message>",
189 "Send an alert to a user", RunCommand);
190
191 m_console.Commands.AddCommand("region", "alert general",
192 "alert general <message>",
193 "Send an alert everyone", RunCommand);
194
195 m_console.Commands.AddCommand("region", "backup",
196 "backup",
197 "Persist objects to the database now", RunCommand);
198
199 m_console.Commands.AddCommand("region", "create region",
200 "create region",
201 "Create a new region", HandleCreateRegion);
202
203 m_console.Commands.AddCommand("region", "login enable",
204 "login enable",
205 "Enable logins to the simulator", HandleLoginEnable);
206
207 m_console.Commands.AddCommand("region", "login disable",
208 "login disable",
209 "Disable logins to the simulator", HandleLoginDisable);
210
211 m_console.Commands.AddCommand("region", "login status",
212 "login status",
213 "Display status of logins", HandleLoginStatus);
214
215 m_console.Commands.AddCommand("region", "restart",
216 "restart",
217 "Restart all sims in this instance", RunCommand);
218
219 m_console.Commands.AddCommand("region", "config set",
220 "config set <section> <field> <value>",
221 "Set a config option", HandleConfig);
222
223 m_console.Commands.AddCommand("region", "config get",
224 "config get <section> <field>",
225 "Read a config option", HandleConfig);
226
227 m_console.Commands.AddCommand("region", "config save",
228 "config save",
229 "Save current configuration", HandleConfig);
230
231 m_console.Commands.AddCommand("region", "command-script",
232 "command-script <script>",
233 "Run a command script from file", RunCommand);
234
235 m_console.Commands.AddCommand("region", "export-map",
236 "export-map <file>",
237 "Save an image of the world map", RunCommand);
238
239 m_console.Commands.AddCommand("region", "remove-region",
240 "remove-region <name>",
241 "Remove a region from this simulator", RunCommand);
242
243 m_console.Commands.AddCommand("region", "delete-region",
244 "delete-region <name>",
245 "Delete a region from disk", RunCommand);
246
247 m_console.Commands.AddCommand("region", "predecode-j2k",
248 "predecode-j2k [<num threads>]>",
249 "Precache assets,decode j2k layerdata", RunCommand);
250
251 m_console.Commands.AddCommand("region", "modules list",
252 "modules list",
253 "List modules", HandleModules);
254
255 m_console.Commands.AddCommand("region", "modules load",
256 "modules load <name>",
257 "Load a module", HandleModules);
258
259 m_console.Commands.AddCommand("region", "modules unload",
260 "modules unload <name>",
261 "Unload a module", HandleModules);
262
263 m_console.Commands.AddCommand("region", "Add-InventoryHost",
264 "Add-InventoryHost <host>",
265 String.Empty, RunCommand);
266
267 if (ConfigurationSettings.Standalone)
268 {
269 m_console.Commands.AddCommand("region", "create user",
270 "create user [<first> [<last> [<pass> [<x> <y> [<email>]]]]]",
271 "Create a new user", HandleCreateUser);
272
273 m_console.Commands.AddCommand("region", "reset user password",
274 "reset user password [<first> [<last> [<password>]]]",
275 "Reset a user password", HandleResetUserPassword);
276 }
277
103 base.StartupSpecific(); 278 base.StartupSpecific();
104 279
105 //Run Startup Commands 280 //Run Startup Commands
@@ -122,11 +297,9 @@ namespace OpenSim
122 } 297 }
123 298
124 PrintFileToConsole("startuplogo.txt"); 299 PrintFileToConsole("startuplogo.txt");
125 RegisterCmd("echoTest", RunEchoTest, "this echos your command args to see how they are parsed");
126 RegisterCmd("kickuser", KickUserCommand, "kickuser [first] [last] - attempts to log off a user from any region we are serving");
127 300
128 // For now, start at the 'root' level by default 301 // For now, start at the 'root' level by default
129 ChangeSelectedRegion(new string[] {"root"}); 302 ChangeSelectedRegion("region", new string[] {"change", "region", "root"});
130 } 303 }
131 304
132 public override void ShutdownSpecific() 305 public override void ShutdownSpecific()
@@ -148,17 +321,9 @@ namespace OpenSim
148 321
149 #region Console Commands 322 #region Console Commands
150 323
151 private void RunEchoTest(string[] cmdparams) 324 private void KickUserCommand(string module, string[] cmdparams)
152 { 325 {
153 for (int i = 0; i < cmdparams.Length; i++) 326 if (cmdparams.Length < 4)
154 {
155 m_log.Info("[EchoTest]: <arg" + i + ">"+cmdparams[i]+"</arg" + i + ">");
156 }
157 }
158
159 private void KickUserCommand(string[] cmdparams)
160 {
161 if (cmdparams.Length < 2)
162 return; 327 return;
163 328
164 IList agents = m_sceneManager.GetCurrentSceneAvatars(); 329 IList agents = m_sceneManager.GetCurrentSceneAvatars();
@@ -167,7 +332,7 @@ namespace OpenSim
167 { 332 {
168 RegionInfo regionInfo = m_sceneManager.GetRegionInfo(presence.RegionHandle); 333 RegionInfo regionInfo = m_sceneManager.GetRegionInfo(presence.RegionHandle);
169 334
170 if (presence.Firstname.ToLower().Contains(cmdparams[0].ToLower()) && presence.Lastname.ToLower().Contains(cmdparams[1].ToLower())) 335 if (presence.Firstname.ToLower().Contains(cmdparams[2].ToLower()) && presence.Lastname.ToLower().Contains(cmdparams[3].ToLower()))
171 { 336 {
172 m_console.Notice( 337 m_console.Notice(
173 String.Format( 338 String.Format(
@@ -219,302 +384,261 @@ namespace OpenSim
219 } 384 }
220 } 385 }
221 386
222 /// <summary> 387 private void HandleClearAssets(string module, string[] args)
223 /// Runs commands issued by the server console from the operator
224 /// </summary>
225 /// <param name="command">The first argument of the parameter (the command)</param>
226 /// <param name="cmdparams">Additional arguments passed to the command</param>
227 public override void RunCmd(string command, string[] cmdparams)
228 { 388 {
229 base.RunCmd(command, cmdparams); 389 m_assetCache.Clear();
230 RunPluginCommands(command , cmdparams); 390 }
231
232 switch (command)
233 {
234 case "clear-assets":
235 m_assetCache.Clear();
236 break;
237
238 case "force-update":
239 m_console.Notice("Updating all clients");
240 m_sceneManager.ForceCurrentSceneClientUpdate();
241 break;
242
243 case "edit-scale":
244 if (cmdparams.Length == 4)
245 {
246 m_sceneManager.HandleEditCommandOnCurrentScene(cmdparams);
247 }
248 break;
249
250 case "debug":
251 Debug(cmdparams);
252 break;
253
254 case "save-xml":
255 SaveXml(cmdparams);
256 break;
257
258 case "load-xml":
259 LoadXml(cmdparams);
260 break;
261
262 case "save-xml2":
263 SaveXml2(cmdparams);
264 break;
265 391
266 case "load-xml2": 392 private void HandleForceUpdate(string module, string[] args)
267 LoadXml2(cmdparams); 393 {
268 break; 394 m_console.Notice("Updating all clients");
395 m_sceneManager.ForceCurrentSceneClientUpdate();
396 }
269 397
270 case "save-prims-xml2": 398 private void HandleEditScale(string module, string[] args)
271 if (cmdparams.Length > 1) 399 {
272 { 400 if (args.Length == 5)
273 m_sceneManager.SaveNamedPrimsToXml2(cmdparams[0], cmdparams[1]); 401 {
274 } 402 m_sceneManager.HandleEditCommandOnCurrentScene(args);
275 else 403 }
276 { 404 else
277 m_sceneManager.SaveNamedPrimsToXml2("Primitive", DEFAULT_PRIM_BACKUP_FILENAME); 405 {
278 } 406 m_console.Notice("Argument error: edit scale <prim name> <x> <y> <z>");
279 break; 407 }
408 }
280 409
281 case "load-oar": 410 private void HandleCreateRegion(string module, string[] cmd)
282 LoadOar(cmdparams); 411 {
283 break; 412 if (cmd.Length < 4)
413 {
414 m_console.Error("Usage: create region <region name> <region_file.xml>");
415 return;
416 }
284 417
285 case "save-oar": 418 string regionsDir = ConfigSource.Source.Configs["Startup"].GetString("regionload_regionsdir", "Regions").Trim();
286 SaveOar(cmdparams); 419 string regionFile = String.Format("{0}/{1}", regionsDir, cmd[3]);
287 break; 420 // Allow absolute and relative specifiers
421 if (cmd[3].StartsWith("/") || cmd[3].StartsWith("\\") || cmd[3].StartsWith(".."))
422 regionFile = cmd[3];
288 423
289 case "save-inv": 424 CreateRegion(new RegionInfo(cmd[2], regionFile, false, ConfigSource.Source), true);
290 SaveInv(cmdparams); 425 }
291 break;
292 426
293 case "load-inv": 427 private void HandleLoginEnable(string module, string[] cmd)
294 LoadInv(cmdparams); 428 {
295 break; 429 ProcessLogin(true);
430 }
296 431
297 case "plugin": 432 private void HandleLoginDisable(string module, string[] cmd)
298 m_sceneManager.SendCommandToPluginModules(cmdparams); 433 {
299 break; 434 ProcessLogin(false);
435 }
300 436
301 case "command-script": 437 private void HandleLoginStatus(string module, string[] cmd)
302 if (cmdparams.Length > 0) 438 {
303 { 439 if (m_commsManager.GridService.RegionLoginsEnabled == false)
304 RunCommandScript(cmdparams[0]);
305 }
306 break;
307 440
308 case "backup": 441 m_log.Info("[ Login ] Login are disabled ");
309 m_sceneManager.BackupCurrentScene(); 442 else
310 break; 443 m_log.Info("[ Login ] Login are enabled");
444 }
311 445
312 case "alert": 446 private void HandleConfig(string module, string[] cmd)
313 m_sceneManager.HandleAlertCommandOnCurrentScene(cmdparams); 447 {
314 break; 448 List<string> args = new List<string>(cmd);
449 args.RemoveAt(0);
450 string[] cmdparams = args.ToArray();
451 string n = "CONFIG";
315 452
316 case "create": 453 if (cmdparams.Length > 0)
317 Create(cmdparams); 454 {
318 break; 455 switch (cmdparams[0].ToLower())
456 {
457 case "set":
458 if (cmdparams.Length < 4)
459 {
460 m_console.Error(n, "SYNTAX: " + n + " SET SECTION KEY VALUE");
461 m_console.Error(n, "EXAMPLE: " + n + " SET ScriptEngine.DotNetEngine NumberOfScriptThreads 5");
462 }
463 else
464 {
465 // IConfig c = DefaultConfig().Configs[cmdparams[1]];
466 // if (c == null)
467 // c = DefaultConfig().AddConfig(cmdparams[1]);
468 IConfig c;
469 IConfigSource source = new IniConfigSource();
470 c = source.AddConfig(cmdparams[1]);
471 if (c != null)
472 {
473 string _value = String.Join(" ", cmdparams, 3, cmdparams.Length - 3);
474 c.Set(cmdparams[2], _value);
475 m_config.Source.Merge(source);
319 476
320 case "login-enable": 477 m_console.Error(n, n + " " + n + " " + cmdparams[1] + " " + cmdparams[2] + " " +
321 ProcessLogin(true); 478 _value);
322 break; 479 }
323 case "login-disable": 480 }
324 ProcessLogin(false); 481 break;
325 break; 482 case "get":
326 case "login-status": 483 if (cmdparams.Length < 3)
327 if (m_commsManager.GridService.RegionLoginsEnabled == false) 484 {
485 m_console.Error(n, "SYNTAX: " + n + " GET SECTION KEY");
486 m_console.Error(n, "EXAMPLE: " + n + " GET ScriptEngine.DotNetEngine NumberOfScriptThreads");
487 }
488 else
489 {
490 IConfig c = m_config.Source.Configs[cmdparams[1]]; // DefaultConfig().Configs[cmdparams[1]];
491 if (c == null)
492 {
493 m_console.Notice(n, "Section \"" + cmdparams[1] + "\" does not exist.");
494 break;
495 }
496 else
497 {
498 m_console.Notice(n + " GET " + cmdparams[1] + " " + cmdparams[2] + ": " +
499 c.GetString(cmdparams[2]));
500 }
501 }
328 502
329 m_log.Info("[ Login ] Login are disabled ");
330 else
331 m_log.Info("[ Login ] Login are enabled");
332 break;
333 case "create-region":
334 if (cmdparams.Length < 2)
335 {
336 m_console.Error("Usage: create-region <region name> <region_file.xml>");
337 break; 503 break;
338 } 504 case "save":
505 m_console.Notice("Saving configuration file: " + Application.iniFilePath);
506 m_config.Save(Application.iniFilePath);
507 break;
508 }
509 }
510 }
339 511
340 string regionsDir = ConfigSource.Source.Configs["Startup"].GetString("regionload_regionsdir", "Regions").Trim(); 512 private void HandleModules(string module, string[] cmd)
341 string regionFile = String.Format("{0}/{1}", regionsDir, cmdparams[1]); 513 {
342 // Allow absolute and relative specifiers 514 List<string> args = new List<string>(cmd);
343 if (cmdparams[1].StartsWith("/") || cmdparams[1].StartsWith("\\") || cmdparams[1].StartsWith("..")) 515 args.RemoveAt(0);
344 regionFile = cmdparams[1]; 516 string[] cmdparams = args.ToArray();
345 517
346 CreateRegion(new RegionInfo(cmdparams[0], regionFile, false, ConfigSource.Source), true); 518 if (cmdparams.Length > 0)
347 break; 519 {
520 switch (cmdparams[0].ToLower())
521 {
522 case "list":
523 foreach (IRegionModule irm in m_moduleLoader.GetLoadedSharedModules)
524 {
525 m_console.Notice("Shared region module: " + irm.Name);
526 }
527 break;
528 case "unload":
529 if (cmdparams.Length > 1)
530 {
531 foreach (IRegionModule rm in new ArrayList(m_moduleLoader.GetLoadedSharedModules))
532 {
533 if (rm.Name.ToLower() == cmdparams[1].ToLower())
534 {
535 m_console.Notice("Unloading module: " + rm.Name);
536 m_moduleLoader.UnloadModule(rm);
537 }
538 }
539 }
540 break;
541 case "load":
542 if (cmdparams.Length > 1)
543 {
544 foreach (Scene s in new ArrayList(m_sceneManager.Scenes))
545 {
348 546
349 case "remove-region": 547 m_console.Notice("Loading module: " + cmdparams[1]);
350 string regRemoveName = CombineParams(cmdparams, 0); 548 m_moduleLoader.LoadRegionModules(cmdparams[1], s);
549 }
550 }
551 break;
552 }
553 }
554 }
351 555
352 Scene removeScene;
353 if (m_sceneManager.TryGetScene(regRemoveName, out removeScene))
354 RemoveRegion(removeScene, false);
355 else
356 m_console.Error("no region with that name");
357 break;
358 556
359 case "delete-region": 557 /// <summary>
360 string regDeleteName = CombineParams(cmdparams, 0); 558 /// Runs commands issued by the server console from the operator
559 /// </summary>
560 /// <param name="command">The first argument of the parameter (the command)</param>
561 /// <param name="cmdparams">Additional arguments passed to the command</param>
562 public void RunCommand(string module, string[] cmdparams)
563 {
564 List<string> args = new List<string>(cmdparams);
565 if (args.Count < 1)
566 return;
361 567
362 Scene killScene; 568 string command = args[0];
363 if (m_sceneManager.TryGetScene(regDeleteName, out killScene)) 569 args.RemoveAt(0);
364 RemoveRegion(killScene, true);
365 else
366 m_console.Error("no region with that name");
367 break;
368 570
369 case "restart": 571 cmdparams = args.ToArray();
370 m_sceneManager.RestartCurrentScene();
371 break;
372 572
373 case "change-region": 573 switch (command)
374 ChangeSelectedRegion(cmdparams); 574 {
375 break; 575 case "command-script":
576 if (cmdparams.Length > 0)
577 {
578 RunCommandScript(cmdparams[0]);
579 }
580 break;
376 581
377 case "export-map": 582 case "backup":
378 if (cmdparams.Length > 0) 583 m_sceneManager.BackupCurrentScene();
379 { 584 break;
380 m_sceneManager.CurrentOrFirstScene.ExportWorldMap(cmdparams[0]);
381 }
382 else
383 {
384 m_sceneManager.CurrentOrFirstScene.ExportWorldMap("exportmap.jpg");
385 }
386 break;
387 585
388 case "config": 586 case "alert":
389 string n = command.ToUpper(); 587 m_sceneManager.HandleAlertCommandOnCurrentScene(cmdparams);
390 if (cmdparams.Length > 0) 588 break;
391 {
392 switch (cmdparams[0].ToLower())
393 {
394 case "set":
395 if (cmdparams.Length < 4)
396 {
397 m_console.Error(n, "SYNTAX: " + n + " SET SECTION KEY VALUE");
398 m_console.Error(n, "EXAMPLE: " + n + " SET ScriptEngine.DotNetEngine NumberOfScriptThreads 5");
399 }
400 else
401 {
402 // IConfig c = DefaultConfig().Configs[cmdparams[1]];
403 // if (c == null)
404 // c = DefaultConfig().AddConfig(cmdparams[1]);
405 IConfig c;
406 IConfigSource source = new IniConfigSource();
407 c = source.AddConfig(cmdparams[1]);
408 if (c != null)
409 {
410 string _value = String.Join(" ", cmdparams, 3, cmdparams.Length - 3);
411 c.Set(cmdparams[2], _value);
412 m_config.Source.Merge(source);
413
414 m_console.Error(n, n + " " + n + " " + cmdparams[1] + " " + cmdparams[2] + " " +
415 _value);
416 }
417 }
418 break;
419 case "get":
420 if (cmdparams.Length < 3)
421 {
422 m_console.Error(n, "SYNTAX: " + n + " GET SECTION KEY");
423 m_console.Error(n, "EXAMPLE: " + n + " GET ScriptEngine.DotNetEngine NumberOfScriptThreads");
424 }
425 else
426 {
427 IConfig c = m_config.Source.Configs[cmdparams[1]]; // DefaultConfig().Configs[cmdparams[1]];
428 if (c == null)
429 {
430 m_console.Notice(n, "Section \"" + cmdparams[1] + "\" does not exist.");
431 break;
432 }
433 else
434 {
435 m_console.Notice(n + " GET " + cmdparams[1] + " " + cmdparams[2] + ": " +
436 c.GetString(cmdparams[2]));
437 }
438 }
439 589
440 break; 590 case "remove-region":
441 case "save": 591 string regRemoveName = CombineParams(cmdparams, 0);
442 m_console.Notice("Saving configuration file: " + Application.iniFilePath);
443 m_config.Save(Application.iniFilePath);
444 break;
445 }
446 }
447 break;
448 592
449 case "modules": 593 Scene removeScene;
450 if (cmdparams.Length > 0) 594 if (m_sceneManager.TryGetScene(regRemoveName, out removeScene))
451 { 595 RemoveRegion(removeScene, false);
452 switch (cmdparams[0].ToLower()) 596 else
453 { 597 m_console.Error("no region with that name");
454 case "list": 598 break;
455 foreach (IRegionModule irm in m_moduleLoader.GetLoadedSharedModules)
456 {
457 m_console.Notice("Shared region module: " + irm.Name);
458 }
459 break;
460 case "unload":
461 if (cmdparams.Length > 1)
462 {
463 foreach (IRegionModule rm in new ArrayList(m_moduleLoader.GetLoadedSharedModules))
464 {
465 if (rm.Name.ToLower() == cmdparams[1].ToLower())
466 {
467 m_console.Notice("Unloading module: " + rm.Name);
468 m_moduleLoader.UnloadModule(rm);
469 }
470 }
471 }
472 break;
473 case "load":
474 if (cmdparams.Length > 1)
475 {
476 foreach (Scene s in new ArrayList(m_sceneManager.Scenes))
477 {
478 599
479 m_console.Notice("Loading module: " + cmdparams[1]); 600 case "delete-region":
480 m_moduleLoader.LoadRegionModules(cmdparams[1], s); 601 string regDeleteName = CombineParams(cmdparams, 0);
481 }
482 }
483 break;
484 }
485 }
486 602
487 break; 603 Scene killScene;
604 if (m_sceneManager.TryGetScene(regDeleteName, out killScene))
605 RemoveRegion(killScene, true);
606 else
607 m_console.Error("no region with that name");
608 break;
488 609
489 case "Add-InventoryHost": 610 case "restart":
490 if (cmdparams.Length > 0) 611 m_sceneManager.RestartCurrentScene();
491 { 612 break;
492 m_commsManager.AddInventoryService(cmdparams[0]);
493 }
494 break;
495 613
496 case "reset": 614 case "export-map":
497 Reset(cmdparams); 615 if (cmdparams.Length > 0)
498 break; 616 {
499 617 m_sceneManager.CurrentOrFirstScene.ExportWorldMap(cmdparams[0]);
500 case "predecode-j2k": 618 }
501 if (cmdparams.Length > 0) 619 else
502 { 620 {
503 m_sceneManager.CacheJ2kDecode(Convert.ToInt32(cmdparams[0])); 621 m_sceneManager.CurrentOrFirstScene.ExportWorldMap("exportmap.jpg");
504 } 622 }
505 else 623 break;
506 {
507 m_sceneManager.CacheJ2kDecode(1);
508 }
509 break;
510 624
511 default: 625 case "Add-InventoryHost":
512 string[] tmpPluginArgs = new string[cmdparams.Length + 1]; 626 if (cmdparams.Length > 0)
513 cmdparams.CopyTo(tmpPluginArgs, 1); 627 {
514 tmpPluginArgs[0] = command; 628 m_commsManager.AddInventoryService(cmdparams[0]);
629 }
630 break;
515 631
516 m_sceneManager.SendCommandToPluginModules(tmpPluginArgs); 632 case "predecode-j2k":
517 break; 633 if (cmdparams.Length > 0)
634 {
635 m_sceneManager.CacheJ2kDecode(Convert.ToInt32(cmdparams[0]));
636 }
637 else
638 {
639 m_sceneManager.CacheJ2kDecode(1);
640 }
641 break;
518 } 642 }
519 } 643 }
520 644
@@ -522,46 +646,39 @@ namespace OpenSim
522 /// Change the currently selected region. The selected region is that operated upon by single region commands. 646 /// Change the currently selected region. The selected region is that operated upon by single region commands.
523 /// </summary> 647 /// </summary>
524 /// <param name="cmdParams"></param> 648 /// <param name="cmdParams"></param>
525 protected void ChangeSelectedRegion(string[] cmdparams) 649 protected void ChangeSelectedRegion(string module, string[] cmdparams)
526 { 650 {
527 if (cmdparams.Length > 0) 651 if (cmdparams.Length > 2)
528 { 652 {
529 string newRegionName = CombineParams(cmdparams, 0); 653 string newRegionName = CombineParams(cmdparams, 2);
530 654
531 if (!m_sceneManager.TrySetCurrentScene(newRegionName)) 655 if (!m_sceneManager.TrySetCurrentScene(newRegionName))
532 m_console.Error("Couldn't select region " + newRegionName); 656 m_console.Error("Couldn't select region " + newRegionName);
533 } 657 }
534 else 658 else
535 { 659 {
536 m_console.Error("Usage: change-region <region name>"); 660 m_console.Error("Usage: change region <region name>");
537 } 661 }
538 662
539 string regionName = (m_sceneManager.CurrentScene == null ? "root" : m_sceneManager.CurrentScene.RegionInfo.RegionName); 663 string regionName = (m_sceneManager.CurrentScene == null ? "root" : m_sceneManager.CurrentScene.RegionInfo.RegionName);
540 m_console.Notice(String.Format("Currently selected region is {0}", regionName)); 664 m_console.Notice(String.Format("Currently selected region is {0}", regionName));
541 m_console.DefaultPrompt = String.Format("Region ({0}) ", regionName); 665 m_console.DefaultPrompt = String.Format("Region ({0}) ", regionName);
666 m_console.ConsoleScene = m_sceneManager.CurrentScene;
542 } 667 }
543 668
544 /// <summary> 669 /// <summary>
545 /// Execute switch for some of the create commands 670 /// Execute switch for some of the create commands
546 /// </summary> 671 /// </summary>
547 /// <param name="args"></param> 672 /// <param name="args"></param>
548 protected void Create(string[] args) 673 private void HandleCreateUser(string module, string[] cmd)
549 { 674 {
550 if (args.Length == 0) 675 if (ConfigurationSettings.Standalone)
551 return;
552
553 switch (args[0])
554 { 676 {
555 case "user": 677 CreateUser(cmd);
556 if (ConfigurationSettings.Standalone) 678 }
557 { 679 else
558 CreateUser(args); 680 {
559 } 681 m_console.Notice("Create user is not available in grid mode, use the user server.");
560 else
561 {
562 m_console.Notice("Create user is not available in grid mode, use the user server.");
563 }
564 break;
565 } 682 }
566 } 683 }
567 684
@@ -569,30 +686,15 @@ namespace OpenSim
569 /// Execute switch for some of the reset commands 686 /// Execute switch for some of the reset commands
570 /// </summary> 687 /// </summary>
571 /// <param name="args"></param> 688 /// <param name="args"></param>
572 protected void Reset(string[] args) 689 protected void HandleResetUserPassword(string module, string[] cmd)
573 { 690 {
574 if (args.Length == 0) 691 if (ConfigurationSettings.Standalone)
575 return;
576
577 switch (args[0])
578 { 692 {
579 case "user": 693 ResetUserPassword(cmd);
580 694 }
581 switch (args[1]) 695 else
582 { 696 {
583 case "password": 697 m_console.Notice("Reset user password is not available in grid mode, use the user-server.");
584 if (ConfigurationSettings.Standalone)
585 {
586 ResetUserPassword(args);
587 }
588 else
589 {
590 m_console.Notice("Reset user password is not available in grid mode, use the user-server.");
591 }
592 break;
593 }
594
595 break;
596 } 698 }
597 } 699 }
598 700
@@ -600,18 +702,18 @@ namespace OpenSim
600 /// Turn on some debugging values for OpenSim. 702 /// Turn on some debugging values for OpenSim.
601 /// </summary> 703 /// </summary>
602 /// <param name="args"></param> 704 /// <param name="args"></param>
603 protected void Debug(string[] args) 705 protected void Debug(string module, string[] args)
604 { 706 {
605 if (args.Length == 0) 707 if (args.Length == 1)
606 return; 708 return;
607 709
608 switch (args[0]) 710 switch (args[1])
609 { 711 {
610 case "packet": 712 case "packet":
611 if (args.Length > 1) 713 if (args.Length > 2)
612 { 714 {
613 int newDebug; 715 int newDebug;
614 if (int.TryParse(args[1], out newDebug)) 716 if (int.TryParse(args[2], out newDebug))
615 { 717 {
616 m_sceneManager.SetDebugPacketLevelOnCurrentScene(newDebug); 718 m_sceneManager.SetDebugPacketLevelOnCurrentScene(newDebug);
617 } 719 }
@@ -625,17 +727,17 @@ namespace OpenSim
625 break; 727 break;
626 728
627 case "scene": 729 case "scene":
628 if (args.Length == 4) 730 if (args.Length == 5)
629 { 731 {
630 if (m_sceneManager.CurrentScene == null) 732 if (m_sceneManager.CurrentScene == null)
631 { 733 {
632 m_console.Error("CONSOLE", "Please use 'change-region <regioname>' first"); 734 m_console.Notice("Please use 'change region <regioname>' first");
633 } 735 }
634 else 736 else
635 { 737 {
636 bool scriptingOn = !Convert.ToBoolean(args[1]); 738 bool scriptingOn = !Convert.ToBoolean(args[2]);
637 bool collisionsOn = !Convert.ToBoolean(args[2]); 739 bool collisionsOn = !Convert.ToBoolean(args[3]);
638 bool physicsOn = !Convert.ToBoolean(args[3]); 740 bool physicsOn = !Convert.ToBoolean(args[4]);
639 m_sceneManager.CurrentScene.SetSceneCoreDebug(scriptingOn, collisionsOn, physicsOn); 741 m_sceneManager.CurrentScene.SetSceneCoreDebug(scriptingOn, collisionsOn, physicsOn);
640 742
641 m_console.Notice( 743 m_console.Notice(
@@ -658,87 +760,12 @@ namespace OpenSim
658 } 760 }
659 } 761 }
660 762
661 protected override void ShowHelp(string[] helpArgs)
662 {
663 base.ShowHelp(helpArgs);
664
665 if (helpArgs.Length == 0)
666 {
667 m_console.Notice("alert - send alert to a designated user or all users.");
668 m_console.Notice(" alert [First] [Last] [Message] - send an alert to a user. Case sensitive.");
669 m_console.Notice(" alert general [Message] - send an alert to all users.");
670 m_console.Notice("backup - persist simulator objects to the database ahead of the normal schedule.");
671 m_console.Notice("clear-assets - clear the asset cache");
672 m_console.Notice("create-region <name> <regionfile.xml> - create a new region");
673 m_console.Notice("change-region <name> - select the region that single region commands operate upon.");
674 m_console.Notice("command-script [filename] - Execute command in a file.");
675 m_console.Notice("debug - debugging commands");
676 m_console.Notice(" debug packet 0..255 - print incoming/outgoing packets (0=off)");
677 m_console.Notice(" debug scene [scripting] [collision] [physics] - Enable/Disable debug stuff, each can be True/False");
678 m_console.Notice("edit-scale [prim name] [x] [y] [z] - resize given prim");
679 m_console.Notice("export-map [filename] - save image of world map");
680 m_console.Notice("force-update - force an update of prims in the scene");
681 m_console.Notice("restart - disconnects all clients and restarts the sims in the instance.");
682 m_console.Notice("remove-region [name] - remove a region");
683 m_console.Notice("delete-region [name] - delete a region and its associated region file");
684 m_console.Notice("load-xml [filename] - load prims from XML (DEPRECATED)");
685 m_console.Notice("save-xml [filename] - save prims to XML (DEPRECATED)");
686 m_console.Notice("save-xml2 [filename] - save prims to XML using version 2 format");
687 m_console.Notice("load-xml2 [filename] - load prims from XML using version 2 format");
688 m_console.Notice("load-oar [filename] - load an OpenSimulator region archive. This replaces everything in the current region.");
689 m_console.Notice("save-oar [filename] - Save the current region to an OpenSimulator region archive.");
690 m_console.Notice("script - manually trigger scripts? or script commands?");
691 m_console.Notice("show assets - show state of asset cache.");
692 m_console.Notice("show modules - shows info about loaded modules.");
693 m_console.Notice("show queues - show packet queues length for all clients.");
694 m_console.Notice("show regions - show running region information.");
695 m_console.Notice("show users - show info about connected users (only root agents).");
696 m_console.Notice("show users full - show info about connected users (root and child agents).");
697 m_console.Notice("config set section field value - set a config value");
698 m_console.Notice("config get section field - get a config value");
699 m_console.Notice("config save - save OpenSim.ini");
700 m_console.Notice("login-enable - Allows login at sim level");
701 m_console.Notice("login-disable - Disable login at sim level");
702 m_console.Notice("login-status - Show the actual login status");
703 m_console.Notice("predecode-j2k - Precache assets,decode j2k layerdata, First parameter is threads to use");
704 ShowPluginCommandsHelp(CombineParams(helpArgs, 0), m_console);
705
706 if (ConfigurationSettings.Standalone)
707 {
708 m_console.Notice("");
709 m_console.Notice("create user - adds a new user.");
710 m_console.Notice("reset user password - reset a user's password.");
711 }
712 }
713 else
714 {
715 // Messily we want to join all the help params back here
716 //string helpSubject = string.Join(" ", helpArgs);
717
718 // FIXME: Very cheap hack to get transition help working. Will disappear very shortly.
719 if (helpArgs.Length == 1)
720 {
721 ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(helpArgs[0]);
722 if (moduleCommander != null)
723 {
724 m_console.Notice(moduleCommander.Help);
725 }
726 }
727 else
728 {
729 ICommand command = SceneManager.CurrentOrFirstScene.GetCommand(helpArgs[1]);
730 if (command != null)
731 {
732 m_console.Notice(command.Help);
733 }
734 }
735 }
736 }
737
738 // see BaseOpenSimServer 763 // see BaseOpenSimServer
739 public override void Show(string[] showParams) 764 private void HandleShow(string mod, string[] cmd)
740 { 765 {
741 base.Show(showParams); 766 List<string> args = new List<string>(cmd);
767 args.RemoveAt(0);
768 string[] showParams = args.ToArray();
742 769
743 switch (showParams[0]) 770 switch (showParams[0])
744 { 771 {
@@ -864,29 +891,29 @@ namespace OpenSim
864 uint regX = 1000; 891 uint regX = 1000;
865 uint regY = 1000; 892 uint regY = 1000;
866 893
867 if (cmdparams.Length < 2) 894 if (cmdparams.Length < 3)
868 firstName = MainConsole.Instance.CmdPrompt("First name", "Default"); 895 firstName = MainConsole.Instance.CmdPrompt("First name", "Default");
869 else firstName = cmdparams[1]; 896 else firstName = cmdparams[2];
870 897
871 if ( cmdparams.Length < 3 ) 898 if ( cmdparams.Length < 4 )
872 lastName = MainConsole.Instance.CmdPrompt("Last name", "User"); 899 lastName = MainConsole.Instance.CmdPrompt("Last name", "User");
873 else lastName = cmdparams[2]; 900 else lastName = cmdparams[3];
874 901
875 if (cmdparams.Length < 4) 902 if (cmdparams.Length < 5)
876 password = MainConsole.Instance.PasswdPrompt("Password"); 903 password = MainConsole.Instance.PasswdPrompt("Password");
877 else password = cmdparams[3]; 904 else password = cmdparams[4];
878 905
879 if ( cmdparams.Length < 5 ) 906 if ( cmdparams.Length < 6 )
880 regX = Convert.ToUInt32(MainConsole.Instance.CmdPrompt("Start Region X", regX.ToString())); 907 regX = Convert.ToUInt32(MainConsole.Instance.CmdPrompt("Start Region X", regX.ToString()));
881 else regX = Convert.ToUInt32(cmdparams[4]); 908 else regX = Convert.ToUInt32(cmdparams[5]);
882 909
883 if ( cmdparams.Length < 6 ) 910 if ( cmdparams.Length < 7 )
884 regY = Convert.ToUInt32(MainConsole.Instance.CmdPrompt("Start Region Y", regY.ToString())); 911 regY = Convert.ToUInt32(MainConsole.Instance.CmdPrompt("Start Region Y", regY.ToString()));
885 else regY = Convert.ToUInt32(cmdparams[5]); 912 else regY = Convert.ToUInt32(cmdparams[6]);
886 913
887 if (cmdparams.Length < 7) 914 if (cmdparams.Length < 8)
888 email = MainConsole.Instance.CmdPrompt("Email", ""); 915 email = MainConsole.Instance.CmdPrompt("Email", "");
889 else email = cmdparams[6]; 916 else email = cmdparams[7];
890 917
891 if (null == m_commsManager.UserService.GetUserProfile(firstName, lastName)) 918 if (null == m_commsManager.UserService.GetUserProfile(firstName, lastName))
892 { 919 {
@@ -908,28 +935,40 @@ namespace OpenSim
908 string lastName; 935 string lastName;
909 string newPassword; 936 string newPassword;
910 937
911 if (cmdparams.Length < 3) 938 if (cmdparams.Length < 4)
912 firstName = MainConsole.Instance.CmdPrompt("First name"); 939 firstName = MainConsole.Instance.CmdPrompt("First name");
913 else firstName = cmdparams[2]; 940 else firstName = cmdparams[3];
914 941
915 if ( cmdparams.Length < 4 ) 942 if ( cmdparams.Length < 5 )
916 lastName = MainConsole.Instance.CmdPrompt("Last name"); 943 lastName = MainConsole.Instance.CmdPrompt("Last name");
917 else lastName = cmdparams[3]; 944 else lastName = cmdparams[4];
918 945
919 if ( cmdparams.Length < 5 ) 946 if ( cmdparams.Length < 6 )
920 newPassword = MainConsole.Instance.PasswdPrompt("New password"); 947 newPassword = MainConsole.Instance.PasswdPrompt("New password");
921 else newPassword = cmdparams[4]; 948 else newPassword = cmdparams[5];
922 949
923 m_commsManager.UserAdminService.ResetUserPassword(firstName, lastName, newPassword); 950 m_commsManager.UserAdminService.ResetUserPassword(firstName, lastName, newPassword);
924 } 951 }
925 952
926 protected void SaveXml(string[] cmdparams) 953 protected void SavePrimsXml2(string module, string[] cmdparams)
954 {
955 if (cmdparams.Length > 5)
956 {
957 m_sceneManager.SaveNamedPrimsToXml2(cmdparams[3], cmdparams[4]);
958 }
959 else
960 {
961 m_sceneManager.SaveNamedPrimsToXml2("Primitive", DEFAULT_PRIM_BACKUP_FILENAME);
962 }
963 }
964
965 protected void SaveXml(string module, string[] cmdparams)
927 { 966 {
928 m_log.Error("[CONSOLE]: PLEASE NOTE, save-xml is DEPRECATED and may be REMOVED soon. If you are using this and there is some reason you can't use save-xml2, please file a mantis detailing the reason."); 967 m_log.Error("[CONSOLE]: PLEASE NOTE, save-xml is DEPRECATED and may be REMOVED soon. If you are using this and there is some reason you can't use save-xml2, please file a mantis detailing the reason.");
929 968
930 if (cmdparams.Length > 0) 969 if (cmdparams.Length > 0)
931 { 970 {
932 m_sceneManager.SaveCurrentSceneToXml(cmdparams[0]); 971 m_sceneManager.SaveCurrentSceneToXml(cmdparams[2]);
933 } 972 }
934 else 973 else
935 { 974 {
@@ -937,30 +976,30 @@ namespace OpenSim
937 } 976 }
938 } 977 }
939 978
940 protected void LoadXml(string[] cmdparams) 979 protected void LoadXml(string module, string[] cmdparams)
941 { 980 {
942 m_log.Error("[CONSOLE]: PLEASE NOTE, load-xml is DEPRECATED and may be REMOVED soon. If you are using this and there is some reason you can't use load-xml2, please file a mantis detailing the reason."); 981 m_log.Error("[CONSOLE]: PLEASE NOTE, load-xml is DEPRECATED and may be REMOVED soon. If you are using this and there is some reason you can't use load-xml2, please file a mantis detailing the reason.");
943 982
944 Vector3 loadOffset = new Vector3(0, 0, 0); 983 Vector3 loadOffset = new Vector3(0, 0, 0);
945 if (cmdparams.Length > 0) 984 if (cmdparams.Length > 2)
946 { 985 {
947 bool generateNewIDS = false; 986 bool generateNewIDS = false;
948 if (cmdparams.Length > 1) 987 if (cmdparams.Length > 3)
949 { 988 {
950 if (cmdparams[1] == "-newUID") 989 if (cmdparams[3] == "-newUID")
951 { 990 {
952 generateNewIDS = true; 991 generateNewIDS = true;
953 } 992 }
954 if (cmdparams.Length > 2) 993 if (cmdparams.Length > 4)
955 { 994 {
956 loadOffset.X = (float) Convert.ToDecimal(cmdparams[2]); 995 loadOffset.X = (float) Convert.ToDecimal(cmdparams[4]);
957 if (cmdparams.Length > 3) 996 if (cmdparams.Length > 5)
958 { 997 {
959 loadOffset.Y = (float) Convert.ToDecimal(cmdparams[3]); 998 loadOffset.Y = (float) Convert.ToDecimal(cmdparams[5]);
960 } 999 }
961 if (cmdparams.Length > 4) 1000 if (cmdparams.Length > 6)
962 { 1001 {
963 loadOffset.Z = (float) Convert.ToDecimal(cmdparams[4]); 1002 loadOffset.Z = (float) Convert.ToDecimal(cmdparams[6]);
964 } 1003 }
965 m_console.Error("loadOffsets <X,Y,Z> = <" + loadOffset.X + "," + loadOffset.Y + "," + 1004 m_console.Error("loadOffsets <X,Y,Z> = <" + loadOffset.X + "," + loadOffset.Y + "," +
966 loadOffset.Z + ">"); 1005 loadOffset.Z + ">");
@@ -981,11 +1020,11 @@ namespace OpenSim
981 } 1020 }
982 } 1021 }
983 1022
984 protected void SaveXml2(string[] cmdparams) 1023 protected void SaveXml2(string module, string[] cmdparams)
985 { 1024 {
986 if (cmdparams.Length > 0) 1025 if (cmdparams.Length > 2)
987 { 1026 {
988 m_sceneManager.SaveCurrentSceneToXml2(cmdparams[0]); 1027 m_sceneManager.SaveCurrentSceneToXml2(cmdparams[2]);
989 } 1028 }
990 else 1029 else
991 { 1030 {
@@ -993,11 +1032,11 @@ namespace OpenSim
993 } 1032 }
994 } 1033 }
995 1034
996 protected void LoadXml2(string[] cmdparams) 1035 protected void LoadXml2(string module, string[] cmdparams)
997 { 1036 {
998 if (cmdparams.Length > 0) 1037 if (cmdparams.Length > 2)
999 { 1038 {
1000 m_sceneManager.LoadCurrentSceneFromXml2(cmdparams[0]); 1039 m_sceneManager.LoadCurrentSceneFromXml2(cmdparams[2]);
1001 } 1040 }
1002 else 1041 else
1003 { 1042 {
@@ -1007,7 +1046,7 @@ namespace OpenSim
1007 } 1046 }
1008 catch 1047 catch
1009 { 1048 {
1010 m_console.Error("Default xml not found. Usage: load-xml2 <filename>"); 1049 m_console.Error("Default xml not found. Usage: load xml2 <filename>");
1011 } 1050 }
1012 } 1051 }
1013 } 1052 }
@@ -1016,11 +1055,11 @@ namespace OpenSim
1016 /// Load a whole region from an opensim archive. 1055 /// Load a whole region from an opensim archive.
1017 /// </summary> 1056 /// </summary>
1018 /// <param name="cmdparams"></param> 1057 /// <param name="cmdparams"></param>
1019 protected void LoadOar(string[] cmdparams) 1058 protected void LoadOar(string module, string[] cmdparams)
1020 { 1059 {
1021 if (cmdparams.Length > 0) 1060 if (cmdparams.Length > 2)
1022 { 1061 {
1023 m_sceneManager.LoadArchiveToCurrentScene(cmdparams[0]); 1062 m_sceneManager.LoadArchiveToCurrentScene(cmdparams[2]);
1024 } 1063 }
1025 else 1064 else
1026 { 1065 {
@@ -1039,11 +1078,11 @@ namespace OpenSim
1039 /// Save a region to a file, including all the assets needed to restore it. 1078 /// Save a region to a file, including all the assets needed to restore it.
1040 /// </summary> 1079 /// </summary>
1041 /// <param name="cmdparams"></param> 1080 /// <param name="cmdparams"></param>
1042 protected void SaveOar(string[] cmdparams) 1081 protected void SaveOar(string module, string[] cmdparams)
1043 { 1082 {
1044 if (cmdparams.Length > 0) 1083 if (cmdparams.Length > 2)
1045 { 1084 {
1046 m_sceneManager.SaveCurrentSceneToArchive(cmdparams[0]); 1085 m_sceneManager.SaveCurrentSceneToArchive(cmdparams[2]);
1047 } 1086 }
1048 else 1087 else
1049 { 1088 {
@@ -1055,19 +1094,19 @@ namespace OpenSim
1055 /// Load inventory from an inventory file archive 1094 /// Load inventory from an inventory file archive
1056 /// </summary> 1095 /// </summary>
1057 /// <param name="cmdparams"></param> 1096 /// <param name="cmdparams"></param>
1058 protected void LoadInv(string[] cmdparams) 1097 protected void LoadInv(string module, string[] cmdparams)
1059 { 1098 {
1060 m_log.Error("[CONSOLE]: This command has not yet been implemented!"); 1099 m_log.Error("[CONSOLE]: This command has not yet been implemented!");
1061 if (cmdparams.Length < 3) 1100 if (cmdparams.Length < 5)
1062 { 1101 {
1063 m_log.Error("[CONSOLE]: usage is load-inv <first name> <last name> <inventory path> [<load file path>]"); 1102 m_log.Error("[CONSOLE]: usage is load-inv <first name> <last name> <inventory path> [<load file path>]");
1064 return; 1103 return;
1065 } 1104 }
1066 1105
1067 string firstName = cmdparams[0]; 1106 string firstName = cmdparams[2];
1068 string lastName = cmdparams[1]; 1107 string lastName = cmdparams[3];
1069 string invPath = cmdparams[2]; 1108 string invPath = cmdparams[4];
1070 string loadPath = (cmdparams.Length > 3 ? cmdparams[3] : DEFAULT_INV_BACKUP_FILENAME); 1109 string loadPath = (cmdparams.Length > 5 ? cmdparams[5] : DEFAULT_INV_BACKUP_FILENAME);
1071 1110
1072 new InventoryArchiveReadRequest( 1111 new InventoryArchiveReadRequest(
1073 m_sceneManager.CurrentOrFirstScene, m_commsManager).execute( 1112 m_sceneManager.CurrentOrFirstScene, m_commsManager).execute(
@@ -1078,19 +1117,19 @@ namespace OpenSim
1078 /// Save inventory to a file archive 1117 /// Save inventory to a file archive
1079 /// </summary> 1118 /// </summary>
1080 /// <param name="cmdparams"></param> 1119 /// <param name="cmdparams"></param>
1081 protected void SaveInv(string[] cmdparams) 1120 protected void SaveInv(string module, string[] cmdparams)
1082 { 1121 {
1083 m_log.Error("[CONSOLE]: This command has not yet been implemented!"); 1122 m_log.Error("[CONSOLE]: This command has not yet been implemented!");
1084 if (cmdparams.Length < 3) 1123 if (cmdparams.Length < 5)
1085 { 1124 {
1086 m_log.Error("[CONSOLE]: usage is save-inv <first name> <last name> <inventory path> [<save file path>]"); 1125 m_log.Error("[CONSOLE]: usage is save-inv <first name> <last name> <inventory path> [<save file path>]");
1087 return; 1126 return;
1088 } 1127 }
1089 1128
1090 string firstName = cmdparams[0]; 1129 string firstName = cmdparams[2];
1091 string lastName = cmdparams[1]; 1130 string lastName = cmdparams[3];
1092 string invPath = cmdparams[2]; 1131 string invPath = cmdparams[4];
1093 string savePath = (cmdparams.Length > 3 ? cmdparams[3] : DEFAULT_INV_BACKUP_FILENAME); 1132 string savePath = (cmdparams.Length > 5 ? cmdparams[5] : DEFAULT_INV_BACKUP_FILENAME);
1094 1133
1095 new InventoryArchiveWriteRequest( 1134 new InventoryArchiveWriteRequest(
1096 m_sceneManager.CurrentOrFirstScene,m_commsManager).execute( 1135 m_sceneManager.CurrentOrFirstScene,m_commsManager).execute(
@@ -1108,62 +1147,6 @@ namespace OpenSim
1108 return result; 1147 return result;
1109 } 1148 }
1110 1149
1111 /// <summary>
1112 /// Runs the best matching plugin command
1113 /// </summary>
1114 /// <param name="cmd"></param>
1115 /// <param name="withParams"></param>
1116 /// <returns>true if a match was found, false otherwise</returns>
1117 public bool RunPluginCommands(string cmd, string[] withParams)
1118 {
1119 ConsolePluginCommand bestMatch = null;
1120 int bestLength = 0;
1121 String cmdWithParams = cmd + " " + String.Join(" ",withParams);
1122
1123 foreach (ConsolePluginCommand cmdinfo in m_PluginCommandInfos)
1124 {
1125 int matchLen = cmdinfo.matchLength(cmdWithParams);
1126 if (matchLen > bestLength)
1127 {
1128 bestMatch = cmdinfo;
1129 bestLength = matchLen;
1130 }
1131 }
1132
1133 if (bestMatch == null) return false;
1134 bestMatch.Run(cmd,withParams);//.Substring(bestLength));
1135 return true;
1136 }
1137
1138 /// <summary>
1139 /// Show the matching plugins command help
1140 /// </summary>
1141 public void ShowPluginCommandsHelp(string cmdWithParams, ConsoleBase console)
1142 {
1143 foreach (ConsolePluginCommand cmdinfo in m_PluginCommandInfos)
1144 {
1145 if (cmdinfo.IsHelpfull(cmdWithParams))
1146 {
1147 cmdinfo.ShowHelp(console);
1148 }
1149 }
1150 }
1151
1152 /// <summary>
1153 /// Registers a new console plugin command
1154 /// </summary>
1155 public static void RegisterCmd(string cmd, ConsoleCommand deligate, string help)
1156 {
1157 RegisterConsolePluginCommand(new ConsolePluginCommand(cmd, deligate, help));
1158 }
1159
1160 /// <summary>
1161 /// Registers a new console plugin command
1162 /// </summary>
1163 public static void RegisterConsolePluginCommand(ConsolePluginCommand pluginCommand)
1164 {
1165 m_PluginCommandInfos.Add(pluginCommand);
1166 }
1167 #endregion 1150 #endregion
1168 } 1151 }
1169} 1152}
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index a7ff0e2..4d56147 100644
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -198,6 +198,46 @@ namespace OpenSim
198 198
199 // Only enable logins to the regions once we have completely finished starting up (apart from scripts) 199 // Only enable logins to the regions once we have completely finished starting up (apart from scripts)
200 m_commsManager.GridService.RegionLoginsEnabled = true; 200 m_commsManager.GridService.RegionLoginsEnabled = true;
201
202 List<string> topics = GetHelpTopics();
203
204 foreach (string topic in topics)
205 {
206 m_console.Commands.AddCommand("plugin", "help "+topic,
207 "help "+topic,
208 "Get help on plugin command '"+topic+"'",
209 HandleCommanderHelp);
210
211 m_console.Commands.AddCommand("plugin", topic,
212 topic,
213 "Execute subcommand for plugin '"+topic+"'",
214 null);
215
216 ICommander commander =
217 SceneManager.CurrentOrFirstScene.GetCommanders()[topic];
218
219 if (commander == null)
220 continue;
221
222 foreach (string command in commander.Commands.Keys)
223 {
224 m_console.Commands.AddCommand(topic, topic+" "+command,
225 topic+" "+commander.Commands[command].ShortHelp(),
226 String.Empty, HandleCommanderCommand);
227 }
228 }
229 }
230
231 private void HandleCommanderCommand(string module, string[] cmd)
232 {
233 m_sceneManager.SendCommandToPluginModules(cmd);
234 }
235
236 private void HandleCommanderHelp(string module, string[] cmd)
237 {
238 ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(cmd[1]);
239 if (moduleCommander != null)
240 m_console.Notice(moduleCommander.Help);
201 } 241 }
202 242
203 /// <summary> 243 /// <summary>
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
index 0921dbd..dcc17a7 100644
--- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs
+++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
@@ -108,6 +108,8 @@ namespace OpenSim.Region.ClientStack
108 108
109 m_log.Info("[REGION]: Starting HTTP server"); 109 m_log.Info("[REGION]: Starting HTTP server");
110 m_httpServer.Start(); 110 m_httpServer.Start();
111
112 base.StartupSpecific();
111 } 113 }
112 114
113 /// <summary> 115 /// <summary>
diff --git a/OpenSim/Region/Environment/Modules/Framework/InterfaceCommander/Command.cs b/OpenSim/Region/Environment/Modules/Framework/InterfaceCommander/Command.cs
index 0ad95ae..b6114e8 100644
--- a/OpenSim/Region/Environment/Modules/Framework/InterfaceCommander/Command.cs
+++ b/OpenSim/Region/Environment/Modules/Framework/InterfaceCommander/Command.cs
@@ -88,6 +88,18 @@ namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
88 } 88 }
89 } 89 }
90 90
91 public string ShortHelp()
92 {
93 string help = m_name;
94
95 foreach (CommandArgument arg in m_args)
96 {
97 help += " <" + arg.Name + ">";
98 }
99
100 return help;
101 }
102
91 public void ShowConsoleHelp() 103 public void ShowConsoleHelp()
92 { 104 {
93 Console.WriteLine("== " + Name + " =="); 105 Console.WriteLine("== " + Name + " ==");
diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs
index 060a4f4..e48ef13 100644
--- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs
@@ -32,21 +32,20 @@ using System.Collections;
32using System.Collections.Generic; 32using System.Collections.Generic;
33using System.Reflection; 33using System.Reflection;
34using log4net; 34using log4net;
35using OpenSim;
35using OpenSim.Framework; 36using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.Framework.Scenes; 38using OpenSim.Region.Framework.Scenes;
38using OpenSim.Region.Environment.Modules.Framework; 39using OpenSim.Region.Environment.Modules.Framework;
39using OpenSim.Region.Environment.Modules.Framework.InterfaceCommander;
40using OpenSim.Framework.Communications.Cache; 40using OpenSim.Framework.Communications.Cache;
41 41
42namespace OpenSim.Region.Environment.Modules.World.Permissions 42namespace OpenSim.Region.Environment.Modules.World.Permissions
43{ 43{
44 public class PermissionsModule : IRegionModule, ICommandableModule 44 public class PermissionsModule : IRegionModule
45 { 45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 protected Scene m_scene; 48 protected Scene m_scene;
49 private readonly Commander m_commander = new Commander("permissions");
50 49
51 #region Constants 50 #region Constants
52 // These are here for testing. They will be taken out 51 // These are here for testing. They will be taken out
@@ -94,60 +93,6 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
94 93
95 #endregion 94 #endregion
96 95
97 #region ICommandableModule Members
98
99 public ICommander CommandInterface
100 {
101 get { throw new System.NotImplementedException(); }
102 }
103
104 private void InterfaceDebugPermissions(Object[] args)
105 {
106 if ((bool)args[0] == true)
107 {
108 m_debugPermissions = true;
109 m_log.Info("[PERMISSIONS]: Permissions Debugging Enabled.");
110 }
111 else
112 {
113 m_debugPermissions = false;
114 m_log.Info("[PERMISSIONS]: Permissions Debugging Disabled.");
115 }
116 }
117
118 private void InterfaceBypassPermissions(Object[] args)
119 {
120 if ((bool)args[0] == true)
121 {
122 m_log.Info("[PERMISSIONS]: Permissions Bypass Enabled.");
123 m_bypassPermissionsValue = (bool)args[1];
124 }
125 else
126 {
127 m_bypassPermissions = false;
128 m_log.Info("[PERMISSIONS]: Permissions Bypass Disabled. Normal Operation.");
129 }
130 }
131
132 /// <summary>
133 /// Processes commandline input. Do not call directly.
134 /// </summary>
135 /// <param name="args">Commandline arguments</param>
136 private void EventManager_OnPluginConsole(string[] args)
137 {
138 if (args[0] == "permissions")
139 {
140 string[] tmpArgs = new string[args.Length - 2];
141 int i;
142 for (i = 2; i < args.Length; i++)
143 tmpArgs[i - 2] = args[i];
144
145 m_commander.ProcessConsoleCommand(args[1], tmpArgs);
146 }
147 }
148
149 #endregion
150
151 #region IRegionModule Members 96 #region IRegionModule Members
152 97
153 public void Initialise(Scene scene, IConfigSource config) 98 public void Initialise(Scene scene, IConfigSource config)
@@ -226,20 +171,89 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
226 171
227 m_scene.Permissions.AddCanTeleportHandler(CanTeleport); //NOT YET IMPLEMENTED 172 m_scene.Permissions.AddCanTeleportHandler(CanTeleport); //NOT YET IMPLEMENTED
228 173
229 //Register Debug Commands 174 m_scene.AddCommand("permissions", "bypass permissions",
230 Command bypassCommand = new Command("bypass", CommandIntentions.COMMAND_HAZARDOUS, InterfaceBypassPermissions, "Force the permissions a specific way to test permissions"); 175 "bypass permissions <true / false>",
231 bypassCommand.AddArgument("enable_bypass_perms", "true to enable bypassing all perms", "Boolean"); 176 "Bypass permission checks",
232 bypassCommand.AddArgument("bypass_perms_value", "true/false: true will ignore all perms; false will restrict everything", "Boolean"); 177 HandleBypassPermissions);
178
179 m_scene.AddCommand("permissions", "force permissions",
180 "force permissions <true / false>",
181 "Force permissions on or off",
182 HandleForcePermissions);
183
184 m_scene.AddCommand("permissions", "debug permissions",
185 "debug permissions <true / false>",
186 "Enable permissions debugging",
187 HandleDebugPermissions);
188 }
189
190 public void HandleBypassPermissions(string module, string[] args)
191 {
192 if (m_scene.ConsoleScene() != null &&
193 m_scene.ConsoleScene() != m_scene)
194 {
195 return;
196 }
197
198 if (args.Length > 2)
199 {
200 bool val;
201
202 if (!bool.TryParse(args[2], out val))
203 return;
204
205 m_bypassPermissions = val;
206
207 m_log.InfoFormat("[PERMISSIONS] Set permissions bypass to {0} for {1}", m_bypassPermissions, m_scene.RegionInfo.RegionName);
208 }
209 }
210
211 public void HandleForcePermissions(string module, string[] args)
212 {
213 if (m_scene.ConsoleScene() != null &&
214 m_scene.ConsoleScene() != m_scene)
215 {
216 return;
217 }
218
219 if (!m_bypassPermissions)
220 {
221 m_log.Error("[PERMISSIONS] Permissions can't be forced unless they are bypassed first");
222 return;
223 }
233 224
234 m_commander.RegisterCommand("bypass", bypassCommand); 225 if (args.Length > 2)
226 {
227 bool val;
235 228
236 Command debugCommand = new Command("debug", CommandIntentions.COMMAND_STATISTICAL, InterfaceDebugPermissions, "Force the permissions a specific way to test permissions"); 229 if (!bool.TryParse(args[2], out val))
237 debugCommand.AddArgument("enable_debug_perms", "true to enable debugging to console all perms", "Boolean"); 230 return;
238 231
239 m_commander.RegisterCommand("debug", debugCommand); 232 m_bypassPermissionsValue = val;
240 m_scene.RegisterModuleCommander(m_commander);
241 233
242 m_scene.EventManager.OnPluginConsole += new EventManager.OnPluginConsoleDelegate(EventManager_OnPluginConsole); 234 m_log.InfoFormat("[PERMISSIONS] Forced permissions to {0} in {1}", m_bypassPermissionsValue, m_scene.RegionInfo.RegionName);
235 }
236 }
237
238 public void HandleDebugPermissions(string module, string[] args)
239 {
240 if (m_scene.ConsoleScene() != null &&
241 m_scene.ConsoleScene() != m_scene)
242 {
243 return;
244 }
245
246 if (args.Length > 2)
247 {
248 bool val;
249
250 if (!bool.TryParse(args[2], out val))
251 return;
252
253 m_debugPermissions = val;
254
255 m_log.InfoFormat("[PERMISSIONS] Set permissions debugging to {0} in {1}", m_debugPermissions, m_scene.RegionInfo.RegionName);
256 }
243 } 257 }
244 258
245 public void PostInitialise() 259 public void PostInitialise()
diff --git a/OpenSim/Region/Framework/Interfaces/ICommand.cs b/OpenSim/Region/Framework/Interfaces/ICommand.cs
index 1551b58..15e55c4 100644
--- a/OpenSim/Region/Framework/Interfaces/ICommand.cs
+++ b/OpenSim/Region/Framework/Interfaces/ICommand.cs
@@ -46,5 +46,6 @@ namespace OpenSim.Region.Framework.Interfaces
46 46
47 void Run(object[] args); 47 void Run(object[] args);
48 void ShowConsoleHelp(); 48 void ShowConsoleHelp();
49 string ShortHelp();
49 } 50 }
50} 51}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f07391d..55fc02a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -37,6 +37,7 @@ using OpenMetaverse;
37using OpenMetaverse.Imaging; 37using OpenMetaverse.Imaging;
38using OpenMetaverse.Packets; 38using OpenMetaverse.Packets;
39using OpenSim.Framework; 39using OpenSim.Framework;
40using OpenSim.Framework.Console;
40using OpenSim.Framework.Communications; 41using OpenSim.Framework.Communications;
41using OpenSim.Framework.Communications.Cache; 42using OpenSim.Framework.Communications.Cache;
42using OpenSim.Framework.Servers; 43using OpenSim.Framework.Servers;
@@ -3384,7 +3385,7 @@ namespace OpenSim.Region.Framework.Scenes
3384 /// <param name="cmdparams"></param> 3385 /// <param name="cmdparams"></param>
3385 public void HandleEditCommand(string[] cmdparams) 3386 public void HandleEditCommand(string[] cmdparams)
3386 { 3387 {
3387 Console.WriteLine("Searching for Primitive: '" + cmdparams[0] + "'"); 3388 Console.WriteLine("Searching for Primitive: '" + cmdparams[2] + "'");
3388 3389
3389 List<EntityBase> EntityList = GetEntities(); 3390 List<EntityBase> EntityList = GetEntities();
3390 3391
@@ -3395,11 +3396,11 @@ namespace OpenSim.Region.Framework.Scenes
3395 SceneObjectPart part = ((SceneObjectGroup)ent).GetChildPart(((SceneObjectGroup)ent).UUID); 3396 SceneObjectPart part = ((SceneObjectGroup)ent).GetChildPart(((SceneObjectGroup)ent).UUID);
3396 if (part != null) 3397 if (part != null)
3397 { 3398 {
3398 if (part.Name == cmdparams[0]) 3399 if (part.Name == cmdparams[2])
3399 { 3400 {
3400 part.Resize( 3401 part.Resize(
3401 new Vector3(Convert.ToSingle(cmdparams[1]), Convert.ToSingle(cmdparams[2]), 3402 new Vector3(Convert.ToSingle(cmdparams[3]), Convert.ToSingle(cmdparams[4]),
3402 Convert.ToSingle(cmdparams[3]))); 3403 Convert.ToSingle(cmdparams[5])));
3403 3404
3404 Console.WriteLine("Edited scale of Primitive: " + part.Name); 3405 Console.WriteLine("Edited scale of Primitive: " + part.Name);
3405 } 3406 }
@@ -4235,5 +4236,14 @@ namespace OpenSim.Region.Framework.Scenes
4235 } 4236 }
4236 } 4237 }
4237 } 4238 }
4239
4240 public Scene ConsoleScene()
4241 {
4242 if (MainConsole.Instance == null)
4243 return null;
4244 if (MainConsole.Instance.ConsoleScene is Scene)
4245 return (Scene)MainConsole.Instance.ConsoleScene;
4246 return null;
4247 }
4238 } 4248 }
4239} 4249}
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index e58d3ce..cee9037 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -32,6 +32,7 @@ using System.Threading;
32using OpenMetaverse; 32using OpenMetaverse;
33using log4net; 33using log4net;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Console;
35using OpenSim.Framework.Communications.Cache; 36using OpenSim.Framework.Communications.Cache;
36using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
37 38
@@ -458,5 +459,12 @@ namespace OpenSim.Region.Framework.Scenes
458 break; 459 break;
459 } 460 }
460 } 461 }
462
463 public void AddCommand(string module, string command, string shorthelp, string longhelp, CommandDelegate callback)
464 {
465 if (MainConsole.Instance == null)
466 return;
467 MainConsole.Instance.Commands.AddCommand(module, command, shorthelp, longhelp, callback);
468 }
461 } 469 }
462} 470}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1484638..0825bf8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -128,12 +128,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
128 get { return m_ScriptEngine.World; } 128 get { return m_ScriptEngine.World; }
129 } 129 }
130 130
131 // Extension commands use this:
132 public ICommander GetCommander(string name)
133 {
134 return World.GetCommander(name);
135 }
136
137 public void state(string newState) 131 public void state(string newState)
138 { 132 {
139 m_ScriptEngine.SetState(m_itemID, newState); 133 m_ScriptEngine.SetState(m_itemID, newState);
diff --git a/OpenSim/TestSuite/BotManager.cs b/OpenSim/TestSuite/BotManager.cs
index 8eb2027..0838214 100644
--- a/OpenSim/TestSuite/BotManager.cs
+++ b/OpenSim/TestSuite/BotManager.cs
@@ -40,7 +40,7 @@ namespace OpenSim.TestSuite
40 /// <summary> 40 /// <summary>
41 /// Thread/Bot manager for the application 41 /// Thread/Bot manager for the application
42 /// </summary> 42 /// </summary>
43 public class BotManager : conscmd_callback 43 public class BotManager
44 { 44 {
45 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 45 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
46 46
@@ -58,8 +58,6 @@ namespace OpenSim.TestSuite
58 public BotManager() 58 public BotManager()
59 { 59 {
60 m_log.Info("In bot manager"); 60 m_log.Info("In bot manager");
61 // m_console = CreateConsole();
62 // MainConsole.Instance = m_console;
63 m_lBot = new List<PhysicsBot>(); 61 m_lBot = new List<PhysicsBot>();
64 } 62 }
65 63
@@ -169,52 +167,5 @@ namespace OpenSim.TestSuite
169 pb.shutdown(); 167 pb.shutdown();
170 } 168 }
171 } 169 }
172
173 /// <summary>
174 /// Standard CreateConsole routine
175 /// </summary>
176 /// <returns></returns>
177 protected ConsoleBase CreateConsole()
178 {
179 return new ConsoleBase("Region", this);
180 }
181
182 /// <summary>
183 /// Command runnint tool.. Currently use it to add bots, shutdown and (dangerous)Forcequit
184 /// </summary>
185 /// <param name="command"></param>
186 /// <param name="cmdparams"></param>
187 public void RunCmd(string command, string[] cmdparams)
188 {
189 switch (command)
190 {
191 case "shutdown":
192 m_console.Warn("BOTMANAGER", "Shutting down bots");
193 doBotShutdown();
194 break;
195 case "quit":
196 m_console.Warn("DANGER", "This should only be used to quit the program if you've already used the shutdown command and the program hasn't quit");
197 Environment.Exit(0);
198 break;
199 case "addbots":
200 int newbots;
201 Int32.TryParse(cmdparams[0], out newbots);
202
203 if (newbots > 0)
204 addbots(newbots);
205 break;
206 case "help":
207 m_console.Notice("HELP", "\nshutdown - graceful shutdown\naddbots <n> - adds n bots to the test\nquit - forcequits, dangerous if you have not already run shutdown");
208 break;
209 }
210 }
211
212 /// <summary>
213 /// Required method to implement the conscmd_callback interface
214 /// </summary>
215 /// <param name="showParams">What to show</param>
216 public void Show(string[] showParams)
217 {
218 }
219 } 170 }
220} 171}
diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs
index 100f2d4..3b08adc 100644
--- a/OpenSim/Tools/pCampBot/BotManager.cs
+++ b/OpenSim/Tools/pCampBot/BotManager.cs
@@ -31,6 +31,9 @@ using System.Reflection;
31using System.Threading; 31using System.Threading;
32using OpenMetaverse; 32using OpenMetaverse;
33using log4net; 33using log4net;
34using log4net.Appender;
35using log4net.Core;
36using log4net.Repository;
34using Nini.Config; 37using Nini.Config;
35using OpenSim.Framework; 38using OpenSim.Framework;
36using OpenSim.Framework.Console; 39using OpenSim.Framework.Console;
@@ -40,7 +43,7 @@ namespace pCampBot
40 /// <summary> 43 /// <summary>
41 /// Thread/Bot manager for the application 44 /// Thread/Bot manager for the application
42 /// </summary> 45 /// </summary>
43 public class BotManager : conscmd_callback 46 public class BotManager
44 { 47 {
45 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
46 49
@@ -59,6 +62,36 @@ namespace pCampBot
59 { 62 {
60 m_console = CreateConsole(); 63 m_console = CreateConsole();
61 MainConsole.Instance = m_console; 64 MainConsole.Instance = m_console;
65
66 // Make log4net see the console
67 //
68 ILoggerRepository repository = LogManager.GetRepository();
69 IAppender[] appenders = repository.GetAppenders();
70 OpenSimAppender consoleAppender = null;
71
72 foreach (IAppender appender in appenders)
73 {
74 if (appender.Name == "Console")
75 {
76 consoleAppender = (OpenSimAppender)appender;
77 consoleAppender.Console = m_console;
78 break;
79 }
80 }
81
82 m_console.Commands.AddCommand("bot", "shutdown",
83 "shutdown",
84 "Gracefully shut down bots", HandleShutdown);
85
86 m_console.Commands.AddCommand("bot", "quit",
87 "quit",
88 "Force quit (DANGEROUS, try shutdown first)",
89 HandleShutdown);
90
91 m_console.Commands.AddCommand("bot", "add bots",
92 "add bots <number>",
93 "Add more bots", HandleAddBots);
94
62 m_lBot = new List<PhysicsBot>(); 95 m_lBot = new List<PhysicsBot>();
63 } 96 }
64 97
@@ -175,45 +208,31 @@ namespace pCampBot
175 /// <returns></returns> 208 /// <returns></returns>
176 protected ConsoleBase CreateConsole() 209 protected ConsoleBase CreateConsole()
177 { 210 {
178 return new ConsoleBase("Region", this); 211 return new ConsoleBase("Region");
179 } 212 }
180 213
181 /// <summary> 214 private void HandleShutdown(string module, string[] cmd)
182 /// Command runnint tool.. Currently use it to add bots, shutdown and (dangerous)Forcequit
183 /// </summary>
184 /// <param name="command"></param>
185 /// <param name="cmdparams"></param>
186 public void RunCmd(string command, string[] cmdparams)
187 { 215 {
188 switch (command) 216 m_console.Warn("BOTMANAGER", "Shutting down bots");
189 { 217 doBotShutdown();
190 case "shutdown": 218 }
191 m_console.Warn("BOTMANAGER", "Shutting down bots");
192 doBotShutdown();
193 break;
194 case "quit":
195 m_console.Warn("DANGER", "This should only be used to quit the program if you've already used the shutdown command and the program hasn't quit");
196 Environment.Exit(0);
197 break;
198 case "addbots":
199 int newbots;
200 Int32.TryParse(cmdparams[0], out newbots);
201 219
202 if (newbots > 0) 220 private void HandleQuit(string module, string[] cmd)
203 addbots(newbots); 221 {
204 break; 222 m_console.Warn("DANGER", "This should only be used to quit the program if you've already used the shutdown command and the program hasn't quit");
205 case "help": 223 Environment.Exit(0);
206 m_console.Notice("HELP", "\nshutdown - graceful shutdown\naddbots <n> - adds n bots to the test\nquit - forcequits, dangerous if you have not already run shutdown");
207 break;
208 }
209 } 224 }
210 225
211 /// <summary> 226 private void HandleAddBots(string module, string[] cmd)
212 /// Required method to implement the conscmd_callback interface
213 /// </summary>
214 /// <param name="showParams">What to show</param>
215 public void Show(string[] showParams)
216 { 227 {
228 int newbots = 0;
229
230 if (cmd.Length > 2)
231 {
232 Int32.TryParse(cmd[2], out newbots);
233 }
234 if (newbots > 0)
235 addbots(newbots);
217 } 236 }
218 } 237 }
219} 238}