diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index d3c1102fce..c6956fc2b9 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Reflection; using System.Text; @@ -67,6 +68,9 @@ namespace OpenSim private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache"; private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient"; + // OpenSim.ini Section name for ESTATES Settings + public const string ESTATE_SECTION_NAME = "Estates"; + protected string proxyUrl; protected int proxyOffset = 0; @@ -445,12 +449,42 @@ namespace OpenSim { RegionInfo regionInfo = scene.RegionInfo; + string estateOwnerFirstName = null; + string estateOwnerLastName = null; + string estateOwnerEMail = null; + string estateOwnerPassword = null; + string rawEstateOwnerUuid = null; + + if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) + { + string defaultEstateOwnerName + = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerName", "").Trim(); + string[] ownerNames = defaultEstateOwnerName.Split(' '); + + if (ownerNames.Length >= 2) + { + estateOwnerFirstName = ownerNames[0]; + estateOwnerLastName = ownerNames[1]; + } + + // Info to be used only on Standalone Mode + rawEstateOwnerUuid = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerUUID", null); + estateOwnerEMail = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerEMail", null); + estateOwnerPassword = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerPassword", null); + } + MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); List excluded = new List(new char[1]{' '}); - string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); - string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); - UserAccount account = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, first, last); + + if (estateOwnerFirstName == null || estateOwnerLastName == null) + { + estateOwnerFirstName = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); + estateOwnerLastName = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); + } + + UserAccount account + = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, estateOwnerFirstName, estateOwnerLastName); if (account == null) { @@ -469,23 +503,35 @@ namespace OpenSim if (scene.UserAccountService is UserAccountService) { - string password = MainConsole.Instance.PasswdPrompt("Password"); - string email = MainConsole.Instance.CmdPrompt("Email", ""); + if (estateOwnerPassword == null) + estateOwnerPassword = MainConsole.Instance.PasswdPrompt("Password"); - string rawPrincipalId = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); + if (estateOwnerEMail == null) + estateOwnerEMail = MainConsole.Instance.CmdPrompt("Email"); + + if (rawEstateOwnerUuid == null) + rawEstateOwnerUuid = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); - UUID principalId = UUID.Zero; - if (!UUID.TryParse(rawPrincipalId, out principalId)) + UUID estateOwnerUuid = UUID.Zero; + if (!UUID.TryParse(rawEstateOwnerUuid, out estateOwnerUuid)) { - m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawPrincipalId); + m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawEstateOwnerUuid); return; } + // If we've been given a zero uuid then this signals that we should use a random user id + if (estateOwnerUuid == UUID.Zero) + estateOwnerUuid = UUID.Random(); + account = ((UserAccountService)scene.UserAccountService).CreateUser( - regionInfo.ScopeID, principalId, first, last, password, email); + regionInfo.ScopeID, + estateOwnerUuid, + estateOwnerFirstName, + estateOwnerLastName, + estateOwnerPassword, + estateOwnerEMail); } -// } } if (account == null) @@ -885,15 +931,21 @@ namespace OpenSim /// This method doesn't allow an estate to be created with the same name as existing estates. /// /// - /// A list of estate names that already exist. + /// A list of estate names that already exist. + /// Estate name to create if already known /// true if the estate was created, false otherwise - public bool CreateEstate(RegionInfo regInfo, List existingNames) + public bool CreateEstate(RegionInfo regInfo, Dictionary estatesByName, string estateName) { // Create a new estate regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); - string newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); - if (existingNames.Contains(newName)) + string newName; + if (estateName != null && estateName != "") + newName = estateName; + else + newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); + + if (estatesByName.ContainsKey(newName)) { MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); return false; @@ -920,66 +972,102 @@ namespace OpenSim if (EstateDataService != null) regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); - if (regInfo.EstateSettings.EstateID == 0) // No record at all + if (regInfo.EstateSettings.EstateID != 0) + return; + + m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); + + List estates = EstateDataService.LoadEstateSettingsAll(); + Dictionary estatesByName = new Dictionary(); + + foreach (EstateSettings estate in estates) + estatesByName[estate.EstateName] = estate; + + string defaultEstateName = null; + + if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) { - m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); - - List estates = EstateDataService.LoadEstateSettingsAll(); - List estateNames = new List(); - foreach (EstateSettings estate in estates) - estateNames.Add(estate.EstateName); - - while (true) + defaultEstateName = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateName", null); + + if (defaultEstateName != null) { - if (estates.Count == 0) - { - m_log.Info("[ESTATE] No existing estates found. You must create a new one."); - - if (CreateEstate(regInfo, estateNames)) - break; + EstateSettings defaultEstate; + bool defaultEstateJoined = false; + + if (estatesByName.ContainsKey(defaultEstateName)) + { + defaultEstate = estatesByName[defaultEstateName]; + + if (EstateDataService.LinkRegion(regInfo.RegionID, (int)defaultEstate.EstateID)) + defaultEstateJoined = true; + } + else + { + if (CreateEstate(regInfo, estatesByName, defaultEstateName)) + defaultEstateJoined = true; + } + + if (defaultEstateJoined) + return; + else + m_log.ErrorFormat( + "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); + } + } + + // If we have no default estate or creation of the default estate failed then ask the user. + while (true) + { + if (estates.Count == 0) + { + m_log.Info("[ESTATE]: No existing estates found. You must create a new one."); + + if (CreateEstate(regInfo, estatesByName, null)) + break; + else + continue; + } + else + { + string response + = MainConsole.Instance.CmdPrompt( + string.Format( + "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), + "yes", + new List() { "yes", "no" }); + + if (response == "no") + { + if (CreateEstate(regInfo, estatesByName, null)) + break; else continue; } else { - string response + string[] estateNames = estatesByName.Keys.ToArray(); + response = MainConsole.Instance.CmdPrompt( string.Format( - "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), - "yes", - new List() { "yes", "no" }); - - if (response == "no") + "Name of estate to join. Existing estate names are ({0})", + string.Join(", ", estateNames)), + estateNames[0]); + + List estateIDs = EstateDataService.GetEstates(response); + if (estateIDs.Count < 1) { - if (CreateEstate(regInfo, estateNames)) - break; - else - continue; - } - else - { - response - = MainConsole.Instance.CmdPrompt( - string.Format( - "Name of estate to join. Existing estate names are ({0})", string.Join(", ", estateNames.ToArray())), - estateNames[0]); - - List estateIDs = EstateDataService.GetEstates(response); - if (estateIDs.Count < 1) - { - MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); - continue; - } - - int estateID = estateIDs[0]; - - regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); - - if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) - break; - - MainConsole.Instance.Output("Joining the estate failed. Please try again."); + MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); + continue; } + + int estateID = estateIDs[0]; + + regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); + + if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) + break; + + MainConsole.Instance.Output("Joining the estate failed. Please try again."); } } } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index a820ddf93f..08a6194fb2 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -36,7 +36,6 @@ [Startup] - ;# {ConsolePrompt} {} {ConsolePrompt} {} "Region (\R) " ;; Console prompt ;; Certain special characters can be used to customize the prompt @@ -232,6 +231,24 @@ ;; server to send mail through. ; emailmodule = DefaultEmailModule +[Estates] + ; If these values are commented out then the user will be asked for estate details when required (this is the normal case). + ; If these values are uncommented then they will be used to create a default estate as necessary. + ; New regions will be automatically assigned to that default estate. + + ; DefaultEstateName = My Estate + ; DefaultEstateOwnerName = FirstName LastName + + ; The following parameters will only be used on a standalone system to create an estate owner that does not already exist + + ; If DefaultEstateOwnerUUID is left at UUID.Zero (as below) then a random UUID will be assigned. + ; This is normally what you want + ; DefaultEstateOwnerUUID = 00000000-0000-0000-0000-000000000000 + + ; DefaultEstateOwnerEMail = owner@domain.com + ; DefaultEstateOwnerPassword = password + + [SMTP] ;; The SMTP server enabled the email module to send email to external ;; destinations. @@ -753,8 +770,7 @@ ;; groups service if the service is using these keys ; XmlRpcServiceReadKey = 1234 ; XmlRpcServiceWriteKey = 1234 - - + [InterestManagement] ;# {UpdatePrioritizationScheme} {} {Update prioritization scheme?} {BestAvatarResponsiveness Time Distance SimpleAngularDistance FrontBack} BestAvatarResponsiveness ;; This section controls how state updates are prioritized for each client