5 use Transmission::Client;
7 use Data::Dump qw(dump);
12 my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) = getpwnam $login;
13 return ( $uid, $gid, $dir );
17 my $worker = Gearman::Worker->new;
18 $worker->job_servers('127.0.0.1:4730');
20 my $tc = Transmission::Client->new( autodie => 1 );
22 my $j = JSON::XS->new;
24 $j->convert_blessed(0);
28 my $name = $ENV{ZSLICE} || die "need ZSLICE";
29 my $torrent_dir = "/$name/torrent";
32 $worker->register_function( $name . '_torrent_list' => sub {
34 my @cols = split(/\s+/,$job->arg);
35 @cols = qw( id name seeders leechers ) unless @cols;
37 for my $torrent ($tc->read_torrents) {
38 warn "## torrent = ",dump($torrent);
40 $hash->{$_} = $torrent->$_ foreach @cols;
43 warn "# torrent_list = ",dump( \@list );
44 return $j->encode( \@list );
47 $worker->register_function( $name . '_torrent_download' => sub {
48 my $work = $_[0]->arg;
50 warn "# torrent_download [$work]\n";
52 my $user = $1 if $work =~ s{~(\w+)/}{};
55 my $dir = (getpwnam($user))[7] || die "no user $user";
57 my $to_dir = "$torrent_dir/download/$user";
61 my ($uid,$gid) = (stat($torrent_dir))[4,5];
62 chown $uid, $gid, $to_dir;
65 $tc->add( filename => "$dir/$path", 'download-dir' => $to_dir );
70 $worker->register_function( $name . '_torrent_download_done' => sub {
71 my $work = $_[0]->arg;
73 warn "# torrent_download_done [$work]\n";
75 my ( $id, $dir, $name, $hash ) = split(/\s+#\s+/,$work);
79 if ( $dir =~ m{/(\w+)$} ) {
82 warn "# check $name md5sum";
83 my $md5sum = `md5sum "$dir/$name"`;
84 $md5sum =~ s/\s+.*$//;
85 if ( $name ne $md5sum ) {
86 warn "ERROR: invalid md5sum for $name -> $md5sum\n";
89 warn "# move $name to $user\n";
90 my ( $uid, $gid, $home_dir ) = user_info $user;
91 link "$dir/$name", "$home_dir/$name";
92 chown $uid, $gid, "$home_dir/$name";
93 warn "FIXME: add to md5 pool?";
98 warn "ERROR: can't find user in $dir for $name\n";
101 warn "# $id removed $dir $name $hash\n";
107 $worker->register_function( $name . '_torrent_share' => sub {
108 my $work = $_[0]->arg;
110 warn "# torrent_share [$work]\n";
112 my $user = $1 if $work =~ s{~(\w+)/}{};
115 my $dir = (getpwnam($user))[7] || die "no user $user";
116 my $md5_path = "$dir/.md5";
118 tie %h, "TokyoCabinet::HDB", $md5_path || die "$md5_path: $!";
119 my $md5 = $h{$path} || die "can't find $path in $md5_path";
124 if ( ! -e "$torrent_dir/download/$md5" ) {
125 symlink "/rsync1/s1/md5/$md5", "$torrent_dir/download/$md5"; # FIXME slice path
126 warn "# created $torrent_dir/download/$md5";
129 if ( ! -e "$torrent_dir/md5/$md5.torrent" ) {
130 my $tracker = "http://213.186.16.27:6502/announce"; # FIXME
131 system "mktorrent --announce $tracker --no-date --verbose --output $torrent_dir/md5/$md5.torrent $torrent_dir/download/$md5";
135 symlink "$torrent_dir/md5/$md5.torrent", "$dir/$path.torrent" unless -e "$dir/$path.torrent";
137 $tc->add( filename => "$torrent_dir/md5/$md5.torrent" );
142 warn "$0 $name pid $$ waitng for jobs\n";
143 $worker->work while 1;