8 my $dbh = DBI->connect("dbi:Pg:dbname=ta;host=127.0.0.1", "ta", "ta")
9 or die "db connect: " . DBI->errstr;
16 # connect to the tracker and tell just that
17 $proto = getprotobyname('tcp');
18 socket(SOCK, PF_INET, SOCK_STREAM, $proto);
19 $sin = sockaddr_in(80, inet_aton("85.17.40.39"));
22 my $hersockaddr = getpeername(STDIN);
23 my ($port, $iaddr) = sockaddr_in($hersockaddr);
24 $iaddr = inet_ntoa($iaddr);
26 print STDERR "LINE: $line\n";
29 if ($line =~ /info_hash=(.*?)&/) {
30 $ih = URI::Escape::uri_escape(URI::Escape::uri_unescape($1));
31 if ($line =~ /port=(\d+)&/) {
34 # add to the list of seen TG peers
35 if ($line =~ /event=stopped/) {
36 $dbh->do('DELETE FROM ta WHERE host=? AND info_hash=?', undef,
39 $dbh->do('INSERT INTO ta (host, port, seen, info_hash) VALUES (?,?,CURRENT_TIMESTAMP,?)', undef,
45 $line =~ s/\r\n\r\n//s;
46 $line .= "\r\nX-Forwarded-For: $iaddr\r\n\r\n";
50 # fetch the http header
58 my $bd = Convert::Bencode::bdecode($body);
59 if (exists($bd->{'peers'})) {
63 my $peers = $bd->{'peers'};
65 for my $i (0..(length($peers) / 6 - 1)) {
66 my $iaddr = inet_ntoa(substr($peers, ($i*6+1), 4));
67 my $p1 = ord(substr($peers, ($i*6+5), 1));
68 my $p2 = ord(substr($peers, ($i*6+6), 1));
69 my $port = ($p1 << 8) | $p2;
71 if ($iaddr =~ /^87\.76\./) {
72 print STDERR "FOUND INTERNAL PEER: $iaddr\n";
74 $dbh->do('INSERT INTO ta (host, port, seen, info_hash) VALUES (?,?,CURRENT_TIMESTAMP,?)', undef,
77 push @tgpeers, [ $iaddr, $port ];
80 push @allpeers, [ $iaddr, $port ];
83 # check for other peers
84 my $q = $dbh->prepare('SELECT DISTINCT ON (host) * FROM ta WHERE host<>? AND info_hash=? AND seen >= now() - INTERVAL \'1 hour 15 minutes\' ORDER BY host,seen desc');
85 $q->execute($iaddr, $ih);
87 while (my $ref = $q->fetchrow_hashref) {
88 push @tgpeers, [ $ref->{'host'}, $ref->{'port'} ];
91 if (scalar @tgpeers > 0) {
93 for my $peer (@tgpeers) {
94 $newpeers .= inet_aton($peer->[0]);
95 $newpeers .= chr($peer->[1] >> 8);
96 $newpeers .= chr($peer->[1] & 0xff);
98 print STDERR "Adding peer $peer->[0]:$peer->[1]\n";
101 # fish in some other peers
102 my $num = (scalar @tgpeers) * 2;
104 while ($num > 0 && $i < scalar @allpeers) {
105 my $iaddr = $allpeers[$i]->[0];
106 my $port = $allpeers[$i]->[1];
108 next if ($iaddr =~ /^87\.76\./);
111 $newpeers .= inet_aton($iaddr);
112 $newpeers .= chr($port >> 8);
113 $newpeers .= chr($port & 0xff);
116 $bd->{'peers'} = $newpeers;
117 print STDERR "DELIVER PEERS " . scalar @tgpeers . "\n";
118 $body = Convert::Bencode::bencode($bd);