mirror of
https://github.com/opensim/opensim.git
synced 2026-08-11 03:45:35 +08:00
Merged 3Di code that provides scene and avatar serialization, and plugin support for region move/split/merge. See ThirdParty/3Di/README.txt. Unless the new modules are used there should be no noticeable changes when running OpenSim.
This commit is contained in:
214
ThirdParty/3Di/RegionMonitor/MonitorGUI/htdocs/MonitorGUI/View.pm
vendored
Normal file
214
ThirdParty/3Di/RegionMonitor/MonitorGUI/htdocs/MonitorGUI/View.pm
vendored
Normal file
@@ -0,0 +1,214 @@
|
||||
package MonitorGUI::View;
|
||||
|
||||
use strict;
|
||||
|
||||
my @server_list;
|
||||
my $max_port;
|
||||
my $regions;
|
||||
|
||||
sub screen_header {
|
||||
return << "HEADER";
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<STYLE TYPE="text/css">
|
||||
<!--
|
||||
a:link {font-size: 12pt; text-decoration:none; color:#0000ff ;}
|
||||
a:visited {font-size: 12pt; text-decoration:none; color:#ff0000 ;}
|
||||
a:active {font-size: 12pt; text-decoration:none; color:#00ff00 ;}
|
||||
a:hover {font-size: 12pt; text-decoration:underline; color:#ff00ff ;}
|
||||
td {font-size: 12pt;border:0;}
|
||||
th {background-color:#000000; font-size: 12pt;border:0; color:#FFFFFF; }
|
||||
tr {background-color:#FFFFFF; }
|
||||
b {font-size: 12pt;}
|
||||
//table {background-color:#000000; }
|
||||
-->
|
||||
</STYLE>
|
||||
<META http-equiv="content-type" content="text/html;charset=UTF-8" />
|
||||
<META name="refresh" content="300" />
|
||||
<TITLE>Region Monitor GUI, 3Di</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
HEADER
|
||||
}
|
||||
|
||||
sub screen_footer {
|
||||
return << "FOOTER";
|
||||
</BODY>
|
||||
</HTML>
|
||||
FOOTER
|
||||
}
|
||||
|
||||
sub html {
|
||||
my $grid_info = shift;
|
||||
my $regions_list = $grid_info->{"sim-profiles"};
|
||||
$regions = undef;
|
||||
foreach(@$regions_list) {
|
||||
my $ip = $_->{sim_ip} || "UNKNOWN";
|
||||
my $port = $_->{sim_port} || "UNKNOWN";
|
||||
$regions->{$ip}->{$port} = $_;
|
||||
if (!$regions->{max_port} || $regions->{max_port} < $port) {
|
||||
$regions->{max_port} = $port;
|
||||
}
|
||||
}
|
||||
@server_list = keys %$regions;
|
||||
$max_port = $regions->{max_port};
|
||||
my $html = "";
|
||||
foreach my $machine (@server_list) {
|
||||
next if ($machine eq "max_port");
|
||||
$html .= &_machine_view($machine, $regions->{$machine});
|
||||
}
|
||||
return $html;
|
||||
}
|
||||
|
||||
sub _machine_view {
|
||||
my ($ip, $info) = @_;
|
||||
my $region_html = "";
|
||||
foreach my $region (keys %$info) {
|
||||
$region_html .= &_region_html($info->{$region});
|
||||
}
|
||||
my $html =<< "MACHINE_HTML";
|
||||
<h3>$ip</h3>
|
||||
$region_html
|
||||
<hr size=0 noshade />
|
||||
MACHINE_HTML
|
||||
}
|
||||
|
||||
sub _region_html {
|
||||
my $region_info = shift;
|
||||
my $name = $region_info->{name} || "UNKNOWN";
|
||||
my $x = $region_info->{x} || -1;
|
||||
my $y = $region_info->{y} || -1;
|
||||
my $ip = $region_info->{sim_ip} || "UNKNOWN";
|
||||
my $port = $region_info->{sim_port} || "UNKNOWN";
|
||||
my $get_scene_presence_filter = $region_info->{get_scene_presence_filter};
|
||||
my $get_scene_presence = $region_info->{get_scene_presence};
|
||||
my $get_avatar_filter = $region_info->{get_avatar_filter};
|
||||
my $get_avatar = $region_info->{get_avatar};
|
||||
my $avatar_names = $region_info->{avatar_names};
|
||||
my $action_forms = &_action_forms($region_info);
|
||||
my $html = <<"REGION_HTML";
|
||||
<strong>$name</strong><br/>
|
||||
$ip:$port | X: $x Y: $y<br/>
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td>get_avatar</td>
|
||||
<td>$get_avatar</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>get_avatar_filter</td>
|
||||
<td>$get_avatar_filter</td>
|
||||
<td>$avatar_names</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>get_scene_presence</td>
|
||||
<td>$get_scene_presence</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>get_scene_presence_filter</td>
|
||||
<td>$get_scene_presence_filter</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
$action_forms
|
||||
REGION_HTML
|
||||
return $html;
|
||||
}
|
||||
|
||||
sub _action_forms {
|
||||
my $region_info = shift;
|
||||
my $ip = $region_info->{sim_ip};
|
||||
my $port = $region_info->{sim_port};
|
||||
my $default_input_port = $max_port + 1;
|
||||
my $move_to_options = "";
|
||||
my $split_to_options = "";
|
||||
my $merge_ip_options = "";
|
||||
foreach(@server_list) {
|
||||
next if ($_ eq "max_port");
|
||||
$merge_ip_options .= "<option value=\"$_\">$_\n";
|
||||
$split_to_options .= "<option value=\"$_\">$_\n";
|
||||
#next if ($_ eq $ip);
|
||||
$move_to_options .= "<option value=\"$_\">$_\n";
|
||||
}
|
||||
my $merge_port_options = "";
|
||||
my $merge_disabled = "disabled";
|
||||
|
||||
foreach(keys %{$regions->{$ip}}) {
|
||||
next if ($_ eq $port);
|
||||
$merge_disabled = "";
|
||||
}
|
||||
# for(9000..$max_port) { # TODO :
|
||||
# next if ($_ eq $port);
|
||||
# $merge_port_options .= "<option value=\"$_\">$_\n";
|
||||
# }
|
||||
my %port = ();
|
||||
foreach my $ip (keys %$regions) {
|
||||
next if ($ip eq "max_port");
|
||||
print STDERR "--" . $ip . "\n";
|
||||
foreach my $region_port (keys %{$regions->{$ip}}) {
|
||||
print STDERR "---" . $region_port . "\n";
|
||||
$port{$region_port} = 1;
|
||||
}
|
||||
}
|
||||
foreach (keys %port) {
|
||||
$merge_port_options .= "<option value=\"$_\">$_\n";
|
||||
$merge_disabled = "";
|
||||
}
|
||||
return << "ACTION_FORMS";
|
||||
<table>
|
||||
<tr>
|
||||
<form method="POST">
|
||||
<td>
|
||||
<input type="hidden" name="A" value="move" />
|
||||
<input type="hidden" name="from_ip" value="$ip" />
|
||||
<input type="hidden" name="from_port" value="$port" />
|
||||
<input type="submit" value="Move to" />
|
||||
<select name="to_ip">
|
||||
$move_to_options
|
||||
</select>:
|
||||
<input type="text" name="to_port" size="5" value="$default_input_port"/>
|
||||
</td>
|
||||
</form>
|
||||
|
||||
<td>
|
||||
|
|
||||
</td>
|
||||
|
||||
<form method="POST">
|
||||
<td>
|
||||
<input type="hidden" name="A" value="split" />
|
||||
<input type="hidden" name="from_ip" value="$ip" />
|
||||
<input type="hidden" name="from_port" value="$port" />
|
||||
<input type="submit" value="Split to" />
|
||||
<select name="to_ip">
|
||||
$split_to_options
|
||||
</select>:
|
||||
<input type="text" name="to_port" size="5" value="$default_input_port"/>
|
||||
</td>
|
||||
</form>
|
||||
|
||||
<td>
|
||||
|
|
||||
</td>
|
||||
|
||||
<form method="POST">
|
||||
<td>
|
||||
<input type="hidden" name="A" value="merge" />
|
||||
<input type="hidden" name="from_ip" value="$ip" />
|
||||
<input type="hidden" name="master_port" value="$port" />
|
||||
<input type="submit" value="Merge" $merge_disabled />
|
||||
<select name="slave_ip" $merge_disabled>
|
||||
$merge_ip_options
|
||||
</select>
|
||||
<select name="slave_port" $merge_disabled>
|
||||
$merge_port_options
|
||||
</select>
|
||||
</td>
|
||||
</form>
|
||||
</tr>
|
||||
</table>
|
||||
ACTION_FORMS
|
||||
}
|
||||
|
||||
1;
|
||||
91
ThirdParty/3Di/RegionMonitor/MonitorGUI/htdocs/MyCGI.pm
vendored
Normal file
91
ThirdParty/3Di/RegionMonitor/MonitorGUI/htdocs/MyCGI.pm
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
package MyCGI;
|
||||
|
||||
use strict;
|
||||
use CGI;
|
||||
|
||||
sub getParam {
|
||||
my $cgi;
|
||||
if ($ARGV[0]) {
|
||||
$cgi = new CGI($ARGV[0]);
|
||||
} else {
|
||||
$cgi = new CGI;
|
||||
}
|
||||
my @param_names = $cgi->param();
|
||||
my %param = ();
|
||||
foreach (@param_names) {
|
||||
$param{$_} = $cgi->param($_);
|
||||
}
|
||||
return \%param;
|
||||
}
|
||||
|
||||
sub getCookie {
|
||||
my $name = shift;
|
||||
my $cookie_value = &CGI::cookie($name);
|
||||
return &_parse($cookie_value);
|
||||
}
|
||||
|
||||
sub outputHtml {
|
||||
my ($charset, $html) = @_;
|
||||
print &CGI::header(-charset => $charset);
|
||||
print $html;
|
||||
}
|
||||
|
||||
sub outputXml {
|
||||
my ($charset, $xml) = @_;
|
||||
print &CGI::header( -type => 'text/xml', -charset => $charset );
|
||||
print $xml;
|
||||
}
|
||||
|
||||
sub makeCookieValue {
|
||||
my $param = shift;
|
||||
my @data = ();
|
||||
foreach(keys %$param) {
|
||||
push(@data, $_ . "=" . $param->{$_});
|
||||
}
|
||||
return join("&", @data);
|
||||
}
|
||||
|
||||
sub setCookie {
|
||||
my $param = shift;
|
||||
my $cookie = &CGI::cookie(
|
||||
-name => $param->{name} || return,
|
||||
-value => $param->{value},
|
||||
-domain => $param->{domain},
|
||||
-path => $param->{path},
|
||||
-expires => $param->{expires},
|
||||
);
|
||||
return &CGI::header(-cookie => $cookie);
|
||||
}
|
||||
|
||||
sub redirect {
|
||||
my $dest = shift;
|
||||
&CGI::redirect($dest);
|
||||
}
|
||||
|
||||
sub urlEncode {
|
||||
my $str = shift;
|
||||
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
|
||||
$str =~ tr/ /+/;
|
||||
return $str;
|
||||
}
|
||||
|
||||
sub urlDecode {
|
||||
my $str = shift;
|
||||
$str =~ tr/+/ /;
|
||||
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
|
||||
return $str;
|
||||
}
|
||||
|
||||
sub _parse {
|
||||
my $value = shift;
|
||||
my @pair = split(/&/, $value);
|
||||
my %data = ();
|
||||
foreach(@pair) {
|
||||
my ($name, $value) = split(/=/, $_);
|
||||
$data{$name} = $value;
|
||||
}
|
||||
return \%data;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
202
ThirdParty/3Di/RegionMonitor/MonitorGUI/htdocs/monitor.cgi
vendored
Normal file
202
ThirdParty/3Di/RegionMonitor/MonitorGUI/htdocs/monitor.cgi
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
use strict;
|
||||
use Carp;
|
||||
use MyCGI;
|
||||
use XML::RPC;
|
||||
use MonitorGUI::View;
|
||||
|
||||
use vars qw ($THIS_URL $GRID_SERVER_URL $DEFAULT_PROXY_PORT);
|
||||
$THIS_URL = "http://10.8.1.165/monitorgui/monitor.cgi";
|
||||
$GRID_SERVER_URL = "http://10.8.1.165/opensim/grid.cgi";
|
||||
$DEFAULT_PROXY_PORT = 9000;
|
||||
|
||||
my %ACTIONS = (
|
||||
# Region commands
|
||||
move => \&move_command,
|
||||
split => \&split_command,
|
||||
merge => \&merge_command,
|
||||
# display commands
|
||||
default => \&main_screen,
|
||||
refresh => \&refresh,
|
||||
);
|
||||
|
||||
# ##################
|
||||
# main
|
||||
my $param = &MyCGI::getParam;
|
||||
my $act = $param->{A} || "default";
|
||||
my $contents = "";
|
||||
if (!$ACTIONS{$act}) {
|
||||
&gui_error("404 NOT FOUND");
|
||||
} else {
|
||||
eval {
|
||||
$ACTIONS{$act}->($param);
|
||||
};
|
||||
if ($@) {
|
||||
&gui_error($@);
|
||||
}
|
||||
}
|
||||
|
||||
# #################
|
||||
# Region Commands
|
||||
sub move_command {
|
||||
my $param = shift;
|
||||
# from
|
||||
my $from_ip = $param->{from_ip} || Carp::croak("not enough params (from_ip)");
|
||||
my $from_port = $param->{from_port} || Carp::croak("not enough params (from_port)");
|
||||
my $from_url = "http://" . $param->{from_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
# to
|
||||
my $to_ip = $param->{to_ip} || Carp::croak("not enough params (to_ip)");
|
||||
my $to_port = $param->{to_port} || Carp::croak("not enough params (to_port)");
|
||||
my $to_url = "http://" . $param->{to_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
# commands
|
||||
eval {
|
||||
&OpenSim::Utility::XMLRPCCall_array($from_url, "SerializeRegion", [$from_ip, $from_port]);
|
||||
&OpenSim::Utility::XMLRPCCall_array($to_url, "DeserializeRegion_Move", [$from_ip, $from_port, $to_ip, $to_port]);
|
||||
&OpenSim::Utility::XMLRPCCall_array($from_url, "TerminateRegion", [$from_port]);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR "Get Status Error: $@\n";
|
||||
}
|
||||
|
||||
# client refresh
|
||||
&redirect_refresh({wait=>5, force=>"$from_url|$to_url", msg=>"Move region $from_ip:$from_port from $from_url to $to_url"});
|
||||
}
|
||||
|
||||
sub split_command {
|
||||
my $param = shift;
|
||||
# from
|
||||
my $from_ip = $param->{from_ip} || Carp::croak("not enough params (from_ip)");
|
||||
my $from_port = $param->{from_port} || Carp::croak("not enough params (from_port)");
|
||||
my $from_url = "http://" . $param->{from_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
# to
|
||||
my $to_ip = $param->{to_ip} || Carp::croak("not enough params (to_ip)");
|
||||
my $to_port = $param->{to_port} || Carp::croak("not enough params (to_port)");
|
||||
my $to_url = "http://" . $param->{to_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
# commands
|
||||
eval {
|
||||
&OpenSim::Utility::XMLRPCCall_array($from_url, "SerializeRegion", [$from_ip, $from_port]);
|
||||
&OpenSim::Utility::XMLRPCCall_array($to_url, "DeserializeRegion_Clone", [$from_ip, $from_port, $to_ip, $to_port]);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR "Get Status Error: $@\n";
|
||||
}
|
||||
|
||||
&redirect_refresh({wait=>5, force=>"$from_url", msg=>"Split region $from_ip:$from_port"});
|
||||
}
|
||||
|
||||
sub merge_command {
|
||||
my $param = shift;
|
||||
# from
|
||||
my $from_ip = $param->{from_ip} || Carp::croak("not enough params (from_ip)");
|
||||
my $url = "http://" . $param->{from_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
# ports
|
||||
my $master_port = $param->{master_port} || Carp::croak("not enough params (master_port)");
|
||||
my $slave_ip = $param->{slave_ip} || Carp::croak("not enough params (slave_ip)");
|
||||
my $slave_port = $param->{slave_port} || Carp::croak("not enough params (slave_port)");
|
||||
my $slave_url = "http://" . $param->{slave_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
# commands
|
||||
eval {
|
||||
&XMLRPCCall_array($url, "MergeRegions", [$from_ip, $master_port]);
|
||||
&XMLRPCCall_array($slave_url, "TerminateRegion", [$slave_port]);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR "Get Status Error: $@\n";
|
||||
}
|
||||
&redirect_refresh({wait=>5, force=>"$url", msg=>"Merge region $from_ip:$master_port, $slave_port"});
|
||||
}
|
||||
|
||||
# #################
|
||||
# Display
|
||||
sub main_screen {
|
||||
my %xml_rpc_param = (
|
||||
# TODO: should be 0 - 65535 ?
|
||||
xmin => 999, ymin => 999, xmax => 1010, ymax => 1010,
|
||||
);
|
||||
my $res_obj = undef;
|
||||
eval {
|
||||
$res_obj = &XMLRPCCall($GRID_SERVER_URL, "map_block", \%xml_rpc_param);
|
||||
};
|
||||
if ($@) {
|
||||
&gui_error("map_block Error: " . $@);
|
||||
}
|
||||
my %copy_obj = %$res_obj;
|
||||
my $getstatus_failed = "<font color=\"red\">GetStatus Failed</font>";
|
||||
my $regions_list = $res_obj->{"sim-profiles"};
|
||||
foreach(@$regions_list) {
|
||||
if ($_->{sim_ip} && $_->{sim_port}) {
|
||||
my $url = "http://" . $_->{sim_ip} . ":" . $DEFAULT_PROXY_PORT;
|
||||
my $port = $_->{sim_port};
|
||||
my $res = undef;
|
||||
eval {
|
||||
$res = &XMLRPCCall_array($url, "GetStatus", [$port]);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR "Get Status Error: $@\n";
|
||||
}
|
||||
$_->{get_scene_presence_filter} = $res ? $res->{get_scene_presence_filter} : $getstatus_failed;
|
||||
$_->{get_scene_presence} = $res ? $res->{get_scene_presence} : $getstatus_failed;
|
||||
$_->{get_avatar_filter} = $res ? $res->{get_avatar_filter} : $getstatus_failed;
|
||||
$_->{get_avatar} = $res ? $res->{get_avatar} : $getstatus_failed;
|
||||
$_->{avatar_names} = $res ? $res->{avatar_names} : "NO USER";
|
||||
}
|
||||
}
|
||||
my $html = &MonitorGUI::View::html(\%copy_obj);
|
||||
&MyCGI::outputHtml("UTF-8", &MonitorGUI::View::screen_header . $html . &MonitorGUI::View::screen_footer);
|
||||
}
|
||||
|
||||
sub gui_error {
|
||||
my $msg = shift;
|
||||
&MyCGI::outputHtml("UTF-8", "<h1>ERROR</h1><hr />$msg");
|
||||
}
|
||||
|
||||
sub redirect_refresh {
|
||||
my $args = shift;
|
||||
my $wait = $args->{wait};
|
||||
my $force = $args->{force} || "";
|
||||
my $msg = $args->{msg} || "";
|
||||
my $param = "A=refresh&wait=$wait&ip=$force&msg=$msg";
|
||||
my $dist_url = $THIS_URL . "?" . $param;
|
||||
&MyCGI::redirect($dist_url);
|
||||
}
|
||||
|
||||
sub refresh {
|
||||
my $param = shift;
|
||||
my $msg = $param->{msg} || "";
|
||||
my $wait = $param->{wait} || 0;
|
||||
my $force = $param->{ip} || "";
|
||||
#my $jump_url = $force ? "$THIS_URL?A=force&ip=$force" : $THIS_URL;
|
||||
my $jump_url = $THIS_URL;
|
||||
my $html =<< "HTML";
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Refresh" content="$wait;URL=$jump_url" />
|
||||
<title>Region Monitor GUI REFRESH</title>
|
||||
</head>
|
||||
<body>
|
||||
<h3>$msg</h3>
|
||||
<br>
|
||||
wait <font color="red"><b>$wait</b></font> sec for server to take effect ... <br>
|
||||
(* The page will jump to "Monitor Screen" automatically)
|
||||
</body>
|
||||
</html>
|
||||
HTML
|
||||
&MyCGI::outputHtml("UTF-8", $html);
|
||||
}
|
||||
|
||||
# ##################
|
||||
# Utility
|
||||
sub XMLRPCCall {
|
||||
my ($url, $methodname, $param) = @_;
|
||||
my $xmlrpc = new XML::RPC($url);
|
||||
my $result = $xmlrpc->call($methodname, $param);
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub XMLRPCCall_array {
|
||||
my ($url, $methodname, $param) = @_;
|
||||
my $xmlrpc = new XML::RPC($url);
|
||||
my $result = $xmlrpc->call($methodname, @$param);
|
||||
return $result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user