libzypp  15.19.5
RepoInfo.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include <vector>
14 
15 #include "zypp/base/LogTools.h"
18 
19 #include "zypp/RepoInfo.h"
20 #include "zypp/TriBool.h"
21 #include "zypp/Pathname.h"
22 #include "zypp/ZConfig.h"
24 #include "zypp/ExternalProgram.h"
25 #include "zypp/media/MediaAccess.h"
26 
27 #include "zypp/base/IOStream.h"
28 #include "zypp/base/InputStream.h"
29 #include "zypp/parser/xml/Reader.h"
30 
31 using std::endl;
32 using zypp::xml::escape;
33 
35 namespace zypp
36 {
37 
39  //
40  // CLASS NAME : RepoInfo::Impl
41  //
44  {
45  Impl()
46  : _gpgCheck( indeterminate )
47  , _repoGpgCheck( indeterminate )
48  , _pkgGpgCheck( indeterminate )
49  , _validRepoSignature( indeterminate )
50  , keeppackages(indeterminate)
52  , type(repo::RepoType::NONE_e)
53  , emptybaseurls(false)
54  {}
55 
57  {}
58 
59  public:
60  static const unsigned defaultPriority = 99;
61 
62  void setProbedType( const repo::RepoType & t ) const
63  {
65  && t != repo::RepoType::NONE )
66  {
67  // lazy init!
68  const_cast<Impl*>(this)->type = t;
69  }
70  }
71 
72  public:
73  Pathname licenseTgz() const
74  { return metadatapath.empty() ? Pathname() : metadatapath / path / "license.tar.gz"; }
75 
77  {
78  const Url & mlurl( _mirrorListUrl.transformed() ); // Variables replaced!
79  if ( _baseUrls.empty() && ! mlurl.asString().empty() )
80  {
81  emptybaseurls = true;
82  DBG << "MetadataPath: " << metadatapath << endl;
84  _baseUrls.raw().insert( _baseUrls.raw().end(), rmurls.getUrls().begin(), rmurls.getUrls().end() );
85  }
86  return _baseUrls;
87  }
88 
90  { return _baseUrls; }
91 
92  bool baseurl2dump() const
93  { return !emptybaseurls && !_baseUrls.empty(); }
94 
95 
96  void addContent( const std::string & keyword_r )
97  { _keywords.insert( keyword_r ); }
98 
99  bool hasContent( const std::string & keyword_r ) const
100  {
101  if ( _keywords.empty() && ! metadatapath.empty() )
102  {
103  // HACK directly check master index file until RepoManager offers
104  // some content probing ans zypepr uses it.
106  MIL << "Empty keywords...." << metadatapath << endl;
107  Pathname master;
108  if ( PathInfo( (master=metadatapath/"/repodata/repomd.xml") ).isFile() )
109  {
110  //MIL << "GO repomd.." << endl;
111  xml::Reader reader( master );
112  while ( reader.seekToNode( 2, "content" ) )
113  {
114  _keywords.insert( reader.nodeText().asString() );
115  reader.seekToEndNode( 2, "content" );
116  }
117  _keywords.insert( "" ); // valid content in _keywords even if empty
118  }
119  else if ( PathInfo( (master=metadatapath/"/content") ).isFile() )
120  {
121  //MIL << "GO content.." << endl;
122  iostr::forEachLine( InputStream( master ),
123  [this]( int num_r, std::string line_r )->bool
124  {
125  if ( str::startsWith( line_r, "REPOKEYWORDS" ) )
126  {
127  std::vector<std::string> words;
128  if ( str::split( line_r, std::back_inserter(words) ) > 1
129  && words[0].length() == 12 /*"REPOKEYWORDS"*/ )
130  {
131  this->_keywords.insert( ++words.begin(), words.end() );
132  }
133  return true; // mult. occurrances are ok.
134  }
135  return( ! str::startsWith( line_r, "META " ) ); // no need to parse into META section.
136  } );
137  _keywords.insert( "" );
138  }
140  }
141  return( _keywords.find( keyword_r ) != _keywords.end() );
142  }
143 
149  {
150  if ( ! indeterminate(_validRepoSignature) ) return _validRepoSignature;
151  // check metadata:
152  if ( ! metadatapath.empty() )
153  {
154  //TODO: a missing ".repo_gpgcheck" might be plaindir(no Downloader) or not yet refreshed signed repo!
155  TriBool linkval = triBoolFromPath( metadatapath / ".repo_gpgcheck" );
156  return linkval;
157  }
158  return indeterminate;
159  }
160 
162  {
163  if ( PathInfo(metadatapath).isDir() )
164  {
165  Pathname gpgcheckFile( metadatapath / ".repo_gpgcheck" );
166  if ( PathInfo(gpgcheckFile).isExist() )
167  {
168  TriBool linkval( indeterminate );
169  if ( triBoolFromPath( gpgcheckFile, linkval ) && linkval == value_r )
170  return; // existing symlink fits value_r
171  else
172  filesystem::unlink( gpgcheckFile ); // will write a new one
173  }
174  filesystem::symlink( asString(value_r), gpgcheckFile );
175  }
176  _validRepoSignature = value_r;
177  }
178 
179  bool triBoolFromPath( const Pathname & path_r, TriBool & ret_r ) const
180  {
181  static const Pathname truePath( "true" );
182  static const Pathname falsePath( "false" );
183  static const Pathname indeterminatePath( "indeterminate" );
184  Pathname linkval( filesystem::readlink( path_r ) );
185  bool known = true;
186  if ( linkval == truePath )
187  ret_r = true;
188  else if ( linkval == falsePath )
189  ret_r = false;
190  else if ( linkval == indeterminatePath )
191  ret_r = indeterminate;
192  else
193  known = false;
194  return known;
195  }
196 
197  TriBool triBoolFromPath( const Pathname & path_r ) const
198  { TriBool ret(indeterminate); triBoolFromPath( path_r, ret ); return ret; }
199 
201 
202  public:
206  private:
208  public:
214  Pathname path;
215  std::string service;
216  std::string targetDistro;
217  Pathname metadatapath;
218  Pathname packagespath;
220  mutable bool emptybaseurls;
222 
223  private:
225  mutable std::set<std::string> _keywords;
226 
227  friend Impl * rwcowClone<Impl>( const Impl * rhs );
229  Impl * clone() const
230  { return new Impl( *this ); }
231  };
233 
235  inline std::ostream & operator<<( std::ostream & str, const RepoInfo::Impl & obj )
236  {
237  return str << "RepoInfo::Impl";
238  }
239 
241  //
242  // CLASS NAME : RepoInfo
243  //
245 
247 
249  : _pimpl( new Impl() )
250  {}
251 
253  {}
254 
255  unsigned RepoInfo::priority() const
256  { return _pimpl->priority; }
257 
259  { return Impl::defaultPriority; }
260 
261  void RepoInfo::setPriority( unsigned newval_r )
262  { _pimpl->priority = newval_r ? newval_r : Impl::defaultPriority; }
263 
264 
265  bool RepoInfo::gpgCheck() const
266  { return indeterminate(_pimpl->_gpgCheck) ? ZConfig::instance().gpgCheck() : (bool)_pimpl->_gpgCheck; }
267 
269  { _pimpl->_gpgCheck = value_r; }
270 
271  void RepoInfo::setGpgCheck( bool value_r ) // deprecated legacy and for squid
272  { setGpgCheck( TriBool(value_r) ); }
273 
274 
276  {
277  if ( ! indeterminate(_pimpl->_repoGpgCheck) ) return _pimpl->_repoGpgCheck;
278  if ( ! indeterminate(ZConfig::instance().repoGpgCheck()) ) return ZConfig::instance().repoGpgCheck();
279  return gpgCheck(); // no preference: follow gpgCheck
280  }
281 
283  { _pimpl->_repoGpgCheck = value_r; }
284 
285 
287  {
288  if ( ! indeterminate(_pimpl->_pkgGpgCheck) ) return _pimpl->_pkgGpgCheck;
289  if ( ! indeterminate(ZConfig::instance().pkgGpgCheck()) ) return ZConfig::instance().pkgGpgCheck();
290  // no preference: follow gpgCheck and check package if repo signature not available or not checked
291  return gpgCheck() && ( !repoGpgCheck() || !(bool)validRepoSignature() ); // !(bool)TriBool ==> false or indeterminate
292  }
293 
295  { _pimpl->_pkgGpgCheck = value_r; }
296 
297  void RepoInfo::getRawGpgChecks( TriBool & g_r, TriBool & r_r, TriBool & p_r ) const
298  {
299  g_r = _pimpl->_gpgCheck;
300  r_r = _pimpl->_repoGpgCheck;
301  p_r = _pimpl->_pkgGpgCheck;
302  }
303 
305  {
307  // keep indeterminate(=unsigned) but invalidate any signature if !repoGpgCheck
308  if ( !indeterminate(ret) && !repoGpgCheck() )
309  ret = false;
310  return ret;
311  }
312 
314  { _pimpl->internalSetValidRepoSignature( value_r ); }
315 
316 
317  void RepoInfo::setMirrorListUrl( const Url & url_r ) // Raw
318  { _pimpl->_mirrorListUrl.raw() = url_r; _pimpl->_mirrorListForceMetalink = false; }
319 
320  void RepoInfo::setMetalinkUrl( const Url & url_r ) // Raw
321  { _pimpl->_mirrorListUrl.raw() = url_r; _pimpl->_mirrorListForceMetalink = true; }
322 
323  void RepoInfo::setGpgKeyUrl( const Url & url_r )
324  { _pimpl->_gpgKeyUrl.raw() = url_r; }
325 
326  void RepoInfo::addBaseUrl( const Url & url_r )
327  {
328  for ( const auto & url : _pimpl->baseUrls().raw() ) // Raw unique!
329  if ( url == url_r )
330  return;
331  _pimpl->baseUrls().raw().push_back( url_r );
332  }
333 
334  void RepoInfo::setBaseUrl( const Url & url_r )
335  {
336  _pimpl->baseUrls().raw().clear();
337  _pimpl->baseUrls().raw().push_back( url_r );
338  }
339 
340  void RepoInfo::setPath( const Pathname &path )
341  { _pimpl->path = path; }
342 
344  { _pimpl->type = t; }
345 
347  { _pimpl->setProbedType( t ); }
348 
349 
350  void RepoInfo::setMetadataPath( const Pathname &path )
351  { _pimpl->metadatapath = path; }
352 
353  void RepoInfo::setPackagesPath( const Pathname &path )
354  { _pimpl->packagespath = path; }
355 
356  void RepoInfo::setKeepPackages( bool keep )
357  { _pimpl->keeppackages = keep; }
358 
359  void RepoInfo::setService( const std::string& name )
360  { _pimpl->service = name; }
361 
362  void RepoInfo::setTargetDistribution( const std::string & targetDistribution )
364 
366  { return indeterminate(_pimpl->keeppackages) ? false : (bool)_pimpl->keeppackages; }
367 
368  Pathname RepoInfo::metadataPath() const
369  { return _pimpl->metadatapath; }
370 
371  Pathname RepoInfo::packagesPath() const
372  { return _pimpl->packagespath; }
373 
375  { return _pimpl->type; }
376 
377  Url RepoInfo::mirrorListUrl() const // Variables replaced!
378  { return _pimpl->_mirrorListUrl.transformed(); }
379 
381  { return _pimpl->_mirrorListUrl.raw(); }
382 
383  Url RepoInfo::gpgKeyUrl() const // Variables replaced!
384  { return _pimpl->_gpgKeyUrl.transformed(); }
385 
387  { return _pimpl->_gpgKeyUrl.raw(); }
388 
389  RepoInfo::url_set RepoInfo::baseUrls() const // Variables replaced!
390  { return _pimpl->baseUrls().transformed(); }
391 
393  { return _pimpl->baseUrls().raw(); }
394 
395  Pathname RepoInfo::path() const
396  { return _pimpl->path; }
397 
398  std::string RepoInfo::service() const
399  { return _pimpl->service; }
400 
401  std::string RepoInfo::targetDistribution() const
402  { return _pimpl->targetDistro; }
403 
405  { return( _pimpl->baseUrls().empty() ? Url() : *_pimpl->baseUrls().rawBegin() ); }
406 
408  { return _pimpl->baseUrls().transformedBegin(); }
409 
411  { return _pimpl->baseUrls().transformedEnd(); }
412 
414  { return _pimpl->baseUrls().size(); }
415 
417  { return _pimpl->baseUrls().empty(); }
418 
419  bool RepoInfo::baseUrlSet() const
420  { return _pimpl->baseurl2dump(); }
421 
422 
423  void RepoInfo::addContent( const std::string & keyword_r )
424  { _pimpl->addContent( keyword_r ); }
425 
426  bool RepoInfo::hasContent( const std::string & keyword_r ) const
427  { return _pimpl->hasContent( keyword_r ); }
428 
430 
431  bool RepoInfo::hasLicense() const
432  {
433  Pathname licenseTgz( _pimpl->licenseTgz() );
434  return ! licenseTgz.empty() && PathInfo(licenseTgz).isFile();
435  }
436 
438  {
439  static const std::string noAcceptanceFile = "no-acceptance-needed\n";
440  bool accept = true;
441 
442  Pathname licenseTgz( _pimpl->licenseTgz() );
443  if ( licenseTgz.empty() || ! PathInfo( licenseTgz ).isFile() )
444  return false; // no licenses at all
445 
447  cmd.push_back( "tar" );
448  cmd.push_back( "-t" );
449  cmd.push_back( "-z" );
450  cmd.push_back( "-f" );
451  cmd.push_back( licenseTgz.asString() );
452 
454  for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() )
455  {
456  if ( output == noAcceptanceFile )
457  {
458  accept = false;
459  }
460  }
461  MIL << "License for " << name() << " has to be accepted: " << (accept?"true":"false" ) << endl;
462  return accept;
463  }
464 
465  std::string RepoInfo::getLicense( const Locale & lang_r )
466  { return const_cast<const RepoInfo *>(this)->getLicense( lang_r ); }
467 
468  std::string RepoInfo::getLicense( const Locale & lang_r ) const
469  {
470  LocaleSet avlocales( getLicenseLocales() );
471  if ( avlocales.empty() )
472  return std::string();
473 
474  Locale getLang( Locale::bestMatch( avlocales, lang_r ) );
475  if ( !getLang && avlocales.find( Locale::noCode ) == avlocales.end() )
476  {
477  WAR << "License.tar.gz contains no fallback text! " << *this << endl;
478  // Using the fist locale instead of returning no text at all.
479  // So the user might recognize that there is a license, even if he
480  // can't read it.
481  getLang = *avlocales.begin();
482  }
483 
484  // now extract the license file.
485  static const std::string licenseFileFallback( "license.txt" );
486  std::string licenseFile( !getLang ? licenseFileFallback
487  : str::form( "license.%s.txt", getLang.c_str() ) );
488 
490  cmd.push_back( "tar" );
491  cmd.push_back( "-x" );
492  cmd.push_back( "-z" );
493  cmd.push_back( "-O" );
494  cmd.push_back( "-f" );
495  cmd.push_back( _pimpl->licenseTgz().asString() ); // if it not exists, avlocales was empty.
496  cmd.push_back( licenseFile );
497 
498  std::string ret;
500  for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() )
501  {
502  ret += output;
503  }
504  prog.close();
505  return ret;
506  }
507 
509  {
510  Pathname licenseTgz( _pimpl->licenseTgz() );
511  if ( licenseTgz.empty() || ! PathInfo( licenseTgz ).isFile() )
512  return LocaleSet();
513 
515  cmd.push_back( "tar" );
516  cmd.push_back( "-t" );
517  cmd.push_back( "-z" );
518  cmd.push_back( "-f" );
519  cmd.push_back( licenseTgz.asString() );
520 
521  LocaleSet ret;
523  for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() )
524  {
525  static const C_Str license( "license." );
526  static const C_Str dotTxt( ".txt\n" );
527  if ( str::hasPrefix( output, license ) && str::hasSuffix( output, dotTxt ) )
528  {
529  if ( output.size() <= license.size() + dotTxt.size() ) // license.txt
530  ret.insert( Locale() );
531  else
532  ret.insert( Locale( std::string( output.c_str()+license.size(), output.size()- license.size() - dotTxt.size() ) ) );
533  }
534  }
535  prog.close();
536  return ret;
537  }
538 
540 
541  std::ostream & RepoInfo::dumpOn( std::ostream & str ) const
542  {
544  if ( _pimpl->baseurl2dump() )
545  {
546  for ( const auto & url : _pimpl->baseUrls().raw() )
547  {
548  str << "- url : " << url << std::endl;
549  }
550  }
551 
552  // print if non empty value
553  auto strif( [&] ( const std::string & tag_r, const std::string & value_r ) {
554  if ( ! value_r.empty() )
555  str << tag_r << value_r << std::endl;
556  });
557 
558  strif( (_pimpl->_mirrorListForceMetalink ? "- metalink : " : "- mirrorlist : "), rawMirrorListUrl().asString() );
559  strif( "- path : ", path().asString() );
560  str << "- type : " << type() << std::endl;
561  str << "- priority : " << priority() << std::endl;
562 
563  // Yes No Default(Y) Default(N)
564 #define OUTS(T,B) ( indeterminate(T) ? (std::string("D(")+(B?"Y":"N")+")") : ((bool)T?"Y":"N") )
565  str << "- gpgcheck : " << OUTS(_pimpl->_gpgCheck,gpgCheck())
566  << " repo" << OUTS(_pimpl->_repoGpgCheck,repoGpgCheck())
567  << " sig" << asString( validRepoSignature(), "?", "Y", "N" )
568  << " pkg" << OUTS(_pimpl->_pkgGpgCheck,pkgGpgCheck())
569  << std::endl;
570 #undef OUTS
571 
572  strif( "- gpgkey : ", rawGpgKeyUrl().asString() );
573 
574  if ( ! indeterminate(_pimpl->keeppackages) )
575  str << "- keeppackages: " << keepPackages() << std::endl;
576 
577  strif( "- service : ", service() );
578  strif( "- targetdistro: ", targetDistribution() );
579  strif( "- metadataPath: ", metadataPath().asString() );
580  strif( "- packagesPath: ", packagesPath().asString() );
581 
582  return str;
583  }
584 
585  std::ostream & RepoInfo::dumpAsIniOn( std::ostream & str ) const
586  {
587  RepoInfoBase::dumpAsIniOn(str);
588 
589  if ( _pimpl->baseurl2dump() )
590  {
591  str << "baseurl=";
592  std::string indent;
593  for ( const auto & url : _pimpl->baseUrls().raw() )
594  {
595  str << indent << url << endl;
596  if ( indent.empty() ) indent = " "; // "baseurl="
597  }
598  }
599 
600  if ( ! _pimpl->path.empty() )
601  str << "path="<< path() << endl;
602 
603  if ( ! (rawMirrorListUrl().asString().empty()) )
604  str << (_pimpl->_mirrorListForceMetalink ? "metalink=" : "mirrorlist=") << rawMirrorListUrl() << endl;
605 
606  str << "type=" << type().asString() << endl;
607 
608  if ( priority() != defaultPriority() )
609  str << "priority=" << priority() << endl;
610 
611  if ( ! indeterminate(_pimpl->_gpgCheck) )
612  str << "gpgcheck=" << (_pimpl->_gpgCheck ? "1" : "0") << endl;
613 
614  if ( ! indeterminate(_pimpl->_repoGpgCheck) )
615  str << "repo_gpgcheck=" << (_pimpl->_repoGpgCheck ? "1" : "0") << endl;
616 
617  if ( ! indeterminate(_pimpl->_pkgGpgCheck) )
618  str << "pkg_gpgcheck=" << (_pimpl->_pkgGpgCheck ? "1" : "0") << endl;
619 
620  if ( ! (rawGpgKeyUrl().asString().empty()) )
621  str << "gpgkey=" << rawGpgKeyUrl() << endl;
622 
623  if (!indeterminate(_pimpl->keeppackages))
624  str << "keeppackages=" << keepPackages() << endl;
625 
626  if( ! service().empty() )
627  str << "service=" << service() << endl;
628 
629  return str;
630  }
631 
632  std::ostream & RepoInfo::dumpAsXmlOn( std::ostream & str, const std::string & content ) const
633  {
634  std::string tmpstr;
635  str
636  << "<repo"
637  << " alias=\"" << escape(alias()) << "\""
638  << " name=\"" << escape(name()) << "\"";
639  if (type() != repo::RepoType::NONE)
640  str << " type=\"" << type().asString() << "\"";
641  str
642  << " priority=\"" << priority() << "\""
643  << " enabled=\"" << enabled() << "\""
644  << " autorefresh=\"" << autorefresh() << "\""
645  << " gpgcheck=\"" << gpgCheck() << "\""
646  << " repo_gpgcheck=\"" << repoGpgCheck() << "\""
647  << " pkg_gpgcheck=\"" << pkgGpgCheck() << "\"";
648  if (!(tmpstr = gpgKeyUrl().asString()).empty())
649  str << " gpgkey=\"" << escape(tmpstr) << "\"";
650  if (!(tmpstr = mirrorListUrl().asString()).empty())
651  str << (_pimpl->_mirrorListForceMetalink ? " metalink=\"" : " mirrorlist=\"") << escape(tmpstr) << "\"";
652  str << ">" << endl;
653 
654  if ( _pimpl->baseurl2dump() )
655  {
656  for_( it, baseUrlsBegin(), baseUrlsEnd() ) // !transform iterator replaces variables
657  str << "<url>" << escape((*it).asString()) << "</url>" << endl;
658  }
659 
660  str << "</repo>" << endl;
661  return str;
662  }
663 
664 
665  std::ostream & operator<<( std::ostream & str, const RepoInfo & obj )
666  {
667  return obj.dumpOn(str);
668  }
669 
670 
672 } // namespace zypp
std::string asString(const Patch::Category &obj)
Definition: Patch.cc:117
static const Locale noCode
Empty code.
Definition: Locale.h:74
LocaleSet getLicenseLocales() const
Return the locales the license is available for.
Definition: RepoInfo.cc:508
TriBool internalValidRepoSignature() const
Signature check result needs to be stored/retrieved from _metadatapath.
Definition: RepoInfo.cc:148
std::string name() const
Repository name.
std::string targetDistribution() const
Distribution for which is this repository meant.
Definition: RepoInfo.cc:401
#define MIL
Definition: Logger.h:64
void setGpgKeyUrl(const Url &gpgkey)
Key to use for gpg checking of this repository.
Definition: RepoInfo.cc:323
static unsigned defaultPriority()
The default priority (99).
Definition: RepoInfo.cc:258
std::string alias() const
unique identifier for this source.
TriBool repoGpgCheck() const
Check repo matadata signatures (indeterminate - according to gpgcheck)
Definition: ZConfig.cc:994
Url rawUrl() const
Pars pro toto: The first repository raw url (no variables replaced)
Definition: RepoInfo.cc:404
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Write this RepoInfo object into str in a .repo file format.
Definition: RepoInfo.cc:585
TriBool _pkgGpgCheck
need to check pkg sign.: Y/N/(ZConf(Y/N/gpgCheck && no valid repo sign.))
Definition: RepoInfo.cc:205
bool _mirrorListForceMetalink
Definition: RepoInfo.cc:212
static ZConfig & instance()
Singleton ctor.
Definition: Resolver.cc:121
void setPriority(unsigned newval_r)
Set repository priority for solver.
Definition: RepoInfo.cc:261
int readlink(const Pathname &symlink_r, Pathname &target_r)
Like 'readlink'.
Definition: PathInfo.cc:847
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
Definition: RepoInfo.h:433
void setMirrorListUrl(const Url &url)
Set mirror list url.
Definition: RepoInfo.cc:317
repo::RepoVariablesUrlReplacer replacer
Definition: RepoInfo.cc:221
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
Definition: RepoInfo.cc:407
std::string escape(const C_Str &str_r, const char sep_r)
Escape desired character c using a backslash.
Definition: String.cc:354
std::ostream & dumpOn(std::ostream &str, const zypp::shared_ptr< void > &obj)
Definition: PtrTypes.h:151
Pathname metadataPath() const
Path where this repo metadata was read from.
Definition: RepoInfo.cc:368
std::ostream & operator<<(std::ostream &str, const RepoInfo::Impl &obj)
Definition: RepoInfo.cc:235
Pathname metadatapath
Definition: RepoInfo.cc:217
bool pkgGpgCheck() const
Whether the signature of rpm packages should be checked for this repo.
Definition: RepoInfo.cc:286
std::list< Url > url_set
Definition: RepoInfo.h:99
void setProbedType(const repo::RepoType &t) const
This allows to adjust the RepoType lazy, from NONE to some probed value, even for const objects...
Definition: RepoInfo.cc:346
What is known about a repository.
Definition: RepoInfo.h:71
void getRawGpgChecks(TriBool &g_r, TriBool &r_r, TriBool &p_r) const
Raw values for RepoManager.
Definition: RepoInfo.cc:297
void setGpgCheck(TriBool value_r)
Set the value for gpgCheck (or indeterminate to use the default).
Definition: RepoInfo.cc:268
std::set< std::string > _keywords
Definition: RepoInfo.cc:225
Helper to create and pass std::istream.
Definition: InputStream.h:56
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:27
void setBaseUrl(const Url &url)
Clears current base URL list and adds url.
Definition: RepoInfo.cc:334
bool enabled() const
If enabled is false, then this repository must be ignored as if does not exists, except when checking...
RepoVariablesReplacedUrl _gpgKeyUrl
Definition: RepoInfo.cc:210
urls_const_iterator baseUrlsEnd() const
iterator that points at end of repository urls
Definition: RepoInfo.cc:410
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition: String.cc:36
void internalSetValidRepoSignature(TriBool value_r)
Definition: RepoInfo.cc:161
Pathname packagesPath() const
Path where this repo packages are cached.
Definition: RepoInfo.cc:371
base::ValueTransform< Url, repo::RepoVariablesUrlReplacer > RepoVariablesReplacedUrl
unsigned priority() const
Repository priority for solver.
Definition: RepoInfo.cc:255
#define OUTS(T, B)
TriBool triBoolFromPath(const Pathname &path_r) const
Definition: RepoInfo.cc:197
void setValidRepoSignature(TriBool value_r)
Set the value for validRepoSignature (or indeterminate if unsigned).
Definition: RepoInfo.cc:313
std::vector< std::string > Arguments
bool repoGpgCheck() const
Whether the signature of repo metadata should be checked for this repo.
Definition: RepoInfo.cc:275
bool seekToNode(int depth_r, const std::string &name_r)
Definition: Reader.cc:212
TriBool _gpgCheck
default gpgcheck behavior: Y/N/ZConf
Definition: RepoInfo.cc:203
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
Definition: String.h:30
transform_iterator< repo::RepoVariablesUrlReplacer, url_set::const_iterator > urls_const_iterator
Definition: RepoInfo.h:101
RepoVariablesReplacedUrlList _baseUrls
Definition: RepoInfo.cc:224
static Locale bestMatch(const LocaleSet &avLocales_r, Locale requested_r=Locale())
Return the best match for Locale requested_r within the available avLocales_r.
Definition: Locale.cc:210
RepoInfo implementation.
Definition: RepoInfo.cc:43
bool keepPackages() const
Whether packages downloaded from this repository will be kept in local cache.
Definition: RepoInfo.cc:365
bool needToAcceptLicense() const
Whether the repo license has to be accepted, e.g.
Definition: RepoInfo.cc:437
Url rawMirrorListUrl() const
The raw mirrorListUrl (no variables replaced).
Definition: RepoInfo.cc:380
unsigned split(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \t")
Split line_r into words.
Definition: String.h:478
virtual ~RepoInfo()
Definition: RepoInfo.cc:252
bool gpgCheck() const
Turn signature checking on/off (on)
Definition: ZConfig.cc:991
std::ostream & operator<<(std::ostream &str, const Exception &obj)
Definition: Exception.cc:120
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
int unlink(const Pathname &path)
Like 'unlink'.
Definition: PathInfo.cc:653
RepoVariablesReplacedUrlList & baseUrls()
Definition: RepoInfo.cc:89
void setRepoGpgCheck(TriBool value_r)
Set the value for repoGpgCheck (or indeterminate to use the default).
Definition: RepoInfo.cc:282
Url mirrorListUrl() const
Url of a file which contains a list of repository urls.
Definition: RepoInfo.cc:377
void addContent(const std::string &keyword_r)
Definition: RepoInfo.cc:96
Convenience char* constructible from std::string and char*, it maps (char*)0 to an empty string...
Definition: String.h:118
int forEachLine(std::istream &str_r, function< bool(int, std::string)> consume_r)
Simple lineparser: Call functor consume_r for each line.
Definition: IOStream.cc:100
TriBool pkgGpgCheck() const
Check rpm package signatures (indeterminate - according to gpgcheck)
Definition: ZConfig.cc:997
void setPath(const Pathname &path)
set the product path.
Definition: RepoInfo.cc:340
void setService(const std::string &name)
sets service which added this repository
Definition: RepoInfo.cc:359
#define WAR
Definition: Logger.h:65
void setMetadataPath(const Pathname &path)
set the path where the local metadata is stored
Definition: RepoInfo.cc:350
bool gpgCheck() const
Whether default signature checking should be performed for this repo.
Definition: RepoInfo.cc:265
bool startsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasPrefix
Definition: String.h:1010
void setType(const repo::RepoType &t)
set the repository type
Definition: RepoInfo.cc:343
TriBool _validRepoSignature
have signed and valid repo metadata
Definition: RepoInfo.cc:207
bool baseUrlSet() const
Whether there are manualy configured repository urls.
Definition: RepoInfo.cc:419
Impl * clone() const
clone for RWCOW_pointer
Definition: RepoInfo.cc:229
void setKeepPackages(bool keep)
Set if packaqes downloaded from this repository will be kept in local cache.
Definition: RepoInfo.cc:356
std::string service() const
Gets name of the service to which this repository belongs or empty string if it has been added manual...
Definition: RepoInfo.cc:398
bool baseurl2dump() const
Definition: RepoInfo.cc:92
const std::string & asString() const
Definition: RepoType.cc:56
bool seekToEndNode(int depth_r, const std::string &name_r)
Definition: Reader.cc:232
int symlink(const Pathname &oldpath, const Pathname &newpath)
Like 'symlink'.
Definition: PathInfo.cc:780
void addBaseUrl(const Url &url)
Add a base url.
Definition: RepoInfo.cc:326
std::string receiveLine()
Read one line from the input stream.
static const RepoType NONE
Definition: RepoType.h:32
base::ContainerTransform< std::list< Url >, repo::RepoVariablesUrlReplacer > RepoVariablesReplacedUrlList
void setPackagesPath(const Pathname &path)
set the path where the local packages are stored
Definition: RepoInfo.cc:353
url_set baseUrls() const
The complete set of repository urls.
Definition: RepoInfo.cc:389
const std::vector< Url > & getUrls() const
url_set rawBaseUrls() const
The complete set of raw repository urls (no variables replaced)
Definition: RepoInfo.cc:392
std::string asString() const
Explicit conversion to std::string.
Definition: XmlString.h:77
int close()
Wait for the progamm to complete.
'Language[_Country]' codes.
Definition: Locale.h:49
TriBool _repoGpgCheck
need to check repo sign.: Y/N/(ZConf(Y/N/gpgCheck))
Definition: RepoInfo.cc:204
void setMetalinkUrl(const Url &url)
Like setMirrorListUrl but expect metalink format.
Definition: RepoInfo.cc:320
bool baseUrlsEmpty() const
whether repository urls are available
Definition: RepoInfo.cc:416
repo::RepoType type() const
Type of repository,.
Definition: RepoInfo.cc:374
void setProbedType(const repo::RepoType &t) const
Definition: RepoInfo.cc:62
bool triBoolFromPath(const Pathname &path_r, TriBool &ret_r) const
Definition: RepoInfo.cc:179
const char * c_str() const
Definition: IdStringType.h:105
Pathname licenseTgz() const
Definition: RepoInfo.cc:73
url_set::size_type urls_size_type
Definition: RepoInfo.h:100
bool hasSuffix(const C_Str &str_r, const C_Str &suffix_r)
Return whether str_r has suffix suffix_r.
Definition: String.h:988
void setTargetDistribution(const std::string &targetDistribution)
Sets the distribution for which is this repository meant.
Definition: RepoInfo.cc:362
std::string getLicense(const Locale &lang_r=Locale()) const
Return the best license for the current (or a specified) locale.
Definition: RepoInfo.cc:468
bool autorefresh() const
If true, the repostory must be refreshed before creating resolvables from it.
XmlString nodeText()
If the curent node is not empty, advances the reader to the next node, and returns the value...
Definition: Reader.cc:140
Pathname packagespath
Definition: RepoInfo.cc:218
bool hasLicense() const
Whether there is a license associated with the repo.
Definition: RepoInfo.cc:431
bool hasContent(const std::string &keyword_r=std::string()) const
Check for content keywords.
Definition: RepoInfo.cc:426
bool hasContent(const std::string &keyword_r) const
Definition: RepoInfo.cc:99
Url gpgKeyUrl() const
Key to use for gpg checking of this repository.
Definition: RepoInfo.cc:383
RepoVariablesReplacedUrl _mirrorListUrl
Definition: RepoInfo.cc:211
DefaultIntegral< unsigned, defaultPriority > priority
Definition: RepoInfo.cc:219
Url url() const
Pars pro toto: The first repository url.
Definition: RepoInfo.h:127
std::string targetDistro
Definition: RepoInfo.cc:216
static const RepoInfo noRepo
Represents no Repository (one with an empty alias).
Definition: RepoInfo.h:80
void addContent(const std::string &keyword_r)
Add content keywords.
Definition: RepoInfo.cc:423
size_type size() const
Definition: String.h:133
virtual std::ostream & dumpAsXmlOn(std::ostream &str, const std::string &content="") const
Write an XML representation of this RepoInfo object.
Definition: RepoInfo.cc:632
repo::RepoType type
Definition: RepoInfo.cc:213
TriBool validRepoSignature() const
Whether the repo metadata are signed and successfully validated or indeterminate if unsigned...
Definition: RepoInfo.cc:304
Functor replacing repository variables.
urls_size_type baseUrlsSize() const
number of repository urls
Definition: RepoInfo.cc:413
static const unsigned defaultPriority
Definition: RepoInfo.cc:60
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
Definition: String.h:980
const RepoVariablesReplacedUrlList & baseUrls() const
Definition: RepoInfo.cc:76
void setPkgGpgCheck(TriBool value_r)
Set the value for pkgGpgCheck (or indeterminate to use the default).
Definition: RepoInfo.cc:294
std::unordered_set< Locale > LocaleSet
Definition: Locale.h:27
Url rawGpgKeyUrl() const
The raw gpgKeyUrl (no variables replaced).
Definition: RepoInfo.cc:386
Url manipulation class.
Definition: Url.h:87
Pathname path() const
Repository path.
Definition: RepoInfo.cc:395
virtual std::ostream & dumpOn(std::ostream &str) const
Write a human-readable representation of this RepoInfo object into the str stream.
Definition: RepoInfo.cc:541
#define DBG
Definition: Logger.h:63
std::string service
Definition: RepoInfo.cc:215
detail::EscapedString escape(const std::string &in_r)
Escape xml special charaters (& -> &; from IoBind library).
Definition: XmlEscape.h:51
Repository type enumeration.
Definition: RepoType.h:27
xmlTextReader based interface to iterate xml streams.
Definition: Reader.h:95