diff options
-rw-r--r-- | OpenSim/Region/Application/OpenSimBase.cs | 216 | ||||
-rwxr-xr-x | bin/OpenSim.ini.example | 22 |
2 files changed, 171 insertions, 67 deletions
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index d3c1102..c6956fc 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.IO; | 30 | using System.IO; |
31 | using System.Linq; | ||
31 | using System.Net; | 32 | using System.Net; |
32 | using System.Reflection; | 33 | using System.Reflection; |
33 | using System.Text; | 34 | using System.Text; |
@@ -67,6 +68,9 @@ namespace OpenSim | |||
67 | private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache"; | 68 | private const string PLUGIN_ASSET_CACHE = "/OpenSim/AssetCache"; |
68 | private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient"; | 69 | private const string PLUGIN_ASSET_SERVER_CLIENT = "/OpenSim/AssetClient"; |
69 | 70 | ||
71 | // OpenSim.ini Section name for ESTATES Settings | ||
72 | public const string ESTATE_SECTION_NAME = "Estates"; | ||
73 | |||
70 | protected string proxyUrl; | 74 | protected string proxyUrl; |
71 | protected int proxyOffset = 0; | 75 | protected int proxyOffset = 0; |
72 | 76 | ||
@@ -445,12 +449,42 @@ namespace OpenSim | |||
445 | { | 449 | { |
446 | RegionInfo regionInfo = scene.RegionInfo; | 450 | RegionInfo regionInfo = scene.RegionInfo; |
447 | 451 | ||
452 | string estateOwnerFirstName = null; | ||
453 | string estateOwnerLastName = null; | ||
454 | string estateOwnerEMail = null; | ||
455 | string estateOwnerPassword = null; | ||
456 | string rawEstateOwnerUuid = null; | ||
457 | |||
458 | if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) | ||
459 | { | ||
460 | string defaultEstateOwnerName | ||
461 | = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerName", "").Trim(); | ||
462 | string[] ownerNames = defaultEstateOwnerName.Split(' '); | ||
463 | |||
464 | if (ownerNames.Length >= 2) | ||
465 | { | ||
466 | estateOwnerFirstName = ownerNames[0]; | ||
467 | estateOwnerLastName = ownerNames[1]; | ||
468 | } | ||
469 | |||
470 | // Info to be used only on Standalone Mode | ||
471 | rawEstateOwnerUuid = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerUUID", null); | ||
472 | estateOwnerEMail = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerEMail", null); | ||
473 | estateOwnerPassword = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerPassword", null); | ||
474 | } | ||
475 | |||
448 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); | 476 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); |
449 | List<char> excluded = new List<char>(new char[1]{' '}); | 477 | List<char> excluded = new List<char>(new char[1]{' '}); |
450 | string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
451 | string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
452 | 478 | ||
453 | UserAccount account = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, first, last); | 479 | |
480 | if (estateOwnerFirstName == null || estateOwnerLastName == null) | ||
481 | { | ||
482 | estateOwnerFirstName = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
483 | estateOwnerLastName = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
484 | } | ||
485 | |||
486 | UserAccount account | ||
487 | = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, estateOwnerFirstName, estateOwnerLastName); | ||
454 | 488 | ||
455 | if (account == null) | 489 | if (account == null) |
456 | { | 490 | { |
@@ -469,23 +503,35 @@ namespace OpenSim | |||
469 | 503 | ||
470 | if (scene.UserAccountService is UserAccountService) | 504 | if (scene.UserAccountService is UserAccountService) |
471 | { | 505 | { |
472 | string password = MainConsole.Instance.PasswdPrompt("Password"); | 506 | if (estateOwnerPassword == null) |
473 | string email = MainConsole.Instance.CmdPrompt("Email", ""); | 507 | estateOwnerPassword = MainConsole.Instance.PasswdPrompt("Password"); |
508 | |||
509 | if (estateOwnerEMail == null) | ||
510 | estateOwnerEMail = MainConsole.Instance.CmdPrompt("Email"); | ||
474 | 511 | ||
475 | string rawPrincipalId = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); | 512 | if (rawEstateOwnerUuid == null) |
513 | rawEstateOwnerUuid = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); | ||
476 | 514 | ||
477 | UUID principalId = UUID.Zero; | 515 | UUID estateOwnerUuid = UUID.Zero; |
478 | if (!UUID.TryParse(rawPrincipalId, out principalId)) | 516 | if (!UUID.TryParse(rawEstateOwnerUuid, out estateOwnerUuid)) |
479 | { | 517 | { |
480 | m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawPrincipalId); | 518 | m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawEstateOwnerUuid); |
481 | return; | 519 | return; |
482 | } | 520 | } |
483 | 521 | ||
522 | // If we've been given a zero uuid then this signals that we should use a random user id | ||
523 | if (estateOwnerUuid == UUID.Zero) | ||
524 | estateOwnerUuid = UUID.Random(); | ||
525 | |||
484 | account | 526 | account |
485 | = ((UserAccountService)scene.UserAccountService).CreateUser( | 527 | = ((UserAccountService)scene.UserAccountService).CreateUser( |
486 | regionInfo.ScopeID, principalId, first, last, password, email); | 528 | regionInfo.ScopeID, |
529 | estateOwnerUuid, | ||
530 | estateOwnerFirstName, | ||
531 | estateOwnerLastName, | ||
532 | estateOwnerPassword, | ||
533 | estateOwnerEMail); | ||
487 | } | 534 | } |
488 | // } | ||
489 | } | 535 | } |
490 | 536 | ||
491 | if (account == null) | 537 | if (account == null) |
@@ -885,15 +931,21 @@ namespace OpenSim | |||
885 | /// This method doesn't allow an estate to be created with the same name as existing estates. | 931 | /// This method doesn't allow an estate to be created with the same name as existing estates. |
886 | /// </remarks> | 932 | /// </remarks> |
887 | /// <param name="regInfo"></param> | 933 | /// <param name="regInfo"></param> |
888 | /// <param name="existingName">A list of estate names that already exist.</param> | 934 | /// <param name="estatesByName">A list of estate names that already exist.</param> |
935 | /// <param name="estateName">Estate name to create if already known</param> | ||
889 | /// <returns>true if the estate was created, false otherwise</returns> | 936 | /// <returns>true if the estate was created, false otherwise</returns> |
890 | public bool CreateEstate(RegionInfo regInfo, List<string> existingNames) | 937 | public bool CreateEstate(RegionInfo regInfo, Dictionary<string, EstateSettings> estatesByName, string estateName) |
891 | { | 938 | { |
892 | // Create a new estate | 939 | // Create a new estate |
893 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); | 940 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); |
894 | string newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); | ||
895 | 941 | ||
896 | if (existingNames.Contains(newName)) | 942 | string newName; |
943 | if (estateName != null && estateName != "") | ||
944 | newName = estateName; | ||
945 | else | ||
946 | newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); | ||
947 | |||
948 | if (estatesByName.ContainsKey(newName)) | ||
897 | { | 949 | { |
898 | MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); | 950 | MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); |
899 | return false; | 951 | return false; |
@@ -920,66 +972,102 @@ namespace OpenSim | |||
920 | if (EstateDataService != null) | 972 | if (EstateDataService != null) |
921 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); | 973 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); |
922 | 974 | ||
923 | if (regInfo.EstateSettings.EstateID == 0) // No record at all | 975 | if (regInfo.EstateSettings.EstateID != 0) |
976 | return; | ||
977 | |||
978 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | ||
979 | |||
980 | List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll(); | ||
981 | Dictionary<string, EstateSettings> estatesByName = new Dictionary<string, EstateSettings>(); | ||
982 | |||
983 | foreach (EstateSettings estate in estates) | ||
984 | estatesByName[estate.EstateName] = estate; | ||
985 | |||
986 | string defaultEstateName = null; | ||
987 | |||
988 | if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) | ||
924 | { | 989 | { |
925 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | 990 | defaultEstateName = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateName", null); |
926 | 991 | ||
927 | List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll(); | 992 | if (defaultEstateName != null) |
928 | List<string> estateNames = new List<string>(); | ||
929 | foreach (EstateSettings estate in estates) | ||
930 | estateNames.Add(estate.EstateName); | ||
931 | |||
932 | while (true) | ||
933 | { | 993 | { |
934 | if (estates.Count == 0) | 994 | EstateSettings defaultEstate; |
935 | { | 995 | bool defaultEstateJoined = false; |
936 | m_log.Info("[ESTATE] No existing estates found. You must create a new one."); | 996 | |
937 | 997 | if (estatesByName.ContainsKey(defaultEstateName)) | |
938 | if (CreateEstate(regInfo, estateNames)) | 998 | { |
939 | break; | 999 | defaultEstate = estatesByName[defaultEstateName]; |
1000 | |||
1001 | if (EstateDataService.LinkRegion(regInfo.RegionID, (int)defaultEstate.EstateID)) | ||
1002 | defaultEstateJoined = true; | ||
1003 | } | ||
1004 | else | ||
1005 | { | ||
1006 | if (CreateEstate(regInfo, estatesByName, defaultEstateName)) | ||
1007 | defaultEstateJoined = true; | ||
1008 | } | ||
1009 | |||
1010 | if (defaultEstateJoined) | ||
1011 | return; | ||
1012 | else | ||
1013 | m_log.ErrorFormat( | ||
1014 | "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); | ||
1015 | } | ||
1016 | } | ||
1017 | |||
1018 | // If we have no default estate or creation of the default estate failed then ask the user. | ||
1019 | while (true) | ||
1020 | { | ||
1021 | if (estates.Count == 0) | ||
1022 | { | ||
1023 | m_log.Info("[ESTATE]: No existing estates found. You must create a new one."); | ||
1024 | |||
1025 | if (CreateEstate(regInfo, estatesByName, null)) | ||
1026 | break; | ||
1027 | else | ||
1028 | continue; | ||
1029 | } | ||
1030 | else | ||
1031 | { | ||
1032 | string response | ||
1033 | = MainConsole.Instance.CmdPrompt( | ||
1034 | string.Format( | ||
1035 | "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), | ||
1036 | "yes", | ||
1037 | new List<string>() { "yes", "no" }); | ||
1038 | |||
1039 | if (response == "no") | ||
1040 | { | ||
1041 | if (CreateEstate(regInfo, estatesByName, null)) | ||
1042 | break; | ||
940 | else | 1043 | else |
941 | continue; | 1044 | continue; |
942 | } | 1045 | } |
943 | else | 1046 | else |
944 | { | 1047 | { |
945 | string response | 1048 | string[] estateNames = estatesByName.Keys.ToArray(); |
1049 | response | ||
946 | = MainConsole.Instance.CmdPrompt( | 1050 | = MainConsole.Instance.CmdPrompt( |
947 | string.Format( | 1051 | string.Format( |
948 | "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), | 1052 | "Name of estate to join. Existing estate names are ({0})", |
949 | "yes", | 1053 | string.Join(", ", estateNames)), |
950 | new List<string>() { "yes", "no" }); | 1054 | estateNames[0]); |
951 | 1055 | ||
952 | if (response == "no") | 1056 | List<int> estateIDs = EstateDataService.GetEstates(response); |
1057 | if (estateIDs.Count < 1) | ||
953 | { | 1058 | { |
954 | if (CreateEstate(regInfo, estateNames)) | 1059 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); |
955 | break; | 1060 | continue; |
956 | else | ||
957 | continue; | ||
958 | } | ||
959 | else | ||
960 | { | ||
961 | response | ||
962 | = MainConsole.Instance.CmdPrompt( | ||
963 | string.Format( | ||
964 | "Name of estate to join. Existing estate names are ({0})", string.Join(", ", estateNames.ToArray())), | ||
965 | estateNames[0]); | ||
966 | |||
967 | List<int> estateIDs = EstateDataService.GetEstates(response); | ||
968 | if (estateIDs.Count < 1) | ||
969 | { | ||
970 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); | ||
971 | continue; | ||
972 | } | ||
973 | |||
974 | int estateID = estateIDs[0]; | ||
975 | |||
976 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); | ||
977 | |||
978 | if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) | ||
979 | break; | ||
980 | |||
981 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
982 | } | 1061 | } |
1062 | |||
1063 | int estateID = estateIDs[0]; | ||
1064 | |||
1065 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); | ||
1066 | |||
1067 | if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) | ||
1068 | break; | ||
1069 | |||
1070 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
983 | } | 1071 | } |
984 | } | 1072 | } |
985 | } | 1073 | } |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index a820ddf..08a6194 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -36,7 +36,6 @@ | |||
36 | 36 | ||
37 | 37 | ||
38 | [Startup] | 38 | [Startup] |
39 | |||
40 | ;# {ConsolePrompt} {} {ConsolePrompt} {} "Region (\R) " | 39 | ;# {ConsolePrompt} {} {ConsolePrompt} {} "Region (\R) " |
41 | ;; Console prompt | 40 | ;; Console prompt |
42 | ;; Certain special characters can be used to customize the prompt | 41 | ;; Certain special characters can be used to customize the prompt |
@@ -232,6 +231,24 @@ | |||
232 | ;; server to send mail through. | 231 | ;; server to send mail through. |
233 | ; emailmodule = DefaultEmailModule | 232 | ; emailmodule = DefaultEmailModule |
234 | 233 | ||
234 | [Estates] | ||
235 | ; If these values are commented out then the user will be asked for estate details when required (this is the normal case). | ||
236 | ; If these values are uncommented then they will be used to create a default estate as necessary. | ||
237 | ; New regions will be automatically assigned to that default estate. | ||
238 | |||
239 | ; DefaultEstateName = My Estate | ||
240 | ; DefaultEstateOwnerName = FirstName LastName | ||
241 | |||
242 | ; The following parameters will only be used on a standalone system to create an estate owner that does not already exist | ||
243 | |||
244 | ; If DefaultEstateOwnerUUID is left at UUID.Zero (as below) then a random UUID will be assigned. | ||
245 | ; This is normally what you want | ||
246 | ; DefaultEstateOwnerUUID = 00000000-0000-0000-0000-000000000000 | ||
247 | |||
248 | ; DefaultEstateOwnerEMail = owner@domain.com | ||
249 | ; DefaultEstateOwnerPassword = password | ||
250 | |||
251 | |||
235 | [SMTP] | 252 | [SMTP] |
236 | ;; The SMTP server enabled the email module to send email to external | 253 | ;; The SMTP server enabled the email module to send email to external |
237 | ;; destinations. | 254 | ;; destinations. |
@@ -753,8 +770,7 @@ | |||
753 | ;; groups service if the service is using these keys | 770 | ;; groups service if the service is using these keys |
754 | ; XmlRpcServiceReadKey = 1234 | 771 | ; XmlRpcServiceReadKey = 1234 |
755 | ; XmlRpcServiceWriteKey = 1234 | 772 | ; XmlRpcServiceWriteKey = 1234 |
756 | 773 | ||
757 | |||
758 | [InterestManagement] | 774 | [InterestManagement] |
759 | ;# {UpdatePrioritizationScheme} {} {Update prioritization scheme?} {BestAvatarResponsiveness Time Distance SimpleAngularDistance FrontBack} BestAvatarResponsiveness | 775 | ;# {UpdatePrioritizationScheme} {} {Update prioritization scheme?} {BestAvatarResponsiveness Time Distance SimpleAngularDistance FrontBack} BestAvatarResponsiveness |
760 | ;; This section controls how state updates are prioritized for each client | 776 | ;; This section controls how state updates are prioritized for each client |