156 lines
3.2 KiB
Perl
156 lines
3.2 KiB
Perl
package OpenSim::Utility;
|
|
|
|
use strict;
|
|
use XML::RPC;
|
|
use XML::Simple;
|
|
use Data::UUID;
|
|
use DBHandler;
|
|
use OpenSim::Config;
|
|
use Socket;
|
|
|
|
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;
|
|
}
|
|
|
|
sub UIntsToLong {
|
|
my ($int1, $int2) = @_;
|
|
return $int1 * 4294967296 + $int2;
|
|
}
|
|
|
|
sub getSimpleResult {
|
|
my ($sql, @args) = @_;
|
|
my $dbh = &DBHandler::getConnection($OpenSim::Config::DSN, $OpenSim::Config::DBUSER, $OpenSim::Config::DBPASS);
|
|
my $st = new Statement($dbh, $sql);
|
|
return $st->exec(@args);
|
|
}
|
|
|
|
sub GenerateUUID {
|
|
my $ug = new Data::UUID();
|
|
my $uuid = $ug->create();
|
|
return $ug->to_string($uuid);
|
|
}
|
|
|
|
sub ZeroUUID {
|
|
return "00000000-0000-0000-0000-000000000000";
|
|
}
|
|
|
|
sub HEX2UUID {
|
|
my $hex = shift;
|
|
Carp::croak("$hex is not a uuid") if (length($hex) != 32);
|
|
my @sub_uuids = ($hex =~ /(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})/);
|
|
return join("-", @sub_uuids);
|
|
}
|
|
|
|
sub BIN2UUID {
|
|
# TODO:
|
|
}
|
|
|
|
sub UUID2HEX {
|
|
my $uuid = shift;
|
|
$uuid =~ s/-//g;
|
|
return $uuid;
|
|
}
|
|
|
|
sub UUID2BIN {
|
|
my $uuid = shift;
|
|
return pack("H*", &UUID2HEX($uuid));
|
|
}
|
|
|
|
sub HttpPostRequest {
|
|
my ($url, $postdata) = @_;
|
|
$url =~ /http:\/\/([^:\/]+)(:([0-9]+))?(\/.*)?/;
|
|
my ($host, $port, $path) = ($1, $3, $4);
|
|
$port ||= 80;
|
|
$path ||= "/";
|
|
my $CRLF= "\015\012";
|
|
my $addr = (gethostbyname($host))[4];
|
|
my $name = pack('S n a4 x8', 2, $port, $addr);
|
|
my $data_len = length($postdata);
|
|
socket(SOCK, PF_INET, SOCK_STREAM, 0);
|
|
connect(SOCK, $name) ;
|
|
select(SOCK); $| = 1; select(STDOUT);
|
|
print SOCK "POST $path HTTP/1.0$CRLF";
|
|
print SOCK "Host: $host:$port$CRLF";
|
|
print SOCK "Content-Length: $data_len$CRLF";
|
|
print SOCK "$CRLF";
|
|
print SOCK $postdata;
|
|
|
|
my $ret = "";
|
|
unless (<SOCK>) {
|
|
close(SOCK);
|
|
Carp::croak("can not connect to $url");
|
|
}
|
|
my $header = "";
|
|
while (<SOCK>) {
|
|
$header .= $_;
|
|
last if ($_ eq $CRLF);
|
|
}
|
|
if ($header != /200/) {
|
|
return $ret;
|
|
}
|
|
while (<SOCK>) {
|
|
$ret .= $_;
|
|
}
|
|
return $ret;
|
|
}
|
|
# TODO : merge with POST
|
|
sub HttpGetRequest {
|
|
my ($url) = @_;
|
|
$url =~ /http:\/\/([^:\/]+)(:([0-9]+))?(\/.*)?/;
|
|
my ($host, $port, $path) = ($1, $3, $4);
|
|
$port ||= 80;
|
|
$path ||= "/";
|
|
my $CRLF= "\015\012";
|
|
my $addr = (gethostbyname($host))[4];
|
|
my $name = pack('S n a4 x8', 2, $port, $addr);
|
|
socket(SOCK, PF_INET, SOCK_STREAM, 0);
|
|
connect(SOCK, $name) ;
|
|
select(SOCK); $| = 1; select(STDOUT);
|
|
print SOCK "GET $path HTTP/1.0$CRLF";
|
|
print SOCK "Host: $host:$port$CRLF";
|
|
print SOCK "$CRLF";
|
|
|
|
unless (<SOCK>) {
|
|
close(SOCK);
|
|
Carp::croak("can not connect to $url");
|
|
}
|
|
while (<SOCK>) {
|
|
last if ($_ eq $CRLF);
|
|
}
|
|
my $ret = "";
|
|
while (<SOCK>) {
|
|
$ret .= $_;
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
sub XML2Obj {
|
|
my $xml = shift;
|
|
my $xs = new XML::Simple( keyattr=>[] );
|
|
return $xs->XMLin($xml);
|
|
}
|
|
|
|
sub Log {
|
|
my $server_name = shift;
|
|
my @param = @_;
|
|
open(FILE, ">>" . $OpenSim::Config::DEBUG_LOGDIR . "/" . $server_name . ".log");
|
|
foreach(@param) {
|
|
print FILE $_ . "\n";
|
|
}
|
|
print FILE "<<<<<<<<<<<=====================\n\n";
|
|
close(FILE);
|
|
}
|
|
|
|
1;
|
|
|