GridServer.pm 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package OpenSim::GridServer;
  2. use strict;
  3. use OpenSim::Utility;
  4. use OpenSim::GridServer::Config;
  5. use OpenSim::GridServer::GridManager;
  6. sub getHandlerList {
  7. my %list = (
  8. "simulator_login" => \&_simulator_login,
  9. "simulator_data_request" => \&_simulator_data_request,
  10. "map_block" => \&_map_block,
  11. "map_block2" => \&_map_block2, # this is better for the Region Monitor
  12. );
  13. return \%list;
  14. }
  15. # #################
  16. # XMLRPC Handlers
  17. sub _simulator_login {
  18. my $params = shift;
  19. my $region_data = undef;
  20. my %response = ();
  21. if ($params->{"UUID"}) {
  22. $region_data = &OpenSim::GridServer::GridManager::getRegionByUUID($params->{"UUID"});
  23. } elsif ($params->{"region_handle"}) {
  24. $region_data = &OpenSim::GridServer::GridManager::getRegionByHandle($params->{"region_handle"});
  25. } else {
  26. $response{"error"} = "No UUID or region_handle passed to grid server - unable to connect you";
  27. return \%response;
  28. }
  29. if (!$region_data) {
  30. my %new_region_data = (
  31. uuid => undef,
  32. regionHandle => OpenSim::Utility::UIntsToLong($params->{region_locx}*256, $params->{region_locx}*256),
  33. regionName => $params->{sim_name},
  34. regionRecvKey => $OpenSim::Config::SIM_RECV_KEY,
  35. regionSendKey => $OpenSim::Config::SIM_SEND_KEY,
  36. regionSecret => $OpenSim::Config::SIM_RECV_KEY,
  37. regionDataURI => "",
  38. serverIP => $params->{sim_ip},
  39. serverPort => $params->{sim_port},
  40. serverURI => "http://" + $params->{sim_ip} + ":" + $params->{sim_port} + "/",
  41. LocX => $params->{region_locx},
  42. LocY => $params->{region_locy},
  43. LocZ => 0,
  44. regionAssetURI => $OpenSim::Config::ASSET_SERVER_URL,
  45. regionAssetRecvKey => $OpenSim::Config::ASSET_RECV_KEY,
  46. regionAssetSendKey => $OpenSim::Config::ASSET_SEND_KEY,
  47. regionUserURI => $OpenSim::Config::USER_SERVER_URL,
  48. regionUserRecvKey => $OpenSim::Config::USER_RECV_KEY,
  49. regionUserSendKey => $OpenSim::Config::USER_SEND_KEY,
  50. regionMapTextureID => $params->{"map-image-id"},
  51. serverHttpPort => $params->{http_port},
  52. serverRemotingPort => $params->{remoting_port},
  53. );
  54. eval {
  55. &OpenSim::GridServer::GridManager::addRegion(\%new_region_data);
  56. };
  57. if ($@) {
  58. $response{"error"} = "unable to add region";
  59. return \%response;
  60. }
  61. $region_data = \%new_region_data;
  62. }
  63. my @region_neighbours_data = ();
  64. my $region_list = &OpenSim::GridServer::GridManager::getRegionList($region_data->{locX}-1, $region_data->{locY}-1, $region_data->{locX}+1, $region_data->{locY}+1);
  65. foreach my $region (@$region_list) {
  66. next if ($region->{regionHandle} eq $region_data->{regionHandle});
  67. my %neighbour_block = (
  68. "sim_ip" => $region->{serverIP},
  69. "sim_port" => $region->{serverPort},
  70. "region_locx" => $region->{locX},
  71. "region_locy" => $region->{locY},
  72. "UUID" => $region->{uuid},
  73. "regionHandle" => $region->{regionHandle},
  74. );
  75. push @region_neighbours_data, \%neighbour_block;
  76. }
  77. %response = (
  78. UUID => $region_data->{uuid},
  79. region_locx => $region_data->{locX},
  80. region_locy => $region_data->{locY},
  81. regionname => $region_data->{regionName},
  82. estate_id => "1", # TODO ???
  83. neighbours => \@region_neighbours_data,
  84. sim_ip => $region_data->{serverIP},
  85. sim_port => $region_data->{serverPort},
  86. asset_url => $region_data->{regionAssetURI},
  87. asset_recvkey => $region_data->{regionAssetRecvKey},
  88. asset_sendkey => $region_data->{regionAssetSendKey},
  89. user_url => $region_data->{regionUserURI},
  90. user_recvkey => $region_data->{regionUserRecvKey},
  91. user_sendkey => $region_data->{regionUserSendKey},
  92. authkey => $region_data->{regionSecret},
  93. data_uri => $region_data->{regionDataURI},
  94. "allow_forceful_banlines" => "TRUE",
  95. );
  96. return \%response;
  97. }
  98. sub _simulator_data_request {
  99. my $params = shift;
  100. my $region_data = undef;
  101. my %response = ();
  102. if ($params->{"region_UUID"}) {
  103. $region_data = &OpenSim::GridServer::GridManager::getRegionByUUID($params->{"region_UUID"});
  104. } elsif ($params->{"region_handle"}) {
  105. $region_data = &OpenSim::GridServer::GridManager::getRegionByHandle($params->{"region_handle"});
  106. }
  107. if (!$region_data) {
  108. $response{"error"} = "Sim does not exist";
  109. return \%response;
  110. }
  111. $response{"sim_ip"} = $region_data->{serverIP};
  112. $response{"sim_port"} = $region_data->{serverPort};
  113. $response{"http_port"} = $region_data->{serverHttpPort};
  114. $response{"remoting_port"} = $region_data->{serverRemotingPort};
  115. $response{"region_locx"} = $region_data->{locX};
  116. $response{"region_locy"} = $region_data->{locY};
  117. $response{"region_UUID"} = $region_data->{uuid};
  118. $response{"region_name"} = $region_data->{regionName};
  119. $response{"regionHandle"} = $region_data->{regionHandle};
  120. return \%response;
  121. }
  122. sub _map_block {
  123. my $params = shift;
  124. my $xmin = $params->{xmin} || 980;
  125. my $ymin = $params->{ymin} || 980;
  126. my $xmax = $params->{xmax} || 1020;
  127. my $ymax = $params->{ymax} || 1020;
  128. my @sim_block_list = ();
  129. my $region_list = &OpenSim::GridServer::GridManager::getRegionList($xmin, $ymin, $xmax, $ymax);
  130. foreach my $region (@$region_list) {
  131. my %sim_block = (
  132. "x" => $region->{locX},
  133. "y" => $region->{locY},
  134. "name" => $region->{regionName},
  135. "access" => 0, # TODO ? meaning unknown
  136. "region-flags" => 0, # TODO ? unknown
  137. "water-height" => 20, # TODO ? get from a XML
  138. "agents" => 1, # TODO
  139. "map-image-id" => $region->{regionMapTexture},
  140. "regionhandle" => $region->{regionHandle},
  141. "sim_ip" => $region->{serverIP},
  142. "sim_port" => $region->{serverPort},
  143. "sim_uri" => $region->{serverURI},
  144. "uuid" => $region->{uuid},
  145. "remoting_port" => $region->{serverRemotingPort},
  146. );
  147. push @sim_block_list, \%sim_block;
  148. }
  149. my %response = (
  150. "sim-profiles" => \@sim_block_list,
  151. );
  152. return \%response;
  153. }
  154. sub _map_block2 {
  155. my $params = shift;
  156. my $xmin = $params->{xmin} || 980;
  157. my $ymin = $params->{ymin} || 980;
  158. my $xmax = $params->{xmax} || 1020;
  159. my $ymax = $params->{ymax} || 1020;
  160. my @sim_block_list = ();
  161. my $region_list = &OpenSim::GridServer::GridManager::getRegionList2($xmin, $ymin, $xmax, $ymax);
  162. foreach my $region (@$region_list) {
  163. my %sim_block = (
  164. "x" => $region->{locX},
  165. "y" => $region->{locY},
  166. "name" => $region->{regionName},
  167. "access" => 0, # TODO ? meaning unknown
  168. "region-flags" => 0, # TODO ? unknown
  169. "water-height" => 20, # TODO ? get from a XML
  170. "agents" => 1, # TODO
  171. "map-image-id" => $region->{regionMapTexture},
  172. "regionhandle" => $region->{regionHandle},
  173. "sim_ip" => $region->{serverIP},
  174. "sim_port" => $region->{serverPort},
  175. "sim_uri" => $region->{serverURI},
  176. "uuid" => $region->{uuid},
  177. "remoting_port" => $region->{serverRemotingPort},
  178. );
  179. push @sim_block_list, \%sim_block;
  180. }
  181. my %response = (
  182. "sim-profiles" => \@sim_block_list,
  183. );
  184. return \%response;
  185. }
  186. 1;