From 8e1d3386561f263646c10c875aa00af4b3c9f815 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Sun, 1 Jun 2008 01:01:16 +0000 Subject: * Refactor: Split opensim background server into a separate class --- OpenSim/Region/Application/OpenSim.cs | 680 ++++++++++++++++++++++++++++++++++ 1 file changed, 680 insertions(+) create mode 100644 OpenSim/Region/Application/OpenSim.cs (limited to 'OpenSim/Region/Application/OpenSim.cs') diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs new file mode 100644 index 0000000..1bed036 --- /dev/null +++ b/OpenSim/Region/Application/OpenSim.cs @@ -0,0 +1,680 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Reflection; +using System.Threading; +using libsecondlife; +using log4net; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Statistics; +using OpenSim.Region.Environment.Interfaces; +using OpenSim.Region.Environment.Scenes; +using Timer=System.Timers.Timer; + +namespace OpenSim +{ + public delegate void ConsoleCommand(string[] comParams); + + /// + /// Interactive OpenSim region server + /// + public class OpenSim : OpenSimBase, conscmd_callback + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected string m_startupCommandsFile; + protected string m_shutdownCommandsFile; + + private string m_timedScript = "disabled"; + private Timer m_scriptTimer; + + public OpenSim(IConfigSource configSource) : base(configSource) + { + } + + protected override void ReadConfigSettings() + { + IConfig startupConfig = m_config.Configs["Startup"]; + + if (startupConfig != null) + { + m_startupCommandsFile = startupConfig.GetString("startup_console_commands_file", String.Empty); + m_shutdownCommandsFile = startupConfig.GetString("shutdown_console_commands_file", String.Empty); + + m_timedScript = startupConfig.GetString("timer_Script", "disabled"); + } + base.ReadConfigSettings(); + } + + /// + /// Performs initialisation of the scene, such as loading configuration from disk. + /// + public override void StartUp() + { + // + // Called from app startup (OpenSim.Application) + // + + m_log.Info("===================================================================="); + m_log.Info("========================= STARTING OPENSIM ========================="); + m_log.Info("===================================================================="); + m_log.InfoFormat("[OPENSIM MAIN]: Running in {0} mode", (m_sandbox ? "sandbox" : "grid")); + + m_console = CreateConsole(); + MainConsole.Instance = m_console; + InternalStartUp(); + + //Run Startup Commands + if (m_startupCommandsFile != String.Empty) + { + RunCommandScript(m_startupCommandsFile); + } + else + { + m_log.Info("[STARTUP]: No startup command script specified. Moving on..."); + } + + // Start timer script (run a script every xx seconds) + if (m_timedScript != "disabled") + { + m_scriptTimer = new Timer(); + m_scriptTimer.Enabled = true; + m_scriptTimer.Interval = 1200 * 1000; + m_scriptTimer.Elapsed += RunAutoTimerScript; + } + + PrintFileToConsole("startuplogo.txt"); + } + + protected ConsoleBase CreateConsole() + { + return new ConsoleBase("Region", this); + } + + private void RunAutoTimerScript(object sender, EventArgs e) + { + if (m_timedScript != "disabled") + { + RunCommandScript(m_timedScript); + } + } + + #region Console Commands + + /// + /// + /// + /// + private void RunCommandScript(string fileName) + { + m_log.Info("[COMMANDFILE]: Running " + fileName); + if (File.Exists(fileName)) + { + StreamReader readFile = File.OpenText(fileName); + string currentCommand; + while ((currentCommand = readFile.ReadLine()) != null) + { + if (currentCommand != String.Empty) + { + m_log.Info("[COMMANDFILE]: Running '" + currentCommand + "'"); + m_console.RunCommand(currentCommand); + } + } + } + else + { + m_log.Error("[COMMANDFILE]: Command script missing. Can not run commands"); + } + } + + private static void PrintFileToConsole(string fileName) + { + if (File.Exists(fileName)) + { + StreamReader readFile = File.OpenText(fileName); + string currentLine; + while ((currentLine = readFile.ReadLine()) != null) + { + m_log.Info("[!]" + currentLine); + } + } + } + + + /// + /// Runs commands issued by the server console from the operator + /// + /// The first argument of the parameter (the command) + /// Additional arguments passed to the command + public override void RunCmd(string command, string[] cmdparams) + { + base.RunCmd(command, cmdparams); + + switch (command) + { + case "clear-assets": + m_assetCache.Clear(); + break; + + case "set-time": + m_sceneManager.SetCurrentSceneTimePhase(Convert.ToInt32(cmdparams[0])); + break; + + case "force-update": + m_console.Notice("Updating all clients"); + m_sceneManager.ForceCurrentSceneClientUpdate(); + break; + + case "edit-scale": + if (cmdparams.Length == 4) + { + m_sceneManager.HandleEditCommandOnCurrentScene(cmdparams); + } + break; + + case "debug": + if (cmdparams.Length > 0) + { + Debug(cmdparams); + } + break; + + case "scene-debug": + if (cmdparams.Length == 3) + { + if (m_sceneManager.CurrentScene == null) + { + m_console.Error("CONSOLE", "Please use 'change-region ' first"); + } + else + { + m_sceneManager.CurrentScene.SetSceneCoreDebug(!Convert.ToBoolean(cmdparams[0]), !Convert.ToBoolean(cmdparams[1]), !Convert.ToBoolean(cmdparams[2])); + } + } + else + { + m_console.Error("scene-debug (where inside <> is true/false)"); + } + break; + + case "help": + m_console.Notice("alert - send alert to a designated user or all users."); + m_console.Notice(" alert [First] [Last] [Message] - send an alert to a user. Case sensitive."); + m_console.Notice(" alert general [Message] - send an alert to all users."); + m_console.Notice("backup - trigger a simulator backup"); + m_console.Notice("clear-assets - clear asset cache"); + m_console.Notice("create-region - creates a new region"); + m_console.Notice("create user - adds a new user."); + m_console.Notice("change-region [name] - sets the region that many of these commands affect."); + m_console.Notice("command-script [filename] - Execute command in a file."); + m_console.Notice("debug - debugging commands"); + m_console.Notice(" packet 0..255 - print incoming/outgoing packets (0=off)"); + m_console.Notice("scene-debug [scripting] [collision] [physics] - Enable/Disable debug stuff, each can be True/False"); + m_console.Notice("edit-scale [prim name] [x] [y] [z] - resize given prim"); + m_console.Notice("export-map [filename] - save image of world map"); + m_console.Notice("force-update - force an update of prims in the scene"); + m_console.Notice("load-xml [filename] - load prims from XML (DEPRECATED)"); + m_console.Notice("load-xml2 [filename] - load prims from XML using version 2 format"); + m_console.Notice("restart - disconnects all clients and restarts the sims in the instance."); + m_console.Notice("remove-region [name] - remove a region"); + m_console.Notice("save-xml [filename] - save prims to XML (DEPRECATED)"); + m_console.Notice("save-xml2 [filename] - save prims to XML using version 2 format"); + m_console.Notice("script - manually trigger scripts? or script commands?"); + m_console.Notice("set-time [x] - set the current scene time phase"); + m_console.Notice("show assets - show state of asset cache."); + m_console.Notice("show users - show info about connected users."); + m_console.Notice("show modules - shows info about loaded modules."); + m_console.Notice("show regions - show running region information."); + m_console.Notice("threads - list threads"); + m_console.Notice("config set section field value - set a config value"); + m_console.Notice("config get section field - get a config value"); + m_console.Notice("config save - save OpenSim.ini"); + m_console.Notice("terrain help - show help for terrain commands."); + break; + + case "threads": +// m_console.Notice("THREAD", Process.GetCurrentProcess().Threads.Count + " threads running:"); +// int _tc = 0; + +// foreach (ProcessThread pt in Process.GetCurrentProcess().Threads) +// { +// _tc++; +// m_console.Notice("THREAD", _tc + ": ID: " + pt.Id + ", Started: " + pt.StartTime.ToString() + ", CPU time: " + pt.TotalProcessorTime + ", Pri: " + pt.BasePriority.ToString() + ", State: " + pt.ThreadState.ToString()); +// } + + List threads = ThreadTracker.GetThreads(); + if (threads == null) + { + m_console.Notice("THREAD", "Thread tracking is only enabled in DEBUG mode."); + } + else + { + int _tc = 0; + m_console.Notice("THREAD", threads.Count + " threads are being tracked:"); + foreach (Thread t in threads) + { + _tc++; + m_console.Notice("THREAD", _tc + ": ID: " + t.ManagedThreadId.ToString() + ", Name: " + t.Name + ", Alive: " + t.IsAlive.ToString() + ", Pri: " + t.Priority.ToString() + ", State: " + t.ThreadState.ToString()); + } + } + + break; + case "save-xml": + 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."); + + if (cmdparams.Length > 0) + { + m_sceneManager.SaveCurrentSceneToXml(cmdparams[0]); + } + else + { + m_sceneManager.SaveCurrentSceneToXml(DEFAULT_PRIM_BACKUP_FILENAME); + } + break; + + case "load-xml": + 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."); + + LLVector3 loadOffset = new LLVector3(0, 0, 0); + if (cmdparams.Length > 0) + { + bool generateNewIDS = false; + if (cmdparams.Length > 1) + { + if (cmdparams[1] == "-newUID") + { + generateNewIDS = true; + } + if (cmdparams.Length > 2) + { + loadOffset.X = (float) Convert.ToDecimal(cmdparams[2]); + if (cmdparams.Length > 3) + { + loadOffset.Y = (float) Convert.ToDecimal(cmdparams[3]); + } + if (cmdparams.Length > 4) + { + loadOffset.Z = (float) Convert.ToDecimal(cmdparams[4]); + } + m_console.Error("loadOffsets = <" + loadOffset.X + "," + loadOffset.Y + "," + + loadOffset.Z + ">"); + } + } + m_sceneManager.LoadCurrentSceneFromXml(cmdparams[0], generateNewIDS, loadOffset); + } + else + { + m_sceneManager.LoadCurrentSceneFromXml(DEFAULT_PRIM_BACKUP_FILENAME, false, loadOffset); + } + break; + + case "save-xml2": + if (cmdparams.Length > 0) + { + m_sceneManager.SaveCurrentSceneToXml2(cmdparams[0]); + } + else + { + m_sceneManager.SaveCurrentSceneToXml2(DEFAULT_PRIM_BACKUP_FILENAME); + } + break; + + case "load-xml2": + if (cmdparams.Length > 0) + { + m_sceneManager.LoadCurrentSceneFromXml2(cmdparams[0]); + } + else + { + m_sceneManager.LoadCurrentSceneFromXml2(DEFAULT_PRIM_BACKUP_FILENAME); + } + break; + + case "load-oar": + m_log.Error("[CONSOLE]: Don't use me - I haven't yet been sufficiently implemented!"); + + if (cmdparams.Length > 0) + { + m_sceneManager.LoadArchiveToCurrentScene(cmdparams[0]); + } + else + { + m_sceneManager.LoadArchiveToCurrentScene(DEFAULT_OAR_BACKUP_FILENAME); + } + break; + + case "save-oar": + m_log.Error("[CONSOLE]: Don't use me - I haven't yet been sufficiently implemented!"); + + if (cmdparams.Length > 0) + { + m_sceneManager.SaveCurrentSceneToArchive(cmdparams[0]); + } + else + { + m_sceneManager.SaveCurrentSceneToArchive(DEFAULT_OAR_BACKUP_FILENAME); + } + break; + + case "plugin": + m_sceneManager.SendCommandToPluginModules(cmdparams); + break; + + case "command-script": + if (cmdparams.Length > 0) + { + RunCommandScript(cmdparams[0]); + } + break; + + case "backup": + m_sceneManager.BackupCurrentScene(); + break; + + case "alert": + m_sceneManager.HandleAlertCommandOnCurrentScene(cmdparams); + break; + + case "create": + CreateAccount(cmdparams); + break; + + case "create-region": + CreateRegion(new RegionInfo(cmdparams[0], "Regions/" + cmdparams[1],false), true); + break; + case "remove-region": + string regName = CombineParams(cmdparams, 0); + + Scene killScene; + if (m_sceneManager.TryGetScene(regName, out killScene)) + { + // only need to check this if we are not at the + // root level + if ((m_sceneManager.CurrentScene != null) && + (m_sceneManager.CurrentScene.RegionInfo.RegionID == killScene.RegionInfo.RegionID)) + { + m_sceneManager.TrySetCurrentScene(".."); + } + m_regionData.Remove(killScene.RegionInfo); + m_sceneManager.CloseScene(killScene); + } + break; + + case "restart": + m_sceneManager.RestartCurrentScene(); + break; + + case "change-region": + if (cmdparams.Length > 0) + { + string regionName = CombineParams(cmdparams, 0); + + if (!m_sceneManager.TrySetCurrentScene(regionName)) + { + m_console.Error("Couldn't set current region to: " + regionName); + } + } + + if (m_sceneManager.CurrentScene == null) + { + m_console.Error("CONSOLE", "Currently at Root level. To change region please use 'change-region '"); + } + else + { + m_console.Error("CONSOLE", "Current Region: " + m_sceneManager.CurrentScene.RegionInfo.RegionName + + ". To change region please use 'change-region '"); + } + + break; + + case "export-map": + if (cmdparams.Length > 0) + { + m_sceneManager.CurrentOrFirstScene.ExportWorldMap(cmdparams[0]); + } + else + { + m_sceneManager.CurrentOrFirstScene.ExportWorldMap("exportmap.jpg"); + } + break; + + case "config": + string n = command.ToUpper(); + if (cmdparams.Length > 0) + { + switch (cmdparams[0].ToLower()) + { + case "set": + if (cmdparams.Length < 4) + { + m_console.Error(n, "SYNTAX: " + n + " SET SECTION KEY VALUE"); + m_console.Error(n, "EXAMPLE: " + n + " SET ScriptEngine.DotNetEngine NumberOfScriptThreads 5"); + } + else + { + IConfig c = DefaultConfig().Configs[cmdparams[1]]; + if (c == null) + c = DefaultConfig().AddConfig(cmdparams[1]); + string _value = String.Join(" ", cmdparams, 3, cmdparams.Length - 3); + c.Set(cmdparams[2], _value); + m_config.Merge(c.ConfigSource); + + m_console.Error(n, n + " " + n + " " + cmdparams[1] + " " + cmdparams[2] + " " + + _value); + } + break; + case "get": + if (cmdparams.Length < 3) + { + m_console.Error(n, "SYNTAX: " + n + " GET SECTION KEY"); + m_console.Error(n, "EXAMPLE: " + n + " GET ScriptEngine.DotNetEngine NumberOfScriptThreads"); + } + else + { + IConfig c = DefaultConfig().Configs[cmdparams[1]]; + if (c == null) + { + m_console.Notice(n, "Section \"" + cmdparams[1] + "\" does not exist."); + break; + } + else + { + m_console.Notice(n + " GET " + cmdparams[1] + " " + cmdparams[2] + ": " + + c.GetString(cmdparams[2])); + } + } + + break; + case "save": + m_console.Notice("Saving configuration file: " + Application.iniFilePath); + m_config.Save(Application.iniFilePath); + break; + } + } + break; + case "modules": + if (cmdparams.Length > 0) + { + switch (cmdparams[0].ToLower()) + { + case "list": + foreach (IRegionModule irm in m_moduleLoader.GetLoadedSharedModules) + { + m_console.Notice("Shared region module: " + irm.Name); + } + break; + case "unload": + if (cmdparams.Length > 1) + { + foreach (IRegionModule rm in new ArrayList(m_moduleLoader.GetLoadedSharedModules)) + { + if (rm.Name.ToLower() == cmdparams[1].ToLower()) + { + m_console.Notice("Unloading module: " + rm.Name); + m_moduleLoader.UnloadModule(rm); + } + } + } + break; + case "load": + if (cmdparams.Length > 1) + { + foreach (Scene s in new ArrayList(m_sceneManager.Scenes)) + { + + m_console.Notice("Loading module: " + cmdparams[1]); + m_moduleLoader.LoadRegionModules(cmdparams[1], s); + } + } + break; + } + } + + break; + default: + string[] tmpPluginArgs = new string[cmdparams.Length + 1]; + cmdparams.CopyTo(tmpPluginArgs, 1); + tmpPluginArgs[0] = command; + + m_sceneManager.SendCommandToPluginModules(tmpPluginArgs); + break; + } + } + + public void Debug(string[] args) + { + switch (args[0]) + { + case "packet": + if (args.Length > 1) + { + int newDebug; + if (int.TryParse(args[1], out newDebug)) + { + m_sceneManager.SetDebugPacketOnCurrentScene(newDebug); + } + else + { + m_console.Error("packet debug should be 0..2"); + } + m_console.Notice("New packet debug: " + newDebug.ToString()); + } + + break; + default: + m_console.Error("Unknown debug"); + break; + } + } + + // see BaseOpenSimServer + public override void Show(string ShowWhat) + { + base.Show(ShowWhat); + + switch (ShowWhat) + { + case "assets": + m_assetCache.ShowState(); + break; + + case "users": + IList agents = m_sceneManager.GetCurrentSceneAvatars(); + + m_console.Notice(String.Format("\nAgents connected: {0}\n", agents.Count)); + + m_console.Notice( + String.Format("{0,-16}{1,-16}{2,-37}{3,-16}", "Firstname", "Lastname", + "Agent ID","Region")); + + foreach (ScenePresence presence in agents) + { + RegionInfo regionInfo = m_sceneManager.GetRegionInfo(presence.RegionHandle); + string regionName; + + if (regionInfo == null) + { + regionName = "Unresolvable"; + } + else + { + regionName = regionInfo.RegionName; + } + + m_console.Notice( + String.Format( + "{0,-16}{1,-16}{2,-37}{3,-16}", + presence.Firstname, + presence.Lastname, + presence.UUID, + regionName)); + } + + m_console.Notice(""); + break; + + case "modules": + m_console.Notice("The currently loaded shared modules are:"); + foreach (IRegionModule module in m_moduleLoader.GetLoadedSharedModules) + { + m_console.Notice("Shared Module: " + module.Name); + } + break; + + case "regions": + m_sceneManager.ForEachScene( + delegate(Scene scene) + { + m_console.Notice("Region Name: " + scene.RegionInfo.RegionName + " , Region XLoc: " + + scene.RegionInfo.RegionLocX + " , Region YLoc: " + + scene.RegionInfo.RegionLocY); + }); + break; + } + } + + private static string CombineParams(string[] commandParams, int pos) + { + string result = String.Empty; + for (int i = pos; i < commandParams.Length; i++) + { + result += commandParams[i] + " "; + } + result = result.TrimEnd(' '); + return result; + } + + #endregion + } +} -- cgit v1.1