diff options
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | 67 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs | 29 |
2 files changed, 76 insertions, 20 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index ab5f485..cfefbe9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs | |||
@@ -30,11 +30,11 @@ using System.Collections.Generic; | |||
30 | using System.IO; | 30 | using System.IO; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using log4net; | 32 | using log4net; |
33 | using NDesk.Options; | ||
33 | using Nini.Config; | 34 | using Nini.Config; |
34 | using OpenMetaverse; | 35 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
36 | using OpenSim.Framework.Communications; | 37 | using OpenSim.Framework.Communications; |
37 | |||
38 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 39 | using OpenSim.Region.Framework.Scenes; |
40 | using OpenSim.Services.Interfaces; | 40 | using OpenSim.Services.Interfaces; |
@@ -91,9 +91,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
91 | 91 | ||
92 | scene.AddCommand( | 92 | scene.AddCommand( |
93 | this, "load iar", | 93 | this, "load iar", |
94 | "load iar <first> <last> <inventory path> <password> [<IAR path>]", | 94 | "load iar <first> <last> <inventory path> <password> [<IAR path>]", |
95 | //"load iar [--merge] <first> <last> <inventory path> <password> [<IAR path>]", | ||
95 | "Load user inventory archive (IAR).", | 96 | "Load user inventory archive (IAR).", |
96 | "<first> is user's first name." + Environment.NewLine | 97 | //"--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones" |
98 | //+ "<first> is user's first name." + Environment.NewLine | ||
99 | "<first> is user's first name." + Environment.NewLine | ||
97 | + "<last> is user's last name." + Environment.NewLine | 100 | + "<last> is user's last name." + Environment.NewLine |
98 | + "<inventory path> is the path inside the user's inventory where the IAR should be loaded." + Environment.NewLine | 101 | + "<inventory path> is the path inside the user's inventory where the IAR should be loaded." + Environment.NewLine |
99 | + "<password> is the user's password." + Environment.NewLine | 102 | + "<password> is the user's password." + Environment.NewLine |
@@ -133,8 +136,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
133 | if (handlerInventoryArchiveSaved != null) | 136 | if (handlerInventoryArchiveSaved != null) |
134 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); | 137 | handlerInventoryArchiveSaved(id, succeeded, userInfo, invPath, saveStream, reportedException); |
135 | } | 138 | } |
136 | 139 | ||
137 | public bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) | 140 | public bool ArchiveInventory( |
141 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream) | ||
142 | { | ||
143 | return ArchiveInventory(id, firstName, lastName, invPath, pass, saveStream, new Dictionary<string, object>()); | ||
144 | } | ||
145 | |||
146 | public bool ArchiveInventory( | ||
147 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, | ||
148 | Dictionary<string, object> options) | ||
138 | { | 149 | { |
139 | if (m_scenes.Count > 0) | 150 | if (m_scenes.Count > 0) |
140 | { | 151 | { |
@@ -172,7 +183,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
172 | return false; | 183 | return false; |
173 | } | 184 | } |
174 | 185 | ||
175 | public bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, string savePath) | 186 | public bool ArchiveInventory( |
187 | Guid id, string firstName, string lastName, string invPath, string pass, string savePath, | ||
188 | Dictionary<string, object> options) | ||
176 | { | 189 | { |
177 | if (m_scenes.Count > 0) | 190 | if (m_scenes.Count > 0) |
178 | { | 191 | { |
@@ -209,8 +222,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
209 | 222 | ||
210 | return false; | 223 | return false; |
211 | } | 224 | } |
212 | 225 | ||
213 | public bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream) | 226 | public bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream) |
227 | { | ||
228 | return DearchiveInventory(firstName, lastName, invPath, pass, loadStream, new Dictionary<string, object>()); | ||
229 | } | ||
230 | |||
231 | public bool DearchiveInventory( | ||
232 | string firstName, string lastName, string invPath, string pass, Stream loadStream, | ||
233 | Dictionary<string, object> options) | ||
214 | { | 234 | { |
215 | if (m_scenes.Count > 0) | 235 | if (m_scenes.Count > 0) |
216 | { | 236 | { |
@@ -252,7 +272,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
252 | return false; | 272 | return false; |
253 | } | 273 | } |
254 | 274 | ||
255 | public bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, string loadPath) | 275 | public bool DearchiveInventory( |
276 | string firstName, string lastName, string invPath, string pass, string loadPath, | ||
277 | Dictionary<string, object> options) | ||
256 | { | 278 | { |
257 | if (m_scenes.Count > 0) | 279 | if (m_scenes.Count > 0) |
258 | { | 280 | { |
@@ -300,29 +322,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
300 | /// <param name="cmdparams"></param> | 322 | /// <param name="cmdparams"></param> |
301 | protected void HandleLoadInvConsoleCommand(string module, string[] cmdparams) | 323 | protected void HandleLoadInvConsoleCommand(string module, string[] cmdparams) |
302 | { | 324 | { |
303 | if (cmdparams.Length < 6) | 325 | m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME."); |
326 | |||
327 | Dictionary<string, object> options = new Dictionary<string, object>(); | ||
328 | OptionSet optionSet = new OptionSet().Add("m|merge", delegate (string v) { options["merge"] = v != null; }); | ||
329 | |||
330 | List<string> mainParams = optionSet.Parse(cmdparams); | ||
331 | |||
332 | if (mainParams.Count < 6) | ||
304 | { | 333 | { |
305 | m_log.Error( | 334 | m_log.Error( |
306 | "[INVENTORY ARCHIVER]: usage is load iar <first name> <last name> <inventory path> <user password> [<load file path>]"); | 335 | "[INVENTORY ARCHIVER]: usage is load iar <first name> <last name> <inventory path> <user password> [<load file path>]"); |
307 | return; | 336 | return; |
308 | } | 337 | } |
309 | 338 | ||
310 | m_log.Info("[INVENTORY ARCHIVER]: PLEASE NOTE THAT THIS FACILITY IS EXPERIMENTAL. BUG REPORTS WELCOME."); | 339 | string firstName = mainParams[2]; |
311 | 340 | string lastName = mainParams[3]; | |
312 | string firstName = cmdparams[2]; | 341 | string invPath = mainParams[4]; |
313 | string lastName = cmdparams[3]; | 342 | string pass = mainParams[5]; |
314 | string invPath = cmdparams[4]; | 343 | string loadPath = (mainParams.Count > 6 ? mainParams[6] : DEFAULT_INV_BACKUP_FILENAME); |
315 | string pass = cmdparams[5]; | ||
316 | string loadPath = (cmdparams.Length > 6 ? cmdparams[6] : DEFAULT_INV_BACKUP_FILENAME); | ||
317 | 344 | ||
318 | m_log.InfoFormat( | 345 | m_log.InfoFormat( |
319 | "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", | 346 | "[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}", |
320 | loadPath, invPath, firstName, lastName); | 347 | loadPath, invPath, firstName, lastName); |
321 | 348 | ||
322 | if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath)) | 349 | if (DearchiveInventory(firstName, lastName, invPath, pass, loadPath, options)) |
323 | m_log.InfoFormat( | 350 | m_log.InfoFormat( |
324 | "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", | 351 | "[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}", |
325 | loadPath, firstName, lastName); | 352 | loadPath, firstName, lastName); |
326 | } | 353 | } |
327 | 354 | ||
328 | /// <summary> | 355 | /// <summary> |
@@ -351,7 +378,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver | |||
351 | savePath, invPath, firstName, lastName); | 378 | savePath, invPath, firstName, lastName); |
352 | 379 | ||
353 | Guid id = Guid.NewGuid(); | 380 | Guid id = Guid.NewGuid(); |
354 | ArchiveInventory(id, firstName, lastName, invPath, pass, savePath); | 381 | ArchiveInventory(id, firstName, lastName, invPath, pass, savePath, new Dictionary<string, object>()); |
355 | 382 | ||
356 | lock (m_pendingConsoleSaves) | 383 | lock (m_pendingConsoleSaves) |
357 | m_pendingConsoleSaves.Add(id); | 384 | m_pendingConsoleSaves.Add(id); |
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs index fbadd91..01066e6 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | ||
29 | using System.IO; | 30 | using System.IO; |
30 | using OpenSim.Services.Interfaces; | 31 | using OpenSim.Services.Interfaces; |
31 | 32 | ||
@@ -59,6 +60,20 @@ namespace OpenSim.Region.Framework.Interfaces | |||
59 | /// <param name="loadStream">The stream from which the inventory archive will be loaded</param> | 60 | /// <param name="loadStream">The stream from which the inventory archive will be loaded</param> |
60 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> | 61 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> |
61 | bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream); | 62 | bool DearchiveInventory(string firstName, string lastName, string invPath, string pass, Stream loadStream); |
63 | |||
64 | /// <summary> | ||
65 | /// Dearchive a user's inventory folder from the given stream | ||
66 | /// </summary> | ||
67 | /// <param name="firstName"></param> | ||
68 | /// <param name="lastName"></param> | ||
69 | /// <param name="invPath">The inventory path in which to place the loaded folders and items</param> | ||
70 | /// <param name="loadStream">The stream from which the inventory archive will be loaded</param> | ||
71 | /// <param name="options">Dearchiving options. At the moment, the only option is ("merge", true). This merges | ||
72 | /// the loaded IAR with existing folders where possible.</param> | ||
73 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> | ||
74 | bool DearchiveInventory( | ||
75 | string firstName, string lastName, string invPath, string pass, Stream loadStream, | ||
76 | Dictionary<string, object> options); | ||
62 | 77 | ||
63 | /// <summary> | 78 | /// <summary> |
64 | /// Archive a user's inventory folder to the given stream | 79 | /// Archive a user's inventory folder to the given stream |
@@ -70,5 +85,19 @@ namespace OpenSim.Region.Framework.Interfaces | |||
70 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> | 85 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> |
71 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> | 86 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> |
72 | bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream); | 87 | bool ArchiveInventory(Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream); |
88 | |||
89 | /// <summary> | ||
90 | /// Archive a user's inventory folder to the given stream | ||
91 | /// </summary> | ||
92 | /// <param name="id">ID representing this request. This will later be returned in the save event</param> | ||
93 | /// <param name="firstName"></param> | ||
94 | /// <param name="lastName"></param> | ||
95 | /// <param name="invPath">The inventory path from which the inventory should be saved.</param> | ||
96 | /// <param name="saveStream">The stream to which the inventory archive will be saved</param> | ||
97 | /// <param name="options">Archiving options. Currently, there are none.</param> | ||
98 | /// <returns>true if the first stage of the operation succeeded, false otherwise</returns> | ||
99 | bool ArchiveInventory( | ||
100 | Guid id, string firstName, string lastName, string invPath, string pass, Stream saveStream, | ||
101 | Dictionary<string, object> options); | ||
73 | } | 102 | } |
74 | } | 103 | } |