From c148e02ce46e1c4d7e0c5bd9e50f088633ebeec1 Mon Sep 17 00:00:00 2001 From: espie Date: Mon, 27 Apr 2015 13:32:57 +0000 Subject: [PATCH] more or less "the final" dpb pieces for fetching as a separate user. --- infrastructure/lib/DPB/Fetch.pm | 9 +++-- infrastructure/lib/DPB/Job/Fetch.pm | 40 +++++++++++++++++------ infrastructure/lib/DPB/State.pm | 7 +++- infrastructure/lib/DPB/SubEngine/Fetch.pm | 4 +-- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/infrastructure/lib/DPB/Fetch.pm b/infrastructure/lib/DPB/Fetch.pm index 6a93e4dd914..535a847b304 100644 --- a/infrastructure/lib/DPB/Fetch.pm +++ b/infrastructure/lib/DPB/Fetch.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Fetch.pm,v 1.63 2014/03/17 10:48:40 espie Exp $ +# $OpenBSD: Fetch.pm,v 1.64 2015/04/27 13:32:57 espie Exp $ # # Copyright (c) 2010-2013 Marc Espie # @@ -22,6 +22,7 @@ use OpenBSD::md5; # handles fetch information, if required package DPB::Fetch; +our @ISA = (qw(DPB::UserProxy)); sub new { @@ -30,6 +31,7 @@ sub new logger => $logger, known_sha => {}, known_files => {}, known_short => {}, + user => $state->{fetch_user}, fetch_only => $state->{fetch_only}}, $class; if (defined $state->{subst}->value('FTP_ONLY')) { $o->{ftp_only} = 1; @@ -105,7 +107,7 @@ sub run_expire_old $core->unsquiggle; $core->start_job(DPB::Job::Normal->new( sub { - $self->expire_old; + $self->run_as(sub { $self->expire_old; }); }, sub { # and we will never need this again @@ -292,7 +294,8 @@ sub fetch { my ($self, $file, $core, $endcode) = @_; require DPB::Job::Fetch; - my $job = DPB::Job::Fetch->new($file, $endcode); + my $job = DPB::Job::Fetch->new($file, $endcode, $self, + $self->{logger}); $core->start_job($job, $file); } diff --git a/infrastructure/lib/DPB/Job/Fetch.pm b/infrastructure/lib/DPB/Job/Fetch.pm index 48147d05d64..fc2fdc59684 100644 --- a/infrastructure/lib/DPB/Job/Fetch.pm +++ b/infrastructure/lib/DPB/Job/Fetch.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Fetch.pm,v 1.3 2015/04/25 11:24:24 espie Exp $ +# $OpenBSD: Fetch.pm,v 1.4 2015/04/27 13:32:57 espie Exp $ # # Copyright (c) 2010-2013 Marc Espie # @@ -30,7 +30,10 @@ sub run { my ($self, $core) = @_; my $job = $core->job; - $self->redirect_fh($job->{logfh}, $job->{log}); + $job->{logger}->run_as( + sub { + $self->redirect_fh($job->{logfh}, $job->{log}); + }); exit(!$job->{file}->checksum($job->{file}->tempfilename)); } @@ -44,13 +47,19 @@ sub finalize # got a stupid error message instead, so retry for # full size. if (defined $self->{fetcher}->{initial_sz}) { - unlink($job->{file}->tempfilename); + $job->{fetcher}->run_as( + sub { + unlink($job->{file}->tempfilename); + }); } else { shift @{$job->{sites}}; } return $job->bad_file($self->{fetcher}, $core); } - rename($job->{file}->tempfilename, $job->{file}->filename); + $job->{fetcher}->run_as( + sub { + rename($job->{file}->tempfilename, $job->{file}->filename); + }); print {$job->{logfh}} "Renamed to ", $job->{file}->filename, "\n"; $job->{file}->cache; my $sz = $job->{file}->{sz}; @@ -103,7 +112,10 @@ sub run my $shell = $core->shell; my $site = $self->{site}; $site =~ s/^\"(.*)\"$/$1/; - $self->redirect($job->{log}); + $job->{logger}->run_as( + sub { + $self->redirect($job->{log}); + }); if ($job->{file}{sz} == 0) { print STDERR "No size in distinfo\n"; exit(1); @@ -119,7 +131,7 @@ sub run print STDERR "===> Trying $site\n"; print STDERR join(' ', @cmd), "\n"; # run ftp; - $core->shell->nochroot->exec(@cmd); + $core->shell->nochroot->run_as($job->{fetcher}{user})->exec(@cmd); } sub finalize @@ -139,7 +151,10 @@ sub finalize # definite error also if file is too large stat($job->{file}->tempfilename) && (stat _)[7] > $job->{file}->{sz}) { - unlink($job->{file}->tempfilename); + $job->{fetcher}->run_as( + sub { + unlink($job->{file}->tempfilename); + }); } # if we got suspended, well, might have to retry same site if (!$self->{got_suspended}) { @@ -190,17 +205,22 @@ sub new_checksum_task sub new { - my ($class, $file, $e) = @_; + my ($class, $file, $e, $fetcher, $logger) = @_; my $job = bless { sites => [@{$file->{site}}], file => $file, tasks => [], endcode => $e, + fetcher => $fetcher, + logger => $logger, log => $file->logger->make_distlogs($file), }, $class; - open $job->{logfh}, '>>', $job->{log}; + $job->{logger}->run_as( + sub { + open $job->{logfh}, '>>', $job->{log}; + }); print {$job->{logfh}} ">>> From ", $file->fullpkgpath, "\n"; - File::Path::mkpath(File::Basename::dirname($file->filename)); + $job->{fetcher}->make_path(File::Basename::dirname($file->filename)); $job->{watched} = DPB::Watch->new($file->tempfilename, $file->{sz}, undef, $job->{started}); $job->new_fetch_task; diff --git a/infrastructure/lib/DPB/State.pm b/infrastructure/lib/DPB/State.pm index abcbd4f20c8..17f32e1015f 100644 --- a/infrastructure/lib/DPB/State.pm +++ b/infrastructure/lib/DPB/State.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: State.pm,v 1.11 2015/04/26 18:00:19 espie Exp $ +# $OpenBSD: State.pm,v 1.12 2015/04/27 13:32:57 espie Exp $ # # Copyright (c) 2010-2013 Marc Espie # @@ -195,6 +195,11 @@ sub grabber return shift->{grabber}; } +sub fetch +{ + return shift->{grabber}{fetch}; +} + sub make { return shift->{make}; diff --git a/infrastructure/lib/DPB/SubEngine/Fetch.pm b/infrastructure/lib/DPB/SubEngine/Fetch.pm index b3238e5e9b7..8b751f8f441 100644 --- a/infrastructure/lib/DPB/SubEngine/Fetch.pm +++ b/infrastructure/lib/DPB/SubEngine/Fetch.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Fetch.pm,v 1.3 2013/10/26 06:51:28 espie Exp $ +# $OpenBSD: Fetch.pm,v 1.4 2015/04/27 13:32:57 espie Exp $ # # Copyright (c) 2010-2013 Marc Espie # @@ -49,7 +49,7 @@ sub start_build { my ($self, $v, $core, $lock) = @_; $self->log('J', $v); - DPB::Fetch->fetch($v, $core, + $self->{engine}{state}->fetch->fetch($v, $core, sub { $self->end($core, $v, $core->{status}); });