Compare commits

...

3 Commits

4 changed files with 46 additions and 16 deletions

View File

@@ -56,6 +56,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
/// Determine whether this archive will save assets. Default is true.
/// </summary>
public bool SaveAssets { get; set; }
public bool SkipBadAssets { get; set; }
/// <summary>
/// Determines which items will be included in the archive, according to their permissions.
@@ -68,6 +70,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
/// </summary>
public int CountItems { get; set; }
public int CountBadAssetSkipItems { get; set; }
/// <summary>
/// Counter for inventory items skipped due to permission filter option for passing to compltion event
/// </summary>
@@ -136,6 +140,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
m_assetGatherer = new UuidGatherer(m_scene.AssetService);
SaveAssets = true;
SkipBadAssets = false;
FilterContent = null;
}
@@ -201,27 +206,32 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
return;
}
if (options.ContainsKey("verbose"))
m_log.InfoFormat(
"[INVENTORY ARCHIVER]: Saving item {0} {1} (asset UUID {2})",
inventoryItem.ID, inventoryItem.Name, inventoryItem.AssetID);
string filename = path + CreateArchiveItemName(inventoryItem);
// Record the creator of this item for user record purposes (which might go away soon)
m_userUuids[inventoryItem.CreatorIdAsUuid] = 1;
string serialization = UserInventoryItemSerializer.Serialize(inventoryItem, options, userAccountService);
m_archiveWriter.WriteFile(filename, serialization);
AssetType itemAssetType = (AssetType)inventoryItem.AssetType;
// Count inventory items (different to asset count)
CountItems++;
// Don't chase down link asset items as they actually point to their target item IDs rather than an asset
if (SaveAssets && itemAssetType != AssetType.Link && itemAssetType != AssetType.LinkFolder)
{
if(SkipBadAssets)
{
AssetBase asset = m_scene.AssetService.Get(inventoryItem.AssetID.ToString());
if(asset is null)
{
m_log.Error($"[INVENTORY ARCHIVER] missing asset {inventoryItem.AssetID} on item { inventoryItem.Name} ({inventoryItem.ID}) type {inventoryItem.InvType}");
CountBadAssetSkipItems++;
return;
}
if(asset.Data is null || asset.Data.Length == 0)
{
m_log.Error($"[INVENTORY ARCHIVER] empty asset {inventoryItem.AssetID} on item { inventoryItem.Name} ({inventoryItem.ID}) type {inventoryItem.InvType}");
CountBadAssetSkipItems++;
return;
}
}
int curErrorCntr = m_assetGatherer.ErrorCount;
int possible = m_assetGatherer.possibleNotAssetCount;
m_assetGatherer.AddForInspection(inventoryItem.AssetID);
@@ -234,7 +244,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
string spath;
int indx = path.IndexOf("__");
if(indx > 0)
spath = path.Substring(0,indx);
spath = path.Substring(0,indx);
else
spath = path;
@@ -251,6 +261,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
}
}
}
if (options.ContainsKey("verbose"))
m_log.Info(
$"[INVENTORY ARCHIVER]: Saving item {inventoryItem.ID} {inventoryItem.Name} (asset UUID {inventoryItem.AssetID})");
string filename = path + CreateArchiveItemName(inventoryItem);
string serialization = UserInventoryItemSerializer.Serialize(inventoryItem, options, userAccountService);
m_archiveWriter.WriteFile(filename, serialization);
// Count inventory items (different to asset count)
CountItems++;
}
/// <summary>
@@ -342,6 +361,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
if (options.ContainsKey("noassets") && (bool)options["noassets"])
SaveAssets = false;
if (options.ContainsKey("skipbadassets") && (bool)options["skipbadassets"])
{
SaveAssets = true;
SkipBadAssets = true;
}
// Set Permission filter if flag is set
if (options.ContainsKey("checkPermissions"))
{

View File

@@ -128,7 +128,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
scene.AddCommand(
"Archiving", this, "save iar",
"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 iar [-h|--home=<url>] [--noassets | --skipbadassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]",
"Save user inventory archive (IAR).",
"<first> is the user's first name.\n"
+ "<last> is the user's last name.\n"
@@ -141,6 +141,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
+ "-f|--excludefolder=<folder/uuid> don't save contents of the folder in archive" + Environment.NewLine
+ "-v|--verbose extra debug messages.\n"
+ "--noassets stops assets being saved to the IAR."
+ "--skipbadassets skips inventory items when their main asset is missing. Avoid to use unless tring to recover a already very damaged inventory"
+ "--perm=<permissions> stops items with insufficient permissions from being saved to the IAR.\n"
+ " <permissions> can contain one or more of these characters: \"C\" = Copy, \"T\" = Transfer, \"M\" = Modify.\n",
HandleSaveInvConsoleCommand);
@@ -446,6 +447,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
ops.Add("v|verbose", delegate(string v) { options["verbose"] = v; });
ops.Add("c|creators", delegate(string v) { options["creators"] = v; });
ops.Add("noassets", delegate(string v) { options["noassets"] = v != null; });
ops.Add("skipbadassets", delegate(string v) { options["skipbadassets"] = v != null; });
ops.Add("e|exclude=", delegate(string v)
{
if (!options.ContainsKey("exclude"))
@@ -467,7 +469,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
if (mainParams.Count < 6)
{
m_log.Error(
"[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]");
"[INVENTORY ARCHIVER]: save iar [-h|--home=<url>] [--noassets | --skipbadassets] <first> <last> <inventory path> <password> [<IAR path>] [-c|--creators] [-e|--exclude=<name/uuid>] [-f|--excludefolder=<foldername/uuid>] [-v|--verbose]");
return;
}

View File

@@ -103,6 +103,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
bool mergeOar = false;
bool mergeReplaceObjects = false;
bool skipAssets = false;
bool forceAssets = false;
bool mergeTerrain = false;
bool mergeParcels = false;
bool noObjects = false;
@@ -118,6 +119,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
options.Add("m|merge", delegate(string v) { mergeOar = (v != null); });
options.Add("mergeReplaceObjects", delegate (string v) { mergeReplaceObjects = (v != null); });
options.Add("s|skip-assets", delegate(string v) { skipAssets = (v != null); });
options.Add("force-assets", delegate(string v) { forceAssets = (v != null); });
options.Add("merge-terrain", delegate(string v) { mergeTerrain = (v != null); });
options.Add("force-terrain", delegate (string v) { mergeTerrain = (v != null); }); // downward compatibility
options.Add("forceterrain", delegate (string v) { mergeTerrain = (v != null); }); // downward compatibility
@@ -216,6 +218,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
Dictionary<string, object> archiveOptions = new Dictionary<string, object>();
if (mergeOar) archiveOptions.Add("merge", null);
if (skipAssets) archiveOptions.Add("skipAssets", null);
if (forceAssets) archiveOptions.Add("forceAssets", null);
if (mergeReplaceObjects) archiveOptions.Add("mReplaceObjects", null);
if (mergeTerrain) archiveOptions.Add("merge-terrain", null);
if (mergeParcels) archiveOptions.Add("merge-parcels", null);

View File

@@ -150,7 +150,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
if(asset == null)
{
m_notFoundAssetUuids.Add(new UUID(thiskey));
m_notFoundAssetUuids.Add(kvp.Key);
continue;
}