From e14f449cc2a59cb84c195b9479bcd43c16cafc48 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 24 Nov 2010 22:14:53 +0000 Subject: [PATCH 1/2] Adding the skeleton for the restart module --- .../CoreModules/World/Region/RestartModule.cs | 93 +++++++++++++++++++ .../Framework/Interfaces/IRestartModule.cs | 39 ++++++++ 2 files changed, 132 insertions(+) create mode 100644 OpenSim/Region/CoreModules/World/Region/RestartModule.cs create mode 100644 OpenSim/Region/Framework/Interfaces/IRestartModule.cs diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs new file mode 100644 index 0000000000..a92a28dd8c --- /dev/null +++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs @@ -0,0 +1,93 @@ +/* + * 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 OpenSimulator 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.Reflection; +using System.Timers; +using System.Threading; +using log4net; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using Timer=System.Timers.Timer; + +namespace OpenSim.Region.CoreModules.World.Region +{ + public class RestartModule : INonSharedRegionModule, IRestartModule + { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected Scene m_Scene; + protected Timer m_CountdownTimer = null; + + public void Initialise(IConfigSource config) + { + } + + public void AddRegion(Scene scene) + { + m_Scene = scene; + } + + public void RegionLoaded(Scene scene) + { + } + + public void RemoveRegion(Scene scene) + { + } + + public void Close() + { + } + + public string Name + { + get { return "RestartModule"; } + } + + public Type ReplaceableInterface + { + get { return typeof(IRestartModule); } + } + + public TimeSpan TimeUntilRestart + { + get { return TimeSpan.FromSeconds(0); } + } + public void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice) + { + } + + public void AbortRestart(string message) + { + } + } +} diff --git a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs new file mode 100644 index 0000000000..d8cac7b66b --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs @@ -0,0 +1,39 @@ +/* + * 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 OpenSimulator 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 OpenMetaverse; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IRestartModule + { + TimeSpan TimeUntilRestart { get; } + void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice); + void AbortRestart(string message); + } +} From 6734c9f83ae00b762873c3d99293435552b9a0c2 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 25 Nov 2010 01:22:05 +0000 Subject: [PATCH 2/2] Implement the restart module --- .../CoreModules/World/Region/RestartModule.cs | 115 +++++++++++++++++- .../Framework/Interfaces/IRestartModule.cs | 2 +- 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs index a92a28dd8c..1c26c38daa 100644 --- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs +++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs @@ -29,6 +29,7 @@ using System; using System.Reflection; using System.Timers; using System.Threading; +using System.Collections.Generic; using log4net; using Nini.Config; using OpenMetaverse; @@ -46,6 +47,12 @@ namespace OpenSim.Region.CoreModules.World.Region protected Scene m_Scene; protected Timer m_CountdownTimer = null; + protected DateTime m_RestartBegin; + protected List m_Alerts; + protected string m_Message; + protected UUID m_Initiator; + protected bool m_Notice = false; + protected IDialogModule m_DialogModule = null; public void Initialise(IConfigSource config) { @@ -54,6 +61,7 @@ namespace OpenSim.Region.CoreModules.World.Region public void AddRegion(Scene scene) { m_Scene = scene; + m_DialogModule = m_Scene.RequestModuleInterface(); } public void RegionLoaded(Scene scene) @@ -80,14 +88,117 @@ namespace OpenSim.Region.CoreModules.World.Region public TimeSpan TimeUntilRestart { - get { return TimeSpan.FromSeconds(0); } + get { return DateTime.Now - m_RestartBegin; } } - public void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice) + + public void ScheduleRestart(UUID initiator, string message, int[] alerts, bool notice) { + if (m_CountdownTimer != null) + return; + + if (alerts == null) + { + m_Scene.RestartNow(); + return; + } + + m_Message = message; + m_Initiator = initiator; + m_Notice = notice; + m_Alerts = new List(alerts); + m_Alerts.Sort(); + m_Alerts.Reverse(); + + if (m_Alerts[0] == 0) + { + m_Scene.RestartNow(); + return; + } + + int nextInterval = DoOneNotice(); + + SetTimer(nextInterval); + } + + public int DoOneNotice() + { + if (m_Alerts.Count == 0 || m_Alerts[0] == 0) + { + m_Scene.RestartNow(); + return 0; + } + + int nextAlert = 0; + while (m_Alerts.Count > 1) + { + if (m_Alerts[1] == m_Alerts[0]) + { + m_Alerts.RemoveAt(0); + continue; + } + nextAlert = m_Alerts[1]; + } + + int currentAlert = m_Alerts[0]; + + m_Alerts.RemoveAt(0); + + int minutes = currentAlert / 60; + string currentAlertString = ""; + if (minutes > 0) + { + if (minutes == 1) + currentAlertString += "1 minute"; + else + currentAlertString += String.Format("{0} minutes", minutes); + if ((currentAlert % 60) != 0) + currentAlertString += " and "; + } + if ((currentAlert % 60) != 0) + { + int seconds = currentAlert % 60; + if (seconds == 1) + currentAlertString += "1 second"; + else + currentAlertString += String.Format("{0} seconds", seconds); + } + + string msg = String.Format(m_Message, currentAlertString); + + if (m_DialogModule != null) + { + if (m_Notice) + m_DialogModule.SendGeneralAlert(msg); + else + m_DialogModule.SendNotificationToUsersInRegion(m_Initiator, "System", msg); + } + + return currentAlert - nextAlert; + } + + public void SetTimer(int intervalSeconds) + { + m_CountdownTimer = new Timer(); + m_CountdownTimer.AutoReset = false; + m_CountdownTimer.Interval = intervalSeconds * 1000; + m_CountdownTimer.Elapsed += OnTimer; + m_CountdownTimer.Start(); + } + + private void OnTimer(object source, ElapsedEventArgs e) + { + int nextInterval = DoOneNotice(); + + SetTimer(nextInterval); } public void AbortRestart(string message) { + if (m_CountdownTimer != null) + { + m_CountdownTimer.Stop(); + m_CountdownTimer = null; + } } } } diff --git a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs index d8cac7b66b..c68550f393 100644 --- a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs @@ -33,7 +33,7 @@ namespace OpenSim.Region.Framework.Interfaces public interface IRestartModule { TimeSpan TimeUntilRestart { get; } - void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice); + void ScheduleRestart(UUID initiator, string message, int[] alerts, bool notice); void AbortRestart(string message); } }