Révision 38868600
loop over every socket/port to get the version and use it afterwards as cache
| plugins/rtorrent/rtom_allsessions_peers | ||
|---|---|---|
| 75 | 75 |
|
| 76 | 76 |
# detect rtorrent version |
| 77 | 77 |
use version; |
| 78 |
my $rtorrent_version; |
|
| 78 |
my %rtorrent_version; |
|
| 79 |
sub get_socket_version {
|
|
| 80 |
my $version; |
|
| 81 |
my $line_version= "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>system.client_version</methodName></methodCall>"; |
|
| 82 |
my $llen = length $line_version; |
|
| 83 |
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
|
|
| 84 |
my $hlen = length $header; |
|
| 85 |
$line_version= "${hlen}:${header},${line_version}";
|
|
| 86 |
print SOCK $line_version; |
|
| 87 |
flush SOCK; |
|
| 88 |
my $pattern = qr/<value><string>([0-9.]+)<\/string><\/value>/; |
|
| 89 |
while ( $line = <SOCK> ) {
|
|
| 90 |
if ( $line =~ /$pattern/ ) {
|
|
| 91 |
$version = $1; |
|
| 92 |
} |
|
| 93 |
} |
|
| 94 |
close (SOCK); |
|
| 95 |
$rtorrent_version{$_[0]} = $version;
|
|
| 96 |
} |
|
| 79 | 97 |
sub rtorrent_version_lower_than {
|
| 80 |
if (not length $rtorrent_version){
|
|
| 98 |
if (keys %rtorrent_version == 0 && not defined $_[0]){
|
|
| 81 | 99 |
if ( ( defined $src ) && ( $src eq "socket" ) ) {
|
| 82 |
socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; |
|
| 83 |
connect( SOCK, sockaddr_un( $socket ) ) or die $!; |
|
| 100 |
for $socket (@sockets) |
|
| 101 |
{
|
|
| 102 |
socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; |
|
| 103 |
connect( SOCK, sockaddr_un( $socket ) ) or die $!; |
|
| 104 |
get_socket_version $port; |
|
| 105 |
close (SOCK); |
|
| 106 |
} |
|
| 84 | 107 |
} else {
|
| 85 |
socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); |
|
| 86 |
connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); |
|
| 108 |
for $port (@ports) |
|
| 109 |
{
|
|
| 110 |
socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); |
|
| 111 |
connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); |
|
| 112 |
get_socket_version $port; |
|
| 113 |
close (SOCK); |
|
| 114 |
} |
|
| 87 | 115 |
} |
| 88 |
my $line_version= "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>system.client_version</methodName></methodCall>"; |
|
| 89 |
my $llen = length $line_version; |
|
| 90 |
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
|
|
| 91 |
my $hlen = length $header; |
|
| 92 |
$line_version= "${hlen}:${header},${line_version}";
|
|
| 93 |
print SOCK $line_version; |
|
| 94 |
flush SOCK; |
|
| 95 |
my $pattern = qr/<value><string>([0-9.]+)<\/string><\/value>/; |
|
| 96 |
while ( $line = <SOCK> ) {
|
|
| 97 |
if ( $line =~ /$pattern/ ) {
|
|
| 98 |
$rtorrent_version = $1; |
|
| 99 |
} |
|
| 100 |
} |
|
| 101 |
close (SOCK); |
|
| 102 | 116 |
} |
| 103 |
return version->parse($rtorrent_version) < version->parse($_[0]); |
|
| 117 |
if(defined $_[1]){
|
|
| 118 |
return version->parse($rtorrent_version{$_[0]}) < version->parse($_[1]);
|
|
| 119 |
} |
|
| 104 | 120 |
} |
| 105 |
|
|
| 121 |
# init rtorrent_version |
|
| 122 |
rtorrent_version_lower_than(); |
|
| 106 | 123 |
|
| 107 | 124 |
my $pattern = qr/<value><(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; |
| 108 | 125 |
my $tpattern = qr/[0-9A-F]{20}/;
|
| 109 |
|
|
| 110 |
my $function_multicall = rtorrent_version_lower_than('0.9.0') ? 'd.multicall' : 'd.multicall2';
|
|
| 111 |
my $function_hash = rtorrent_version_lower_than('0.9.0') ? 'd.get_hash=' : 'd.hash=';
|
|
| 112 |
my $line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>$function_multicall</methodName><params><param><value><string>main</string></value></param><param><value><string>$function_hash</string></value></param><param><value><string>p.multicall=,p.is_encrypted=,p.is_incoming=</string></value></param></params></methodCall>"; |
|
| 113 |
my $llen = length $line; |
|
| 114 |
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
|
|
| 115 |
my $hlen = length $header; |
|
| 126 |
sub construct_line {
|
|
| 127 |
my $function_multicall = rtorrent_version_lower_than($_[0], '0.9.0') ? 'd.multicall' : 'd.multicall2'; |
|
| 128 |
my $function_hash = rtorrent_version_lower_than($_[0], '0.9.0') ? 'd.get_hash=' : 'd.hash='; |
|
| 129 |
my $line = "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>$function_multicall</methodName><params><param><value><string>main</string></value></param><param><value><string>$function_hash</string></value></param><param><value><string>p.multicall=,p.is_encrypted=,p.is_incoming=</string></value></param></params></methodCall>"; |
|
| 130 |
my $llen = length $line; |
|
| 131 |
my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
|
|
| 132 |
my $hlen = length $header; |
|
| 133 |
$line = "${hlen}:${header},${line}";
|
|
| 134 |
return $line; |
|
| 135 |
} |
|
| 116 | 136 |
|
| 117 | 137 |
my $tor = 0; |
| 118 | 138 |
my $tot = 0; |
| ... | ... | |
| 123 | 143 |
my $out = 0; |
| 124 | 144 |
my $pla = 0; |
| 125 | 145 |
|
| 126 |
|
|
| 127 | 146 |
if ( ( defined $src ) && ( $src eq "socket" ) ) {
|
| 128 | 147 |
for $socket (@sockets) |
| 129 | 148 |
{
|
| 130 | 149 |
socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; |
| 131 | 150 |
connect( SOCK, sockaddr_un( $socket ) ) or die $!; |
| 132 |
my $line = "${hlen}:${header},${line}";
|
|
| 133 |
print SOCK $line; |
|
| 151 |
print SOCK construct_line($socket); |
|
| 134 | 152 |
flush SOCK; |
| 135 | 153 |
while ( $line = <SOCK> ) {
|
| 136 | 154 |
if ( $line =~ /$tpattern/ ) {
|
| ... | ... | |
| 154 | 172 |
{
|
| 155 | 173 |
socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); |
| 156 | 174 |
connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); |
| 157 |
my $line = "${hlen}:${header},${line}";
|
|
| 158 |
print SOCK $line; |
|
| 175 |
print SOCK construct_line($port); |
|
| 159 | 176 |
flush SOCK; |
| 160 | 177 |
while ( $line = <SOCK> ) {
|
| 161 | 178 |
if ( $line =~ /$tpattern/ ) {
|
Formats disponibles : Unified diff