2009-02-11 18:46:51 +00:00
/ *
* 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 .
2009-06-01 06:37:14 +00:00
* * Neither the name of the OpenSimulator Project nor the
2009-02-11 18:46:51 +00:00
* 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 .
* /
2009-02-17 15:39:18 +00:00
using System ;
2009-02-12 18:59:45 +00:00
using System.Collections.Generic ;
using System.IO ;
using System.Reflection ;
using log4net ;
2010-06-04 21:17:23 +00:00
using NDesk.Options ;
2009-02-12 18:59:45 +00:00
using Nini.Config ;
using OpenMetaverse ;
using OpenSim.Framework ;
2009-02-12 17:41:09 +00:00
using OpenSim.Framework.Communications ;
2012-10-24 02:08:58 +00:00
using OpenSim.Framework.Console ;
2009-02-12 18:59:45 +00:00
using OpenSim.Region.Framework.Interfaces ;
using OpenSim.Region.Framework.Scenes ;
2009-05-15 05:00:25 +00:00
using OpenSim.Services.Interfaces ;
2012-11-11 15:31:25 +00:00
using Mono.Addins ;
2009-02-12 18:59:45 +00:00
2009-02-11 18:46:51 +00:00
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
2009-09-30 16:00:09 +00:00
{
2009-02-11 18:46:51 +00:00
/// <summary>
/// This module loads and saves OpenSimulator inventory archives
2009-09-30 16:00:09 +00:00
/// </summary>
2012-11-13 02:08:02 +00:00
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "InventoryArchiverModule")]
2012-11-11 15:31:25 +00:00
public class InventoryArchiverModule : ISharedRegionModule , IInventoryArchiverModule
2009-09-30 16:00:09 +00:00
{
2009-02-11 18:46:51 +00:00
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2012-02-10 19:09:46 +00:00
2009-09-07 18:57:44 +00:00
/// <value>
2012-02-10 19:09:46 +00:00
/// Enable or disable checking whether the iar user is actually logged in
2009-09-07 18:57:44 +00:00
/// </value>
2010-12-11 03:09:00 +00:00
// public bool DisablePresenceChecks { get; set; }
2012-02-10 19:09:46 +00:00
2009-09-30 16:00:09 +00:00
public event InventoryArchiveSaved OnInventoryArchiveSaved ;
2012-02-10 19:09:46 +00:00
2009-02-11 18:46:51 +00:00
/// <summary>
/// The file to load and save inventory if no filename has been specified
/// </summary>
2009-09-07 17:42:53 +00:00
protected const string DEFAULT_INV_BACKUP_FILENAME = "user-inventory.iar" ;
2009-09-04 20:10:56 +00:00
/// <value>
/// Pending save completions initiated from the console
/// </value>
protected List < Guid > m_pendingConsoleSaves = new List < Guid > ( ) ;
2012-02-10 19:09:46 +00:00
2009-02-11 18:46:51 +00:00
/// <value>
/// All scenes that this module knows about
/// </value>
private Dictionary < UUID , Scene > m_scenes = new Dictionary < UUID , Scene > ( ) ;
2009-05-15 05:00:25 +00:00
private Scene m_aScene ;
2009-02-11 18:46:51 +00:00
2010-11-29 16:43:33 +00:00
private IUserAccountService m_UserAccountService ;
protected IUserAccountService UserAccountService
{
get
{
if ( m_UserAccountService = = null )
// What a strange thing to do...
foreach ( Scene s in m_scenes . Values )
{
m_UserAccountService = s . RequestModuleInterface < IUserAccountService > ( ) ;
break ;
}
return m_UserAccountService ;
}
}
2009-09-07 18:57:44 +00:00
public InventoryArchiverModule ( ) { }
2010-12-11 03:09:00 +00:00
// public InventoryArchiverModule(bool disablePresenceChecks)
// {
// DisablePresenceChecks = disablePresenceChecks;
2012-11-11 15:31:25 +00:00
// }
2009-09-07 18:57:44 +00:00
2012-11-11 15:31:25 +00:00
#region ISharedRegionModule
public void Initialise ( IConfigSource source )
{
}
public void AddRegion ( Scene scene )
2009-09-30 16:00:09 +00:00
{
2009-02-11 18:46:51 +00:00
if ( m_scenes . Count = = 0 )
{
scene . RegisterModuleInterface < IInventoryArchiverModule > ( this ) ;
2009-02-18 19:26:10 +00:00
OnInventoryArchiveSaved + = SaveInvConsoleCommandCompleted ;
2012-02-10 19:09:46 +00:00
2009-02-11 18:46:51 +00:00
scene . AddCommand (
2012-03-08 01:51:37 +00:00
"Archiving" , this , "load iar" ,
2011-03-08 22:44:02 +00:00
"load iar [-m|--merge] <first> <last> <inventory path> <password> [<IAR path>]" ,
2010-05-28 19:07:15 +00:00
"Load user inventory archive (IAR)." ,
2011-03-08 22:44:02 +00:00
"-m|--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones"
2010-12-18 00:59:37 +00:00
+ "<first> is user's first name." + Environment . NewLine
2010-05-28 19:07:15 +00:00
+ "<last> is user's last name." + Environment . NewLine
+ "<inventory path> is the path inside the user's inventory where the IAR should be loaded." + Environment . NewLine
+ "<password> is the user's password." + Environment . NewLine
+ "<IAR path> is the filesystem path or URI from which to load the IAR."
+ string . Format ( " If this is not given then the filename {0} in the current directory is used" , DEFAULT_INV_BACKUP_FILENAME ) ,
HandleLoadInvConsoleCommand ) ;
2012-02-10 19:09:46 +00:00
2009-02-11 18:46:51 +00:00
scene . AddCommand (
2012-03-08 01:51:37 +00:00
"Archiving" , this , "save iar" ,
2012-02-10 19:09:46 +00:00
"save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]" ,
"Save user inventory archive (IAR)." ,
2012-03-17 02:54:19 +00:00
"<first> is the user's first name.\n"
+ "<last> is the user's last name.\n"
+ "<inventory path> is the path inside the user's inventory for the folder/item to be saved.\n"
2010-05-28 19:07:15 +00:00
+ "<IAR path> is the filesystem path at which to save the IAR."
2012-03-17 02:54:19 +00:00
+ string . Format ( " If this is not given then the filename {0} in the current directory is used.\n" , DEFAULT_INV_BACKUP_FILENAME )
+ "-h|--home=<url> adds the url of the profile service to the saved user information.\n"
+ "-c|--creators preserves information about foreign creators.\n"
2012-02-10 19:09:46 +00:00
+ "-e|--exclude=<name/uuid> don't save the inventory item in archive" + Environment . NewLine
+ "-f|--excludefolder=<folder/uuid> don't save contents of the folder in archive" + Environment . NewLine
2012-03-17 02:54:19 +00:00
+ "-v|--verbose extra debug messages.\n"
+ "--noassets stops assets being saved to the IAR." ,
2010-05-28 19:07:15 +00:00
HandleSaveInvConsoleCommand ) ;
2009-05-15 05:00:25 +00:00
m_aScene = scene ;
2009-02-11 18:46:51 +00:00
}
2012-02-10 19:09:46 +00:00
2009-09-30 16:00:09 +00:00
m_scenes [ scene . RegionInfo . RegionID ] = scene ;
2009-02-11 18:46:51 +00:00
}
2009-09-06 19:16:56 +00:00
2012-11-11 15:31:25 +00:00
public void RemoveRegion ( Scene scene )
{
}
2009-02-11 18:46:51 +00:00
2009-02-12 17:41:09 +00:00
public void Close ( ) { }
2012-02-10 19:09:46 +00:00
2012-11-11 15:31:25 +00:00
public void RegionLoaded ( Scene scene )
{
}
public void PostInitialise ( )
{
}
public Type ReplaceableInterface
{
get { return null ; }
}
public string Name { get { return "Inventory Archiver Module" ; } }
#endregion
2009-02-17 15:39:18 +00:00
/// <summary>
/// Trigger the inventory archive saved event.
/// </summary>
protected internal void TriggerInventoryArchiveSaved (
2012-02-10 19:09:46 +00:00
Guid id , bool succeeded , UserAccount userInfo , string invPath , Stream saveStream ,
2009-09-04 20:10:56 +00:00
Exception reportedException )
2009-02-17 15:39:18 +00:00
{
InventoryArchiveSaved handlerInventoryArchiveSaved = OnInventoryArchiveSaved ;
if ( handlerInventoryArchiveSaved ! = null )
2009-09-04 20:10:56 +00:00
handlerInventoryArchiveSaved ( id , succeeded , userInfo , invPath , saveStream , reportedException ) ;
2009-09-30 16:00:09 +00:00
}
2012-02-10 19:09:46 +00:00
2010-06-04 21:17:23 +00:00
public bool ArchiveInventory (
2010-06-29 23:10:44 +00:00
Guid id , string firstName , string lastName , string invPath , string pass , Stream saveStream )
{
return ArchiveInventory ( id , firstName , lastName , invPath , pass , saveStream , new Dictionary < string , object > ( ) ) ;
}
2009-09-03 18:41:38 +00:00
2010-06-04 21:17:23 +00:00
public bool ArchiveInventory (
2012-02-10 19:09:46 +00:00
Guid id , string firstName , string lastName , string invPath , string pass , Stream saveStream ,
2010-06-29 23:10:44 +00:00
Dictionary < string , object > options )
2009-09-03 18:41:38 +00:00
{
if ( m_scenes . Count > 0 )
{
2010-01-10 18:40:07 +00:00
UserAccount userInfo = GetUserInfo ( firstName , lastName , pass ) ;
2009-09-03 18:41:38 +00:00
if ( userInfo ! = null )
2009-09-07 18:57:44 +00:00
{
2010-12-11 03:09:00 +00:00
// if (CheckPresence(userInfo.PrincipalID))
// {
2010-02-19 22:30:46 +00:00
try
{
2010-11-29 16:43:33 +00:00
new InventoryArchiveWriteRequest ( id , this , m_aScene , userInfo , invPath , saveStream ) . Execute ( options , UserAccountService ) ;
2010-02-22 03:25:59 +00:00
}
2010-02-19 22:30:46 +00:00
catch ( EntryPointNotFoundException e )
{
m_log . ErrorFormat (
2011-03-08 22:44:02 +00:00
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
2010-02-19 22:30:46 +00:00
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?" ) ;
m_log . Error ( e ) ;
return false ;
}
2012-02-10 19:09:46 +00:00
2009-09-07 18:57:44 +00:00
return true ;
2010-12-11 03:09:00 +00:00
// }
// else
// {
// m_log.ErrorFormat(
// "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator",
// userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID);
// }
2009-09-07 18:57:44 +00:00
}
}
return false ;
2009-09-03 18:41:38 +00:00
}
2012-02-10 19:09:46 +00:00
2010-06-04 21:17:23 +00:00
public bool ArchiveInventory (
2012-02-10 19:09:46 +00:00
Guid id , string firstName , string lastName , string invPath , string pass , string savePath ,
2010-06-29 23:10:44 +00:00
Dictionary < string , object > options )
2009-09-03 18:41:38 +00:00
{
2012-11-01 03:42:15 +00:00
// if (!ConsoleUtil.CheckFileDoesNotExist(MainConsole.Instance, savePath))
// return false;
2012-10-24 02:08:58 +00:00
2009-09-03 18:41:38 +00:00
if ( m_scenes . Count > 0 )
{
2010-01-10 18:40:07 +00:00
UserAccount userInfo = GetUserInfo ( firstName , lastName , pass ) ;
2012-02-10 19:09:46 +00:00
2009-09-03 18:41:38 +00:00
if ( userInfo ! = null )
2009-09-07 18:57:44 +00:00
{
2010-12-11 03:09:00 +00:00
// if (CheckPresence(userInfo.PrincipalID))
// {
2010-02-19 22:30:46 +00:00
try
{
2010-11-29 16:43:33 +00:00
new InventoryArchiveWriteRequest ( id , this , m_aScene , userInfo , invPath , savePath ) . Execute ( options , UserAccountService ) ;
2010-02-22 03:25:59 +00:00
}
2010-02-19 22:30:46 +00:00
catch ( EntryPointNotFoundException e )
{
m_log . ErrorFormat (
2011-03-08 22:44:02 +00:00
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
2010-02-19 22:30:46 +00:00
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?" ) ;
m_log . Error ( e ) ;
return false ;
}
2012-02-10 19:09:46 +00:00
2009-09-07 18:57:44 +00:00
return true ;
2010-12-11 03:09:00 +00:00
// }
// else
// {
// m_log.ErrorFormat(
// "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator",
// userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID);
// }
2009-09-07 18:57:44 +00:00
}
}
2012-02-10 19:09:46 +00:00
2009-09-07 18:57:44 +00:00
return false ;
2009-02-17 15:39:18 +00:00
}
2010-06-04 21:17:23 +00:00
2009-09-15 06:55:29 +00:00
public bool DearchiveInventory ( string firstName , string lastName , string invPath , string pass , Stream loadStream )
2010-06-29 23:10:44 +00:00
{
return DearchiveInventory ( firstName , lastName , invPath , pass , loadStream , new Dictionary < string , object > ( ) ) ;
}
2012-02-10 19:09:46 +00:00
2010-06-04 21:17:23 +00:00
public bool DearchiveInventory (
2012-02-10 19:09:46 +00:00
string firstName , string lastName , string invPath , string pass , Stream loadStream ,
2010-06-29 23:10:44 +00:00
Dictionary < string , object > options )
2009-02-11 18:46:51 +00:00
{
if ( m_scenes . Count > 0 )
2009-09-30 16:00:09 +00:00
{
2010-01-10 18:40:07 +00:00
UserAccount userInfo = GetUserInfo ( firstName , lastName , pass ) ;
2010-11-29 17:57:41 +00:00
2009-02-12 17:41:09 +00:00
if ( userInfo ! = null )
{
2010-12-11 03:09:00 +00:00
// if (CheckPresence(userInfo.PrincipalID))
// {
2010-02-19 22:30:46 +00:00
InventoryArchiveReadRequest request ;
2010-09-12 17:43:49 +00:00
bool merge = ( options . ContainsKey ( "merge" ) ? ( bool ) options [ "merge" ] : false ) ;
2010-11-29 17:57:41 +00:00
2010-02-19 22:30:46 +00:00
try
{
2013-07-06 03:17:10 +00:00
request = new InventoryArchiveReadRequest ( m_aScene . InventoryService , m_aScene . AssetService , m_aScene . UserAccountService , userInfo , invPath , loadStream , merge ) ;
2010-02-22 03:25:59 +00:00
}
2010-02-19 22:30:46 +00:00
catch ( EntryPointNotFoundException e )
{
m_log . ErrorFormat (
2011-03-08 22:44:02 +00:00
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
2010-02-19 22:30:46 +00:00
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?" ) ;
m_log . Error ( e ) ;
return false ;
}
2010-11-29 17:57:41 +00:00
2009-09-07 18:57:44 +00:00
UpdateClientWithLoadedNodes ( userInfo , request . Execute ( ) ) ;
return true ;
2010-12-11 03:09:00 +00:00
// }
// else
// {
// m_log.ErrorFormat(
// "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator",
// userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID);
// }
2009-02-12 17:41:09 +00:00
}
2010-11-29 17:57:41 +00:00
else
m_log . ErrorFormat ( "[INVENTORY ARCHIVER]: User {0} {1} not found" ,
firstName , lastName ) ;
2009-09-07 18:57:44 +00:00
}
return false ;
2009-09-30 16:00:09 +00:00
}
2012-02-10 19:09:46 +00:00
2010-06-04 21:17:23 +00:00
public bool DearchiveInventory (
2012-02-10 19:09:46 +00:00
string firstName , string lastName , string invPath , string pass , string loadPath ,
2010-06-29 23:10:44 +00:00
Dictionary < string , object > options )
2009-02-11 18:46:51 +00:00
{
if ( m_scenes . Count > 0 )
2009-09-30 16:00:09 +00:00
{
2010-01-10 18:40:07 +00:00
UserAccount userInfo = GetUserInfo ( firstName , lastName , pass ) ;
2012-02-10 19:09:46 +00:00
2009-02-12 17:41:09 +00:00
if ( userInfo ! = null )
{
2010-12-11 03:09:00 +00:00
// if (CheckPresence(userInfo.PrincipalID))
// {
2010-02-19 22:30:46 +00:00
InventoryArchiveReadRequest request ;
2010-09-12 17:43:49 +00:00
bool merge = ( options . ContainsKey ( "merge" ) ? ( bool ) options [ "merge" ] : false ) ;
2012-02-10 19:09:46 +00:00
2010-02-19 22:30:46 +00:00
try
2010-09-12 17:43:49 +00:00
{
2013-07-06 03:17:10 +00:00
request = new InventoryArchiveReadRequest ( m_aScene . InventoryService , m_aScene . AssetService , m_aScene . UserAccountService , userInfo , invPath , loadPath , merge ) ;
2010-02-22 03:25:59 +00:00
}
2010-02-19 22:30:46 +00:00
catch ( EntryPointNotFoundException e )
{
m_log . ErrorFormat (
2011-03-08 22:44:02 +00:00
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
2010-02-19 22:30:46 +00:00
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?" ) ;
m_log . Error ( e ) ;
return false ;
}
2012-02-10 19:09:46 +00:00
2009-09-07 18:57:44 +00:00
UpdateClientWithLoadedNodes ( userInfo , request . Execute ( ) ) ;
return true ;
2010-12-11 03:09:00 +00:00
// }
// else
// {
// m_log.ErrorFormat(
// "[INVENTORY ARCHIVER]: User {0} {1} {2} not logged in to this region simulator",
// userInfo.FirstName, userInfo.LastName, userInfo.PrincipalID);
// }
2009-09-30 16:00:09 +00:00
}
2009-09-07 18:57:44 +00:00
}
return false ;
2009-09-30 16:00:09 +00:00
}
2012-02-10 19:09:46 +00:00
2009-02-11 18:46:51 +00:00
/// <summary>
/// Load inventory from an inventory file archive
/// </summary>
/// <param name="cmdparams"></param>
protected void HandleLoadInvConsoleCommand ( string module , string [ ] cmdparams )
{
2010-07-14 19:43:35 +00:00
try
2010-09-12 17:43:49 +00:00
{
Dictionary < string , object > options = new Dictionary < string , object > ( ) ;
2010-07-14 19:43:35 +00:00
OptionSet optionSet = new OptionSet ( ) . Add ( "m|merge" , delegate ( string v ) { options [ "merge" ] = v ! = null ; } ) ;
2012-02-10 19:09:46 +00:00
2010-07-14 19:43:35 +00:00
List < string > mainParams = optionSet . Parse ( cmdparams ) ;
2012-02-10 19:09:46 +00:00
2010-07-14 19:43:35 +00:00
if ( mainParams . Count < 6 )
{
m_log . Error (
2012-02-10 19:09:46 +00:00
"[INVENTORY ARCHIVER]: usage is load iar [-m|--merge] <first name> <last name> <inventory path> <user password> [<load file path>]" ) ;
2010-07-14 19:43:35 +00:00
return ;
2010-09-12 17:43:49 +00:00
}
2012-02-10 19:09:46 +00:00
2010-07-14 19:43:35 +00:00
string firstName = mainParams [ 2 ] ;
string lastName = mainParams [ 3 ] ;
string invPath = mainParams [ 4 ] ;
string pass = mainParams [ 5 ] ;
string loadPath = ( mainParams . Count > 6 ? mainParams [ 6 ] : DEFAULT_INV_BACKUP_FILENAME ) ;
2012-02-10 19:09:46 +00:00
2009-09-07 18:57:44 +00:00
m_log . InfoFormat (
2010-07-14 19:43:35 +00:00
"[INVENTORY ARCHIVER]: Loading archive {0} to inventory path {1} for {2} {3}" ,
loadPath , invPath , firstName , lastName ) ;
2012-02-10 19:09:46 +00:00
2010-07-14 19:43:35 +00:00
if ( DearchiveInventory ( firstName , lastName , invPath , pass , loadPath , options ) )
m_log . InfoFormat (
"[INVENTORY ARCHIVER]: Loaded archive {0} for {1} {2}" ,
2010-09-12 17:43:49 +00:00
loadPath , firstName , lastName ) ;
2010-07-14 19:43:35 +00:00
}
catch ( InventoryArchiverException e )
{
m_log . ErrorFormat ( "[INVENTORY ARCHIVER]: {0}" , e . Message ) ;
2010-08-04 19:56:52 +00:00
}
2009-02-11 18:46:51 +00:00
}
2012-02-10 19:09:46 +00:00
2009-02-11 18:46:51 +00:00
/// <summary>
/// Save inventory to a file archive
/// </summary>
/// <param name="cmdparams"></param>
protected void HandleSaveInvConsoleCommand ( string module , string [ ] cmdparams )
{
2010-07-14 19:43:35 +00:00
Guid id = Guid . NewGuid ( ) ;
2010-11-29 16:43:33 +00:00
Dictionary < string , object > options = new Dictionary < string , object > ( ) ;
OptionSet ops = new OptionSet ( ) ;
//ops.Add("v|version=", delegate(string v) { options["version"] = v; });
2012-02-03 22:53:18 +00:00
ops . Add ( "h|home=" , delegate ( string v ) { options [ "home" ] = v ; } ) ;
2011-01-09 00:17:00 +00:00
ops . Add ( "v|verbose" , delegate ( string v ) { options [ "verbose" ] = v ; } ) ;
2011-02-03 12:07:36 +00:00
ops . Add ( "c|creators" , delegate ( string v ) { options [ "creators" ] = v ; } ) ;
2011-05-26 01:22:52 +00:00
ops . Add ( "noassets" , delegate ( string v ) { options [ "noassets" ] = v ! = null ; } ) ;
2012-02-10 19:09:46 +00:00
ops . Add ( "e|exclude=" , delegate ( string v )
{
if ( ! options . ContainsKey ( "exclude" ) )
options [ "exclude" ] = new List < String > ( ) ;
( ( List < String > ) options [ "exclude" ] ) . Add ( v ) ;
} ) ;
ops . Add ( "f|excludefolder=" , delegate ( string v )
{
if ( ! options . ContainsKey ( "excludefolders" ) )
options [ "excludefolders" ] = new List < String > ( ) ;
( ( List < String > ) options [ "excludefolders" ] ) . Add ( v ) ;
} ) ;
2010-11-29 16:43:33 +00:00
List < string > mainParams = ops . Parse ( cmdparams ) ;
2010-07-14 19:43:35 +00:00
try
2009-02-11 18:46:51 +00:00
{
2010-11-29 16:43:33 +00:00
if ( mainParams . Count < 6 )
2010-07-14 19:43:35 +00:00
{
m_log . Error (
2012-02-10 19:09:46 +00:00
"[INVENTORY ARCHIVER]: save iar [-h|--home=<url>] [--noassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]" ) ;
2010-07-14 19:43:35 +00:00
return ;
}
2012-02-10 19:09:46 +00:00
2012-02-03 22:53:18 +00:00
if ( options . ContainsKey ( "home" ) )
m_log . WarnFormat ( "[INVENTORY ARCHIVER]: Please be aware that inventory archives with creator information are not compatible with OpenSim 0.7.0.2 and earlier. Do not use the -home option if you want to produce a compatible IAR" ) ;
2010-11-29 16:43:33 +00:00
string firstName = mainParams [ 2 ] ;
string lastName = mainParams [ 3 ] ;
string invPath = mainParams [ 4 ] ;
string pass = mainParams [ 5 ] ;
string savePath = ( mainParams . Count > 6 ? mainParams [ 6 ] : DEFAULT_INV_BACKUP_FILENAME ) ;
2012-02-10 19:09:46 +00:00
2010-07-14 19:43:35 +00:00
m_log . InfoFormat (
"[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}" ,
savePath , invPath , firstName , lastName ) ;
2011-05-26 01:22:52 +00:00
lock ( m_pendingConsoleSaves )
m_pendingConsoleSaves . Add ( id ) ;
2010-11-29 16:43:33 +00:00
ArchiveInventory ( id , firstName , lastName , invPath , pass , savePath , options ) ;
2009-02-11 18:46:51 +00:00
}
2010-07-14 19:43:35 +00:00
catch ( InventoryArchiverException e )
{
m_log . ErrorFormat ( "[INVENTORY ARCHIVER]: {0}" , e . Message ) ;
}
2009-09-30 16:00:09 +00:00
}
2012-02-10 19:09:46 +00:00
2009-02-18 19:26:10 +00:00
private void SaveInvConsoleCommandCompleted (
2012-02-10 19:09:46 +00:00
Guid id , bool succeeded , UserAccount userInfo , string invPath , Stream saveStream ,
2009-09-04 20:10:56 +00:00
Exception reportedException )
2009-02-18 19:26:10 +00:00
{
2009-09-04 20:10:56 +00:00
lock ( m_pendingConsoleSaves )
{
if ( m_pendingConsoleSaves . Contains ( id ) )
m_pendingConsoleSaves . Remove ( id ) ;
else
return ;
}
2012-02-10 19:09:46 +00:00
2009-02-18 19:26:10 +00:00
if ( succeeded )
{
2010-01-10 18:40:07 +00:00
m_log . InfoFormat ( "[INVENTORY ARCHIVER]: Saved archive for {0} {1}" , userInfo . FirstName , userInfo . LastName ) ;
2009-02-18 19:26:10 +00:00
}
else
{
m_log . ErrorFormat (
2012-02-10 19:09:46 +00:00
"[INVENTORY ARCHIVER]: Archive save for {0} {1} failed - {2}" ,
2010-01-10 18:40:07 +00:00
userInfo . FirstName , userInfo . LastName , reportedException . Message ) ;
2009-02-18 19:26:10 +00:00
}
2009-02-11 20:24:41 +00:00
}
2012-02-10 19:09:46 +00:00
2009-02-12 17:41:09 +00:00
/// <summary>
/// Get user information for the given name.
/// </summary>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
2009-09-16 17:20:55 +00:00
/// <param name="pass">User password</param>
2009-02-12 17:41:09 +00:00
/// <returns></returns>
2010-01-10 18:40:07 +00:00
protected UserAccount GetUserInfo ( string firstName , string lastName , string pass )
2009-09-30 16:00:09 +00:00
{
2012-02-10 19:09:46 +00:00
UserAccount account
2010-06-04 19:43:05 +00:00
= m_aScene . UserAccountService . GetUserAccount ( m_aScene . RegionInfo . ScopeID , firstName , lastName ) ;
2012-02-10 19:09:46 +00:00
2010-01-10 18:40:07 +00:00
if ( null = = account )
2009-02-12 17:41:09 +00:00
{
m_log . ErrorFormat (
2012-02-10 19:09:46 +00:00
"[INVENTORY ARCHIVER]: Failed to find user info for {0} {1}" ,
2009-04-17 19:11:03 +00:00
firstName , lastName ) ;
2009-02-12 17:41:09 +00:00
return null ;
}
2009-09-16 17:20:55 +00:00
2009-09-24 14:19:47 +00:00
try
2009-09-30 16:00:09 +00:00
{
2010-03-28 05:48:15 +00:00
string encpass = Util . Md5Hash ( pass ) ;
if ( m_aScene . AuthenticationService . Authenticate ( account . PrincipalID , encpass , 1 ) ! = string . Empty )
2009-09-24 14:19:47 +00:00
{
2010-01-10 18:40:07 +00:00
return account ;
2009-09-24 14:19:47 +00:00
}
else
{
m_log . ErrorFormat (
2012-02-10 19:09:46 +00:00
"[INVENTORY ARCHIVER]: Password for user {0} {1} incorrect. Please try again." ,
2009-09-30 16:00:09 +00:00
firstName , lastName ) ;
2009-09-24 14:19:47 +00:00
return null ;
}
2009-09-18 21:22:00 +00:00
}
2009-09-24 14:19:47 +00:00
catch ( Exception e )
2009-09-16 17:20:55 +00:00
{
2013-08-23 20:53:47 +00:00
m_log . ErrorFormat ( "[INVENTORY ARCHIVER]: Could not authenticate password, {0}" , e ) ;
2009-09-16 17:20:55 +00:00
return null ;
}
2009-02-12 17:41:09 +00:00
}
2012-02-10 19:09:46 +00:00
2009-02-11 20:24:41 +00:00
/// <summary>
/// Notify the client of loaded nodes if they are logged in
/// </summary>
/// <param name="loadedNodes">Can be empty. In which case, nothing happens</param>
2010-06-29 23:10:44 +00:00
private void UpdateClientWithLoadedNodes ( UserAccount userInfo , HashSet < InventoryNodeBase > loadedNodes )
2009-09-30 16:00:09 +00:00
{
2009-02-11 20:24:41 +00:00
if ( loadedNodes . Count = = 0 )
return ;
2012-02-10 19:09:46 +00:00
2009-02-11 20:24:41 +00:00
foreach ( Scene scene in m_scenes . Values )
{
2010-01-10 18:40:07 +00:00
ScenePresence user = scene . GetScenePresence ( userInfo . PrincipalID ) ;
2012-02-10 19:09:46 +00:00
2009-02-11 20:24:41 +00:00
if ( user ! = null & & ! user . IsChildAgent )
2009-09-30 16:00:09 +00:00
{
2009-02-11 20:24:41 +00:00
foreach ( InventoryNodeBase node in loadedNodes )
{
2009-09-24 14:19:47 +00:00
// m_log.DebugFormat(
2012-02-10 19:09:46 +00:00
// "[INVENTORY ARCHIVER]: Notifying {0} of loaded inventory node {1}",
2009-09-24 14:19:47 +00:00
// user.Name, node.Name);
2012-02-10 19:09:46 +00:00
2009-02-11 20:24:41 +00:00
user . ControllingClient . SendBulkUpdateInventory ( node ) ;
}
2012-02-10 19:09:46 +00:00
2009-02-11 20:24:41 +00:00
break ;
2009-09-30 16:00:09 +00:00
}
}
2009-02-11 20:24:41 +00:00
}
2009-09-07 18:57:44 +00:00
2010-12-11 03:09:00 +00:00
// /// <summary>
// /// Check if the given user is present in any of the scenes.
// /// </summary>
// /// <param name="userId">The user to check</param>
// /// <returns>true if the user is in any of the scenes, false otherwise</returns>
// protected bool CheckPresence(UUID userId)
// {
// if (DisablePresenceChecks)
// return true;
2012-02-10 19:09:46 +00:00
/ /
2010-12-11 03:09:00 +00:00
// foreach (Scene scene in m_scenes.Values)
// {
// ScenePresence p;
// if ((p = scene.GetScenePresence(userId)) != null)
// {
// p.ControllingClient.SendAgentAlertMessage("Inventory operation has been started", false);
// return true;
// }
// }
/ /
// return false;
// }
2009-02-11 18:46:51 +00:00
}
}