Utility.pm 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package OpenSim::Utility;
  2. use strict;
  3. use XML::RPC;
  4. use XML::Simple;
  5. use Data::UUID;
  6. use DBHandler;
  7. use OpenSim::Config;
  8. use Socket;
  9. sub XMLRPCCall {
  10. my ($url, $methodname, $param) = @_;
  11. my $xmlrpc = new XML::RPC($url);
  12. my $result = $xmlrpc->call($methodname, $param);
  13. return $result;
  14. }
  15. sub XMLRPCCall_array {
  16. my ($url, $methodname, $param) = @_;
  17. my $xmlrpc = new XML::RPC($url);
  18. my $result = $xmlrpc->call($methodname, @$param);
  19. return $result;
  20. }
  21. sub UIntsToLong {
  22. my ($int1, $int2) = @_;
  23. return $int1 * 4294967296 + $int2;
  24. }
  25. sub getSimpleResult {
  26. my ($sql, @args) = @_;
  27. my $dbh = &DBHandler::getConnection($OpenSim::Config::DSN, $OpenSim::Config::DBUSER, $OpenSim::Config::DBPASS);
  28. my $st = new Statement($dbh, $sql);
  29. return $st->exec(@args);
  30. }
  31. sub GenerateUUID {
  32. my $ug = new Data::UUID();
  33. my $uuid = $ug->create();
  34. return $ug->to_string($uuid);
  35. }
  36. sub ZeroUUID {
  37. return "00000000-0000-0000-0000-000000000000";
  38. }
  39. sub HEX2UUID {
  40. my $hex = shift;
  41. Carp::croak("$hex is not a uuid") if (length($hex) != 32);
  42. my @sub_uuids = ($hex =~ /(\w{8})(\w{4})(\w{4})(\w{4})(\w{12})/);
  43. return join("-", @sub_uuids);
  44. }
  45. sub BIN2UUID {
  46. # TODO:
  47. }
  48. sub UUID2HEX {
  49. my $uuid = shift;
  50. $uuid =~ s/-//g;
  51. return $uuid;
  52. }
  53. sub UUID2BIN {
  54. my $uuid = shift;
  55. return pack("H*", &UUID2HEX($uuid));
  56. }
  57. sub HttpPostRequest {
  58. my ($url, $postdata) = @_;
  59. $url =~ /http:\/\/([^:\/]+)(:([0-9]+))?(\/.*)?/;
  60. my ($host, $port, $path) = ($1, $3, $4);
  61. $port ||= 80;
  62. $path ||= "/";
  63. my $CRLF= "\015\012";
  64. my $addr = (gethostbyname($host))[4];
  65. my $name = pack('S n a4 x8', 2, $port, $addr);
  66. my $data_len = length($postdata);
  67. socket(SOCK, PF_INET, SOCK_STREAM, 0);
  68. connect(SOCK, $name) ;
  69. select(SOCK); $| = 1; select(STDOUT);
  70. print SOCK "POST $path HTTP/1.0$CRLF";
  71. print SOCK "Host: $host:$port$CRLF";
  72. print SOCK "Content-Length: $data_len$CRLF";
  73. print SOCK "$CRLF";
  74. print SOCK $postdata;
  75. my $ret = "";
  76. unless (<SOCK>) {
  77. close(SOCK);
  78. Carp::croak("can not connect to $url");
  79. }
  80. my $header = "";
  81. while (<SOCK>) {
  82. $header .= $_;
  83. last if ($_ eq $CRLF);
  84. }
  85. if ($header != /200/) {
  86. return $ret;
  87. }
  88. while (<SOCK>) {
  89. $ret .= $_;
  90. }
  91. return $ret;
  92. }
  93. # TODO : merge with POST
  94. sub HttpGetRequest {
  95. my ($url) = @_;
  96. $url =~ /http:\/\/([^:\/]+)(:([0-9]+))?(\/.*)?/;
  97. my ($host, $port, $path) = ($1, $3, $4);
  98. $port ||= 80;
  99. $path ||= "/";
  100. my $CRLF= "\015\012";
  101. my $addr = (gethostbyname($host))[4];
  102. my $name = pack('S n a4 x8', 2, $port, $addr);
  103. socket(SOCK, PF_INET, SOCK_STREAM, 0);
  104. connect(SOCK, $name) ;
  105. select(SOCK); $| = 1; select(STDOUT);
  106. print SOCK "GET $path HTTP/1.0$CRLF";
  107. print SOCK "Host: $host:$port$CRLF";
  108. print SOCK "$CRLF";
  109. unless (<SOCK>) {
  110. close(SOCK);
  111. Carp::croak("can not connect to $url");
  112. }
  113. while (<SOCK>) {
  114. last if ($_ eq $CRLF);
  115. }
  116. my $ret = "";
  117. while (<SOCK>) {
  118. $ret .= $_;
  119. }
  120. return $ret;
  121. }
  122. sub XML2Obj {
  123. my $xml = shift;
  124. my $xs = new XML::Simple( keyattr=>[] );
  125. return $xs->XMLin($xml);
  126. }
  127. sub Log {
  128. my $server_name = shift;
  129. my @param = @_;
  130. open(FILE, ">>" . $OpenSim::Config::DEBUG_LOGDIR . "/" . $server_name . ".log");
  131. foreach(@param) {
  132. print FILE $_ . "\n";
  133. }
  134. print FILE "<<<<<<<<<<<=====================\n\n";
  135. close(FILE);
  136. }
  137. 1;