| version 1.4, 2005/03/22 23:45:10 | 
version 1.27, 2010/05/19 23:19:43 | 
 | 
 | 
|  #!/usr/bin/perl -T | 
 #!/usr/bin/perl | 
|  #$Id$ | 
 # -T | 
|   | 
 #$RedRiver: MakeTorrents.pl,v 1.26 2010/03/22 20:16:02 andrew Exp $ | 
|  use strict; | 
 use strict; | 
|  use warnings; | 
 use warnings; | 
|  use diagnostics; | 
 use diagnostics; | 
|   | 
  | 
|  use lib 'lib'; | 
 use lib 'lib'; | 
|   | 
 use BT::MetaInfo::Cached; | 
|  use OpenBSDTorrents; | 
 use OpenBSDTorrents; | 
|   | 
  | 
|  %ENV = (); | 
 %ENV = (); | 
|   | 
  | 
|  use YAML; | 
 chdir( $OBT->{DIR_FTP} ) | 
|   | 
     || die "Couldn't change dir to " . $OBT->{DIR_FTP} . ": $!"; | 
|   | 
  | 
|  my $BTMake   = '/usr/local/bin/btmake'; | 
 my $StartDir = ''; | 
|  my $MinFiles = 5; | 
 if (@ARGV) { | 
|   | 
     foreach (@ARGV) { | 
|   | 
         s#/$##; | 
|   | 
         Process_Dir($_); | 
|   | 
     } | 
|   | 
 } | 
|   | 
 else { | 
|   | 
     $StartDir = $OBT->{BASENAME}; | 
|   | 
     Process_Dir($StartDir); | 
|   | 
 } | 
|   | 
  | 
