implement transmission download-done via script and gearman
[cloudstore.git] / gearman / transmission.pl
index 220da18..901070d 100755 (executable)
@@ -7,10 +7,10 @@ use JSON::XS;
 use Data::Dump qw(dump);
 use autodie;
 
-sub home_dir {
+sub user_info {
        my $login = shift;
        my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) = getpwnam $login;
-       return $dir;
+       return ( $uid, $gid, $dir );
 }
 
 use Gearman::Worker;
@@ -67,6 +67,43 @@ $worker->register_function( $name . '_torrent_download' => sub {
        return $to_dir;
 } );
 
+$worker->register_function( $name . '_torrent_download_done' => sub {
+       my $work = $_[0]->arg;
+       chomp $work;
+       warn "# torrent_download_done [$work]\n";
+
+       my ( $id, $dir, $name, $hash ) = split(/\s+#\s+/,$work);
+
+       $tc->remove( $id );
+
+       if ( $dir =~ m{/(\w+)$} ) {
+               my $user = $1;
+
+               warn "# check $name md5sum";
+               my $md5sum = `md5sum "$dir/$name"`;
+               $md5sum =~ s/\s+.*$//;
+               if ( $name ne $md5sum ) {
+                       warn "ERROR: invalid md5sum for $name -> $md5sum\n";
+               } else {
+
+                       warn "# move $name to $user\n";
+                       my ( $uid, $gid, $home_dir ) = user_info $user;
+                       link "$dir/$name", "$home_dir/$name";
+                       chown $uid, $gid,  "$home_dir/$name";
+                       warn "FIXME: add to md5 pool?";
+
+               }
+
+       } else {
+               warn "ERROR: can't find user in $dir for $name\n";
+       }
+
+       warn "# $id removed $dir $name $hash\n";
+
+       unlink "$dir/$name";
+
+} );
+
 $worker->register_function( $name . '_torrent_share' => sub {
        my $work = $_[0]->arg;
        chomp $work;