* CHANGED SOME CONSOLE COMMAND BEHAVIOURS

* Normalized 'change-region' so (almost) all commands are context sensitive (use 'root' or '..' to set 'all scenes' context)
  * 'terrain-sim' is thusly obsolete, use 'change-region', followed by 'terrain'
  * Introduced SceneManager to administrate operations on group of scenes and moved relevant funcs there.
    * In it, there's a ForEach(Action<Scene>) that either passes all scenes, or only current scene depending on context.
  * Changed default prim backup (save-xml/load-xml) xml to "prim-backup.xml"
  * Changed Disable/EnablePermissions to BypassPermissions = true/false;

Also:
  * Removed unused and non-existent project ref
afrisby
lbsa71 2007-09-17 06:57:17 +00:00
parent 4cb8108fae
commit 6961013c24
4 changed files with 317 additions and 146 deletions

View File

@ -50,6 +50,8 @@ namespace OpenSim
public class OpenSimMain : RegionApplicationBase, conscmd_callback public class OpenSimMain : RegionApplicationBase, conscmd_callback
{ {
private const string DEFAULT_PRIM_BACKUP_FILENAME = "prim-backup.xml";
public string m_physicsEngine; public string m_physicsEngine;
public string m_scriptEngine; public string m_scriptEngine;
public bool m_sandbox; public bool m_sandbox;
@ -65,7 +67,7 @@ namespace OpenSim
protected List<UDPServer> m_udpServers = new List<UDPServer>(); protected List<UDPServer> m_udpServers = new List<UDPServer>();
protected List<RegionInfo> m_regionData = new List<RegionInfo>(); protected List<RegionInfo> m_regionData = new List<RegionInfo>();
protected List<Scene> m_localScenes = new List<Scene>(); protected SceneManager m_localScenes = new SceneManager();
private bool m_silent; private bool m_silent;
private readonly string m_logFilename = ("region-console.log"); private readonly string m_logFilename = ("region-console.log");
@ -213,10 +215,7 @@ namespace OpenSim
//} //}
//Server side object editing permissions checking //Server side object editing permissions checking
if (m_permissions) scene.PermissionsMngr.BypassPermissions = !m_permissions;
scene.PermissionsMngr.EnablePermissions();
else
scene.PermissionsMngr.DisablePermissions();
m_localScenes.Add(scene); m_localScenes.Add(scene);
@ -334,10 +333,9 @@ namespace OpenSim
m_log.Verbose("Killing clients"); m_log.Verbose("Killing clients");
// IMPLEMENT THIS // IMPLEMENT THIS
m_log.Verbose("Closing console and terminating"); m_log.Verbose("Closing console and terminating");
for (int i = 0; i < m_localScenes.Count; i++)
{ m_localScenes.Close();
m_localScenes[i].Close();
}
m_log.Close(); m_log.Close();
Environment.Exit(0); Environment.Exit(0);
} }
@ -376,6 +374,8 @@ namespace OpenSim
/// <param name="cmdparams">Additional arguments passed to the command</param> /// <param name="cmdparams">Additional arguments passed to the command</param>
public void RunCmd(string command, string[] cmdparams) public void RunCmd(string command, string[] cmdparams)
{ {
string result = "";
if ((m_consoleRegion == null) || (command == "change-region") || (command == "shutdown")) if ((m_consoleRegion == null) || (command == "change-region") || (command == "shutdown"))
{ {
switch (command) switch (command)
@ -414,56 +414,51 @@ namespace OpenSim
case "save-xml": case "save-xml":
if (cmdparams.Length > 0) if (cmdparams.Length > 0)
{ {
m_localScenes[0].SavePrimsToXml(cmdparams[0]); m_localScenes.SavePrimsToXml(cmdparams[0]);
} }
else else
{ {
m_localScenes[0].SavePrimsToXml("test.xml"); m_localScenes.SavePrimsToXml(DEFAULT_PRIM_BACKUP_FILENAME);
} }
break; break;
case "load-xml": case "load-xml":
if (cmdparams.Length > 0) if (cmdparams.Length > 0)
{ {
m_localScenes[0].LoadPrimsFromXml(cmdparams[0]); m_localScenes.LoadPrimsFromXml(cmdparams[0]);
} }
else else
{ {
m_localScenes[0].LoadPrimsFromXml("test.xml"); m_localScenes.LoadPrimsFromXml(DEFAULT_PRIM_BACKUP_FILENAME);
} }
break; break;
case "terrain": case "terrain":
string result = ""; if (!m_localScenes.RunTerrainCmd(cmdparams, ref result))
foreach (Scene scene in m_localScenes)
{
if (!scene.Terrain.RunTerrainCmd(cmdparams, ref result, scene.RegionInfo.RegionName))
{ {
m_log.Error(result); m_log.Error(result);
} }
}
break; break;
case "terrain-sim":
string result2 = "";
foreach (Scene scene in m_localScenes)
{
if (scene.RegionInfo.RegionName.ToLower() == cmdparams[0].ToLower())
{
string[] tmpCmdparams = new string[cmdparams.Length - 1];
cmdparams.CopyTo(tmpCmdparams, 1);
if (!scene.Terrain.RunTerrainCmd(tmpCmdparams, ref result2, scene.RegionInfo.RegionName)) // terrain-sim now obsolete: do change-region first, then terrain as usual
{ //case "terrain-sim":
m_log.Error(result2); // foreach (Scene scene in m_localScenes)
} // {
} // if (scene.RegionInfo.RegionName.ToLower() == cmdparams[0].ToLower())
} // {
break; // string[] tmpCmdparams = new string[cmdparams.Length - 1];
// cmdparams.CopyTo(tmpCmdparams, 1);
// if (!scene.Terrain.RunTerrainCmd(tmpCmdparams, ref result, scene.RegionInfo.RegionName))
// {
// m_log.Error(result);
// }
// }
// }
// break;
case "script": case "script":
foreach (Scene scene in m_localScenes) m_localScenes.SendCommandToScripts(cmdparams);
{
scene.SendCommandToScripts(cmdparams);
}
break; break;
case "command-script": case "command-script":
@ -475,27 +470,18 @@ namespace OpenSim
case "permissions": case "permissions":
// Treats each user as a super-admin when disabled // Treats each user as a super-admin when disabled
foreach (Scene scene in m_localScenes) bool permissions = Convert.ToBoolean(cmdparams[0]);
{
if (Convert.ToBoolean(cmdparams[0])) m_localScenes.BypassPermissions(!permissions);
scene.PermissionsMngr.EnablePermissions();
else
scene.PermissionsMngr.DisablePermissions();
}
break; break;
case "backup": case "backup":
foreach (Scene scene in m_localScenes) m_localScenes.Backup();
{
scene.Backup();
}
break; break;
case "alert": case "alert":
foreach (Scene scene in m_localScenes) m_localScenes.HandleAlertCommand(cmdparams);
{
scene.HandleAlertCommand(cmdparams);
}
break; break;
case "create": case "create":
@ -513,43 +499,27 @@ namespace OpenSim
case "change-region": case "change-region":
if (cmdparams.Length > 0) if (cmdparams.Length > 0)
{ {
if ((cmdparams[0].ToLower() == "root") || (cmdparams[0].ToLower() == "..")) string regionName = this.CombineParams(cmdparams, 0);
if( m_localScenes.TrySetCurrentRegion( regionName ) )
{ {
if (m_consoleRegion != null)
{
m_consoleRegion = null;
MainLog.Instance.Verbose("Now at Root level");
} }
else else
{ {
MainLog.Instance.Verbose("Already at Root level"); MainLog.Instance.Error("Couldn't set current region to: " + regionName);
} }
} }
else
{ if (m_localScenes.CurrentScene == null)
string name = this.CombineParams(cmdparams, 0);
Console.WriteLine("Searching for Region: '" + name + "'");
foreach (Scene scene in m_localScenes)
{
if (scene.RegionInfo.RegionName.ToLower() == name.ToLower())
{
m_consoleRegion = scene;
MainLog.Instance.Verbose("Setting current region: " + m_consoleRegion.RegionInfo.RegionName);
}
}
}
}
else
{
if (m_consoleRegion != null)
{
MainLog.Instance.Verbose("Current Region: " + m_consoleRegion.RegionInfo.RegionName + ". To change region please use 'change-region <regioname>'");
}
else
{ {
MainLog.Instance.Verbose("Currently at Root level. To change region please use 'change-region <regioname>'"); MainLog.Instance.Verbose("Currently at Root level. To change region please use 'change-region <regioname>'");
} }
else
{
MainLog.Instance.Verbose("Current Region: " + m_consoleRegion.RegionInfo.RegionName + ". To change region please use 'change-region <regioname>'");
} }
break; break;
default: default:
@ -564,30 +534,9 @@ namespace OpenSim
} }
} }
private void DebugPacket(int newDebug)
{
for (int i = 0; i < m_localScenes.Count; i++)
{
Scene scene = m_localScenes[i];
foreach (EntityBase entity in scene.Entities.Values)
{
if (entity is ScenePresence)
{
ScenePresence scenePrescence = entity as ScenePresence;
if (!scenePrescence.childAgent)
{
m_log.Error(String.Format("Packet debug for {0} {1} set to {2}",
scenePrescence.Firstname, scenePrescence.Lastname,
newDebug));
scenePrescence.ControllingClient.SetDebug(newDebug);
}
}
}
}
}
public void Debug(string[] args) public void Debug(string[] args)
{ {
switch(args[0]) switch (args[0])
{ {
case "packet": case "packet":
if (args.Length > 1) if (args.Length > 1)
@ -595,7 +544,7 @@ namespace OpenSim
int newDebug; int newDebug;
if (int.TryParse(args[1], out newDebug)) if (int.TryParse(args[1], out newDebug))
{ {
DebugPacket(newDebug); m_localScenes.DebugPacket(m_log, newDebug);
} }
else else
{ {
@ -627,29 +576,34 @@ namespace OpenSim
break; break;
case "users": case "users":
m_log.Error(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}{6,-16}", "Firstname", "Lastname", "Agent ID", "Session ID", "Circuit", "IP", "World")); m_log.Error(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}{6,-16}", "Firstname", "Lastname", "Agent ID", "Session ID", "Circuit", "IP", "World"));
for (int i = 0; i < m_localScenes.Count; i++)
List<ScenePresence> avatars = m_localScenes.GetAvatars();
foreach( ScenePresence avatar in avatars )
{ {
Scene scene = m_localScenes[i]; RegionInfo regionInfo = m_localScenes.GetRegionInfo( avatar.RegionHandle );
foreach (EntityBase entity in scene.Entities.Values) string regionName;
if( regionInfo == null )
{ {
if (entity is ScenePresence) regionName = "Unresolvable";
{ }
ScenePresence scenePrescence = entity as ScenePresence; else
if (!scenePrescence.childAgent)
{ {
regionName = regionInfo.RegionName;
}
m_log.Error( m_log.Error(
String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}", String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}{6,-16}",
scenePrescence.Firstname, avatar.Firstname,
scenePrescence.Lastname, avatar.Lastname,
scenePrescence.UUID, avatar.UUID,
scenePrescence.ControllingClient.AgentId, avatar.ControllingClient.AgentId,
"Unknown", "Unknown",
"Unknown", "Unknown",
scene.RegionInfo.RegionName)); regionName ));
}
}
}
} }
break; break;
case "modules": case "modules":
m_log.Error("The currently loaded shared modules are:"); m_log.Error("The currently loaded shared modules are:");

View File

@ -19,23 +19,19 @@ namespace OpenSim.Region.Environment
// disable in any production environment // disable in any production environment
// TODO: Change this to false when permissions are a desired default // TODO: Change this to false when permissions are a desired default
// TODO: Move to configuration option. // TODO: Move to configuration option.
private bool bypassPermissions = true; private bool m_bypassPermissions = true;
public bool BypassPermissions
{
get { return m_bypassPermissions; }
set { m_bypassPermissions = value; }
}
public PermissionManager(Scene scene) public PermissionManager(Scene scene)
{ {
m_scene = scene; m_scene = scene;
} }
public void DisablePermissions()
{
bypassPermissions = true;
}
public void EnablePermissions()
{
bypassPermissions = false;
}
protected virtual void SendPermissionError(LLUUID user, string reason) protected virtual void SendPermissionError(LLUUID user, string reason)
{ {
m_scene.EventManager.TriggerPermissionError(user, reason); m_scene.EventManager.TriggerPermissionError(user, reason);
@ -43,16 +39,20 @@ namespace OpenSim.Region.Environment
protected virtual bool IsAdministrator(LLUUID user) protected virtual bool IsAdministrator(LLUUID user)
{ {
if (bypassPermissions) if (m_bypassPermissions)
return bypassPermissions; {
return true;
}
return m_scene.RegionInfo.MasterAvatarAssignedUUID == user; return m_scene.RegionInfo.MasterAvatarAssignedUUID == user;
} }
protected virtual bool IsEstateManager(LLUUID user) protected virtual bool IsEstateManager(LLUUID user)
{ {
if (bypassPermissions) if (m_bypassPermissions)
return bypassPermissions; {
return true;
}
return false; return false;
} }
@ -74,14 +74,22 @@ namespace OpenSim.Region.Environment
string reason = "Insufficient permission"; string reason = "Insufficient permission";
if (IsAdministrator(user)) if (IsAdministrator(user))
{
permission = true; permission = true;
}
else else
{
reason = "Not an administrator"; reason = "Not an administrator";
}
if (GenericParcelPermission(user, position)) if (GenericParcelPermission(user, position))
{
permission = true; permission = true;
}
else else
{
reason = "Not the parcel owner"; reason = "Not the parcel owner";
}
if (!permission) if (!permission)
SendPermissionError(user, reason); SendPermissionError(user, reason);

View File

@ -0,0 +1,210 @@
using System.Collections.Generic;
using System;
using OpenSim.Framework.Console;
using OpenSim.Framework.Types;
namespace OpenSim.Region.Environment.Scenes
{
public class SceneManager
{
private readonly List<Scene> m_localScenes;
private Scene m_currentScene = null;
public Scene CurrentScene
{
get
{
return m_currentScene;
}
}
private Scene CurrentOrFirstScene
{
get
{
if (m_currentScene == null)
{
return m_localScenes[0];
}
else
{
return m_currentScene;
}
}
}
public SceneManager()
{
m_localScenes = new List<Scene>();
}
public void Close()
{
for (int i = 0; i < m_localScenes.Count; i++)
{
m_localScenes[i].Close();
}
}
public void Add(Scene scene)
{
m_localScenes.Add(scene);
}
public void SavePrimsToXml(string filename)
{
CurrentOrFirstScene.SavePrimsToXml(filename);
}
public void LoadPrimsFromXml(string filename)
{
CurrentOrFirstScene.LoadPrimsFromXml(filename);
}
public bool RunTerrainCmd(string[] cmdparams, ref string result)
{
if (m_currentScene == null)
{
bool success = true;
foreach (Scene scene in m_localScenes)
{
if (!scene.Terrain.RunTerrainCmd(cmdparams, ref result, scene.RegionInfo.RegionName))
{
success = false;
}
}
return success;
}
else
{
return m_currentScene.Terrain.RunTerrainCmd(cmdparams, ref result, m_currentScene.RegionInfo.RegionName);
}
}
public void SendCommandToScripts(string[] cmdparams)
{
ForEach(delegate(Scene scene)
{
scene.SendCommandToScripts(cmdparams);
});
}
public void BypassPermissions(bool bypassPermissions)
{
ForEach(delegate(Scene scene)
{
scene.PermissionsMngr.BypassPermissions = bypassPermissions;
});
}
private void ForEach(Action<Scene> func)
{
if (m_currentScene == null)
{
m_localScenes.ForEach(func);
}
else
{
func(m_currentScene);
}
}
public void Backup()
{
ForEach(delegate(Scene scene)
{
scene.Backup();
});
}
public void HandleAlertCommand(string[] cmdparams)
{
ForEach(delegate(Scene scene)
{
scene.HandleAlertCommand(cmdparams);
});
}
public bool TrySetCurrentRegion(string regionName)
{
if ((String.Compare(regionName, "root") == 0) || (String.Compare(regionName, "..") == 0))
{
m_currentScene = null;
return true;
}
else
{
Console.WriteLine("Searching for Region: '" + regionName + "'");
Scene foundScene = null;
foreach (Scene scene in m_localScenes)
{
if (String.Compare(scene.RegionInfo.RegionName, regionName, true) == 0)
{
m_currentScene = scene;
return true;
}
}
return false;
}
}
public void DebugPacket(LogBase log, int newDebug)
{
ForEach(delegate(Scene scene)
{
foreach (EntityBase entity in scene.Entities.Values)
{
if (entity is ScenePresence)
{
ScenePresence scenePrescence = entity as ScenePresence;
if (!scenePrescence.childAgent)
{
log.Error(String.Format("Packet debug for {0} {1} set to {2}",
scenePrescence.Firstname, scenePrescence.Lastname,
newDebug));
scenePrescence.ControllingClient.SetDebug(newDebug);
}
}
}
});
}
public List<ScenePresence> GetAvatars()
{
List<ScenePresence> avatars = new List<ScenePresence>();
ForEach(delegate(Scene scene)
{
foreach (EntityBase entity in scene.Entities.Values)
{
if (entity is ScenePresence)
{
ScenePresence scenePrescence = entity as ScenePresence;
if (!scenePrescence.childAgent)
{
avatars.Add(scenePrescence);
}
}
}
});
return avatars;
}
public RegionInfo GetRegionInfo(ulong regionHandle)
{
foreach (Scene scene in m_localScenes)
{
if( scene.RegionInfo.RegionHandle == regionHandle )
{
return scene.RegionInfo;
}
}
return null;
}
}
}

View File

@ -823,7 +823,6 @@
<Reference name="OpenSim.Framework.Console"/> <Reference name="OpenSim.Framework.Console"/>
<Reference name="OpenSim.Framework.Servers"/> <Reference name="OpenSim.Framework.Servers"/>
<Reference name="OpenSim.Framework.Data"/> <Reference name="OpenSim.Framework.Data"/>
<Reference name="OpenSim.Grid.Framework.Manager"/>
<Reference name="libsecondlife.dll"/> <Reference name="libsecondlife.dll"/>
<Reference name="Db4objects.Db4o.dll"/> <Reference name="Db4objects.Db4o.dll"/>
<Reference name="XMLRPC.dll"/> <Reference name="XMLRPC.dll"/>