5 use Transmission::Client;
7 use Data::Dump qw(dump);
9 use File::Path qw(make_path remove_tree);
13 my ( undef, undef, $uid, $gid, undef, undef, $email, $dir, $shell ) = getpwnam $login;
14 return ( $uid, $gid, $dir );
18 my $worker = Gearman::Worker->new;
19 $worker->job_servers('127.0.0.1:4730');
21 my $tc = Transmission::Client->new( autodie => 1 );
23 my $j = JSON::XS->new;
25 $j->convert_blessed(0);
28 use CloudStore::MD5sum;
30 my $name = $ENV{ZSLICE} || die "need ZSLICE";
31 my $torrent_dir = "/$name/torrent";
34 =head1 host_s1_torrent_list
36 Returns JSON encoded list of all torrents
40 $worker->register_function( $name . '_torrent_list' => sub {
42 my @cols = split(/\s+/,$job->arg);
43 @cols = qw( id name seeders leechers ) unless @cols;
45 for my $torrent ($tc->read_torrents) {
46 warn "## torrent = ",dump($torrent);
48 $hash->{$_} = $torrent->$_ foreach @cols;
51 warn "# torrent_list = ",dump( \@list );
52 return $j->encode( \@list );
55 =head1 host_s1_torrent_download ~login/path.torrent
57 Start download of torrent
61 $worker->register_function( $name . '_torrent_download' => sub {
62 my $work = $_[0]->arg;
64 warn "# torrent_download [$work]\n";
66 my $user = $1 if $work =~ s{~(\w+)/}{};
69 my $dir = (getpwnam($user))[7] || die "no user $user";
71 my $torrent_file = "$dir/$path";
73 $path =~ s/\.torrent$//;
74 my $to_dir = "$torrent_dir/download/$user/$path";
75 my ($uid,$gid) = (stat($torrent_dir))[4,5];
76 make_path $to_dir, { uid => $uid, gid => $gid };
78 my $t = $tc->add( filename => $torrent_file, 'download-dir' => $to_dir );
79 warn "# added $to_dir = ",dump($t);
84 $worker->register_function( $name . '_torrent_download_done' => sub {
85 my $work = $_[0]->arg;
87 warn "# torrent_download_done [$work]\n";
89 my ( $id, $dir, $name, $hash ) = split(/\s+#\s+/,$work);
91 if ( $dir =~ m{/download/(\w+)/(.+)$} ) {
95 warn "# check $name md5sum";
96 my $md5sum = `md5sum "$dir/$name"`;
97 $md5sum =~ s/\s+.*$//s;
98 if ( $name ne $md5sum ) {
99 warn "ERROR: invalid md5sum filename ",dump( $name, $md5sum );
102 warn "# move $name to $user $path\n";
103 my ( $uid, $gid, $home_dir ) = user_info $user;
104 link "$dir/$name", "$home_dir/$path";
105 chown $uid, $gid, "$home_dir/$path";
106 warn "FIXME: add to md5 pool?";
108 my $t = $tc->remove( $id );
109 warn "# remove $id = ",dump($t);
111 warn "# $id removed $dir $name $hash\n";
115 warn "ERROR: can't find user in $dir for $name\n";
121 =head1 host_s1_torrent_share ~login/file.txt
123 Create torrent and start seeding it
127 $worker->register_function( $name . '_torrent_share' => sub {
128 my $work = $_[0]->arg;
130 warn "# torrent_share [$work]\n";
132 my $user = $1 if $work =~ s{~(\w+)/}{};
135 my $dir = (getpwnam($user))[7] || die "no user $user";
136 my $md5 = CloudStore::MD5sum->md5_get( "$dir/$path" );
140 if ( ! -e "$torrent_dir/download/$md5" ) {
141 symlink "/rsync1/s1/md5/$md5", "$torrent_dir/download/$md5"; # FIXME slice path
142 warn "# created $torrent_dir/download/$md5";
145 if ( ! -e "$torrent_dir/md5/$md5.torrent" ) {
146 my $tracker = "http://213.186.16.27:6502/announce"; # FIXME
147 system "mktorrent --announce $tracker --no-date --verbose --output $torrent_dir/md5/$md5.torrent $torrent_dir/download/$md5";
151 symlink "$torrent_dir/md5/$md5.torrent", "$dir/$path.torrent" unless -e "$dir/$path.torrent";
153 $tc->add( filename => "$torrent_dir/md5/$md5.torrent" );
158 warn "$0 $name pid $$ waitng for jobs\n";
159 $worker->work while 1;