48 const Arch & arch_r )
const
98 if ( ! ( ret->empty() ||
_package->repoInfo().keepPackages() ) )
154 std::string package_str =
_package->name() +
"-" +
_package->edition().asString();
163 ZYPP_THROW(SkipRequestException(
"User requested skip of corrupted file"));
166 ZYPP_THROW(AbortRequestException(
"User requested to abort"));
179 _target = getZYpp()->getTarget();
184 ret =
_target->rpmDb().checkPackage( path_r, detail );
186 detail.push_back( RpmDb::CheckPackageDetail::value_type( ret,
"OOps. Target is not initialized!" ) );
188 userData.
set(
"CheckPackageResult", ret );
189 userData.
set(
"CheckPackageDetail", std::move(detail) );
203 WAR <<
_package->asUserString() <<
": " <<
"User requested skip of insecure file" << endl;
207 ZYPP_THROW(AbortRequestException(
"User requested to abort"));
215 std::string msg(
str::Str() <<
_package->asUserString() <<
": " <<
_(
"Signature verification failed") <<
" " << ret );
234 return shared_ptr<void>(
static_cast<void*
>(0),
235 bind( mem_fun_ref(
static_cast<void (shared_ptr<Report>::*)()
>(&shared_ptr<Report>::reset) ),
256 policy.
progressCB( bind( &Base::progressPackageDownload,
this, _1 ) );
258 return _access.provideFile( _package->repoInfo(), loc, policy );
269 if ( ! ret->empty() )
271 MIL <<
"provided Package from cache " << _package <<
" at " << ret << endl;
272 report()->infoInCache( _package, ret );
277 RepoInfo info = _package->repoInfo();
285 if ( ! loc.checksum().empty() )
288 if ( pi.isExist() && loc.checksum() ==
CheckSum( loc.checksum().type(), std::ifstream( pi.c_str() ) ) )
290 report()->start( _package, pi.path().asFileUrl() );
291 const Pathname & dest( info.
packagesPath() / loc.filename() );
298 MIL <<
"provided Package from toplevel cache " << _package <<
" at " << ret << endl;
311 MIL <<
"provide Package " << _package << endl;
315 if ( ! ret->empty() )
320 report()->start( _package, url );
323 ret = doProvidePackage();
328 userData.
set(
"Package", _package );
329 userData.
set(
"Localpath", ret.
value() );
332 report()->pkgGpgCheck( userData );
334 if ( res != RpmDb::CHK_OK )
336 if ( userData.
hasvalue(
"Action" ) )
340 else if ( userData.
haskey(
"Action" ) )
342 defaultReportSignatureError( res );
351 case RpmDb::CHK_NOKEY:
352 case RpmDb::CHK_NOTFOUND:
353 case RpmDb::CHK_FAIL:
354 case RpmDb::CHK_NOTTRUSTED:
355 case RpmDb::CHK_ERROR:
358 defaultReportSignatureError( res );
368 ERR <<
"Failed to provide Package " << _package << endl;
376 ERR <<
"Failed to provide Package " << _package << endl;
380 std::string package_str = _package->name() +
"-" + _package->edition().asString();
383 std::string detail_str(
str::form(
_(
"Failed to provide Package %s. Do you want to retry retrieval?"), package_str.c_str() ) );
392 ZYPP_THROW(SkipRequestException(
"User requested skip of corrupted file", excpt));
395 ZYPP_THROW(AbortRequestException(
"User requested to abort", excpt));
406 MIL <<
"provided Package " << _package <<
" at " << ret << endl;
426 virtual ManagedFile doProvidePackageFromCache()
const;
433 ManagedFile tryDelta(
const DeltaRpm & delta_r )
const;
436 {
return report()->progressDeltaDownload( value ); }
439 {
return report()->progressDeltaApply( value ); }
442 {
return _policy.queryInstalled( _package->name(), ed_r, _package->arch() ); }
454 RepoInfo info = _package->repoInfo();
465 std::list<DeltaRpm> deltaRpms;
466 _deltas.deltaRpms( _package ).swap( deltaRpms );
470 for_( it, deltaRpms.begin(), deltaRpms.end())
472 DBG <<
"tryDelta " << *it << endl;
474 if ( ! ret->empty() )
481 return Base::doProvidePackage();
507 report()->finishDeltaDownload();
509 report()->startDeltaApply( delta );
512 report()->problemDeltaApply(
_(
"applydeltarpm check failed.") );
517 Pathname destination( _package->repoInfo().packagesPath() / _package->location().filename() );
522 report()->problemDeltaApply(
_(
"applydeltarpm failed.") );
525 report()->finishDeltaApply();
541 PluginPackageProvider(
const std::string & stem_r,
546 : Base( access_r, package_r, deltas_r, policy_r )
550 virtual ManagedFile doProvidePackageFromCache()
const
552 return Base::doProvidePackageFromCache();
557 return Base::doProvidePackage();
579 :
_pimpl(
Impl::factoryMake( access_r, package_r, deltas_r, policy_r ) )
Candidate delta and patches for a package.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
RepoInfo info() const
Return any associated RepoInfo.
Interface to the rpm program.
bool failOnChecksumError() const
Redirect ProvideFilePolicy failOnChecksumError to this if needed.
virtual ManagedFile doProvidePackageFromCache() const
Lookup the final rpm in cache.
RpmDb::CheckPackageResult packageSigCheck(const Pathname &path_r, UserData &userData) const
const Repository & repository() const
PackageProvider implementation.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
bool hasvalue(const std::string &key_r) const
Whether key_r is in data and value is not empty.
static ZConfig & instance()
Singleton ctor.
const BaseVersion & baseversion() const
ManagedFile providePackage() const
Provide the package.
bool isCached() const
Whether the package is cached.
ManagedFile tryDelta(const DeltaRpm &delta_r) const
reference value() const
Reference to the _Tp object.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
callback::SendReport< repo::DownloadResolvableReport > Report
bool isCached() const
Whether the package is cached.
Policies and options for PackageProvider.
bool haveApplydeltarpm()
Test whether an execuatble applydeltarpm program is available.
bool pkgGpgCheck() const
Whether the signature of rpm packages should be checked for this repo.
void reset()
Reset to default Ctor values.
What is known about a repository.
AutoDispose< const Pathname > ManagedFile
A Pathname plus associated cleanup code to be executed when path is no longer needed.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Edition represents [epoch:]version[-release]
void progressDeltaApply(int value) const
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Report & report() const
Access to the DownloadResolvableReport.
Pathname packagesPath() const
Path where this repo packages are cached.
bool queryInstalled(const Edition &ed_r=Edition()) const
ManagedFile providePackageFromCache() const
Provide the package if it is cached.
QueryInstalledCB _queryInstalledCB
shared_ptr< Report > _report
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
RW_pointer< Impl > _pimpl
Implementation class.
PackageProvider(RepoMediaAccess &access, const Package::constPtr &package, const DeltaCandidates &deltas, const PackageProviderPolicy &policy_r=PackageProviderPolicy())
Ctor taking the Package to provide.
const Tp & get(const std::string &key_r) const
Pass back a const Tp & reference to key_r value.
packagedelta::DeltaRpm DeltaRpm
shared_ptr< void > ScopedGuard
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
bool keepPackages() const
Whether packages downloaded from this repository will be kept in local cache.
Convenient building of std::string via std::ostream::operator<<.
int unlink(const Pathname &path)
Like 'unlink'.
ManagedFile providePackageFromCache() const
Provide the package if it is cached.
Detailed rpm signature check log messages A single multiline message if CHK_OK.
callback::UserData UserData
void defaultReportSignatureError(RpmDb::CheckPackageResult ret) const
Default signature verrification error handling.
const Edition & edition() const
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
bool progressPackageDownload(int value) const
Redirect ProvideFilePolicy package download progress to this.
RpmPackageProvider(RepoMediaAccess &access_r, const Package::constPtr &package_r, const DeltaCandidates &deltas_r, const PackageProviderPolicy &policy_r)
const OnMediaLocation & location() const
virtual ManagedFile doProvidePackage() const
Actually provide the final rpm.
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
RepoMediaAccess & _access
ScopedGuard newReport() const
bool baseUrlsEmpty() const
whether repository urls are available
ProvideFilePolicy & failOnChecksumErrorCB(FailOnChecksumErrorCB failOnChecksumErrorCB_r)
Set callback.
PackageProvider::Impl Base
const std::string & sequenceinfo() const
virtual ManagedFile doProvidePackageFromCache() const =0
Lookup the final rpm in cache.
Base class for Exception.
ProvideFilePolicy & progressCB(ProgressCB progressCB_r)
Set callback.
PackageProviderPolicy _policy
Provide a package from a Repo.
Impl(RepoMediaAccess &access_r, const Package::constPtr &package_r, const DeltaCandidates &deltas_r, const PackageProviderPolicy &policy_r)
Ctor taking the Package to provide.
ManagedFile providePackage() const
Provide the package.
Typesafe passing of user data via callbacks.
Reference counted access to a _Tp object calling a custom Dispose function when the last AutoDispose ...
shared_ptr< MediaSetAccess > _access
RPM PackageProvider implementation.
Pathname repoPackagesCachePath
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
CheckPackageResult
checkPackage result
bool quickcheck(const std::string &sequenceinfo_r)
Quick via check sequence info.
bool check(const std::string &sequenceinfo_r, bool quick_r)
Check via sequence info.
virtual ManagedFile doProvidePackage() const =0
Actually provide the final rpm.
bool queryInstalled(const std::string &name_r, const Edition &ed_r, const Arch &arch_r) const
Evaluate callback.
bool haskey(const std::string &key_r) const
Whether key_r is in data.
bool progressDeltaDownload(int value) const
Base for exceptions caused by explicit user request.
static bool schemeIsDownloading(const std::string &scheme_r)
http https ftp sftp tftp
Easy-to use interface to the ZYPP dependency resolver.
void resolveSignatureErrorAction(repo::DownloadResolvableReport::Action action_r) const
React on signature verrification error user action.
Package::constPtr _package
bool provide(const Pathname &delta_r, const Pathname &new_r, const Progress &report_r)
Apply a binary delta to on-disk data to re-create a new rpm.
TraitsType::constPtrType constPtr
bool download_use_deltarpm_always() const
Whether to consider using a deltarpm even when rpm is local.
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
static Impl * factoryMake(RepoMediaAccess &access_r, const Package::constPtr &package_r, const DeltaCandidates &deltas_r, const PackageProviderPolicy &policy_r)
Factory method providing the appropriate implementation.
bool set(const std::string &key_r, boost::any val_r)
Set the value for key (nonconst version always returns true).