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-03-28 13:08:27 +00:00
public class OpenSimMain : OpenSimNetworkHandler , conscmd_callback
2007-03-22 10:11:15 +00:00
{
2007-04-04 19:55:31 +00:00
//private SimConfig Cfg;
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 ;
2007-04-01 20:42:42 +00:00
private PacketServer _packetServer ;
private World LocalWorld ;
2007-03-28 13:08:27 +00:00
private AssetCache AssetCache ;
private InventoryCache InventoryCache ;
2007-04-01 20:42:42 +00:00
//private Dictionary<uint, SimClient> ClientThreads = new Dictionary<uint, SimClient>();
2007-03-28 13:08:27 +00:00
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
public Socket Server ;
private IPEndPoint ServerIncoming ;
private byte [ ] RecvBuffer = new byte [ 4096 ] ;
private byte [ ] ZeroBuffer = new byte [ 8192 ] ;
private IPEndPoint ipeSender ;
private EndPoint epSender ;
private AsyncCallback ReceivedData ;
2007-03-29 18:21:04 +00:00
private System . Timers . Timer m_heartbeatTimer = new System . Timers . Timer ( ) ;
2007-04-02 15:48:01 +00:00
//private string ConfigDll = "OpenSim.Config.SimConfigDb4o.dll";
2007-03-28 05:27:20 +00:00
public string m_physicsEngine ;
public bool m_sandbox = false ;
public bool m_loginserver ;
2007-04-25 13:03:48 +00:00
public OpenGridProtocolServer OGSServer ;
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-03-27 08:10:15 +00:00
protected ConsoleBase m_console ;
2007-03-29 11:08:42 +00:00
2007-04-27 20:32:02 +00:00
public OpenSimMain ( bool sandBoxMode , bool startLoginServer , string physicsEngine , bool useConfigFile , bool verbose , 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-08 14:37:04 +00:00
m_console = new ConsoleBase ( "region-console-" + Guid . NewGuid ( ) . ToString ( ) + ".log" , "Region" , this , verbose ) ;
2007-03-27 08:10:15 +00:00
OpenSim . Framework . Console . MainConsole . Instance = m_console ;
2007-03-22 10:11:15 +00:00
}
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-12 15:32:04 +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-04-02 12:56:35 +00:00
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-03-28 13:08:27 +00:00
GridServers . AssetDll = "OpenSim.GridInterfaces.Local.dll" ;
GridServers . GridDll = "OpenSim.GridInterfaces.Local.dll" ;
2007-03-29 11:08:42 +00:00
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Starting in Sandbox mode" ) ;
2007-03-28 05:27:20 +00:00
}
else
{
2007-04-17 13:39:21 +00:00
if ( this . gridLocalAsset )
{
GridServers . AssetDll = "OpenSim.GridInterfaces.Local.dll" ;
}
else
{
GridServers . AssetDll = "OpenSim.GridInterfaces.Remote.dll" ;
}
2007-03-28 13:08:27 +00:00
GridServers . GridDll = "OpenSim.GridInterfaces.Remote.dll" ;
2007-03-28 05:27:20 +00:00
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Starting in Grid mode" ) ;
2007-03-28 05:27:20 +00:00
}
2007-05-07 16:32:30 +00:00
try
{
GridServers . Initialise ( ) ;
}
catch ( Exception e )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . HIGH , e . Message + "\nSorry, could not setup the grid interface" ) ;
2007-05-07 16:32:30 +00:00
Environment . Exit ( 1 ) ;
}
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-12 15:32:04 +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-04-02 15:48:01 +00:00
PacketServer packetServer = new PacketServer ( this ) ;
2007-04-01 20:42:42 +00:00
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
GridServers . AssetServer . SetServerInfo ( regionData . AssetURL , regionData . AssetSendKey ) ;
IGridServer gridServer = GridServers . GridServer ;
gridServer . SetServerInfo ( regionData . GridURL , regionData . GridSendKey , regionData . GridRecvKey ) ;
if ( ! m_sandbox )
{
if ( GridServers . GridServer . RequestConnection ( regionData . SimUUID , regionData . IPListenAddr , ( uint ) regionData . IPListenPort ) )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Success: Got a grid connection OK!" ) ;
2007-05-04 07:23:41 +00:00
}
else
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . CRITICAL , "Main.cs:Startup() - FAILED: Unable to get connection to grid. Shutting down." ) ;
2007-05-04 07:23:41 +00:00
Shutdown ( ) ;
}
GridServers . AssetServer . SetServerInfo ( ( string ) ( ( RemoteGridBase ) GridServers . GridServer ) . GridData [ "asset_url" ] , ( string ) ( ( RemoteGridBase ) GridServers . GridServer ) . GridData [ "asset_sendkey" ] ) ;
// If we are being told to load a file, load it.
2007-05-08 14:16:01 +00:00
string dataUri = ( string ) ( ( RemoteGridBase ) GridServers . GridServer ) . GridData [ "data_uri" ] ;
if ( ! String . IsNullOrEmpty ( dataUri ) )
2007-05-04 07:23:41 +00:00
{
2007-05-08 14:16:01 +00:00
this . LocalWorld . m_datastore = dataUri ;
2007-05-04 07:23:41 +00:00
}
2007-05-04 07:43:07 +00:00
if ( ( ( RemoteGridBase ) ( GridServers . GridServer ) ) . GridData [ "regionname" ] . ToString ( ) ! = "" )
{
// The grid server has told us who we are
// We must obey the grid server.
2007-05-07 16:32:30 +00:00
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 )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . CRITICAL , e . Message + "\nBAD ERROR! THIS SHOULD NOT HAPPEN! Bad GridData from the grid interface!!!! ZOMG!!!" ) ;
2007-05-07 16:32:30 +00:00
Environment . Exit ( 1 ) ;
}
2007-05-04 07:43:07 +00:00
}
2007-05-04 07:23:41 +00:00
}
2007-05-12 15:32:04 +00:00
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-13 12:25:08 +00:00
LocalWorld = new World ( this . _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-04-01 20:42:42 +00:00
this . _packetServer . LocalWorld = LocalWorld ;
this . _packetServer . RegisterClientPacketHandlers ( ) ;
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-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Starting up messaging system" ) ;
2007-03-28 13:08:27 +00:00
LocalWorld . PhysScene = this . physManager . GetPhysicsScene ( this . m_physicsEngine ) ; //should be reading from the config file what physics engine to use
2007-04-06 19:08:24 +00:00
LocalWorld . PhysScene . SetTerrain ( LocalWorld . Terrain . getHeights1D ( ) ) ;
2007-03-22 10:11:15 +00:00
2007-03-28 13:08:27 +00:00
LocalWorld . LoadPrimsFromStorage ( ) ;
2007-03-22 10:11:15 +00:00
2007-03-29 11:08:42 +00:00
if ( m_sandbox )
2007-03-22 10:11:15 +00:00
{
2007-03-28 13:08:27 +00:00
AssetCache . LoadDefaultTextureSet ( ) ;
2007-03-22 10:11:15 +00:00
}
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Initialising HTTP server" ) ;
2007-03-29 11:08:42 +00:00
// HttpServer = new SimCAPSHTTPServer(GridServers.GridServer, Cfg.IPListenPort);
2007-04-15 09:45:34 +00:00
BaseHttpServer httpServer = new BaseHttpServer ( regionData . IPListenPort ) ;
2007-03-29 11:08:42 +00:00
if ( gridServer . GetName ( ) = = "Remote" )
{
2007-04-25 13:03:48 +00:00
// should startup the OGS protocol server here
2007-05-07 16:32:30 +00:00
// Are we actually using this?
2007-05-04 07:43:07 +00:00
OGSServer = new OpenGridProtocolServer ( this . regionData . IPListenPort - 500 ) ; // Changed so we can have more than one OGSServer per machine.
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 ;
}
if ( ( ( RemoteGridBase ) gridServer ) . agentcircuits . ContainsKey ( ( uint ) agent_data . circuitcode ) )
{
( ( RemoteGridBase ) gridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] = agent_data ;
}
else
{
( ( RemoteGridBase ) gridServer ) . agentcircuits . Add ( ( uint ) agent_data . circuitcode , agent_data ) ;
}
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" ] ) ) ;
if ( ( ( RemoteGridBase ) gridServer ) . agentcircuits . ContainsKey ( ( uint ) agent_data . circuitcode ) )
{
( ( RemoteGridBase ) gridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] . firstname = agent_data . firstname ;
( ( RemoteGridBase ) gridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] . lastname = agent_data . lastname ;
( ( RemoteGridBase ) gridServer ) . agentcircuits [ ( uint ) agent_data . circuitcode ] . startpos = agent_data . startpos ;
}
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-03-28 18:10:52 +00:00
LoginServer loginServer = null ;
2007-03-29 18:21:04 +00:00
LoginServer adminLoginServer = null ;
bool sandBoxWithLoginServer = m_loginserver & & m_sandbox ;
if ( sandBoxWithLoginServer )
2007-03-28 05:27:20 +00:00
{
2007-05-08 16:40:20 +00:00
loginServer = new LoginServer ( gridServer , regionData . IPListenAddr , regionData . IPListenPort , regionData . RegionLocX , regionData . RegionLocY , this . user_accounts ) ;
2007-03-28 05:27:20 +00:00
loginServer . Startup ( ) ;
2007-04-03 13:37:11 +00:00
if ( user_accounts )
2007-03-29 18:21:04 +00:00
{
//sandbox mode with loginserver using accounts
this . GridServers . UserServer = loginServer ;
adminLoginServer = loginServer ;
2007-04-03 13:37:11 +00:00
2007-04-11 20:07:58 +00:00
httpServer . AddXmlRPCHandler ( "login_to_simulator" , loginServer . LocalUserManager . XmlRpcLoginMethod ) ;
2007-03-29 18:21:04 +00:00
}
else
{
//sandbox mode with loginserver not using accounts
2007-04-11 20:07:58 +00:00
httpServer . AddXmlRPCHandler ( "login_to_simulator" , loginServer . XmlRpcLoginMethod ) ;
2007-03-29 18:21:04 +00:00
}
2007-03-28 05:27:20 +00:00
}
2007-03-30 10:14:15 +00:00
AdminWebFront adminWebFront = new AdminWebFront ( "Admin" , LocalWorld , InventoryCache , adminLoginServer ) ;
2007-04-11 20:07:58 +00:00
adminWebFront . LoadMethods ( httpServer ) ;
2007-04-03 13:37:11 +00:00
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Starting HTTP server" ) ;
2007-04-11 20:07:58 +00:00
httpServer . Start ( ) ;
2007-04-25 13:03:48 +00:00
if ( gridServer . GetName ( ) = = "Remote" )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:Startup() - Starting up OGS protocol server" ) ;
2007-04-25 13:03:48 +00:00
OGSServer . Start ( ) ;
}
2007-03-28 05:27:20 +00:00
MainServerListener ( ) ;
2007-03-29 18:21:04 +00:00
m_heartbeatTimer . Enabled = true ;
m_heartbeatTimer . Interval = 100 ;
m_heartbeatTimer . Elapsed + = new ElapsedEventHandler ( this . Heartbeat ) ;
2007-03-22 10:11:15 +00:00
}
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-12 15:32:04 +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-03-22 10:11:15 +00:00
private SimConfig LoadConfigDll ( string dllName )
{
2007-05-07 16:32:30 +00:00
try
2007-03-22 10:11:15 +00:00
{
2007-05-07 16:32:30 +00:00
Assembly pluginAssembly = Assembly . LoadFrom ( dllName ) ;
SimConfig config = null ;
foreach ( Type pluginType in pluginAssembly . GetTypes ( ) )
2007-03-22 10:11:15 +00:00
{
2007-05-07 16:32:30 +00:00
if ( pluginType . IsPublic )
2007-03-22 10:11:15 +00:00
{
2007-05-07 16:32:30 +00:00
if ( ! pluginType . IsAbstract )
2007-03-22 10:11:15 +00:00
{
2007-05-07 16:32:30 +00:00
Type typeInterface = pluginType . GetInterface ( "ISimConfig" , true ) ;
2007-03-22 10:11:15 +00:00
2007-05-07 16:32:30 +00:00
if ( typeInterface ! = null )
{
ISimConfig plug = ( ISimConfig ) Activator . CreateInstance ( pluginAssembly . GetType ( pluginType . ToString ( ) ) ) ;
config = plug . GetConfigObject ( ) ;
break ;
}
typeInterface = null ;
}
2007-03-22 10:11:15 +00:00
}
}
2007-05-07 16:32:30 +00:00
pluginAssembly = null ;
return config ;
}
catch ( Exception e )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . CRITICAL , e . Message + "\nSorry, a fatal error occurred while trying to load the config DLL" ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . CRITICAL , "Can not continue starting up" ) ;
2007-05-07 16:32:30 +00:00
Environment . Exit ( 1 ) ;
return null ;
2007-03-22 10:11:15 +00:00
}
}
2007-04-17 12:03:52 +00:00
2007-03-22 10:11:15 +00:00
private void OnReceivedData ( IAsyncResult result )
{
ipeSender = new IPEndPoint ( IPAddress . Any , 0 ) ;
epSender = ( EndPoint ) ipeSender ;
Packet packet = null ;
int numBytes = Server . EndReceiveFrom ( result , ref epSender ) ;
int packetEnd = numBytes - 1 ;
2007-04-25 18:12:06 +00:00
2007-03-22 10:11:15 +00:00
packet = Packet . BuildPacket ( RecvBuffer , ref packetEnd , ZeroBuffer ) ;
2007-03-29 11:08:42 +00:00
2007-03-22 10:11:15 +00:00
// This is either a new client or a packet to send to an old one
2007-03-29 11:08:42 +00:00
// if (OpenSimRoot.Instance.ClientThreads.ContainsKey(epSender))
2007-03-22 10:11:15 +00:00
// do we already have a circuit for this endpoint
2007-03-29 11:08:42 +00:00
if ( this . clientCircuits . ContainsKey ( epSender ) )
2007-03-22 10:11:15 +00:00
{
2007-04-01 20:42:42 +00:00
//ClientThreads[this.clientCircuits[epSender]].InPacket(packet);
this . _packetServer . ClientInPacket ( this . clientCircuits [ epSender ] , packet ) ;
2007-03-22 10:11:15 +00:00
}
else if ( packet . Type = = PacketType . UseCircuitCode )
{ // new client
2007-04-15 09:45:34 +00:00
2007-03-22 10:11:15 +00:00
UseCircuitCodePacket useCircuit = ( UseCircuitCodePacket ) packet ;
this . clientCircuits . Add ( epSender , useCircuit . CircuitCode . Code ) ;
2007-04-15 09:45:34 +00:00
bool isChildAgent = false ;
if ( this . GridServers . GridServer . GetName ( ) = = "Remote" )
{
isChildAgent = ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ useCircuit . CircuitCode . Code ] . child ;
}
2007-04-17 12:03:52 +00:00
SimClient newuser = new SimClient ( epSender , useCircuit , LocalWorld , _packetServer . ClientThreads , AssetCache , GridServers . GridServer , this , InventoryCache , m_sandbox , isChildAgent , this . regionData ) ;
2007-03-28 18:10:52 +00:00
if ( ( this . GridServers . UserServer ! = null ) & & ( user_accounts ) )
{
newuser . UserServer = this . GridServers . UserServer ;
}
2007-03-22 10:11:15 +00:00
//OpenSimRoot.Instance.ClientThreads.Add(epSender, newuser);
2007-04-01 20:42:42 +00:00
this . _packetServer . ClientThreads . Add ( useCircuit . CircuitCode . Code , newuser ) ;
2007-04-15 09:45:34 +00:00
//if (!((RemoteGridBase)GridServers.GridServer).agentcircuits[useCircuit.CircuitCode.Code].child)
if ( ( this . GridServers . GridServer . GetName ( ) = = "Remote" ) & & ( ! isChildAgent ) )
{
Hashtable SimParams ;
ArrayList SendParams ;
XmlRpcRequest GridReq ;
XmlRpcResponse GridResp ;
foreach ( Hashtable neighbour in ( ( RemoteGridBase ) this . GridServers . GridServer ) . neighbours )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . VERBOSE , "http://" + neighbour [ "sim_ip" ] + ":" + neighbour [ "sim_port" ] ) ;
2007-04-15 09:45:34 +00:00
SimParams = new Hashtable ( ) ;
SimParams [ "session_id" ] = ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ useCircuit . CircuitCode . Code ] . SessionID . ToString ( ) ;
SimParams [ "secure_session_id" ] = ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ useCircuit . CircuitCode . Code ] . SecureSessionID . ToString ( ) ;
SimParams [ "firstname" ] = ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ useCircuit . CircuitCode . Code ] . firstname ;
SimParams [ "lastname" ] = ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ useCircuit . CircuitCode . Code ] . lastname ;
SimParams [ "agent_id" ] = ( ( RemoteGridBase ) this . GridServers . GridServer ) . agentcircuits [ useCircuit . CircuitCode . Code ] . AgentID . ToString ( ) ;
SimParams [ "circuit_code" ] = ( Int32 ) useCircuit . CircuitCode . Code ;
SimParams [ "child_agent" ] = "1" ;
SendParams = new ArrayList ( ) ;
SendParams . Add ( SimParams ) ;
GridReq = new XmlRpcRequest ( "expect_user" , SendParams ) ;
GridResp = GridReq . Send ( "http://" + neighbour [ "sim_ip" ] + ":" + neighbour [ "sim_port" ] , 3000 ) ;
EnableSimulatorPacket enablesimpacket = new EnableSimulatorPacket ( ) ;
enablesimpacket . SimulatorInfo = new EnableSimulatorPacket . SimulatorInfoBlock ( ) ;
enablesimpacket . SimulatorInfo . Handle = Helpers . UIntsToLong ( ( uint ) ( Convert . ToInt32 ( neighbour [ "region_locx" ] ) * 256 ) , ( uint ) ( Convert . ToInt32 ( neighbour [ "region_locy" ] ) * 256 ) ) ;
System . Net . IPAddress neighbourIP = System . Net . IPAddress . Parse ( ( string ) neighbour [ "sim_ip" ] ) ;
byte [ ] byteIP = neighbourIP . GetAddressBytes ( ) ;
enablesimpacket . SimulatorInfo . IP = ( uint ) byteIP [ 3 ] < < 24 ;
enablesimpacket . SimulatorInfo . IP + = ( uint ) byteIP [ 2 ] < < 16 ;
enablesimpacket . SimulatorInfo . IP + = ( uint ) byteIP [ 1 ] < < 8 ;
enablesimpacket . SimulatorInfo . IP + = ( uint ) byteIP [ 0 ] ;
enablesimpacket . SimulatorInfo . Port = ( ushort ) Convert . ToInt32 ( neighbour [ "sim_port" ] ) ;
Thread . Sleep ( 3000 ) ;
_packetServer . ClientThreads [ useCircuit . CircuitCode . Code ] . OutPacket ( enablesimpacket ) ;
}
}
2007-03-22 10:11:15 +00:00
}
else
{ // invalid client
Console . Error . WriteLine ( "Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender . ToString ( ) ) ;
}
2007-04-25 18:12:06 +00:00
2007-03-22 10:11:15 +00:00
Server . BeginReceiveFrom ( RecvBuffer , 0 , RecvBuffer . Length , SocketFlags . None , ref epSender , ReceivedData , null ) ;
}
private void MainServerListener ( )
{
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:MainServerListener() - New thread started" ) ;
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:MainServerListener() - Opening UDP socket on " + regionData . IPListenAddr + ":" + regionData . IPListenPort ) ;
2007-03-22 10:11:15 +00:00
2007-04-02 15:48:01 +00:00
ServerIncoming = new IPEndPoint ( IPAddress . Any , regionData . IPListenPort ) ;
2007-03-22 10:11:15 +00:00
Server = new Socket ( AddressFamily . InterNetwork , SocketType . Dgram , ProtocolType . Udp ) ;
Server . Bind ( ServerIncoming ) ;
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:MainServerListener() - UDP socket bound, getting ready to listen" ) ;
2007-03-22 10:11:15 +00:00
ipeSender = new IPEndPoint ( IPAddress . Any , 0 ) ;
epSender = ( EndPoint ) ipeSender ;
ReceivedData = new AsyncCallback ( this . OnReceivedData ) ;
Server . BeginReceiveFrom ( RecvBuffer , 0 , RecvBuffer . Length , SocketFlags . None , ref epSender , ReceivedData , null ) ;
2007-05-12 15:32:04 +00:00
m_console . WriteLine ( OpenSim . Framework . Console . LogPriority . LOW , "Main.cs:MainServerListener() - Listening..." ) ;
2007-03-22 10:11:15 +00:00
}
2007-04-01 20:42:42 +00:00
public void RegisterPacketServer ( PacketServer server )
{
this . _packetServer = server ;
}
2007-03-29 11:08:42 +00:00
public virtual void SendPacketTo ( byte [ ] buffer , int size , SocketFlags flags , uint circuitcode ) //EndPoint packetSender)
2007-03-22 10:11:15 +00:00
{
// find the endpoint for this circuit
EndPoint sendto = null ;
2007-03-29 11:08:42 +00:00
foreach ( KeyValuePair < EndPoint , uint > p in this . clientCircuits )
2007-03-22 10:11:15 +00:00
{
if ( p . Value = = circuitcode )
{
sendto = p . Key ;
break ;
}
}
if ( sendto ! = null )
{
//we found the endpoint so send the packet to it
this . Server . SendTo ( buffer , size , flags , sendto ) ;
}
}
2007-03-28 13:08:27 +00:00
public virtual void RemoveClientCircuit ( uint circuitcode )
2007-03-22 10:11:15 +00:00
{
foreach ( KeyValuePair < EndPoint , uint > p in this . clientCircuits )
{
if ( p . Value = = circuitcode )
{
this . clientCircuits . Remove ( p . Key ) ;
break ;
}
}
}
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-12 15:32:04 +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-12 15:32:04 +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-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-12 15:32:04 +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-12 15:32:04 +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-12 15:32:04 +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-12 15:32:04 +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-12 15:32:04 +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-12 15:32:04 +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-03-22 10:11:15 +00:00
}
2007-03-29 11:08:42 +00:00
2007-03-22 10:11:15 +00:00
}