2007-03-22 10:11:15 +00:00
/ *
Copyright ( c ) OpenSim project , http : //osgrid.org/
* All rights reserved .
*
* 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 .
* * Neither the name of the < organization > nor the
* 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 < copyright holder > ` ` 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 < copyright holder > 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 .
* /
using System ;
using System.Text ;
using System.IO ;
using System.Threading ;
using System.Net ;
using System.Net.Sockets ;
using System.Timers ;
using System.Reflection ;
using System.Collections ;
using System.Collections.Generic ;
using libsecondlife ;
using libsecondlife.Packets ;
using OpenSim.world ;
2007-04-11 09:45:48 +00:00
using OpenSim.Terrain ;
2007-03-22 10:11:15 +00:00
using OpenSim.Framework.Interfaces ;
2007-04-25 13:03:48 +00:00
using OpenSim.Framework.Types ;
2007-03-22 10:11:15 +00:00
using OpenSim.UserServer ;
using OpenSim.Assets ;
using OpenSim.CAPS ;
using OpenSim.Framework.Console ;
using OpenSim.Physics.Manager ;
2007-03-29 11:08:42 +00:00
using Nwc.XmlRpc ;
using OpenSim.Servers ;
2007-04-15 09:45:34 +00:00
using OpenSim.GenericConfig ;
2007-03-22 10:11:15 +00:00
namespace OpenSim
{
2007-03-31 21:18:05 +00:00
2007-05-16 13:10:17 +00:00
public class OpenSimMain : conscmd_callback
2007-03-22 10:11:15 +00:00
{
2007-04-02 15:48:01 +00:00
private IGenericConfig localConfig ;
//private IGenericConfig remoteConfig;
2007-03-22 10:11:15 +00:00
private PhysicsManager physManager ;
2007-03-28 13:08:27 +00:00
private Grid GridServers ;
private AssetCache AssetCache ;
private InventoryCache InventoryCache ;
private Dictionary < EndPoint , uint > clientCircuits = new Dictionary < EndPoint , uint > ( ) ;
private DateTime startuptime ;
2007-04-17 12:03:52 +00:00
private RegionInfo regionData ;
2007-03-22 10:11:15 +00:00
2007-03-29 18:21:04 +00:00
private System . Timers . Timer m_heartbeatTimer = new System . Timers . Timer ( ) ;
2007-03-28 05:27:20 +00:00
public string m_physicsEngine ;
public bool m_sandbox = false ;
public bool m_loginserver ;
2007-03-28 18:10:52 +00:00
public bool user_accounts = false ;
2007-04-17 13:39:21 +00:00
public bool gridLocalAsset = false ;
2007-04-25 13:47:32 +00:00
private bool configFileSetup = false ;
2007-04-27 20:32:02 +00:00
public string m_config ;
2007-04-22 05:40:00 +00:00
2007-05-16 13:10:17 +00:00
private UDPServer m_udpServer ;
2007-05-16 12:44:58 +00:00
protected BaseHttpServer httpServer ;
2007-03-27 08:10:15 +00:00
protected ConsoleBase m_console ;
2007-03-29 11:08:42 +00:00
2007-05-16 17:12:17 +00:00
public OpenSimMain ( bool sandBoxMode , bool startLoginServer , string physicsEngine , bool useConfigFile , bool silent , string configFile )
2007-03-22 10:11:15 +00:00
{
2007-04-25 13:47:32 +00:00
this . configFileSetup = useConfigFile ;
2007-03-28 05:27:20 +00:00
m_sandbox = sandBoxMode ;
m_loginserver = startLoginServer ;
m_physicsEngine = physicsEngine ;
2007-04-27 22:29:29 +00:00
m_config = configFile ;
2007-03-29 11:08:42 +00:00
2007-05-16 17:12:17 +00:00
m_console = new ConsoleBase ( "region-console-" + Guid . NewGuid ( ) . ToString ( ) + ".log" , "Region" , this , silent ) ;
2007-03-27 08:10:15 +00:00
OpenSim . Framework . Console . MainConsole . Instance = m_console ;
2007-03-22 10:11:15 +00:00
}
2007-05-16 17:12:17 +00:00
private World m_localWorld ;
public World LocalWorld
{
get { return m_localWorld ; }
}
2007-04-07 17:37:04 +00:00
/// <summary>
/// Performs initialisation of the world, such as loading configuration from disk.
/// </summary>
2007-03-28 13:08:27 +00:00
public virtual void StartUp ( )
2007-03-22 10:11:15 +00:00
{
2007-04-02 15:48:01 +00:00
this . regionData = new RegionInfo ( ) ;
try
{
2007-04-27 20:32:02 +00:00
this . localConfig = new XmlConfig ( m_config ) ;
2007-04-02 15:48:01 +00:00
this . localConfig . LoadData ( ) ;
}
catch ( Exception e )
{
Console . WriteLine ( e . Message ) ;
}
2007-04-25 13:47:32 +00:00
if ( this . configFileSetup )
{
this . SetupFromConfigFile ( this . localConfig ) ;
}
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Loading configuration" ) ;
2007-04-04 18:57:13 +00:00
this . regionData . InitConfig ( this . m_sandbox , this . localConfig ) ;
2007-04-04 19:55:31 +00:00
this . localConfig . Close ( ) ; //for now we can close it as no other classes read from it , but this should change
2007-03-28 13:08:27 +00:00
GridServers = new Grid ( ) ;
2007-03-29 11:08:42 +00:00
if ( m_sandbox )
2007-03-28 05:27:20 +00:00
{
2007-05-16 12:44:58 +00:00
this . SetupLocalGridServers ( ) ;
2007-03-28 05:27:20 +00:00
}
else
{
2007-05-16 12:44:58 +00:00
this . SetupRemoteGridServers ( ) ;
2007-05-07 16:32:30 +00:00
}
2007-03-29 11:08:42 +00:00
2007-03-28 13:08:27 +00:00
startuptime = DateTime . Now ;
2007-03-22 10:11:15 +00:00
2007-05-07 16:32:30 +00:00
try
{
AssetCache = new AssetCache ( GridServers . AssetServer ) ;
InventoryCache = new InventoryCache ( ) ;
}
catch ( Exception e )
{
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , e . Message + "\nSorry, could not setup local cache" ) ;
2007-05-07 16:32:30 +00:00
Environment . Exit ( 1 ) ;
}
2007-03-22 10:11:15 +00:00
2007-05-16 13:10:17 +00:00
//PacketServer packetServer = new PacketServer(this);
m_udpServer = new UDPServer ( this . regionData . IPListenPort , this . GridServers , this . AssetCache , this . InventoryCache , this . regionData , this . m_sandbox , this . user_accounts , this . m_console ) ;
2007-05-04 07:23:41 +00:00
//should be passing a IGenericConfig object to these so they can read the config data they want from it
2007-05-16 12:44:58 +00:00
GridServers . AssetServer . SetServerInfo ( regionData . AssetURL , regionData . AssetSendKey ) ;
2007-05-04 07:23:41 +00:00
IGridServer gridServer = GridServers . GridServer ;
gridServer . SetServerInfo ( regionData . GridURL , regionData . GridSendKey , regionData . GridRecvKey ) ;
if ( ! m_sandbox )
{
2007-05-16 12:44:58 +00:00
this . ConnectToRemoteGridServer ( ) ;
}
this . SetupLocalWorld ( ) ;
if ( m_sandbox )
{
AssetCache . LoadDefaultTextureSet ( ) ;
}
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Initialising HTTP server" ) ;
this . SetupHttpListener ( ) ;
LoginServer loginServer = null ;
LoginServer adminLoginServer = null ;
bool sandBoxWithLoginServer = m_loginserver & & m_sandbox ;
if ( sandBoxWithLoginServer )
{
loginServer = new LoginServer ( gridServer , regionData . IPListenAddr , regionData . IPListenPort , regionData . RegionLocX , regionData . RegionLocY , this . user_accounts ) ;
loginServer . Startup ( ) ;
if ( user_accounts )
2007-05-04 07:23:41 +00:00
{
2007-05-16 12:44:58 +00:00
//sandbox mode with loginserver using accounts
this . GridServers . UserServer = loginServer ;
adminLoginServer = loginServer ;
httpServer . AddXmlRPCHandler ( "login_to_simulator" , loginServer . LocalUserManager . XmlRpcLoginMethod ) ;
2007-05-04 07:23:41 +00:00
}
else
{
2007-05-16 12:44:58 +00:00
//sandbox mode with loginserver not using accounts
httpServer . AddXmlRPCHandler ( "login_to_simulator" , loginServer . XmlRpcLoginMethod ) ;
2007-05-04 07:23:41 +00:00
}
2007-05-16 12:44:58 +00:00
}
2007-05-04 07:23:41 +00:00
2007-05-16 12:44:58 +00:00
AdminWebFront adminWebFront = new AdminWebFront ( "Admin" , LocalWorld , InventoryCache , adminLoginServer ) ;
adminWebFront . LoadMethods ( httpServer ) ;
2007-05-04 07:23:41 +00:00
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Starting HTTP server" ) ;
httpServer . Start ( ) ;
2007-05-04 07:43:07 +00:00
2007-05-16 13:10:17 +00:00
//MainServerListener();
this . m_udpServer . ServerListener ( ) ;
2007-05-04 07:43:07 +00:00
2007-05-16 12:44:58 +00:00
m_heartbeatTimer . Enabled = true ;
m_heartbeatTimer . Interval = 100 ;
m_heartbeatTimer . Elapsed + = new ElapsedEventHandler ( this . Heartbeat ) ;
}
# region Setup methods
protected virtual void SetupLocalGridServers ( )
{
GridServers . AssetDll = "OpenSim.GridInterfaces.Local.dll" ;
GridServers . GridDll = "OpenSim.GridInterfaces.Local.dll" ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Starting in Sandbox mode" ) ;
try
{
GridServers . Initialise ( ) ;
}
catch ( Exception e )
{
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , e . Message + "\nSorry, could not setup the grid interface" ) ;
Environment . Exit ( 1 ) ;
}
}
protected virtual void SetupRemoteGridServers ( )
{
if ( this . gridLocalAsset )
{
GridServers . AssetDll = "OpenSim.GridInterfaces.Local.dll" ;
}
else
{
GridServers . AssetDll = "OpenSim.GridInterfaces.Remote.dll" ;
2007-05-04 07:23:41 +00:00
}
2007-05-16 12:44:58 +00:00
GridServers . GridDll = "OpenSim.GridInterfaces.Remote.dll" ;
2007-05-04 07:23:41 +00:00
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Starting in Grid mode" ) ;
2007-05-04 07:23:41 +00:00
2007-05-16 12:44:58 +00:00
try
{
GridServers . Initialise ( ) ;
}
catch ( Exception e )
{
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , e . Message + "\nSorry, could not setup the grid interface" ) ;
Environment . Exit ( 1 ) ;
}
}
protected virtual void SetupLocalWorld ( )
{
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . NORMAL , "Main.cs:Startup() - We are " + regionData . RegionName + " at " + regionData . RegionLocX . ToString ( ) + "," + regionData . RegionLocY . ToString ( ) ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Initialising world" ) ;
2007-05-14 21:15:26 +00:00
m_console . componentname = "Region " + regionData . RegionName ;
2007-05-16 12:44:58 +00:00
2007-05-16 17:12:17 +00:00
m_localWorld = new World ( this . m_udpServer . PacketServer . ClientThreads , regionData , regionData . RegionHandle , regionData . RegionName ) ;
2007-03-31 15:54:16 +00:00
LocalWorld . InventoryCache = InventoryCache ;
LocalWorld . AssetCache = AssetCache ;
2007-03-22 10:11:15 +00:00
2007-05-16 13:10:17 +00:00
this . m_udpServer . LocalWorld = LocalWorld ;
this . m_udpServer . PacketServer . RegisterClientPacketHandlers ( ) ;
2007-04-01 20:42:42 +00:00
2007-03-22 10:11:15 +00:00
this . physManager = new OpenSim . Physics . Manager . PhysicsManager ( ) ;
this . physManager . LoadPlugins ( ) ;
2007-04-27 22:26:57 +00:00
LocalWorld . m_datastore = this . regionData . DataStore ;
2007-04-02 10:46:59 +00:00
LocalWorld . LoadStorageDLL ( "OpenSim.Storage.LocalStorageDb4o.dll" ) ; //all these dll names shouldn't be hard coded.
LocalWorld . LoadWorldMap ( ) ;
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Starting up messaging system" ) ;
2007-05-16 15:46:22 +00:00
LocalWorld . PhysScene = this . physManager . GetPhysicsScene ( this . m_physicsEngine ) ;
2007-04-06 19:08:24 +00:00
LocalWorld . PhysScene . SetTerrain ( LocalWorld . Terrain . getHeights1D ( ) ) ;
2007-03-28 13:08:27 +00:00
LocalWorld . LoadPrimsFromStorage ( ) ;
2007-05-16 12:44:58 +00:00
}
2007-03-22 10:11:15 +00:00
2007-05-16 12:44:58 +00:00
protected virtual void SetupHttpListener ( )
{
httpServer = new BaseHttpServer ( regionData . IPListenPort ) ;
2007-03-29 11:08:42 +00:00
2007-05-16 12:44:58 +00:00
if ( this . GridServers . GridServer . GetName ( ) = = "Remote" )
2007-03-29 11:08:42 +00:00
{
2007-04-22 05:40:00 +00:00
// we are in Grid mode so set a XmlRpc handler to handle "expect_user" calls from the user server
2007-04-11 20:07:58 +00:00
httpServer . AddXmlRPCHandler ( "expect_user" ,
2007-03-29 11:08:42 +00:00
delegate ( XmlRpcRequest request )
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
AgentCircuitData agent_data = new AgentCircuitData ( ) ;
agent_data . SessionID = new LLUUID ( ( string ) requestData [ "session_id" ] ) ;
agent_data . SecureSessionID = new LLUUID ( ( string ) requestData [ "secure_session_id" ] ) ;
agent_data . firstname = ( string ) requestData [ "firstname" ] ;
agent_data . lastname = ( string ) requestData [ "lastname" ] ;
agent_data . AgentID = new LLUUID ( ( string ) requestData [ "agent_id" ] ) ;
2007-04-17 12:03:52 +00:00
agent_data . circuitcode = Convert . ToUInt32 ( requestData [ "circuit_code" ] ) ;
if ( requestData . ContainsKey ( "child_agent" ) & & requestData [ "child_agent" ] . Equals ( "1" ) )
{
agent_data . child = true ;
}
else
{
agent_data . startpos = new LLVector3 ( Convert . ToUInt32 ( requestData [ "startpos_x" ] ) , Convert . ToUInt32 ( requestData [ "startpos_y" ] ) , Convert . ToUInt32 ( requestData [ "startpos_z" ] ) ) ;
agent_data . child = false ;
}
2007-05-16 12:44:58 +00:00
if ( ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits . ContainsKey ( ( uint ) agent_data . circuitcode ) )
2007-04-17 12:03:52 +00:00
{
2007-05-16 12:44:58 +00:00
( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] = agent_data ;
2007-04-17 12:03:52 +00:00
}
else
{
2007-05-16 12:44:58 +00:00
( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits . Add ( ( uint ) agent_data . circuitcode , agent_data ) ;
2007-04-17 12:03:52 +00:00
}
2007-03-29 11:08:42 +00:00
return new XmlRpcResponse ( ) ;
} ) ;
2007-04-17 12:03:52 +00:00
2007-04-17 10:53:50 +00:00
httpServer . AddXmlRPCHandler ( "agent_crossing" ,
delegate ( XmlRpcRequest request )
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
AgentCircuitData agent_data = new AgentCircuitData ( ) ;
agent_data . firstname = ( string ) requestData [ "firstname" ] ;
agent_data . lastname = ( string ) requestData [ "lastname" ] ;
2007-04-17 12:03:52 +00:00
agent_data . circuitcode = Convert . ToUInt32 ( requestData [ "circuit_code" ] ) ;
agent_data . startpos = new LLVector3 ( Single . Parse ( ( string ) requestData [ "pos_x" ] ) , Single . Parse ( ( string ) requestData [ "pos_y" ] ) , Single . Parse ( ( string ) requestData [ "pos_z" ] ) ) ;
2007-05-16 12:44:58 +00:00
if ( ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits . ContainsKey ( ( uint ) agent_data . circuitcode ) )
2007-04-17 12:03:52 +00:00
{
2007-05-16 12:44:58 +00:00
( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] . firstname = agent_data . firstname ;
( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] . lastname = agent_data . lastname ;
( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] . startpos = agent_data . startpos ;
2007-04-17 12:03:52 +00:00
}
2007-04-17 10:53:50 +00:00
return new XmlRpcResponse ( ) ;
} ) ;
2007-04-17 12:03:52 +00:00
2007-04-11 20:07:58 +00:00
httpServer . AddRestHandler ( "GET" , "/simstatus/" ,
2007-04-15 09:45:34 +00:00
delegate ( string request , string path , string param )
2007-04-03 13:37:11 +00:00
{
return "OK" ;
} ) ;
2007-03-29 11:08:42 +00:00
}
2007-05-16 12:44:58 +00:00
}
2007-03-29 11:08:42 +00:00
2007-05-16 12:44:58 +00:00
protected virtual void ConnectToRemoteGridServer ( )
{
if ( GridServers . GridServer . RequestConnection ( regionData . SimUUID , regionData . IPListenAddr , ( uint ) regionData . IPListenPort ) )
2007-03-28 05:27:20 +00:00
{
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Success: Got a grid connection OK!" ) ;
}
else
{
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . CRITICAL , "Main.cs:Startup() - FAILED: Unable to get connection to grid. Shutting down." ) ;
Shutdown ( ) ;
2007-03-28 05:27:20 +00:00
}
2007-05-16 12:44:58 +00:00
GridServers . AssetServer . SetServerInfo ( ( string ) ( ( RemoteGridBase ) GridServers . GridServer ) . GridData [ "asset_url" ] , ( string ) ( ( RemoteGridBase ) GridServers . GridServer ) . GridData [ "asset_sendkey" ] ) ;
2007-04-03 13:37:11 +00:00
2007-05-16 12:44:58 +00:00
// If we are being told to load a file, load it.
string dataUri = ( string ) ( ( RemoteGridBase ) GridServers . GridServer ) . GridData [ "data_uri" ] ;
2007-04-25 13:03:48 +00:00
2007-05-16 12:44:58 +00:00
if ( ! String . IsNullOrEmpty ( dataUri ) )
2007-04-25 13:03:48 +00:00
{
2007-05-16 12:44:58 +00:00
this . LocalWorld . m_datastore = dataUri ;
2007-04-25 13:03:48 +00:00
}
2007-05-16 12:44:58 +00:00
if ( ( ( RemoteGridBase ) ( GridServers . GridServer ) ) . GridData [ "regionname" ] . ToString ( ) ! = "" )
{
// The grid server has told us who we are
// We must obey the grid server.
try
{
regionData . RegionLocX = Convert . ToUInt32 ( ( ( RemoteGridBase ) ( GridServers . GridServer ) ) . GridData [ "region_locx" ] . ToString ( ) ) ;
regionData . RegionLocY = Convert . ToUInt32 ( ( ( RemoteGridBase ) ( GridServers . GridServer ) ) . GridData [ "region_locy" ] . ToString ( ) ) ;
regionData . RegionName = ( ( RemoteGridBase ) ( GridServers . GridServer ) ) . GridData [ "regionname" ] . ToString ( ) ;
}
catch ( Exception e )
{
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . CRITICAL , e . Message + "\nBAD ERROR! THIS SHOULD NOT HAPPEN! Bad GridData from the grid interface!!!! ZOMG!!!" ) ;
Environment . Exit ( 1 ) ;
}
}
2007-03-22 10:11:15 +00:00
}
2007-05-16 12:44:58 +00:00
# endregion
2007-04-25 13:47:32 +00:00
private void SetupFromConfigFile ( IGenericConfig configData )
{
try
{
// SandBoxMode
string attri = "" ;
attri = configData . GetAttribute ( "SandBox" ) ;
2007-05-07 16:32:30 +00:00
if ( ( attri = = "" ) | | ( ( attri ! = "false" ) & & ( attri ! = "true" ) ) )
2007-04-25 13:47:32 +00:00
{
this . m_sandbox = false ;
configData . SetAttribute ( "SandBox" , "false" ) ;
}
else
{
this . m_sandbox = Convert . ToBoolean ( attri ) ;
}
// LoginServer
attri = "" ;
attri = configData . GetAttribute ( "LoginServer" ) ;
2007-05-07 16:32:30 +00:00
if ( ( attri = = "" ) | | ( ( attri ! = "false" ) & & ( attri ! = "true" ) ) )
2007-04-25 13:47:32 +00:00
{
this . m_loginserver = false ;
configData . SetAttribute ( "LoginServer" , "false" ) ;
}
else
{
this . m_loginserver = Convert . ToBoolean ( attri ) ;
}
// Sandbox User accounts
attri = "" ;
attri = configData . GetAttribute ( "UserAccount" ) ;
2007-05-07 16:32:30 +00:00
if ( ( attri = = "" ) | | ( ( attri ! = "false" ) & & ( attri ! = "true" ) ) )
2007-04-25 13:47:32 +00:00
{
this . user_accounts = false ;
configData . SetAttribute ( "UserAccounts" , "false" ) ;
}
2007-05-07 16:32:30 +00:00
else if ( attri = = "true" )
2007-04-25 13:47:32 +00:00
{
this . user_accounts = Convert . ToBoolean ( attri ) ;
}
// Grid mode hack to use local asset server
attri = "" ;
attri = configData . GetAttribute ( "LocalAssets" ) ;
2007-05-07 16:32:30 +00:00
if ( ( attri = = "" ) | | ( ( attri ! = "false" ) & & ( attri ! = "true" ) ) )
2007-04-25 13:47:32 +00:00
{
this . gridLocalAsset = false ;
configData . SetAttribute ( "LocalAssets" , "false" ) ;
}
2007-05-07 16:32:30 +00:00
else if ( attri = = "true" )
2007-04-25 13:47:32 +00:00
{
this . gridLocalAsset = Convert . ToBoolean ( attri ) ;
}
2007-05-07 16:32:30 +00:00
2007-04-25 13:47:32 +00:00
attri = "" ;
attri = configData . GetAttribute ( "PhysicsEngine" ) ;
2007-05-07 16:32:30 +00:00
switch ( attri )
2007-04-25 13:47:32 +00:00
{
2007-05-07 16:32:30 +00:00
default :
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . MEDIUM , "Main.cs: SetupFromConfig() - Invalid value for PhysicsEngine attribute, terminating" ) ;
2007-05-07 16:32:30 +00:00
Environment . Exit ( 1 ) ;
break ;
case "" :
this . m_physicsEngine = "basicphysics" ;
configData . SetAttribute ( "PhysicsEngine" , "basicphysics" ) ;
2007-04-25 13:47:32 +00:00
OpenSim . world . Avatar . PhysicsEngineFlying = false ;
2007-05-07 16:32:30 +00:00
break ;
case "basicphysics" :
this . m_physicsEngine = "basicphysics" ;
configData . SetAttribute ( "PhysicsEngine" , "basicphysics" ) ;
OpenSim . world . Avatar . PhysicsEngineFlying = false ;
break ;
case "RealPhysX" :
this . m_physicsEngine = "RealPhysX" ;
OpenSim . world . Avatar . PhysicsEngineFlying = true ;
break ;
case "OpenDynamicsEngine" :
this . m_physicsEngine = "OpenDynamicsEngine" ;
OpenSim . world . Avatar . PhysicsEngineFlying = true ;
break ;
2007-04-25 13:47:32 +00:00
}
2007-05-07 16:32:30 +00:00
2007-04-25 13:47:32 +00:00
configData . Commit ( ) ;
}
catch ( Exception e )
{
Console . WriteLine ( e . Message ) ;
2007-05-07 16:32:30 +00:00
Console . WriteLine ( "\nSorry, a fatal error occurred while trying to initialise the configuration data" ) ;
Console . WriteLine ( "Can not continue starting up" ) ;
Environment . Exit ( 1 ) ;
2007-04-25 13:47:32 +00:00
}
}
2007-04-07 17:37:04 +00:00
/// <summary>
/// Performs any last-minute sanity checking and shuts down the region server
/// </summary>
2007-03-28 13:08:27 +00:00
public virtual void Shutdown ( )
2007-03-22 10:11:15 +00:00
{
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Shutdown() - Closing all threads" ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Shutdown() - Killing listener thread" ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Shutdown() - Killing clients" ) ;
2007-03-22 10:11:15 +00:00
// IMPLEMENT THIS
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Shutdown() - Closing console and terminating" ) ;
2007-03-28 13:08:27 +00:00
LocalWorld . Close ( ) ;
GridServers . Close ( ) ;
2007-03-28 05:27:20 +00:00
m_console . Close ( ) ;
2007-03-22 10:11:15 +00:00
Environment . Exit ( 0 ) ;
}
2007-04-07 17:37:04 +00:00
/// <summary>
/// Performs per-frame updates regularly
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2007-03-29 18:21:04 +00:00
void Heartbeat ( object sender , System . EventArgs e )
2007-03-22 10:11:15 +00:00
{
2007-03-28 13:08:27 +00:00
LocalWorld . Update ( ) ;
2007-03-22 10:11:15 +00:00
}
2007-03-29 11:08:42 +00:00
2007-05-16 12:44:58 +00:00
#region Console Commands
2007-04-07 17:37:04 +00:00
/// <summary>
/// Runs commands issued by the server console from the operator
/// </summary>
/// <param name="command">The first argument of the parameter (the command)</param>
/// <param name="cmdparams">Additional arguments passed to the command</param>
2007-03-27 08:10:15 +00:00
public void RunCmd ( string command , string [ ] cmdparams )
{
switch ( command )
{
case "help" :
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , "show users - show info about connected users" ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , "shutdown - disconnect all clients and shutdown" ) ;
2007-03-27 08:10:15 +00:00
break ;
case "show" :
Show ( cmdparams [ 0 ] ) ;
break ;
2007-04-20 05:39:01 +00:00
case "terrain" :
2007-04-24 18:01:37 +00:00
string result = "" ;
2007-04-25 13:03:48 +00:00
if ( ! LocalWorld . Terrain . RunTerrainCmd ( cmdparams , ref result ) )
2007-04-24 18:01:37 +00:00
{
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , result ) ;
2007-04-24 18:01:37 +00:00
}
2007-03-27 08:10:15 +00:00
break ;
case "shutdown" :
2007-03-28 05:27:20 +00:00
Shutdown ( ) ;
2007-03-27 08:10:15 +00:00
break ;
2007-04-20 05:39:01 +00:00
default :
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , "Unknown command" ) ;
2007-04-20 05:39:01 +00:00
break ;
}
}
2007-04-07 17:37:04 +00:00
/// <summary>
/// Outputs to the console information about the region
/// </summary>
/// <param name="ShowWhat">What information to display (valid arguments are "uptime", "users")</param>
2007-03-27 08:10:15 +00:00
public void Show ( string ShowWhat )
{
switch ( ShowWhat )
{
case "uptime" :
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , "OpenSim has been running since " + startuptime . ToString ( ) ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , "That is " + ( DateTime . Now - startuptime ) . ToString ( ) ) ;
2007-03-27 08:10:15 +00:00
break ;
case "users" :
OpenSim . world . Avatar TempAv ;
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , String . Format ( "{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}" , "Firstname" , "Lastname" , "Agent ID" , "Session ID" , "Circuit" , "IP" ) ) ;
2007-03-28 13:08:27 +00:00
foreach ( libsecondlife . LLUUID UUID in LocalWorld . Entities . Keys )
2007-03-27 08:10:15 +00:00
{
2007-03-28 13:08:27 +00:00
if ( LocalWorld . Entities [ UUID ] . ToString ( ) = = "OpenSim.world.Avatar" )
2007-03-27 08:10:15 +00:00
{
2007-03-28 13:08:27 +00:00
TempAv = ( OpenSim . world . Avatar ) LocalWorld . Entities [ UUID ] ;
2007-05-16 12:44:58 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , String . Format ( "{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}" , TempAv . firstname , TempAv . lastname , UUID , TempAv . ControllingClient . SessionID , TempAv . ControllingClient . CircuitCode , TempAv . ControllingClient . userEP . ToString ( ) ) ) ;
2007-03-27 08:10:15 +00:00
}
}
break ;
}
}
2007-05-16 12:44:58 +00:00
# endregion
2007-03-22 10:11:15 +00:00
}
2007-03-29 11:08:42 +00:00
2007-03-22 10:11:15 +00:00
}