diff options
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim/Region/Application/OpenSimBase.cs')
-rw-r--r-- | OpenSim/Region/Application/OpenSimBase.cs | 239 |
1 files changed, 165 insertions, 74 deletions
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index f482d8f..5de3f25 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 | ||
@@ -242,15 +246,18 @@ namespace OpenSim | |||
242 | 246 | ||
243 | foreach (string topic in topics) | 247 | foreach (string topic in topics) |
244 | { | 248 | { |
245 | m_console.Commands.AddCommand("plugin", false, "help " + topic, | 249 | string capitalizedTopic = char.ToUpper(topic[0]) + topic.Substring(1); |
246 | "help " + topic, | 250 | |
251 | // This is a hack to allow the user to enter the help command in upper or lowercase. This will go | ||
252 | // away at some point. | ||
253 | m_console.Commands.AddCommand(capitalizedTopic, false, "help " + topic, | ||
254 | "help " + capitalizedTopic, | ||
255 | "Get help on plugin command '" + topic + "'", | ||
256 | HandleCommanderHelp); | ||
257 | m_console.Commands.AddCommand(capitalizedTopic, false, "help " + capitalizedTopic, | ||
258 | "help " + capitalizedTopic, | ||
247 | "Get help on plugin command '" + topic + "'", | 259 | "Get help on plugin command '" + topic + "'", |
248 | HandleCommanderHelp); | 260 | HandleCommanderHelp); |
249 | |||
250 | m_console.Commands.AddCommand("plugin", false, topic, | ||
251 | topic, | ||
252 | "Execute subcommand for plugin '" + topic + "'", | ||
253 | null); | ||
254 | 261 | ||
255 | ICommander commander = null; | 262 | ICommander commander = null; |
256 | 263 | ||
@@ -267,7 +274,7 @@ namespace OpenSim | |||
267 | 274 | ||
268 | foreach (string command in commander.Commands.Keys) | 275 | foreach (string command in commander.Commands.Keys) |
269 | { | 276 | { |
270 | m_console.Commands.AddCommand(topic, false, | 277 | m_console.Commands.AddCommand(capitalizedTopic, false, |
271 | topic + " " + command, | 278 | topic + " " + command, |
272 | topic + " " + commander.Commands[command].ShortHelp(), | 279 | topic + " " + commander.Commands[command].ShortHelp(), |
273 | String.Empty, HandleCommanderCommand); | 280 | String.Empty, HandleCommanderCommand); |
@@ -286,7 +293,7 @@ namespace OpenSim | |||
286 | // Only safe for the interactive console, since it won't | 293 | // Only safe for the interactive console, since it won't |
287 | // let us come here unless both scene and commander exist | 294 | // let us come here unless both scene and commander exist |
288 | // | 295 | // |
289 | ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(cmd[1]); | 296 | ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(cmd[1].ToLower()); |
290 | if (moduleCommander != null) | 297 | if (moduleCommander != null) |
291 | m_console.Output(moduleCommander.Help); | 298 | m_console.Output(moduleCommander.Help); |
292 | } | 299 | } |
@@ -424,7 +431,7 @@ namespace OpenSim | |||
424 | 431 | ||
425 | mscene = scene; | 432 | mscene = scene; |
426 | 433 | ||
427 | scene.StartTimer(); | 434 | scene.Start(); |
428 | 435 | ||
429 | scene.StartScripts(); | 436 | scene.StartScripts(); |
430 | 437 | ||
@@ -443,12 +450,42 @@ namespace OpenSim | |||
443 | { | 450 | { |
444 | RegionInfo regionInfo = scene.RegionInfo; | 451 | RegionInfo regionInfo = scene.RegionInfo; |
445 | 452 | ||
453 | string estateOwnerFirstName = null; | ||
454 | string estateOwnerLastName = null; | ||
455 | string estateOwnerEMail = null; | ||
456 | string estateOwnerPassword = null; | ||
457 | string rawEstateOwnerUuid = null; | ||
458 | |||
459 | if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) | ||
460 | { | ||
461 | string defaultEstateOwnerName | ||
462 | = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerName", "").Trim(); | ||
463 | string[] ownerNames = defaultEstateOwnerName.Split(' '); | ||
464 | |||
465 | if (ownerNames.Length >= 2) | ||
466 | { | ||
467 | estateOwnerFirstName = ownerNames[0]; | ||
468 | estateOwnerLastName = ownerNames[1]; | ||
469 | } | ||
470 | |||
471 | // Info to be used only on Standalone Mode | ||
472 | rawEstateOwnerUuid = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerUUID", null); | ||
473 | estateOwnerEMail = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerEMail", null); | ||
474 | estateOwnerPassword = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateOwnerPassword", null); | ||
475 | } | ||
476 | |||
446 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); | 477 | MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); |
447 | List<char> excluded = new List<char>(new char[1]{' '}); | 478 | List<char> excluded = new List<char>(new char[1]{' '}); |
448 | string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
449 | string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
450 | 479 | ||
451 | UserAccount account = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, first, last); | 480 | |
481 | if (estateOwnerFirstName == null || estateOwnerLastName == null) | ||
482 | { | ||
483 | estateOwnerFirstName = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); | ||
484 | estateOwnerLastName = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); | ||
485 | } | ||
486 | |||
487 | UserAccount account | ||
488 | = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, estateOwnerFirstName, estateOwnerLastName); | ||
452 | 489 | ||
453 | if (account == null) | 490 | if (account == null) |
454 | { | 491 | { |
@@ -467,23 +504,35 @@ namespace OpenSim | |||
467 | 504 | ||
468 | if (scene.UserAccountService is UserAccountService) | 505 | if (scene.UserAccountService is UserAccountService) |
469 | { | 506 | { |
470 | string password = MainConsole.Instance.PasswdPrompt("Password"); | 507 | if (estateOwnerPassword == null) |
471 | string email = MainConsole.Instance.CmdPrompt("Email", ""); | 508 | estateOwnerPassword = MainConsole.Instance.PasswdPrompt("Password"); |
472 | 509 | ||
473 | string rawPrincipalId = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); | 510 | if (estateOwnerEMail == null) |
511 | estateOwnerEMail = MainConsole.Instance.CmdPrompt("Email"); | ||
512 | |||
513 | if (rawEstateOwnerUuid == null) | ||
514 | rawEstateOwnerUuid = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); | ||
474 | 515 | ||
475 | UUID principalId = UUID.Zero; | 516 | UUID estateOwnerUuid = UUID.Zero; |
476 | if (!UUID.TryParse(rawPrincipalId, out principalId)) | 517 | if (!UUID.TryParse(rawEstateOwnerUuid, out estateOwnerUuid)) |
477 | { | 518 | { |
478 | m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawPrincipalId); | 519 | m_log.ErrorFormat("[OPENSIM]: ID {0} is not a valid UUID", rawEstateOwnerUuid); |
479 | return; | 520 | return; |
480 | } | 521 | } |
481 | 522 | ||
523 | // If we've been given a zero uuid then this signals that we should use a random user id | ||
524 | if (estateOwnerUuid == UUID.Zero) | ||
525 | estateOwnerUuid = UUID.Random(); | ||
526 | |||
482 | account | 527 | account |
483 | = ((UserAccountService)scene.UserAccountService).CreateUser( | 528 | = ((UserAccountService)scene.UserAccountService).CreateUser( |
484 | regionInfo.ScopeID, principalId, first, last, password, email); | 529 | regionInfo.ScopeID, |
530 | estateOwnerUuid, | ||
531 | estateOwnerFirstName, | ||
532 | estateOwnerLastName, | ||
533 | estateOwnerPassword, | ||
534 | estateOwnerEMail); | ||
485 | } | 535 | } |
486 | // } | ||
487 | } | 536 | } |
488 | 537 | ||
489 | if (account == null) | 538 | if (account == null) |
@@ -883,15 +932,21 @@ namespace OpenSim | |||
883 | /// This method doesn't allow an estate to be created with the same name as existing estates. | 932 | /// This method doesn't allow an estate to be created with the same name as existing estates. |
884 | /// </remarks> | 933 | /// </remarks> |
885 | /// <param name="regInfo"></param> | 934 | /// <param name="regInfo"></param> |
886 | /// <param name="existingName">A list of estate names that already exist.</param> | 935 | /// <param name="estatesByName">A list of estate names that already exist.</param> |
936 | /// <param name="estateName">Estate name to create if already known</param> | ||
887 | /// <returns>true if the estate was created, false otherwise</returns> | 937 | /// <returns>true if the estate was created, false otherwise</returns> |
888 | public bool CreateEstate(RegionInfo regInfo, List<string> existingNames) | 938 | public bool CreateEstate(RegionInfo regInfo, Dictionary<string, EstateSettings> estatesByName, string estateName) |
889 | { | 939 | { |
890 | // Create a new estate | 940 | // Create a new estate |
891 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); | 941 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, true); |
892 | string newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); | ||
893 | 942 | ||
894 | if (existingNames.Contains(newName)) | 943 | string newName; |
944 | if (estateName != null && estateName != "") | ||
945 | newName = estateName; | ||
946 | else | ||
947 | newName = MainConsole.Instance.CmdPrompt("New estate name", regInfo.EstateSettings.EstateName); | ||
948 | |||
949 | if (estatesByName.ContainsKey(newName)) | ||
895 | { | 950 | { |
896 | MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); | 951 | MainConsole.Instance.OutputFormat("An estate named {0} already exists. Please try again.", newName); |
897 | return false; | 952 | return false; |
@@ -918,66 +973,102 @@ namespace OpenSim | |||
918 | if (EstateDataService != null) | 973 | if (EstateDataService != null) |
919 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); | 974 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false); |
920 | 975 | ||
921 | if (regInfo.EstateSettings.EstateID == 0) // No record at all | 976 | if (regInfo.EstateSettings.EstateID != 0) |
977 | return; | ||
978 | |||
979 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | ||
980 | |||
981 | List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll(); | ||
982 | Dictionary<string, EstateSettings> estatesByName = new Dictionary<string, EstateSettings>(); | ||
983 | |||
984 | foreach (EstateSettings estate in estates) | ||
985 | estatesByName[estate.EstateName] = estate; | ||
986 | |||
987 | string defaultEstateName = null; | ||
988 | |||
989 | if (m_config.Source.Configs[ESTATE_SECTION_NAME] != null) | ||
922 | { | 990 | { |
923 | m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName); | 991 | defaultEstateName = m_config.Source.Configs[ESTATE_SECTION_NAME].GetString("DefaultEstateName", null); |
924 | 992 | ||
925 | List<EstateSettings> estates = EstateDataService.LoadEstateSettingsAll(); | 993 | if (defaultEstateName != null) |
926 | List<string> estateNames = new List<string>(); | ||
927 | foreach (EstateSettings estate in estates) | ||
928 | estateNames.Add(estate.EstateName); | ||
929 | |||
930 | while (true) | ||
931 | { | 994 | { |
932 | if (estates.Count == 0) | 995 | EstateSettings defaultEstate; |
933 | { | 996 | bool defaultEstateJoined = false; |
934 | m_log.Info("[ESTATE] No existing estates found. You must create a new one."); | 997 | |
935 | 998 | if (estatesByName.ContainsKey(defaultEstateName)) | |
936 | if (CreateEstate(regInfo, estateNames)) | 999 | { |
937 | break; | 1000 | defaultEstate = estatesByName[defaultEstateName]; |
1001 | |||
1002 | if (EstateDataService.LinkRegion(regInfo.RegionID, (int)defaultEstate.EstateID)) | ||
1003 | defaultEstateJoined = true; | ||
1004 | } | ||
1005 | else | ||
1006 | { | ||
1007 | if (CreateEstate(regInfo, estatesByName, defaultEstateName)) | ||
1008 | defaultEstateJoined = true; | ||
1009 | } | ||
1010 | |||
1011 | if (defaultEstateJoined) | ||
1012 | return; | ||
1013 | else | ||
1014 | m_log.ErrorFormat( | ||
1015 | "[OPENSIM BASE]: Joining default estate {0} failed", defaultEstateName); | ||
1016 | } | ||
1017 | } | ||
1018 | |||
1019 | // If we have no default estate or creation of the default estate failed then ask the user. | ||
1020 | while (true) | ||
1021 | { | ||
1022 | if (estates.Count == 0) | ||
1023 | { | ||
1024 | m_log.Info("[ESTATE]: No existing estates found. You must create a new one."); | ||
1025 | |||
1026 | if (CreateEstate(regInfo, estatesByName, null)) | ||
1027 | break; | ||
1028 | else | ||
1029 | continue; | ||
1030 | } | ||
1031 | else | ||
1032 | { | ||
1033 | string response | ||
1034 | = MainConsole.Instance.CmdPrompt( | ||
1035 | string.Format( | ||
1036 | "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), | ||
1037 | "yes", | ||
1038 | new List<string>() { "yes", "no" }); | ||
1039 | |||
1040 | if (response == "no") | ||
1041 | { | ||
1042 | if (CreateEstate(regInfo, estatesByName, null)) | ||
1043 | break; | ||
938 | else | 1044 | else |
939 | continue; | 1045 | continue; |
940 | } | 1046 | } |
941 | else | 1047 | else |
942 | { | 1048 | { |
943 | string response | 1049 | string[] estateNames = estatesByName.Keys.ToArray(); |
1050 | response | ||
944 | = MainConsole.Instance.CmdPrompt( | 1051 | = MainConsole.Instance.CmdPrompt( |
945 | string.Format( | 1052 | string.Format( |
946 | "Do you wish to join region {0} to an existing estate (yes/no)?", regInfo.RegionName), | 1053 | "Name of estate to join. Existing estate names are ({0})", |
947 | "yes", | 1054 | string.Join(", ", estateNames)), |
948 | new List<string>() { "yes", "no" }); | 1055 | estateNames[0]); |
949 | 1056 | ||
950 | if (response == "no") | 1057 | List<int> estateIDs = EstateDataService.GetEstates(response); |
1058 | if (estateIDs.Count < 1) | ||
951 | { | 1059 | { |
952 | if (CreateEstate(regInfo, estateNames)) | 1060 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); |
953 | break; | 1061 | continue; |
954 | else | ||
955 | continue; | ||
956 | } | ||
957 | else | ||
958 | { | ||
959 | response | ||
960 | = MainConsole.Instance.CmdPrompt( | ||
961 | string.Format( | ||
962 | "Name of estate to join. Existing estate names are ({0})", string.Join(", ", estateNames.ToArray())), | ||
963 | estateNames[0]); | ||
964 | |||
965 | List<int> estateIDs = EstateDataService.GetEstates(response); | ||
966 | if (estateIDs.Count < 1) | ||
967 | { | ||
968 | MainConsole.Instance.Output("The name you have entered matches no known estate. Please try again."); | ||
969 | continue; | ||
970 | } | ||
971 | |||
972 | int estateID = estateIDs[0]; | ||
973 | |||
974 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); | ||
975 | |||
976 | if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) | ||
977 | break; | ||
978 | |||
979 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
980 | } | 1062 | } |
1063 | |||
1064 | int estateID = estateIDs[0]; | ||
1065 | |||
1066 | regInfo.EstateSettings = EstateDataService.LoadEstateSettings(estateID); | ||
1067 | |||
1068 | if (EstateDataService.LinkRegion(regInfo.RegionID, estateID)) | ||
1069 | break; | ||
1070 | |||
1071 | MainConsole.Instance.Output("Joining the estate failed. Please try again."); | ||
981 | } | 1072 | } |
982 | } | 1073 | } |
983 | } | 1074 | } |