[BACK]Return to ServerTorrents.pl CVS log [TXT][DIR] Up to [local] / openbsd / OpenBSDTorrents

Diff for /openbsd/OpenBSDTorrents/ServerTorrents.pl between version 1.27 and 1.28

version 1.27, 2008/12/29 22:04:00 version 1.28, 2010/01/07 18:50:02
Line 1 
Line 1 
 #!/usr/bin/perl -T  #!/usr/bin/perl -T
 #$RedRiver: ServerTorrents.pl,v 1.26 2008/12/29 22:02:14 andrew Exp $  #$RedRiver: ServerTorrents.pl,v 1.27 2008/12/29 22:04:00 andrew Exp $
 use strict;  use strict;
 use warnings;  use warnings;
 use diagnostics;  use diagnostics;
Line 7 
Line 7 
 use LWP::UserAgent;  use LWP::UserAgent;
 use Time::Local;  use Time::Local;
 use File::Basename;  use File::Basename;
   
 #use YAML;  #use YAML;
   
 use lib 'lib';  use lib 'lib';
Line 17 
Line 18 
   
 justme();  justme();
   
 my @Sizes = ('', 'Ki', 'Mi', 'Gi', 'Ti');  my @Sizes = ( '', 'Ki', 'Mi', 'Gi', 'Ti' );
 my $ua = LWP::UserAgent->new;  my $ua = LWP::UserAgent->new;
   
 my $response = $ua->get($OBT->{URL_TORRENTS});  my $response = $ua->get( $OBT->{URL_TORRENTS} );
   
 my %server_torrents;  my %server_torrents;
 if ($response->is_success) {  if ( $response->is_success ) {
     my $content = $response->content;  # or whatever      my $content = $response->content;    # or whatever
     $content =~ s/^.*<!-- BEGIN LIST -->//s || die "Beginning of list not found!";      $content =~ s/^.*<!-- BEGIN LIST -->//s
     $content =~ s/<!-- END LIST -->.*$//s   || die "End of list not found!";          || die "Beginning of list not found!";
     unless ($content =~ /No data/) {      $content =~ s/<!-- END LIST -->.*$//s || die "End of list not found!";
         foreach (split /\n/, $content) {      unless ( $content =~ /No data/ ) {
           foreach ( split /\n/, $content ) {
             s/^\s+//;              s/^\s+//;
             s/\s+$//;              s/\s+$//;
             next unless $_;              next unless $_;
             my ($name, $hash, $disabled) = split /\t/;              my ( $name, $hash, $disabled ) = split /\t/;
             next if $name eq 'File';              next if $name eq 'File';
   
             $name =~ s#.*/##;              $name =~ s#.*/##;
             $server_torrents{$name}{$hash} = $disabled;              $server_torrents{$hash} = {
                   name     => $name,
                   disabled => $disabled,
               };
         }          }
     }      }
 } else {  }
   else {
     die $response->status_line;      die $response->status_line;
 }  }
   
 my %files;  my %torrents;
 opendir DIR, $OBT->{DIR_TORRENT} or die "Couldn't opendir $OBT->{DIR_TORRENT}: $!";  opendir DIR, $OBT->{DIR_TORRENT}
 foreach (readdir DIR) {      or die "Couldn't opendir $OBT->{DIR_TORRENT}: $!";
         chomp;  foreach my $torrent ( readdir DIR ) {
         if (/^([^\/]+)$/) {      chomp $torrent;
                 $_ = $1;      next unless $torrent =~ /\.torrent$/;
         } else {  
                 die "Invalid character in $_: $!";  
         }  
         next unless /\.torrent$/;  
   
         my $name = basename($_, '.torrent');      if ($torrent =~ /^([^\/]+)$/) {
           $torrent = $1;
       }
       else {
           die "Invalid character in $torrent: $!";
       }
   
         if (my ($base, $year, $mon, $mday, $hour, $min) =      my $name = basename( $torrent, '.torrent' );
            /^(.*)-(\d{4})-(\d{2})-(\d{2})-(\d{2})(\d{2})/) {  
                 $name = $base;  
         }  
   
         my $t;      if ( my ( $base, $year, $mon, $mday, $hour, $min )
         eval {          = $torrent =~ /^(.*)-(\d{4})-(\d{2})-(\d{2})-(\d{2})(\d{2})/ )
                 $t = BT::MetaInfo::Cached->new(      {
                         $OBT->{DIR_TORRENT} . '/' . $_,          $name = $base;
                         {      }
                                 cache_root => '/tmp/OBTFileCache'  
                                 #$OBT->{DIR_HOME} . '/FileCache'  
                         }  
                 );  
         };  
   
         if ($@) {      my $t;
                 warn "Error reading torrent $_\n";      eval {
                 next;          $t = BT::MetaInfo::Cached->new(
         }              $OBT->{DIR_TORRENT} . '/' . $torrent,
               {   cache_root => '/tmp/OBTFileCache'
   
         my $epoch = $t->creation_date;                      #$OBT->{DIR_HOME} . '/FileCache'
               }
           );
       };
       if ($@) {
           warn "Error reading torrent $torrent\n";
           next;
       }
   
         $files{$name}{$epoch} = {      #my $epoch = $t->creation_date;
                 file      => $_,  
                 details   => $t,  
                 name      => $name,  
                 epoch     => $epoch,  
         };  
   
       my $hash = unpack( "H*", $t->info_hash );
       $torrents{$hash} = {
           file    => $torrent,
           details => $t,
           name    => $name,
           #epoch   => $epoch,
       };
   
       if ( !exists $server_torrents{$hash} ) {
           Upload_Torrent( $torrents{$hash} );
       }
 }  }
 closedir DIR;  closedir DIR;
   
 #print Dump \%server_torrents;  #print Dump \%server_torrents;
 #print Dump \%files;  
 #exit;  #exit;
   
 my %torrents;  foreach my $hash ( keys %server_torrents ) {
 FILE: foreach my $name (keys %files) {  
         #print "$name\n";  
         foreach my $epoch ( sort { $b <=> $a } keys %{ $files{$name} } ) {  
                 #print "\t$epoch\n";  
                 my $torrent = $files{$name}{$epoch}{file};  
                 my $hash = unpack("H*", $files{$name}{$epoch}{'details'}->info_hash );  
                 #printf "LOCAL:  [%s] [%s]\n", $hash, $torrent;  
   
                 $torrents{$torrent}{$hash} = $files{$name}{$epoch};      #printf "SERVER: [%s] [%s]\n", $hash, $torrent;
       if (   ( !exists $torrents{$hash} )
                 unless (exists $server_torrents{$torrent}{$hash}) {          && ( !$server_torrents{$hash}{disabled} ) )
                         Upload_Torrent($files{$name}{$epoch});      {
                 }          Delete_Torrent( $server_torrents{$hash}{name}, $hash );
         }      }
 }  }
   
 foreach my $torrent (keys %server_torrents) {  $ua->get( $OBT->{URL_SANITY} );
         foreach my $hash (keys %{ $server_torrents{$torrent} }) {  
                 #printf "SERVER: [%s] [%s]\n", $hash, $torrent;  
                 if ((! exists $torrents{$torrent}{$hash}) &&  
                     (  
                      (! defined $server_torrents{$torrent}{$hash}) ||  
                      $server_torrents{$torrent}{$hash} != 1  
                     )  
                 ) {  
                         Delete_Torrent($torrent, $hash);  
                 }  
         }  
 }  
   
 $ua->get($OBT->{URL_SANITY});  sub Upload_Torrent {
       my $torrent = shift;
       my $t       = $torrent->{'details'};
   
 sub Upload_Torrent      my $file = $torrent->{'file'};
 {      print "Uploading $file\n";
         my $torrent = shift;  
         my $t = $torrent->{'details'};  
   
         my $file = $torrent->{'file'};      my $size = $t->total_size;
         print "Uploading $file\n";      my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday )
           = gmtime( $t->creation_date );
       $year += 1900;
       $mon++;
       my $time = sprintf "%04d.%02d.%02d %02d:%02d",
           $year, $mon, $mday, $hour, $min;
   
         my $size = $t->total_size;      ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday )
         my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) =          = localtime( $t->creation_date );
                 gmtime($t->creation_date);      $year += 1900;
         $year += 1900;      $mon++;
         $mon++;      my $sql_time = sprintf "%04d-%02d-%02d %02d:%02d",
         my $time = sprintf "%04d.%02d.%02d %02d:%02d",          $year, $mon, $mday, $hour, $min;
                 $year, $mon, $mday,  $hour, $min;  
   
         ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) =      my $i = 0;
                 localtime($t->creation_date);      while ( $size > 1024 ) {
         $year += 1900;          $size /= 1024;
         $mon++;          $i++;
         my $sql_time = sprintf "%04d-%02d-%02d %02d:%02d",      }
                 $year, $mon, $mday,  $hour, $min;      $size = sprintf( '%.2f', $size );
       $size .= $Sizes[$i] . 'B';
   
         my $i = 0;      my $comment = $t->{comment};
         while ($size > 1024) {      $comment =~ s/\n.*$//s;
                 $size /= 1024;  
                 $i++;  
         }  
         $size = sprintf('%.2f', $size);  
         $size .= $Sizes[$i] . 'B';  
   
         my $comment = $t->{comment};  
         $comment =~ s/\n.*$//s;  
   
         my $filename =  
                  $comment =~ /($OBT->{BASENAME}.+)/ ? $1  
                 :                                $file;  
         $filename =~ s#/# #g;  
         $filename =~ s/\.torrent\z//;  
   
         $comment  .= " [$size]";  
         $filename .= " [$time]";  
   
         my $response = $ua->post($OBT->{URL_UPLOAD}, {      my $filename
                 username => $OBT->{UPLOAD_USER},          = $comment =~ /($OBT->{BASENAME}.+)/
                 password => $OBT->{UPLOAD_PASS},          ? $1
                 torrent  => [ $OBT->{DIR_TORRENT} . "/$file" ],          : $file;
                 url      => "/torrents/$file",      $filename =~ s#/# #g;
                 filename => $filename,      $filename =~ s/\.torrent\z//;
                 filedate => $sql_time,  
                 info     => $comment,  
                 hash     => '',  
                 autoset  => 'enabled', # -> checked="checked"  
         }, Content_Type => 'form-data');  
   
         if ($response->is_success) {      $comment  .= " [$size]";
                 print STDERR "Uploaded  $file\n";      $filename .= " [$time]";
                 #print $response->content;  
         } else {      my $response = $ua->post(
                 die $response->status_line;          $OBT->{URL_UPLOAD},
         }          {   username => $OBT->{UPLOAD_USER},
               password => $OBT->{UPLOAD_PASS},
               torrent  => [ $OBT->{DIR_TORRENT} . "/$file" ],
               url      => "/torrents/$file",
               filename => $filename,
               filedate => $sql_time,
               info     => $comment,
               hash     => '',
               autoset => 'enabled',    # -> checked="checked"
           },
           Content_Type => 'form-data'
       );
   
       if ( $response->is_success ) {
           print STDERR "Uploaded  $file\n";
   
           #print $response->content;
       }
       else {
           die $response->status_line;
       }
 }  }
   
 sub Delete_Torrent  sub Delete_Torrent {
 {      my $filename = shift;
         my $filename = shift;      my $hash     = shift;
         my $hash = shift;      die "No hash passed!" unless $hash;
         die "No hash passed!" unless $hash;  
   
         print "Removing $filename [$hash]\n";      print "Removing $filename [$hash]\n";
   
         my $response = $ua->post($OBT->{'URL_DELETE'}, {      my $response = $ua->post(
                 username => $OBT->{UPLOAD_USER},          $OBT->{'URL_DELETE'},
                 password => $OBT->{UPLOAD_PASS},          {   username => $OBT->{UPLOAD_USER},
                 filename => $filename,              password => $OBT->{UPLOAD_PASS},
                 hash     => $hash,              filename => $filename,
         }, Content_Type => 'form-data');              hash     => $hash,
           },
           Content_Type => 'form-data'
       );
   
         if ($response->is_success) {      if ( $response->is_success ) {
                 my ($result) = $response->content =~ /class="error"\>([^<]+)\</;          my ($result) = $response->content =~ /class="error"\>([^<]+)\</;
   
                 if ($result eq 'Torrent was removed successfully.') {          if ( $result eq 'Torrent was removed successfully.' ) {
                         print STDERR "Removed $filename [$hash]\n";              print STDERR "Removed $filename [$hash]\n";
                 }          }
                 elsif ($result) {          elsif ($result) {
                         print STDERR "Error: $result (removing $filename [$hash])\n";              print STDERR "Error: $result (removing $filename [$hash])\n";
                 }          }
                 else {          else {
                         print STDERR "An unknown error occurred removing $filename [$hash]\n";              print STDERR
                 }                  "An unknown error occurred removing $filename [$hash]\n";
         }          }
         else {      }
                 die $response->status_line . " removing $filename [$hash]\n";      else {
         }          die $response->status_line . " removing $filename [$hash]\n";
       }
 }  }

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.28

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>