|  my $StartDir = shift || $BaseName; | 
 sub Process_Dir { | 
|  $StartDir =~ s#/$##; | 
     my $basedir = shift; | 
|   | 
  | 
|  chdir($BaseDir) || die "Couldn't change dir to $BaseDir"; | 
     #return undef if $basedir =~ /packages/; | 
|   | 
  | 
|  Process_Dir($StartDir); | 
     my ( $dirs, $files ) = Get_Files_and_Dirs($basedir); | 
|   | 
     if ( -f $basedir) { | 
|   | 
         $basedir =~ s{/[^/]+$}{}xms; | 
|   | 
     } | 
|   | 
     if (@$files) { | 
|   | 
         Make_Torrent( $basedir, $files ); | 
|   | 
     } | 
|   | 
  | 
|  sub Process_Dir | 
     # don't recurse if we were started with a specific directory | 
|  { | 
     return 1 if $StartDir ne $OBT->{BASENAME}; | 
|          my $basedir = shift; | 
  | 
|   | 
  | 
|          my ($dirs, $files) = Get_Files_and_Dirs($basedir); | 
     foreach my $subdir (@$dirs) { | 
|          if (@$files) { | 
         next if $subdir =~ /^\./; | 
|                  my $torrent = Make_Torrent($basedir, $files); | 
         Process_Dir("$basedir/$subdir"); | 
|          } | 
     } | 
|   | 
 } | 
|   | 
  | 
|          # don't recurse if we were called on a specific directory | 
 sub Make_Torrent { | 
|          return 1 if $StartDir ne $BaseName; | 
     my $basedir = shift; | 
|   | 
     my $files   = shift; | 
|   | 
  | 
|          foreach my $subdir (@$dirs) { | 
     if ( $basedir !~ /\.\./ && $basedir =~ /^([\w\/\.-]+)$/ ) { | 
|                  next if $subdir eq '.'; | 
         $basedir = $1; | 
|                  next if $subdir eq '..'; | 
     } | 
|                  Process_Dir("$basedir/$subdir") | 
     else { | 
|          } | 
         die "Invalid characters in dir '$basedir'"; | 
|  } | 
     } | 
|   | 
  | 
|  sub Make_Torrent | 
     if ( $#{$files} < $OBT->{MIN_FILES} | 
|  { | 
       && $files->[0] !~/$INSTALL_ISO_REGEX/xms ) { | 
|          my $basedir = shift; | 
         print "Too few files in $basedir, skipping . . .\n"; | 
|          my $files   = shift; | 
         return undef; | 
|   | 
     } | 
|   | 
  | 
|          if ($#{ $files } < $MinFiles) { | 
     my $torrent = Name_Torrent($basedir); | 
|                  print "Too few files in $basedir, skipping . . .\n"; | 
     my $comment = "Files from $basedir"; | 
|                  return undef; | 
  | 
|          } | 
  | 
|   | 
  | 
|          if ($basedir !~ /\.\./ && $basedir =~ /^([\w\/\.-]+)$/) { | 
     my %torrents; | 
|                  $basedir = $1; | 
     foreach my $file (@$files) { | 
|          } else { | 
         if ( $file =~ /^([^\/]+)$/ ) { | 
|                  die "Invalid characters in dir '$basedir'"; | 
             $file = $1; | 
|   | 
  | 
|   | 
             my $t = $torrent; | 
|   | 
             my $c = $comment; | 
|   | 
  | 
|   | 
             if ( $file =~ /$INSTALL_ISO_REGEX/xms ) { | 
|   | 
                 $t = Name_Torrent("$basedir/$file"); | 
|   | 
                 $c = "$basedir/$file"; | 
|   | 
             } | 
|   | 
             elsif ( my ($ext) = $file =~ /$SONG_REGEX/xms ) { | 
|   | 
                 $t = Name_Torrent("$basedir/$ext"); | 
|   | 
                 $c = "$ext files from $basedir"; | 
|   | 
             } | 
|   | 
  | 
|   | 
             $torrents{$t}{comment} = $c; | 
|   | 
             push @{ $torrents{$t}{files} }, "$basedir/$file"; | 
|          } | 
         } | 
|   | 
         else { | 
|   | 
             die "Invalid characters in file '$file' in '$basedir'"; | 
|   | 
         } | 
|   | 
     } | 
|   | 
  | 
|          foreach (@$files) { | 
     foreach my $t ( keys %torrents ) { | 
|                  if (/^([^\/]+)$/) { | 
  | 
|                          $_ = "$basedir/$1"; | 
         print "Creating $t (" | 
|                  } else { | 
             . ( scalar @{ $torrents{$t}{files} } ) | 
|                          die "Invalid characters in file '$_' in '$basedir'"; | 
             . " files)\n"; | 
|                  } | 
  | 
|   | 
         my $c = $torrents{$t}{comment}; | 
|   | 
         $c .= "\nCreated by andrew fresh (andrew\@afresh1.com)\n" | 
|   | 
             . "http://OpenBSD.somedomain.net/"; | 
|   | 
  | 
|   | 
         eval { btmake( $t, $c, $torrents{$t}{files} ); }; | 
|   | 
         if ($@) { | 
|   | 
             print "Error creating $t\n$@\n"; | 
|          } | 
         } | 
|   | 
  | 
|          my $torrent = Name_Torrent($basedir); | 
         #        system($BTMake, | 
|   | 
         #               '-C', | 
|   | 
         #               '-c', $comment, | 
|   | 
         #               '-n', $OBT->{BASENAME}, | 
|   | 
         #               '-o', $OBT->{DIR_TORRENT} . "/$t", | 
|   | 
         #               '-a', $Tracker, | 
|   | 
         #               @$files | 
|   | 
         #        );# || die "Couldn't system $BTMake $t: $!"; | 
|   | 
     } | 
|   | 
  | 
|          print "Creating $torrent\n"; | 
     return [ keys %torrents ]; | 
|   | 
 } | 
|   | 
  | 
|          my $comment = "Files from $basedir\n" . | 
 # Stole and modified from btmake to work for this. | 
|                        "Created by andrew fresh (andrew\@mad-techies.org)\n" . | 
 sub btmake { | 
|                        "http://OpenBSD.somedomain.net/"; | 
     no locale; | 
|   | 
  | 
|          system($BTMake, | 
     my $torrent = shift; | 
|                 '-C', | 
     my $comment = shift; | 
|                 '-c', $comment, | 
     my $files   = shift; | 
|                 '-n', $BaseName, | 
  | 
|                 '-o', "$TorrentDir/$torrent", | 
  | 
|                 '-a', $Tracker, | 
  | 
|                 @$files | 
  | 
|          );# || die "Couldn't system $BTMake $torrent: $!"; | 
  | 
|   | 
  | 
|          return $torrent; | 
     my $name      = $OBT->{BASENAME}; | 
|   | 
     my $announce  = $OBT->{URL_TRACKER}; | 
|   | 
     my $piece_len = 2 << ( $OBT->{PIECE_LENGTH} - 1 ); | 
|   | 
  | 
|   | 
     my $torrent_with_path = $OBT->{DIR_NEW_TORRENT} . "/$torrent"; | 
|   | 
  | 
|   | 
     #if (@$files == 1) { | 
|   | 
     #$name = $files->[0]; | 
|   | 
     #} | 
|   | 
  | 
|   | 
     my $t | 
|   | 
         = BT::MetaInfo::Cached->new( { cache_root => '/tmp/OBTFileCache' } ); | 
|   | 
  | 
|   | 
     $t->name($name); | 
|   | 
     $t->announce($announce); | 
|   | 
     unless ( $announce =~ m!^http://[^/]+/!i ) { | 
|   | 
         warn | 
|   | 
             "  [ WARNING: announce URL does not look like: http://hostname/ ]\n"; | 
|   | 
     } | 
|   | 
     $t->comment($comment); | 
|   | 
  | 
|   | 
     #foreach my $pair (split(/;/, $::opt_f)) { | 
|   | 
     #    if (my($key, $val) = split(/,/, $pair, 2)) { | 
|   | 
     #        $t->set($key, $val); | 
|   | 
     #    } | 
|   | 
     #} | 
|   | 
     $t->piece_length($piece_len); | 
|   | 
     $t->creation_date(time); | 
|   | 
  | 
|   | 
     #print "Checksumming files. This may take a little while...\n"; | 
|   | 
  | 
|   | 
     # Can't use this,  have to do this manually because | 
|   | 
     # we need to have the multi-file type of torrent | 
|   | 
     # even when we have only one file. | 
|   | 
     #$t->set_files(@$files); | 
|   | 
  | 
|   | 
     my @file_list; | 
|   | 
     foreach my $f (@$files) { | 
|   | 
         my $l = ( stat("$OBT->{DIR_FTP}/$f") )[7]; | 
|   | 
         my @p = split /\//, $f; | 
|   | 
         shift @p; | 
|   | 
         push @file_list, | 
|   | 
             { | 
|   | 
             length => $l, | 
|   | 
             path   => \@p, | 
|   | 
             }; | 
|   | 
     } | 
|   | 
     $t->files( \@file_list ); | 
|   | 
     $t->make_pieces(@$files); | 
|   | 
  | 
|   | 
     if ( $t->total_size < $OBT->{MIN_SIZE} ) { | 
|   | 
         print "Skipping smaller than minimum size\n"; | 
|   | 
         return 0; | 
|   | 
     } | 
|   | 
  | 
|   | 
     my $hash = $t->info_hash; | 
|   | 
     $hash = unpack( "H*", $hash ); | 
|   | 
  | 
|   | 
     $t->save($torrent_with_path); | 
|   | 
     print "Created: $torrent_with_path\n"; | 
|  } | 
 } | 
|   | 
  |