From 134f86e8d5c414409631b25b8c6f0ee45fbd8631 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Thu, 3 Nov 2016 21:44:39 +1000 Subject: Initial update to OpenSim 0.8.2.1 source code. --- .../World/AutoBackup/AutoBackupModule.cs | 123 +++++++++++++++++++-- .../World/AutoBackup/AutoBackupModuleState.cs | 14 +++ 2 files changed, 130 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/OptionalModules/World/AutoBackup') diff --git a/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs b/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs index 1d35c54..ceb3332 100644 --- a/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs +++ b/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs @@ -76,6 +76,10 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup /// AutoBackupBusyCheck: True/False. Default: True. /// If True, we will only take an auto-backup if a set of conditions are met. /// These conditions are heuristics to try and avoid taking a backup when the sim is busy. + /// AutoBackupSkipAssets + /// If true, assets are not saved to the oar file. Considerably reduces impact on simulator when backing up. Intended for when assets db is backed up separately + /// AutoBackupKeepFilesForDays + /// Backup files older than this value (in days) are deleted during the current backup process, 0 will disable this and keep all backup files indefinitely /// AutoBackupScript: String. Default: not specified (disabled). /// File path to an executable script or binary to run when an automatic backup is taken. /// The file should really be (Windows) an .exe or .bat, or (Linux/Mac) a shell script or binary. @@ -111,6 +115,9 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup private delegate T DefaultGetter(string settingName, T defaultValue); private bool m_enabled; + private ICommandConsole m_console; + private List m_Scenes = new List (); + /// /// Whether the shared module should be enabled at all. NOT the same as m_Enabled in AutoBackupModuleState! @@ -202,8 +209,20 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup /// Currently a no-op for AutoBackup because we have to wait for region to be fully loaded. /// /// - void IRegionModuleBase.AddRegion(Scene scene) + void IRegionModuleBase.AddRegion (Scene scene) { + if (!this.m_enabled) { + return; + } + lock (m_Scenes) { + m_Scenes.Add (scene); + } + m_console = MainConsole.Instance; + + m_console.Commands.AddCommand ( + "AutoBackup", false, "dobackup", + "dobackup", + "do backup.", DoBackup); } /// @@ -216,7 +235,7 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup { return; } - + m_Scenes.Remove (scene); if (this.m_states.ContainsKey(scene)) { AutoBackupModuleState abms = this.m_states[scene]; @@ -258,6 +277,8 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup AutoBackupModuleState abms = this.ParseConfig(scene, false); m_log.Debug("[AUTO BACKUP]: Config for " + scene.RegionInfo.RegionName); m_log.Debug((abms == null ? "DEFAULT" : abms.ToString())); + + m_states.Add(scene, abms); } /// @@ -269,6 +290,28 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup #endregion + private void DoBackup (string module, string[] args) + { + if (args.Length != 2) { + MainConsole.Instance.OutputFormat ("Usage: dobackup "); + return; + } + bool found = false; + string name = args [1]; + lock (m_Scenes) { + foreach (Scene s in m_Scenes) { + string test = s.Name.ToString (); + if (test == name) { + found = true; + DoRegionBackup (s); + } + } + if (!found) { + MainConsole.Instance.OutputFormat ("No such region {0}. Nothing to backup", name); + } + } + } + /// /// Set up internal state for a given scene. Fairly complex code. /// When this method returns, we've started auto-backup timers, put members in Dictionaries, and created a State object for this scene. @@ -334,7 +377,7 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup double interval = this.ResolveDouble("AutoBackupInterval", this.m_defaultState.IntervalMinutes, config, regionConfig) * 60000.0; - if (state == null && interval != this.m_defaultState.IntervalMinutes*60000.0) + if (state == null && interval != this.m_defaultState.IntervalMinutes * 60000.0) { state = new AutoBackupModuleState(); } @@ -412,6 +455,32 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup state.BusyCheck = tmpBusyCheck; } + // Included Option To Skip Assets + bool tmpSkipAssets = ResolveBoolean("AutoBackupSkipAssets", + this.m_defaultState.SkipAssets, config, regionConfig); + if (state == null && tmpSkipAssets != this.m_defaultState.SkipAssets) + { + state = new AutoBackupModuleState(); + } + + if (state != null) + { + state.SkipAssets = tmpSkipAssets; + } + + // How long to keep backup files in days, 0 Disables this feature + int tmpKeepFilesForDays = ResolveInt("AutoBackupKeepFilesForDays", + this.m_defaultState.KeepFilesForDays, config, regionConfig); + if (state == null && tmpKeepFilesForDays != this.m_defaultState.KeepFilesForDays) + { + state = new AutoBackupModuleState(); + } + + if (state != null) + { + state.KeepFilesForDays = tmpKeepFilesForDays; + } + // Set file naming algorithm string stmpNamingType = ResolveString("AutoBackupNaming", this.m_defaultState.NamingType.ToString(), config, regionConfig); @@ -480,7 +549,7 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup catch (Exception e) { m_log.Warn( - "BAD NEWS. You won't be able to save backups to directory " + + "[AUTO BACKUP]: BAD NEWS. You won't be able to save backups to directory " + state.BackupDir + " because it doesn't exist or there's a permissions issue with it. Here's the exception.", e); @@ -488,6 +557,9 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup } } + if(state == null) + return m_defaultState; + return state; } @@ -594,7 +666,7 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup bool heuristicsPassed = false; if (!this.m_timerMap.ContainsKey((Timer) sender)) { - m_log.Debug("Code-up error: timerMap doesn't contain timer " + sender); + m_log.Debug("[AUTO BACKUP]: Code-up error: timerMap doesn't contain timer " + sender); } List tmap = this.m_timerMap[(Timer) sender]; @@ -630,6 +702,9 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup } this.DoRegionBackup(scene); } + + // Remove Old Backups + this.RemoveOldFiles(state); } } } @@ -640,7 +715,7 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup /// private void DoRegionBackup(IScene scene) { - if (scene.RegionStatus != RegionStatus.Up) + if (!scene.Ready) { // We won't backup a region that isn't operating normally. m_log.Warn("[AUTO BACKUP]: Not backing up region " + scene.RegionInfo.RegionName + @@ -662,7 +737,41 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup m_pendingSaves.Add(guid, scene); state.LiveRequests.Add(guid, savePath); ((Scene) scene).EventManager.OnOarFileSaved += new EventManager.OarFileSaved(EventManager_OnOarFileSaved); - iram.ArchiveRegion(savePath, guid, null); + + m_log.Info("[AUTO BACKUP]: Backing up region " + scene.RegionInfo.RegionName); + + // Must pass options, even if dictionary is empty! + Dictionary options = new Dictionary(); + + if (state.SkipAssets) + options["noassets"] = true; + + iram.ArchiveRegion(savePath, guid, options); + } + + // For the given state, remove backup files older than the states KeepFilesForDays property + private void RemoveOldFiles(AutoBackupModuleState state) + { + // 0 Means Disabled, Keep Files Indefinitely + if (state.KeepFilesForDays > 0) + { + string[] files = Directory.GetFiles(state.BackupDir, "*.oar"); + DateTime CuttOffDate = DateTime.Now.AddDays(0 - state.KeepFilesForDays); + + foreach (string file in files) + { + try + { + FileInfo fi = new FileInfo(file); + if (fi.CreationTime < CuttOffDate) + fi.Delete(); + } + catch (Exception Ex) + { + m_log.Error("[AUTO BACKUP]: Error deleting old backup file '" + file + "': " + Ex.Message); + } + } + } } /// diff --git a/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModuleState.cs b/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModuleState.cs index f9e118b..ce7c368 100644 --- a/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModuleState.cs +++ b/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModuleState.cs @@ -45,9 +45,11 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup this.Enabled = false; this.BackupDir = "."; this.BusyCheck = true; + this.SkipAssets = false; this.Timer = null; this.NamingType = NamingType.Time; this.Script = null; + this.KeepFilesForDays = 0; } public Dictionary LiveRequests @@ -91,6 +93,12 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup set; } + public bool SkipAssets + { + get; + set; + } + public string Script { get; @@ -109,6 +117,12 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup set; } + public int KeepFilesForDays + { + get; + set; + } + public new string ToString() { string retval = ""; -- cgit v1.1