diff --git a/lib/sessions/downloader.pm b/lib/sessions/downloader.pm index 1f57e9ac9e4df55a2e941aebd7ab72f1e1ff922d..62839216dbd948caf29ca0a9aaa3b74d8e038188 100644 --- a/lib/sessions/downloader.pm +++ b/lib/sessions/downloader.pm @@ -19,6 +19,7 @@ POE::Session->create( signal_filename => \&sessions::downloader::ddl::signal_filename, signal_ddl => \&sessions::downloader::ddl::signal_ddl, signal_move => \&sessions::downloader::ddl::signal_move, + signal_rm => \&sessions::downloader::ddl::signal_rm, end_task => \&sessions::downloader::ddl::end_task, }, ); diff --git a/lib/sessions/downloader/ddl.pm b/lib/sessions/downloader/ddl.pm index e8f9daeab59d73e562b36ad159538dbc3a966d6b..1a91a6435dfa93440f0d6aa29dee044b01a6ed09 100644 --- a/lib/sessions/downloader/ddl.pm +++ b/lib/sessions/downloader/ddl.pm @@ -83,7 +83,7 @@ sub signal_filename { $log->error("error getting filename for $id : $status"); $heap->{ddl}->{pb}->{$id}->{child} = undef; - $kernel->yield("end_task"); + $kernel->yield("end_task", $id); return; } @@ -120,7 +120,7 @@ sub signal_ddl { if ($status ne "0") { $log->error("error downloading $id : $status"); - $kernel->yield("end_task"); + rm($kernel, $heap, $id, "/tmp/".$heap->{ddl}->{pb}->{$id}->{filename}.".part"); return; } @@ -155,23 +155,70 @@ sub signal_move { if ($status ne "0") { $log->error("error moving $id from tmp : $status"); + + # rm file + rm($kernel, $heap, $id, "/tmp/".$heap->{ddl}->{pb}->{$id}->{filename}); + return; } - else { - # we update db - eval { - utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename}); - }; - $log->error($@) if ($@); + + # we update db + eval { + utils::db::set_filename($id, $heap->{ddl}->{pb}->{$id}->{filename}); + $kernel->yield("end_task", $id); + }; + if ($a) { + $log->error($@); + rm( + $kernel, + $heap, + $id, + $conf->{save_folder}."/".$heap->{ddl}->{pb}->{$id}->{filename}, + ); } +} - delete $heap->{ddl}->{pb}->{$id}; - $kernel->yield("end_task"); +sub rm { + my ($kernel, $heap, $id, $filename) = @_; + + my $child = POE::Wheel::Run->new( + Program => [ + "rm", + $filename + ], + StdoutEvent => "devnull", + StderrEvent => "devnull", + ); + $kernel->sig_child($child->PID, "signal_rm"); + + # we link playbot id to PID and url + $heap->{ddl}->{pb}->{$id}->{child} = $child->PID; + + # we link wheel id to playbot id + $heap->{ddl}->{wid}->{$child->ID} = $id; + # we link PID to child object + $heap->{ddl}->{pid}->{$child->PID} = $child; +} + +sub signal_rm { + $log->debug("DDL"); + my ($kernel, $heap, $pid, $status) = @_[KERNEL, HEAP, ARG1, ARG2]; + + my $child = delete $heap->{ddl}->{pid}->{$pid}; + my $id = delete $heap->{ddl}->{wid}->{$child->ID}; + $heap->{ddl}->{pb}->{$id}->{child} = undef; + + if ($status ne "0") { + $log->critical("cannot remove file"); + } + + $kernel->yield("end_task", $id); } sub end_task { - my ($kernel, $heap) = @_[KERNEL, HEAP]; + my ($kernel, $heap, $id) = @_[KERNEL, HEAP, ARG0]; $heap->{ddl}->{running} = 0; + delete $heap->{ddl}->{pb}->{$id}; if (@{ $heap->{ddl}->{tasks} }) { my $task = shift $heap->{ddl}->{tasks};