diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 7b931d7da7..7be152beab 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -209,68 +209,43 @@ namespace OpenSim.ApplicationPlugins.RemoteController UUID regionID = new UUID((string) requestData["regionID"]); - responseData["accepted"] = true; - responseData["success"] = true; - response.Value = responseData; - Scene rebootedScene; + responseData["success"] = false; + responseData["accepted"] = true; if (!m_application.SceneManager.TryGetScene(regionID, out rebootedScene)) throw new Exception("region not found"); - int timeout = 30000; + int timeout = 30; string message; if (requestData.ContainsKey("restart") && ((string)requestData["restart"] == "delayed") && requestData.ContainsKey("milliseconds")) { - timeout = Int32.Parse(requestData["milliseconds"].ToString()); - - if (timeout < 15000) - { - //It must be at least 15 seconds or we'll cancel the reboot request - timeout = 15000; - } - - message - = "Region is restarting in " + ((int)(timeout / 1000)).ToString() - + " second(s). Please save what you are doing and log out."; - } - else - { - message = "Region is restarting in 30 second(s). Please save what you are doing and log out."; + timeout = Int32.Parse(requestData["milliseconds"].ToString()) / 1000; } + message = "Region is restarting in {0}. Please save what you are doing and log out."; + + bool notice = true; if (requestData.ContainsKey("noticetype") && ((string)requestData["noticetype"] == "dialog")) { - m_application.SceneManager.ForEachScene( - delegate(Scene scene) - { - IDialogModule dialogModule = scene.RequestModuleInterface(); - if (dialogModule != null) - dialogModule.SendNotificationToUsersInRegion(UUID.Zero, "System", message); - }); - } - else - { - if (!requestData.ContainsKey("noticetype") - || ((string)requestData["noticetype"] != "none")) - { - m_application.SceneManager.ForEachScene( - delegate(Scene scene) - { - IDialogModule dialogModule = scene.RequestModuleInterface(); - if (dialogModule != null) - dialogModule.SendGeneralAlert(message); - }); - } + notice = false; } responseData["rebooting"] = true; + + IRestartModule restartModule = rebootedScene.RequestModuleInterface(); + if (restartModule != null) + { + List times = new List { 30, 15 }; + + restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), notice); + responseData["success"] = true; + } response.Value = responseData; - rebootedScene.Restart(timeout / 1000,false); } catch (Exception e) { diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index 6798b7be8a..1298f26a62 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs @@ -73,7 +73,7 @@ namespace OpenSim.Framework void AddNewClient(IClientAPI client); void RemoveClient(UUID agentID); - void Restart(int seconds); + void Restart(); //RegionInfo OtherRegionUp(RegionInfo thisRegion); string GetSimulatorVersion(); diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 14de4f4c53..75cf0c66e3 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -233,7 +233,23 @@ namespace OpenSim.Region.CoreModules.World.Estate private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds) { - m_scene.Restart(timeInSeconds); + IRestartModule restartModule = m_scene.RequestModuleInterface(); + if (restartModule != null) + { + List times = new List(); + while (timeInSeconds > 0) + { + times.Add(timeInSeconds); + if (timeInSeconds > 300) + timeInSeconds -= 120; + else if (timeInSeconds > 30) + timeInSeconds -= 30; + else + timeInSeconds -= 15; + } + + restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); + } } private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d3a46788e3..e479628467 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -915,72 +915,6 @@ namespace OpenSim.Region.Framework.Scenes return new GridRegion(RegionInfo); } - /// - /// Given float seconds, this will restart the region. - /// - /// float indicating duration before restart. - public virtual void Restart(float seconds) - { - Restart(seconds, true); - } - - /// - /// Given float seconds, this will restart the region. showDialog will optionally alert the users. - /// - /// float indicating duration before restart. - public virtual void Restart(float seconds, bool showDialog) - { - // notifications are done in 15 second increments - // so .. if the number of seconds is less then 15 seconds, it's not really a restart request - // It's a 'Cancel restart' request. - - // RestartNow() does immediate restarting. - if (seconds < 15) - { - m_restartTimer.Stop(); - m_dialogModule.SendGeneralAlert("Restart Aborted"); - } - else - { - // Now we figure out what to set the timer to that does the notifications and calls, RestartNow() - m_restartTimer.Interval = 15000; - m_incrementsof15seconds = (int)seconds / 15; - m_RestartTimerCounter = 0; - m_restartTimer.AutoReset = true; - m_restartTimer.Elapsed += new ElapsedEventHandler(RestartTimer_Elapsed); - m_log.Info("[REGION]: Restarting Region in " + (seconds / 60) + " minutes"); - m_restartTimer.Start(); - if (showDialog) - { - m_dialogModule.SendNotificationToUsersInRegion( - UUID.Random(), String.Empty, RegionInfo.RegionName + String.Format(": Restarting in {0} Minutes", (int)(seconds / 60.0))); - } - } - } - - // The Restart timer has occured. - // We have to figure out if this is a notification or if the number of seconds specified in Restart - // have elapsed. - // If they have elapsed, call RestartNow() - public void RestartTimer_Elapsed(object sender, ElapsedEventArgs e) - { - m_RestartTimerCounter++; - if (m_RestartTimerCounter <= m_incrementsof15seconds) - { - if (m_RestartTimerCounter == 4 || m_RestartTimerCounter == 6 || m_RestartTimerCounter == 7) - m_dialogModule.SendNotificationToUsersInRegion( - UUID.Random(), - String.Empty, - RegionInfo.RegionName + ": Restarting in " + ((8 - m_RestartTimerCounter) * 15) + " seconds"); - } - else - { - m_restartTimer.Stop(); - m_restartTimer.AutoReset = false; - RestartNow(); - } - } - // This causes the region to restart immediatley. public void RestartNow() { @@ -1003,7 +937,8 @@ namespace OpenSim.Region.Framework.Scenes Close(); m_log.Error("[REGION]: Firing Region Restart Message"); - base.Restart(0); + + base.Restart(); } // This is a helper function that notifies root agents in this region that a new sim near them has come up diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index c71aefadee..f343bc861e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -218,18 +218,6 @@ namespace OpenSim.Region.Framework.Scenes #region admin stuff - /// - /// Region Restart - Seconds till restart. - /// - /// - public virtual void Restart(int seconds) - { - m_log.Error("[REGION]: passing Restart Message up the namespace"); - restart handlerPhysicsCrash = OnRestart; - if (handlerPhysicsCrash != null) - handlerPhysicsCrash(RegionInfo); - } - public virtual bool PresenceChildStatus(UUID avatarID) { return false; @@ -562,6 +550,14 @@ namespace OpenSim.Region.Framework.Scenes get { return false; } } + public void Restart() + { + // This has to be here to fire the event + restart handlerPhysicsCrash = OnRestart; + if (handlerPhysicsCrash != null) + handlerPhysicsCrash(RegionInfo); + } + public abstract bool CheckClient(UUID agentID, System.Net.IPEndPoint ep); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 26ef0dd7db..eba6e75f3c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -404,10 +404,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // CheckThreatLevel(ThreatLevel.High, "osRegionRestart"); + IRestartModule restartModule = World.RequestModuleInterface(); m_host.AddScriptLPS(1); - if (World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false)) + if (World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false) && (restartModule != null)) { - World.Restart((float)seconds); + if (seconds < 15) + { + restartModule.AbortRestart("Restart aborted"); + return 1; + } + + List times = new List(); + while (seconds > 0) + { + times.Add((int)seconds); + if (seconds > 300) + seconds -= 120; + else if (seconds > 30) + seconds -= 30; + else + seconds -= 15; + } + + restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), true); return 1; } else @@ -2328,4 +2347,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return date.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); } } -} \ No newline at end of file +}