torrent_share gearman worker
authorDobrica Pavlinusic <dpavlin@rsync1.maxxo.com>
Mon, 9 Jan 2012 20:07:50 +0000 (21:07 +0100)
committerDobrica Pavlinusic <dpavlin@rsync1.maxxo.com>
Mon, 9 Jan 2012 20:07:50 +0000 (21:07 +0100)
gearman/transmission.pl

index bf6bce3..2531ed3 100755 (executable)
@@ -5,6 +5,7 @@ use strict;
 use Transmission::Client;
 use JSON::XS;
 use Data::Dump qw(dump);
+use autodie;
 
 sub home_dir {
        my $login = shift;
@@ -22,7 +23,10 @@ my $j = JSON::XS->new;
 $j->allow_blessed(1);
 $j->convert_blessed(0);
 
+use TokyoCabinet;
+
 my $name = $ENV{ZSLICE} || die "need ZSLICE";
+my $torrent_dir = "/$name/torrent";
 $name =~ s/\W+/_/g;
 
 $worker->register_function( $name . '_torrent_list' => sub {
@@ -40,6 +44,41 @@ $worker->register_function( $name . '_torrent_list' => sub {
        return $j->encode( \@list );
 } );
 
+$worker->register_function( $name . '_torrent_share' => sub {
+       my $work = $_[0]->arg;
+       chomp $work;
+       warn "# torrent_share [$work]\n";
+       
+       my $user = $1 if $work =~ s{~(\w+)/}{};
+       my $path = $work;
+
+       my $dir = (getpwnam($user))[7] || die "no user $user";
+       my $md5_path = "$dir/.md5";
+       my %h;
+       tie %h, "TokyoCabinet::HDB", $md5_path || die "$md5_path: $!";
+       my $md5 = $h{$path} || die "can't find $path in $md5_path";
+       untie %h;
+
+       warn "# $md5 $path";
+
+       if ( ! -e "$torrent_dir/download/$md5" ) {
+               symlink "/rsync1/s1/md5/$md5", "$torrent_dir/download/$md5"; # FIXME slice path
+               warn "# created $torrent_dir/download/$md5";
+       }
+
+       if ( ! -e "$torrent_dir/md5/$md5.torrent" ) {
+               my $tracker = "http://213.186.16.27:6502/announce"; # FIXME
+               system "mktorrent --announce $tracker --no-date --verbose --output $torrent_dir/md5/$md5.torrent $torrent_dir/download/$md5";
+
+       }
+
+       symlink "$torrent_dir/md5/$md5.torrent", "$dir/$path.torrent" unless -e "$dir/$path.torrent";
+
+       $tc->add( filename => "$torrent_dir/md5/$md5.torrent" );
+
+       return "$dir/$path";
+} );
+
 warn "$0 $name pid $$ waitng for jobs\n";
 $worker->work while 1;