libzypp  17.38.7
PackageProvider.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include <fstream>
14 #include <sstream>
15 #include <zypp/repo/PackageDelta.h>
16 #include <zypp-core/base/Logger.h>
17 #include <zypp-core/base/Gettext.h>
18 #include <utility>
19 #include <zypp-core/base/UserRequestException>
23 #include <zypp/repo/PackageDelta.h>
24 
25 #include <zypp/TmpPath.h>
26 #include <zypp/ZConfig.h>
27 #include <zypp/RepoInfo.h>
28 #include <zypp/RepoManager.h>
29 #include <zypp/SrcPackage.h>
30 
31 #include <zypp/ZYppFactory.h>
32 #include <zypp/Target.h>
33 #include <zypp/target/rpm/RpmDb.h>
34 #include <zypp/FileChecker.h>
36 
37 #include <zypp/ng/context.h>
39 
40 using std::endl;
41 
43 namespace zypp
44 {
46  namespace repo
47  {
53  {
54  public:
55  RpmSigCheckException( repo::DownloadResolvableReport::Action action_r, std::string msg_r = "RpmSigCheckException" )
56  : FileCheckException( std::move(msg_r) )
57  , _action( action_r )
58  {}
59 
62  { return _action; }
63 
64  private:
66  };
67 
68 
70  // class PackageProviderPolicy
72 
73  bool PackageProviderPolicy::queryInstalled( const std::string & name_r,
74  const Edition & ed_r,
75  const Arch & arch_r ) const
76  {
77  if ( _queryInstalledCB )
78  return _queryInstalledCB( name_r, ed_r, arch_r );
79  return false;
80  }
81 
87  {
88  Impl() {}
89  Impl(const Impl &) = delete;
90  Impl(Impl &&) = delete;
91  Impl &operator=(const Impl &) = delete;
92  Impl &operator=(Impl &&) = delete;
93  virtual ~Impl() {}
94 
99  virtual ManagedFile providePackage() const = 0;
100 
102  virtual ManagedFile providePackageFromCache() const = 0;
103 
105  virtual bool isCached() const = 0;
106  };
107 
112  template <class TPackage>
114  {
115  using TPackagePtr = typename TPackage::constPtr; // Package or SrcPackage
117  public:
120  PackageProviderPolicy &&policy_r )
121  : _policy(std::move( policy_r ))
122  , _package(std::move( package_r ))
123  , _access( access_r )
124  , _retry(false)
125  {}
126 
127  PackageProviderImpl(const PackageProviderImpl &) = delete;
131 
132  ~PackageProviderImpl() override {}
133 
134  public:
139  ManagedFile providePackage() const override;
140 
143  {
145  if ( ! ( ret->empty() || _package->repoInfo().effectiveKeepPackages() ) )
147  return ret;
148  }
149 
151  bool isCached() const override
152  { return ! doProvidePackageFromCache()->empty(); }
153 
154  protected:
157 
166  { return ManagedFile( _package->cachedLocation() ); }
167 
183  {
184  ManagedFile ret;
185  OnMediaLocation loc = _package->location();
186 
187  ProvideFilePolicy policy;
188  policy.progressCB( bind( &Base::progressPackageDownload, this, _1 ) );
189  policy.fileChecker( bind( &Base::rpmSigFileChecker, this, _1 ) );
190  return _access.provideFile( _package->repoInfo(), loc, policy );
191  }
192 
193  protected:
195  Report & report() const
196  { return *_report; }
197 
199  bool progressPackageDownload( int value ) const
200  { return report()->progress( value, _package ); }
201 
202 
217  void rpmSigFileChecker( const Pathname & file_r ) const
218  {
219  RepoInfo info = _package->repoInfo();
220  if ( info.pkgGpgCheck() )
221  {
222  UserData userData( "pkgGpgCheck" );
223  ResObject::constPtr roptr( _package ); // gcc6 needs it more explcit. Has problem deducing
224  userData.set( "ResObject", roptr ); // a type for '_package->asKind<ResObject>()'...
225  /*legacy:*/userData.set( "Package", roptr->asKind<Package>() );
226  userData.set( "Localpath", file_r );
227 
229  while ( res == RpmDb::CHK_NOKEY ) {
230  res = packageSigCheck( file_r, info.pkgGpgCheckIsMandatory(), userData );
231 
232  // publish the checkresult, even if it is OK. Apps may want to report something...
233  report()->pkgGpgCheck( userData );
234 
235  if ( res == RpmDb::CHK_NOKEY ) {
236  // if the check fails because we don't know the key
237  // we try to resolv it with gpgkey urls from the
238  // repository, if available
239 
241  if ( !hr ) {
242  // we did not find any information about the key in the header
243  // this should never happen
244  WAR << "Unable to read package header from " << hr << endl;
245  break;
246  }
247 
248  std::string keyID = hr->signatureKeyID();
249  if ( keyID.length() > 0 ) {
251  break;
252 
253  } else {
254  // we did not find any information about the key in the header
255  // this should never happen
256  WAR << "packageSigCheck returned without setting providing missing key information" << endl;
257  break;
258  }
259  }
260  }
261 
262  if ( res != RpmDb::CHK_OK )
263  {
264  if ( userData.hasvalue( "Action" ) ) // pkgGpgCheck report provided an user error action
265  {
267  }
268  else if ( userData.haskey( "Action" ) ) // pkgGpgCheck requests the default problem report (wo. details)
269  {
271  }
272  else // no advice from user => usedefaults
273  {
274  switch ( res )
275  {
276  case RpmDb::CHK_OK: // Signature is OK
277  break;
278 
279  case RpmDb::CHK_NOKEY: // Public key is unavailable
280  case RpmDb::CHK_NOTFOUND: // Signature is unknown type
281  case RpmDb::CHK_FAIL: // Signature does not verify
282  case RpmDb::CHK_NOTTRUSTED: // Signature is OK, but key is not trusted
283  case RpmDb::CHK_ERROR: // File does not exist or can't be opened
284  case RpmDb::CHK_NOSIG: // File is unsigned
285  default:
286  // report problem (w. details), throw if to abort, else retry/ignore
287  defaultReportSignatureError( res, str::Str() << userData.get<RpmDb::CheckPackageDetail>( "CheckPackageDetail" ) );
288  break;
289  }
290  }
291  }
292  }
293  }
294 
296 
298  RpmDb::CheckPackageResult packageSigCheck( const Pathname & path_r, bool isMandatory_r, UserData & userData ) const
299  {
300  if ( !_target )
301  _target = getZYpp()->getTarget();
302 
305  if ( _target )
306  {
307  ret = _target->rpmDb().checkPackageSignature( path_r, detail );
308  if ( ret == RpmDb::CHK_NOSIG && !isMandatory_r )
309  {
310  WAR << "Relax CHK_NOSIG: Config says unsigned packages are OK" << endl;
311  ret = RpmDb::CHK_OK;
312  }
313  }
314  else
315  detail.push_back( RpmDb::CheckPackageDetail::value_type( ret, "OOps. Target is not initialized!" ) );
316 
317  userData.set( "CheckPackageResult", ret );
318  userData.set( "CheckPackageDetail", std::move(detail) );
319  return ret;
320  }
321 
326  {
327  switch ( action_r )
328  {
330  WAR << _package->asUserString() << ": " << "User requested to accept insecure file" << endl;
331  break;
332  default:
335  ZYPP_THROW(RpmSigCheckException(action_r,"Signature verification failed"));
336  break;
337  }
338  }
339 
341  void defaultReportSignatureError( RpmDb::CheckPackageResult ret, const std::string & detail_r = std::string() ) const
342  {
343  str::Str msg;
344  msg << _package->asUserString() << ": " << _("Signature verification failed") << " " << ret;
345  if ( ! detail_r.empty() )
346  msg << "\n" << detail_r;
348  }
350 
351  protected:
355 
356  private:
357  using ScopedGuard = shared_ptr<void>;
358 
360  {
361  _report.reset( new Report );
362  // Use a custom deleter calling _report.reset() when guard goes out of
363  // scope (cast required as reset is overloaded). We want report to end
364  // when leaving providePackage and not wait for *this going out of scope.
365  return shared_ptr<void>( static_cast<void*>(0),
366  std::bind( std::mem_fn(static_cast<void (shared_ptr<Report>::*)()>(&shared_ptr<Report>::reset)),
367  std::ref(_report) ) );
368  }
369 
370  mutable bool _retry;
371  mutable shared_ptr<Report> _report;
373  };
375 
376  template <class TPackage>
378  {
379  ScopedGuard guardReport( newReport() );
380 
381  // check for cache hit:
382  ManagedFile ret( providePackageFromCache() );
383  if ( ! ret->empty() )
384  {
385  MIL << "provided Package from cache " << _package << " at " << ret << endl;
386  report()->infoInCache( _package, ret );
387  return ret; // <-- cache hit
388  }
389 
390  // HERE: cache misss, check toplevel cache or do download:
391  RepoInfo info = _package->repoInfo();
392 
393  // Check toplevel cache
394  {
395  RepoManagerOptions topCache;
396  if ( info.packagesPath().dirname() != topCache.repoPackagesCachePath ) // not using toplevel cache
397  {
398  const OnMediaLocation & loc( _package->location() );
399  if ( ! loc.checksum().empty() ) // no cache hit without checksum
400  {
401  PathInfo pi( topCache.repoPackagesCachePath / info.packagesPath().basename() / info.path() / loc.filename() );
402  if ( pi.isExist() && loc.checksum() == CheckSum( loc.checksum().type(), std::ifstream( pi.c_str() ) ) )
403  {
404  report()->start( _package, pi.path().asFileUrl() );
405  const Pathname & dest( info.packagesPath() / info.path() / loc.filename() );
406  if ( filesystem::assert_dir( dest.dirname() ) == 0 && filesystem::hardlinkCopy( pi.path(), dest ) == 0 )
407  {
408  ret = ManagedFile( dest );
409  if ( ! info.effectiveKeepPackages() )
411 
412  MIL << "provided Package from toplevel cache " << _package << " at " << ret << endl;
413  report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() );
414  return ret; // <-- toplevel cache hit
415  }
416  }
417  }
418  }
419  }
420 
421  if ( info.repoOriginsEmpty() )
422  ZYPP_THROW(Exception("No url in repository."));
423 
424  MIL << "provide Package " << _package << endl;
425  Url url = info.location();
426  try {
427  do {
428  _retry = false;
429  if ( ! ret->empty() )
430  {
432  ret.reset();
433  }
434  report()->start( _package, url );
435  try
436  {
437  ret = doProvidePackage();
438  }
439  catch ( const UserRequestException & excpt )
440  {
441  ERR << "Failed to provide Package " << _package << endl;
442  if ( ! _retry )
443  ZYPP_RETHROW( excpt );
444  }
445  catch ( const RpmSigCheckException & excpt )
446  {
447  ERR << "Failed to provide Package " << _package << endl;
448  if ( ! _retry )
449  {
450  // Signature verification error was already reported by the
451  // rpmSigFileChecker. Just handle the users action decision:
452  switch ( excpt.action() )
453  {
455  _retry = true;
456  break;
458  ZYPP_THROW(SkipRequestException("User requested skip of corrupted file"));
459  break;
460  default:
462  ZYPP_THROW(AbortRequestException("User requested to abort"));
463  break;
464  }
465  }
466  }
467  catch ( const FileCheckException & excpt )
468  {
469  ERR << "Failed to provide Package " << _package << endl;
470  if ( ! _retry )
471  {
472  const std::string & package_str = _package->asUserString();
473  // TranslatorExplanation %s = package being checked for integrity
474  switch ( report()->problem( _package, repo::DownloadResolvableReport::INVALID, str::form(_("Package %s seems to be corrupted during transfer. Do you want to retry retrieval?"), package_str.c_str() ) ) )
475  {
477  _retry = true;
478  break;
480  ZYPP_THROW(SkipRequestException("User requested skip of corrupted file"));
481  break;
482  default:
484  ZYPP_THROW(AbortRequestException("User requested to abort"));
485  break;
486  }
487  }
488  }
489  catch ( const Exception & excpt )
490  {
491  ERR << "Failed to provide Package " << _package << endl;
492  if ( ! _retry )
493  {
494  // Aything else gets reported
495  const std::string & package_str = _package->asUserString();
496 
497  // TranslatorExplanation %s = name of the package being processed.
498  std::string detail_str( str::form(_("Failed to provide Package %s. Do you want to retry retrieval?"), package_str.c_str() ) );
499  detail_str += str::form( "\n\n%s", excpt.asUserHistory().c_str() );
500 
501  switch ( report()->problem( _package, repo::DownloadResolvableReport::IO, detail_str.c_str() ) )
502  {
504  _retry = true;
505  break;
507  ZYPP_THROW(SkipRequestException("User requested skip of file", excpt));
508  break;
509  default:
511  ZYPP_THROW(AbortRequestException("User requested to abort", excpt));
512  break;
513  }
514  }
515  }
516  } while ( _retry );
517  } catch(...){
518  // bsc#1045735: Be sure no invalid files stay in the cache!
519  if ( ! ret->empty() )
521  throw;
522  }
523 
524  report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() );
525  MIL << "provided Package " << _package << " at " << ret << endl;
526  return ret;
527  }
528 
529 
534  class RpmPackageProvider : public PackageProviderImpl<Package>
535  {
536  public:
538  Package::constPtr &&package_r,
539  DeltaCandidates &&deltas_r,
540  PackageProviderPolicy &&policy_r )
541  : PackageProviderImpl<Package>( access_r, std::move(package_r), std::move(policy_r) )
542  , _deltas( std::move(deltas_r) )
543  {}
544 
545  protected:
546  ManagedFile doProvidePackage() const override;
547 
548  private:
550 
551  ManagedFile tryDelta( const DeltaRpm & delta_r ) const;
552 
553  bool progressDeltaDownload( int value ) const
554  { return report()->progressDeltaDownload( value ); }
555 
556  void progressDeltaApply( int value ) const
557  { return report()->progressDeltaApply( value ); }
558 
559  bool queryInstalled( const Edition & ed_r = Edition() ) const
560  { return _policy.queryInstalled( _package->name(), ed_r, _package->arch() ); }
561 
562  private:
564  };
566 
568  {
569  // check whether to process patch/delta rpms
570  // FIXME we only check the first url for now.
571  if ( ZConfig::instance().download_use_deltarpm()
572  && ( _package->repoInfo().url().schemeIsDownloading() || ZConfig::instance().download_use_deltarpm_always() ) )
573  {
574  std::list<DeltaRpm> deltaRpms;
575  _deltas.deltaRpms( _package ).swap( deltaRpms );
576 
577  if ( ! deltaRpms.empty() && queryInstalled() && applydeltarpm::haveApplydeltarpm() )
578  {
579  for_( it, deltaRpms.begin(), deltaRpms.end())
580  {
581  DBG << "tryDelta " << *it << endl;
582  ManagedFile ret( tryDelta( *it ) );
583  if ( ! ret->empty() )
584  return ret;
585  }
586  }
587  }
588 
589  // no patch/delta -> provide full package
590  return Base::doProvidePackage();
591  }
592 
594  {
595  if ( delta_r.baseversion().edition() != Edition::noedition
596  && ! queryInstalled( delta_r.baseversion().edition() ) )
597  return ManagedFile();
598 
599  if ( ! applydeltarpm::quickcheck( delta_r.baseversion().sequenceinfo() ) )
600  return ManagedFile();
601 
602  report()->startDeltaDownload( delta_r.location().filename(),
603  delta_r.location().downloadSize() );
604  ManagedFile delta;
605  try
606  {
607  ProvideFilePolicy policy;
608  policy.progressCB( bind( &RpmPackageProvider::progressDeltaDownload, this, _1 ) );
609  delta = _access.provideFile( delta_r.repository().info(), delta_r.location(), policy );
610  // bsc#1245672: delta rpms are optional resources.
611  // ProvideFile however always returns a managed file if no Exception occurred.
612  // So the caller has to check whether the optional file actually exists.
613  if ( not PathInfo(delta).isExist() ) {
614  delta.resetDispose();
615  report()->problemDeltaApply( _("download deltarpm: not found") );
616  return ManagedFile();
617  }
618  }
619  catch ( const Exception & excpt )
620  {
621  report()->problemDeltaDownload( excpt.asUserHistory() );
622  return ManagedFile();
623  }
624  report()->finishDeltaDownload();
625 
626  report()->startDeltaApply( delta );
627  if ( ! applydeltarpm::check( delta_r.baseversion().sequenceinfo() ) )
628  {
629  report()->problemDeltaApply( _("applydeltarpm check failed.") );
630  return ManagedFile();
631  }
632 
633  // Build the package
634  Pathname cachedest( _package->repoInfo().packagesPath() / _package->repoInfo().path() / _package->location().filename() );
635  Pathname builddest( cachedest.extend( ".drpm" ) );
636 
637  if ( ! applydeltarpm::provide( delta, builddest,
638  bind( &RpmPackageProvider::progressDeltaApply, this, _1 ) ) )
639  {
640  report()->problemDeltaApply( _("applydeltarpm failed.") );
641  return ManagedFile();
642  }
643  ManagedFile builddestCleanup( builddest, filesystem::unlink );
644  report()->finishDeltaApply();
645 
646  // Check and move it into the cache
647  // Here the rpm itself is ready. If the packages sigcheck fails, it
648  // makes no sense to return a ManagedFile() and fallback to download the
649  // full rpm. It won't be different. So let the exceptions escape...
650  rpmSigFileChecker( builddest );
651  if ( filesystem::hardlinkCopy( builddest, cachedest ) != 0 )
652  ZYPP_THROW( Exception( str::Str() << "Can't hardlink/copy " << builddest << " to " << cachedest ) );
653 
654  return ManagedFile( cachedest, filesystem::unlink );
655  }
656 
658  // class PackageProvider
660  namespace factory
661  {
662  inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r,
663  DeltaCandidates &&deltas_r,
664  PackageProviderPolicy &&policy_r )
665  {
666  if ( pi_r.isKind<Package>() )
667  return new RpmPackageProvider( access_r, pi_r->asKind<Package>(), std::move(deltas_r), std::move(policy_r) );
668  else if ( pi_r.isKind<SrcPackage>() )
669  return new PackageProviderImpl<SrcPackage>( access_r, pi_r->asKind<SrcPackage>(), std::move(policy_r) );
670  else
671  ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) );
672  }
673 
674  inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r,
675  PackageProviderPolicy &&policy_r )
676  {
677  if ( pi_r.isKind<Package>() )
678  return new PackageProviderImpl<Package>( access_r, pi_r->asKind<Package>(), std::move(policy_r) );
679  else if ( pi_r.isKind<SrcPackage>() )
680  return new PackageProviderImpl<SrcPackage>( access_r, pi_r->asKind<SrcPackage>(), std::move(policy_r) );
681  else
682  ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) );
683  }
684 
686  Package::constPtr &&package_r,
687  DeltaCandidates &&deltas_r,
688  PackageProviderPolicy &&policy_r )
689  { return new RpmPackageProvider( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ); }
690 
691  } // namespace factory
693 
695  DeltaCandidates deltas_r, PackageProviderPolicy policy_r )
696 
697  : _pimpl( factory::make( access_r, pi_r, std::move(deltas_r), std::move(policy_r) ) )
698  {}
699 
701  PackageProviderPolicy policy_r )
702  : _pimpl( factory::make( access_r, pi_r, std::move(policy_r) ) )
703  {}
704 
705  /* legacy */
707  Package::constPtr package_r,
708  DeltaCandidates deltas_r,
709  PackageProviderPolicy policy_r )
710  : _pimpl( factory::make( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ) )
711  {}
712 
714  {}
715 
717  { return _pimpl->providePackage(); }
718 
720  { return _pimpl->providePackageFromCache(); }
721 
723  { return _pimpl->isCached(); }
724 
725  } // namespace repo
727 } // namespace zypp
PackageProvider implementation interface.
Candidate delta and patches for a package.
const BaseVersion & baseversion() const
Definition: PackageDelta.h:69
Pathname path() const
Repository path.
Definition: RepoInfo.cc:824
Interface to the rpm program.
Definition: RpmDb.h:50
#define MIL
Definition: Logger.h:103
TraitsType::constPtrType constPtr
Definition: Package.h:39
bool download_use_deltarpm_always() const
Whether to consider using a deltarpm even when rpm is local.
Definition: ZConfig.cc:1021
std::string str() const
Definition: String.h:223
int assert_dir(const Pathname &path, unsigned mode)
Like &#39;mkdir -p&#39;.
Definition: PathInfo.cc:338
RpmPackageProvider(RepoMediaAccess &access_r, Package::constPtr &&package_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r)
intrusive_ptr< const RpmHeader > constPtr
Definition: RpmHeader.h:65
Impl & operator=(const Impl &)=delete
MaybeAwaitable< bool > provideAndImportKeyFromRepository(ContextRef ctx, std::string id_r, zypp::RepoInfo info_r)
Try to find the id in key cache or repository specified in info.
Definition: keyringwf.cc:115
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:459
Describes a resource file located on a medium.
static ZConfig & instance()
Singleton ctor.
Definition: ZConfig.cc:756
Architecture.
Definition: Arch.h:36
void reset()
Reset to default Ctor values.
Definition: AutoDispose.h:150
void defaultReportSignatureError(RpmDb::CheckPackageResult ret, const std::string &detail_r=std::string()) const
Default signature verification error handling.
ManagedFile providePackageFromCache() const override
Provide the package if it is cached.
bool isCached() const
Whether the package is cached.
const repo::DownloadResolvableReport::Action & action() const
Users final decision how to proceed.
Policies and options for PackageProvider.
ManagedFile tryDelta(const DeltaRpm &delta_r) const
bool haveApplydeltarpm()
Test whether an execuatble applydeltarpm program is available.
bool pkgGpgCheckIsMandatory() const
Mandatory check (pkgGpgCheck is not off) must ask to confirm using unsigned packages.
Definition: RepoInfo.cc:596
void progressDeltaApply(int value) const
ManagedFile providePackageFromCache() const
Provide the package if it is cached.
Definition: ansi.h:854
What is known about a repository.
Definition: RepoInfo.h:71
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:27
Edition represents [epoch:]version[-release]
Definition: Edition.h:59
std::string basename() const
Return the last component of this path.
Definition: Pathname.h:137
ManagedFile providePackage() const
Provide the package.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition: String.cc:39
PackageProvider::Impl * make(RepoMediaAccess &access_r, const PoolItem &pi_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r)
RpmDb::CheckPackageResult packageSigCheck(const Pathname &path_r, bool isMandatory_r, UserData &userData) const
Actual rpm package signature check.
RpmSigCheckException(repo::DownloadResolvableReport::Action action_r, std::string msg_r="RpmSigCheckException")
std::list< packagedelta::DeltaRpm > deltaRpms(const Package::constPtr &package) const
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
Definition: PathInfo.cc:902
#define ERR
Definition: Logger.h:105
PackageProvider implementation for Package and SrcPackage.
AutoDispose< const Pathname > ManagedFile
A Pathname plus associated cleanup code to be executed when path is no longer needed.
Definition: ManagedFile.h:27
void rpmSigFileChecker(const Pathname &file_r) const
Repo manager settings.
Policy for provideFile and RepoMediaAccess.
bool empty() const
Test for an empty path.
Definition: Pathname.h:117
zypp::callback::UserData UserData
Definition: userrequest.h:18
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
Definition: Exception.h:479
RW_pointer< Impl > _pimpl
Implementation class.
virtual bool isCached() const =0
Whether the package is cached.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Definition: String.h:212
bool pkgGpgCheck() const
Whether the signature of rpm packages should be checked for this repo.
Definition: RepoInfo.cc:593
bool set(const std::string &key_r, AnyType val_r)
Set the value for key (nonconst version always returns true).
Definition: UserData.h:119
bool isExist() const
Return whether valid stat info exists.
Definition: PathInfo.h:286
const OnMediaLocation & location() const
Definition: PackageDelta.h:68
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
Definition: Exception.cc:140
Package interface.
Definition: Package.h:33
const ByteCount & downloadSize() const
The size of the resource on the server.
Pathname dirname() const
Return all but the last component od this path.
Definition: Pathname.h:133
#define WAR
Definition: Logger.h:104
void resolveSignatureErrorAction(repo::DownloadResolvableReport::Action action_r) const
React on signature verification error user action.
Detailed rpm signature check log messages A single multiline message if CHK_OK.
Definition: RpmDb.h:391
RepoInfo info() const
Return any associated RepoInfo.
Definition: Repository.cc:274
Exception thrown by PackageProviderImpl::rpmSigFileChecker.
bool queryInstalled(const Edition &ed_r=Edition()) const
bool repoOriginsEmpty() const
whether repo origins are available
Definition: RepoInfo.cc:740
ResTraits< TRes >::PtrType make(const sat::Solvable &solvable_r)
Directly create a certain kind of ResObject from sat::Solvable.
Definition: ResObject.h:118
ProvideFilePolicy & fileChecker(FileChecker fileChecker_r)
Add a FileCecker passed down to the Fetcher.
bool isCached() const override
Whether the package is cached.
bool progressPackageDownload(int value) const
Redirect ProvideFilePolicy package download progress to this.
Report & report() const
Access to the DownloadResolvableReport.
TraitsType::constPtrType constPtr
Definition: ResObject.h:43
#define _(MSG)
Definition: Gettext.h:39
static ContextRef defaultContext()
Definition: context.cc:26
static RpmHeader::constPtr readPackage(const Pathname &path, VERIFICATION verification=VERIFY)
Get an accessible packages data from disk.
Definition: RpmHeader.cc:212
const Pathname & filename() const
The path to the resource on the medium.
int unlink(const Pathname &path)
Like &#39;unlink&#39;.
Definition: PathInfo.cc:719
void resetDispose()
Set no dispose function.
Definition: AutoDispose.h:171
Provides files from different repos.
ManagedFile provideFile(const RepoInfo &repo_r, const OnMediaLocation &loc_r, const ProvideFilePolicy &policy_r)
Provide a file from a Repository.
std::string asUserString() const
Definition: SolvableType.h:100
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
Definition: AutoDispose.h:167
ZYpp::Ptr getZYpp()
relates: ZYppFactory Convenience to get the Pointer to the ZYpp instance.
Definition: ZYppFactory.h:77
SrcPackage interface.
Definition: SrcPackage.h:29
ManagedFile doProvidePackage() const override
Actually provide the final rpm.
Base class for Exception.
Definition: Exception.h:152
ProvideFilePolicy & progressCB(ProgressCB progressCB_r)
Set callback.
const Tp & get(const std::string &key_r) const
Pass back a const Tp & reference to key_r value.
Definition: UserData.h:176
Url location() const
Returns the location URL for the repository, this is either the first configured baseUrl or a configu...
Definition: RepoInfo.cc:836
virtual ManagedFile providePackageFromCache() const =0
Provide the package if it is cached.
Typesafe passing of user data via callbacks.
Definition: UserData.h:39
bool progressDeltaDownload(int value) const
RPM PackageProvider implementation (with deltarpm processing).
Pathname packagesPath() const
packagesPath Checks if the effective user is allowed to write into the system package cache...
Definition: RepoInfo.cc:785
Wrapper class for ::stat/::lstat.
Definition: PathInfo.h:225
bool haskey(const std::string &key_r) const
Whether key_r is in data.
Definition: UserData.h:98
CheckPackageResult
checkPackage result
Definition: RpmDb.h:376
repo::DownloadResolvableReport::Action _action
bool quickcheck(const std::string &sequenceinfo_r)
Quick via check sequence info.
Definition: Applydeltarpm.h:48
bool check(const std::string &sequenceinfo_r, bool quick_r)
Check via sequence info.
virtual ManagedFile doProvidePackage() const
Actually provide the final rpm.
Combining sat::Solvable and ResStatus.
Definition: PoolItem.h:50
virtual ManagedFile providePackage() const =0
Provide the package.
bool queryInstalled(const std::string &name_r, const Edition &ed_r, const Arch &arch_r) const
Evaluate callback.
bool isKind(const ResKind &kind_r) const
Definition: SolvableType.h:64
Base for exceptions caused by explicit user request.
bool hasvalue(const std::string &key_r) const
Whether key_r is in data and value is not empty.
Definition: UserData.h:102
PackageProviderImpl & operator=(const PackageProviderImpl &)=delete
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
PackageProviderImpl(RepoMediaAccess &access_r, TPackagePtr &&package_r, PackageProviderPolicy &&policy_r)
Ctor taking the Package to provide.
ManagedFile doProvidePackageFromCache() const
Lookup the final rpm in cache.
ManagedFile providePackage() const override
Provide the package.
const std::string & sequenceinfo() const
Definition: PackageDelta.h:46
bool effectiveKeepPackages() const
keepPackages unless the package cache itself enforces keeping the packages.
Definition: RepoInfo.cc:776
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.
Url manipulation class.
Definition: Url.h:92
#define DBG
Definition: Logger.h:102
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
Definition: Edition.h:72
const Repository & repository() const
Definition: PackageDelta.h:70
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
PackageProvider(RepoMediaAccess &access, const PoolItem &pi_r, PackageProviderPolicy policy_r=PackageProviderPolicy())
Ctor taking the package to provide.