22#include <solv/solvversion.h>
24#include <zypp-core/base/InputStream>
25#include <zypp/base/LogTools.h>
26#include <zypp/base/Gettext.h>
27#include <zypp-core/base/DefaultIntegral>
28#include <zypp/base/Function.h>
29#include <zypp/base/Regex.h>
30#include <zypp/PathInfo.h>
31#include <zypp/TmpPath.h>
38#include <zypp-media/auth/CredentialManager>
39#include <zypp-media/MediaException>
41#include <zypp/ExternalProgram.h>
42#include <zypp/ManagedFile.h>
48#include <zypp/repo/yum/Downloader.h>
49#include <zypp/repo/susetags/Downloader.h>
66#define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc()
71 namespace zypp_readonly_hack {
81 const char * env = getenv(
"ZYPP_PLUGIN_APPDATA_FORCE_COLLECT");
111 class UrlCredentialExtractor
114 UrlCredentialExtractor(
Pathname & root_r )
118 ~UrlCredentialExtractor()
119 {
if ( _cmPtr )
_cmPtr->save(); }
122 bool collect(
const Url & url_r )
128 _cmPtr->addUserCred( url_r );
133 template<
class TContainer>
134 bool collect(
const TContainer & urls_r )
135 {
bool ret =
false;
for (
const Url & url : urls_r ) {
if ( collect( url ) && !ret ) ret =
true; }
return ret; }
138 bool extract(
Url & url_r )
140 bool ret = collect( url_r );
146 template<
class TContainer>
147 bool extract( TContainer & urls_r )
148 {
bool ret =
false;
for (
Url & url : urls_r ) {
if ( extract( url ) && !ret ) ret =
true; }
return ret; }
167 MediaMounter(
const Url & url_r )
179 mediamanager.
close( _mid );
189 return mediamanager.
localPath( _mid, path_r );
198 template <
class Iterator>
199 inline bool foundAliasIn(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
201 for_( it, begin_r, end_r )
202 if ( it->alias() == alias_r )
207 template <
class Container>
208 inline bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
209 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
212 template <
class Iterator>
213 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
215 for_( it, begin_r, end_r )
216 if ( it->alias() == alias_r )
221 template <
class Container>
222 inline typename Container::iterator findAlias(
const std::string & alias_r, Container & cont_r )
223 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
225 template <
class Container>
226 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
227 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
231 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
233 std::string filename( alias_r );
238 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
262 RepoCollector(
const std::string & targetDistro_)
266 bool collect(
const RepoInfo &repo )
275 <<
"' distribution (current distro is '"
281 repos.push_back(repo);
295 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
297 MIL <<
"repo file: " << file << endl;
298 RepoCollector collector;
300 return std::move(collector.repos);
313 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
315 MIL <<
"directory " << dir << endl;
316 std::list<RepoInfo>
repos;
317 bool nonroot( geteuid() != 0 );
318 if ( nonroot && !
PathInfo(dir).userMayRX() )
324 std::list<Pathname> entries;
331 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
332 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
342 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
343 repos.insert(
repos.end(), tmp.begin(), tmp.end() );
353 inline void assert_alias(
const RepoInfo & info )
355 if ( info.
alias().empty() )
359 if ( info.
alias()[0] ==
'.')
361 info,
_(
"Repository alias cannot start with dot.")));
364 inline void assert_alias(
const ServiceInfo & info )
366 if ( info.
alias().empty() )
370 if ( info.
alias()[0] ==
'.')
372 info,
_(
"Service alias cannot start with dot.")));
377 inline void assert_urls(
const RepoInfo & info )
395 inline bool isTmpRepo(
const RepoInfo & info_r )
419 {
return rawcache_path_for_repoinfo( opt, info ) / info.
path(); }
442 class ServiceCollector
445 typedef std::set<ServiceInfo> ServiceSet;
447 ServiceCollector( ServiceSet & services_r )
451 bool operator()(
const ServiceInfo & service_r )
const
463 inline bool autoPruneInDir(
const Pathname & path_r )
473 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
475 return repositories_in_file(local);
514#define OUTS(X) str << " " #X "\t" << obj.X << endl
515 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
516 OUTS( repoRawCachePath );
517 OUTS( repoSolvCachePath );
518 OUTS( repoPackagesCachePath );
519 OUTS( knownReposPath );
520 OUTS( knownServicesPath );
537 , _pluginRepoverification( _options.pluginsPath/
"repoverification", _options.rootDir )
539 init_knownServices();
540 init_knownRepositories();
546 if ( ( _reposDirty || env::ZYPP_PLUGIN_APPDATA_FORCE_COLLECT() )
547 && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
550 std::list<Pathname> entries;
551 filesystem::readdir( entries, _options.pluginsPath/
"appdata",
false );
552 if ( ! entries.empty() )
555 cmd.push_back(
"<" );
556 cmd.push_back(
">" );
557 cmd.push_back(
"PROGRAM" );
558 for (
const auto & rinfo :
repos() )
560 if ( ! rinfo.enabled() )
562 cmd.push_back(
"-R" );
563 cmd.push_back( rinfo.alias() );
564 cmd.push_back(
"-t" );
565 cmd.push_back( rinfo.type().asString() );
566 cmd.push_back(
"-p" );
567 cmd.push_back( (rinfo.metadataPath()/rinfo.path()).asString() );
570 for_( it, entries.begin(), entries.end() )
593 bool hasRepo(
const std::string & alias )
const
594 {
return foundAliasIn( alias,
repos() ); }
599 return it ==
repos().end() ? RepoInfo::noRepo : *it;
604 {
return rawcache_path_for_repoinfo( _options, info ); }
607 {
return packagescache_path_for_repoinfo( _options, info ); }
611 RefreshCheckStatus checkIfToRefreshMetadata(
const RepoInfo & info,
const Url & url, RawMetadataRefreshPolicy policy );
629 {
return PathInfo(solv_path_for_repoinfo( _options, info ) /
"solv").
isExist(); }
632 {
return RepoStatus::fromCookieFile(solv_path_for_repoinfo(_options, info) /
"cookie"); }
654 {
return foundAliasIn( alias,
_services ); }
659 return it ==
_services.end() ? ServiceInfo::noService : *it;
667 void removeService(
const std::string & alias );
669 { removeService( service.
alias() ); }
671 void refreshServices(
const RefreshServiceOptions & options_r );
673 void refreshService(
const std::string & alias,
const RefreshServiceOptions & options_r );
675 { refreshService( service.
alias(), options_r ); }
677 void modifyService(
const std::string & oldAlias,
const ServiceInfo & newService );
689 {
return filenameFromAlias( info.
alias(),
"repo" ); }
692 {
return filenameFromAlias( info.
alias(),
"service" ); }
696 Pathname base = solv_path_for_repoinfo( _options, info );
697 filesystem::assert_dir(base);
703 template<
typename OutputIterator>
707 std::copy( boost::make_filter_iterator( filter,
repos().begin(),
repos().end() ),
708 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
729 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
732 {
return new Impl( *
this ); }
738 {
return str <<
"RepoManager::Impl"; }
742 void RepoManager::Impl::saveService(
ServiceInfo & service )
const
745 Pathname servfile = generateNonExistingName( _options.knownServicesPath,
746 generateFilename( service ) );
749 MIL <<
"saving service in " << servfile << endl;
751 std::ofstream file( servfile.
c_str() );
758 MIL <<
"done" << endl;
777 const std::string & basefilename )
const
779 std::string final_filename = basefilename;
781 while (
PathInfo(dir + final_filename).isExist() )
786 return dir +
Pathname(final_filename);
791 void RepoManager::Impl::init_knownServices()
793 Pathname dir = _options.knownServicesPath;
794 std::list<Pathname> entries;
804 for_(it, entries.begin(), entries.end() )
821 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
822 const Pathname & defaultCachePath_r,
823 const std::list<std::string> & repoEscAliases_r )
828 if ( cachePath_r != defaultCachePath_r )
831 std::list<std::string> entries;
835 std::set<std::string> oldfiles;
836 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
837 std::inserter( oldfiles, oldfiles.end() ) );
843 for (
const std::string & old : oldfiles )
847 pi( cachePath_r/old );
857 void RepoManager::Impl::init_knownRepositories()
859 MIL <<
"start construct known repos" << endl;
863 std::list<std::string> repoEscAliases;
864 std::list<RepoInfo> orphanedRepos;
865 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
868 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
870 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
872 _reposX.insert( repoInfo );
875 const std::string & serviceAlias( repoInfo.service() );
876 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
878 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
879 orphanedRepos.push_back( repoInfo );
883 repoEscAliases.push_back(repoInfo.escaped_alias());
887 if ( ! orphanedRepos.empty() )
889 for (
const auto & repoInfo : orphanedRepos )
891 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
897 % repoInfo.alias() );
899 removeRepository( repoInfo );
915 repoEscAliases.sort();
916 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath,
919 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath,
923 if ( autoPruneInDir( _options.repoPackagesCachePath ) )
924 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath,
929 MIL <<
"end construct known repos" << endl;
936 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
937 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
942 repokind = probeCache( productdatapath );
949 switch ( repokind.
toEnum() )
952 status =
RepoStatus( productdatapath/
"repodata/repomd.xml");
954 status = status &&
RepoStatus( mediarootpath/
"media.1/media" );
958 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
972 if ( ! status.
empty() )
979 void RepoManager::Impl::touchIndexFile(
const RepoInfo & info )
981 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
986 repokind = probeCache( productdatapath );
992 switch ( repokind.
toEnum() )
995 p =
Pathname(productdatapath +
"/repodata/repomd.xml");
999 p =
Pathname(productdatapath +
"/content");
1003 p =
Pathname(productdatapath +
"/cookie");
1021 MIL <<
"Check if to refresh repo " << info.
alias() <<
" at " << url <<
" (" << info.
type() <<
")" << endl;
1023 refreshGeoIPData( { url } );
1026 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1028 RepoStatus oldstatus = metadataStatus( info );
1030 if ( oldstatus.
empty() )
1032 MIL <<
"No cached metadata, going to refresh" << endl;
1033 return REFRESH_NEEDED;
1038 MIL <<
"Never refresh CD/DVD" << endl;
1039 return REPO_UP_TO_DATE;
1042 if ( policy == RefreshForced )
1044 MIL <<
"Forced refresh!" << endl;
1045 return REFRESH_NEEDED;
1050 policy = RefreshIfNeededIgnoreDelay;
1054 if ( policy != RefreshIfNeededIgnoreDelay )
1059 RepoStatus cachestatus = cacheStatus( info );
1061 if ( oldstatus == cachestatus )
1069 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1073 MIL <<
"Repository '" << info.
alias()
1074 <<
"' has been refreshed less than repo.refresh.delay ("
1076 <<
") minutes ago. Advising to skip refresh" << endl;
1077 return REPO_CHECK_DELAYED;
1082 MIL <<
"Metadata and solv cache don't match. Check data on server..." << endl;
1089 repokind = probe( url, info.
path() );
1093 switch ( repokind.
toEnum() )
1120 if ( oldstatus == newstatus )
1122 MIL <<
"repo has not changed" << endl;
1123 touchIndexFile( info );
1124 return REPO_UP_TO_DATE;
1128 MIL <<
"repo has changed, going to refresh" << endl;
1129 return REFRESH_NEEDED;
1135 ERR <<
"refresh check failed for " << url << endl;
1139 return REFRESH_NEEDED;
1149 refreshGeoIPData( info.
baseUrls() );
1152 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1153 "Valid metadata not found at specified URLs",
1167 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1170 MIL <<
"Going to refresh metadata from " << url << endl;
1178 if ( repokind != probed )
1182 for_( it, repoBegin(), repoEnd() )
1184 if ( info.
alias() == (*it).alias() )
1187 modifiedrepo.
setType( repokind );
1201 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1210 if( tmpdir.path().empty() )
1212 Exception ex(
_(
"Can't create metadata cache directory."));
1222 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1226 if ( _pluginRepoverification.checkIfNeeded() )
1227 downloader_ptr->setPluginRepoverification( _pluginRepoverification );
1238 for_( it, repoBegin(), repoEnd() )
1240 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1241 if (
PathInfo(cachepath).isExist() )
1242 downloader_ptr->addCachePath(cachepath);
1245 downloader_ptr->download( media, tmpdir.path() );
1250 MediaMounter media( url );
1265 if ( ! isTmpRepo( info ) )
1274 ERR <<
"Trying another url..." << endl;
1280 rexception.remember(e);
1286 ERR <<
"No more urls..." << endl;
1295 progress.sendTo(progressfnc);
1305 progress.sendTo(progressfnc);
1308 const Pathname & rpc { packagescache_path_for_repoinfo(_options, info) };
1309 if ( not isAutoClean_r || autoPruneInDir( rpc.dirname() ) )
1318 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1319 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1326 RepoStatus raw_metadata_status = metadataStatus(info);
1327 if ( raw_metadata_status.
empty() )
1332 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1333 raw_metadata_status = metadataStatus(info);
1336 bool needs_cleaning =
false;
1337 if ( isCached( info ) )
1339 MIL << info.
alias() <<
" is already cached." << endl;
1342 if ( cache_status == raw_metadata_status )
1344 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1345 if ( policy == BuildIfNeeded )
1348 const Pathname & base = solv_path_for_repoinfo( _options, info);
1349 if ( !
PathInfo(base/
"solv.idx").isExist() )
1355 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1359 needs_cleaning =
true;
1365 progress.name(
str::form(
_(
"Building repository '%s' cache"), info.
label().c_str()));
1373 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1375 Pathname base = solv_path_for_repoinfo( _options, info);
1394 switch ( repokind.
toEnum() )
1398 repokind = probeCache( productdatapath );
1404 MIL <<
"repo type is " << repokind << endl;
1406 switch ( repokind.
toEnum() )
1417 cmd.push_back(
PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
1419 cmd.push_back(
"-o" );
1420 cmd.push_back( solvfile.
asString() );
1421 cmd.push_back(
"-X" );
1426 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
1428 cmd.push_back(
"-R" );
1430 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1433 cmd.push_back( productdatapath.
asString() );
1436 std::string errdetail;
1438 for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
1439 WAR <<
" " << output;
1440 errdetail += output;
1443 int ret = prog.close();
1447 ex.addHistory(
str::Str() << prog.command() << endl << errdetail << prog.execError() );
1452 guard.resetDispose();
1461 setCacheStatus(info, raw_metadata_status);
1462 MIL <<
"Commit cache.." << endl;
1477 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1483 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1495 bool gotMediaException =
false;
1501 if ( access.doesFileExist(path/
"/repodata/repomd.xml") )
1503 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1510 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1512 gotMediaException =
true;
1517 if ( access.doesFileExist(path/
"/content") )
1519 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1526 DBG <<
"problem checking for content file" << endl;
1528 gotMediaException =
true;
1534 MediaMounter media( url );
1538 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1552 if (gotMediaException)
1555 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1566 MIL <<
"going to probe the cached repo at " << path_r << endl;
1570 if (
PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1572 else if (
PathInfo(path_r/
"/content").isFile() )
1574 else if (
PathInfo(path_r).isDir() )
1577 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1585 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1588 progress.sendTo(progressrcv);
1591 std::list<Pathname> cachedirs;
1592 cachedirs.push_back(_options.repoRawCachePath);
1593 cachedirs.push_back(_options.repoPackagesCachePath);
1594 cachedirs.push_back(_options.repoSolvCachePath);
1596 for_( dir, cachedirs.begin(), cachedirs.end() )
1600 std::list<Pathname> entries;
1605 unsigned sdircount = entries.size();
1606 unsigned sdircurrent = 1;
1607 for_( subdir, entries.begin(), entries.end() )
1611 for_( r, repoBegin(), repoEnd() )
1612 if ( subdir->basename() == r->escaped_alias() )
1613 { found =
true;
break; }
1618 progress.set( progress.val() + sdircurrent * 100 / sdircount );
1623 progress.set( progress.val() + 100 );
1633 progress.sendTo(progressrcv);
1636 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1647 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1649 if ( !
PathInfo(solvfile).isExist() )
1659 if ( toolversion != LIBSOLV_TOOLVERSION )
1668 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1669 cleanCache( info, progressrcv );
1670 buildCache( info, BuildIfNeeded, progressrcv );
1685 progress.name(
str::form(
_(
"Adding repository '%s'"), info.
label().c_str()));
1688 MIL <<
"Try adding repo " << info << endl;
1695 if ( _options.probe )
1697 DBG <<
"unknown repository type, probing" << endl;
1698 assert_urls(tosave);
1712 Pathname repofile = generateNonExistingName(
1713 _options.knownReposPath, generateFilename(tosave));
1715 MIL <<
"Saving repo in " << repofile << endl;
1717 std::ofstream file(repofile.
c_str());
1726 tosave.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1727 tosave.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1732 oinfo.setFilepath(repofile);
1733 oinfo.setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1734 oinfo.setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1736 reposManip().insert(tosave);
1741 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1746 MIL <<
"done" << endl;
1753 for ( std::list<RepoInfo>::const_iterator it =
repos.begin();
1758 for_ ( kit, repoBegin(), repoEnd() )
1760 if ( (*it).alias() == (*kit).alias() )
1762 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1779 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1781 MIL <<
"Saving " <<
repos.size() <<
" repo" << (
repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1783 std::ofstream file(repofile.
c_str());
1790 for ( std::list<RepoInfo>::iterator it =
repos.begin();
1794 MIL <<
"Saving " << (*it).alias() << endl;
1795 it->dumpAsIniOn(file);
1796 it->setFilepath(repofile);
1797 it->setMetadataPath( rawcache_path_for_repoinfo( _options, *it ) );
1798 it->setPackagesPath( packagescache_path_for_repoinfo( _options, *it ) );
1799 reposManip().insert(*it);
1804 MIL <<
"done" << endl;
1816 MIL <<
"Going to delete repo " << info.
alias() << endl;
1818 for_( it, repoBegin(), repoEnd() )
1823 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1838 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1839 if ( filerepos.size() == 0
1840 ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.
alias() ) )
1844 if ( ! ( ret == 0 || ret == ENOENT ) )
1849 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1867 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1868 fit != filerepos.end();
1871 if ( (*fit).alias() != todelete.
alias() )
1872 (*fit).dumpAsIniOn(file);
1880 if ( isCached(todelete) )
1881 cleanCache( todelete, cSubprogrcv);
1883 cleanMetadata( todelete, mSubprogrcv );
1884 cleanPackages( todelete, pSubprogrcv,
true );
1885 reposManip().erase(todelete);
1886 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1900 RepoInfo toedit = getRepositoryInfo(alias);
1904 if ( alias != newinfo.alias() && hasRepo( newinfo.alias() ) )
1916 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1932 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1933 fit != filerepos.end();
1938 if ( (*fit).alias() != toedit.
alias() )
1939 (*fit).dumpAsIniOn(file);
1941 newinfo.dumpAsIniOn(file);
1944 if ( toedit.
enabled() && !newinfo.enabled() )
1947 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1952 newinfo.setFilepath(toedit.
filepath());
1953 newinfo.setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1954 newinfo.setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1959 oinfo.setFilepath(toedit.
filepath());
1960 oinfo.setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1961 oinfo.setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1963 reposManip().erase(toedit);
1964 reposManip().insert(newinfo);
1966 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.baseUrls() );
1968 MIL <<
"repo " << alias <<
" modified" << endl;
1976 RepoConstIterator it( findAlias( alias,
repos() ) );
1977 if ( it !=
repos().end() )
1987 for_( it, repoBegin(), repoEnd() )
1989 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1991 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
2006 void RepoManager::Impl::addService(
const ServiceInfo & service )
2008 assert_alias( service );
2011 if ( hasService( service.
alias() ) )
2017 saveService( toSave );
2021 UrlCredentialExtractor( _options.rootDir ).collect( toSave.url() );
2023 MIL <<
"added service " << toSave.alias() << endl;
2028 void RepoManager::Impl::removeService(
const std::string & alias )
2030 MIL <<
"Going to delete service " << alias << endl;
2032 const ServiceInfo & service = getService( alias );
2035 if( location.
empty() )
2044 if ( tmpSet.size() == 1 )
2051 MIL << alias <<
" successfully deleted." << endl;
2057 std::ofstream file(location.
c_str());
2064 for_(it, tmpSet.begin(), tmpSet.end())
2066 if( it->alias() != alias )
2067 it->dumpAsIniOn(file);
2070 MIL << alias <<
" successfully deleted from file " << location << endl;
2074 RepoCollector rcollector;
2075 getRepositoriesInService( alias,
2076 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
2078 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
2079 removeRepository(*rit);
2084 void RepoManager::
Impl::refreshServices( const RefreshServiceOptions & options_r )
2088 ServiceSet services( serviceBegin(), serviceEnd() );
2089 for_( it, services.begin(), services.end() )
2091 if ( !it->enabled() )
2095 refreshService(*it, options_r);
2102 void RepoManager::Impl::refreshService(
const std::string & alias,
const RefreshServiceOptions & options_r )
2105 assert_alias( service );
2106 assert_url( service );
2107 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2109 if ( service.
ttl() && !( options_r.testFlag( RefreshService_forceRefresh) || options_r.testFlag( RefreshService_restoreStatus ) ) )
2118 if ( (lrf+=service.
ttl()) > now )
2120 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2125 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2132 bool serviceModified =
false;
2143 serviceModified =
true;
2148 std::string servicesTargetDistro = _options.servicesTargetDistro;
2149 if ( servicesTargetDistro.empty() )
2153 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2157 RepoCollector collector(servicesTargetDistro);
2170 ServiceRepos( _options.rootDir, service, bind( &RepoCollector::collect, &collector, _1 ) );
2175 uglyHack.first =
true;
2176 uglyHack.second = e;
2178 if ( service.
ttl() != origTtl )
2180 if ( !service.
ttl() )
2182 serviceModified =
true;
2190 for_( it, collector.repos.begin(), collector.repos.end() )
2193 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2195 it->setService( service.
alias() );
2198 newRepoStates[it->alias()] = *it;
2206 if ( !it->path().empty() )
2208 if ( it->path() !=
"/" )
2213 if ( it->baseUrlsEmpty() )
2216 if ( !path.
empty() )
2218 it->setBaseUrl( std::move(url) );
2220 else if ( !path.
empty() )
2223 for (
Url & url : urls )
2227 it->setBaseUrls( std::move(urls) );
2234 RepoInfoList oldRepos;
2235 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2239 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2241 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2243 if ( oldRepo->enabled() )
2246 const auto & last = service.
repoStates().find( oldRepo->alias() );
2247 if ( last != service.
repoStates().end() && ! last->second.enabled )
2249 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2251 serviceModified =
true;
2254 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2257 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2259 removeRepository( *oldRepo );
2265 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2266 for_( it, collector.repos.begin(), collector.repos.end() )
2272 TriBool toBeEnabled( indeterminate );
2273 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2275 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2277 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2289 DBG <<
"User request to enable service repo " << it->alias() << endl;
2295 serviceModified =
true;
2299 DBG <<
"User request to disable service repo " << it->alias() << endl;
2300 toBeEnabled =
false;
2304 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2305 if ( oldRepo == oldRepos.end() )
2310 if ( ! indeterminate(toBeEnabled) )
2311 it->setEnabled( (
bool ) toBeEnabled );
2313 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2314 addRepository( *it );
2319 bool oldRepoModified =
false;
2321 if ( indeterminate(toBeEnabled) )
2325 if ( oldRepo->enabled() == it->enabled() )
2326 toBeEnabled = it->enabled();
2327 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2329 toBeEnabled = it->enabled();
2330 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2334 const auto & last = service.
repoStates().find( oldRepo->alias() );
2335 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2336 toBeEnabled = it->enabled();
2339 toBeEnabled = oldRepo->enabled();
2340 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2346 if ( toBeEnabled == oldRepo->enabled() )
2348 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2350 else if ( toBeEnabled )
2352 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2353 oldRepo->setEnabled(
true );
2354 oldRepoModified =
true;
2358 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2359 oldRepo->setEnabled(
false );
2360 oldRepoModified =
true;
2366 if ( oldRepo->rawName() != it->rawName() )
2368 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2369 oldRepo->setName( it->rawName() );
2370 oldRepoModified =
true;
2374 if ( oldRepo->autorefresh() != it->autorefresh() )
2376 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2377 oldRepo->setAutorefresh( it->autorefresh() );
2378 oldRepoModified =
true;
2382 if ( oldRepo->priority() != it->priority() )
2384 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2385 oldRepo->setPriority( it->priority() );
2386 oldRepoModified =
true;
2392 urlCredentialExtractor.extract( newUrls );
2393 if ( oldRepo->rawBaseUrls() != newUrls )
2395 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2396 oldRepo->setBaseUrls( std::move(newUrls) );
2397 oldRepoModified =
true;
2407 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2408 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2409#define Z_CHKGPG(I,N) \
2410 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
2412 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
2413 oldRepo->set##N##Check( ngpg[I] ); \
2414 oldRepoModified = true; \
2423 if ( oldRepoModified )
2425 modifyRepository( oldRepo->alias(), *oldRepo );
2434 serviceModified =
true;
2441 serviceModified =
true;
2448 if ( service.
ttl() )
2451 serviceModified =
true;
2454 if ( serviceModified )
2457 modifyService( service.
alias(), service );
2461 if ( uglyHack.first )
2463 throw( uglyHack.second );
2469 void RepoManager::Impl::modifyService(
const std::string & oldAlias,
const ServiceInfo & newService )
2471 MIL <<
"Going to modify service " << oldAlias << endl;
2482 const ServiceInfo & oldService = getService(oldAlias);
2485 if( location.
empty() )
2495 std::ofstream file(location.
c_str());
2496 for_(it, tmpSet.begin(), tmpSet.end())
2498 if( *it != oldAlias )
2499 it->dumpAsIniOn(file);
2508 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2512 if ( oldAlias != service.
alias()
2515 std::vector<RepoInfo> toModify;
2516 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2517 for_( it, toModify.begin(), toModify.end() )
2524 const auto & last = service.
repoStates().find( it->alias() );
2526 it->setEnabled( last->second.enabled );
2529 it->setEnabled(
false );
2532 if ( oldAlias != service.
alias() )
2533 it->setService(service.
alias());
2535 modifyRepository(it->alias(), *it);
2549 if ( access.doesFileExist(
"/repo/repoindex.xml") )
2577 MIL <<
"GeoIp disabled via ZConfig, not refreshing the GeoIP information." << std::endl;
2581 std::vector<std::string> hosts;
2582 for (
const auto &baseUrl : urls ) {
2583 const auto &host = baseUrl.getHost();
2585 hosts.push_back( host );
2590 if ( hosts.empty() ) {
2591 MIL <<
"No configured geoip URL found, not updating geoip data" << std::endl;
2598 MIL <<
"Unable to create cache directory for GeoIP." << std::endl;
2602 if ( !
PathInfo(geoIPCache).userMayRWX() ) {
2603 MIL <<
"No access rights for the GeoIP cache directory." << std::endl;
2613 auto age = std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t( pi.
mtime() );
2614 if ( age < std::chrono::hours(24) )
2617 MIL <<
"Removing GeoIP file for " << entry.
name <<
" since it's older than 24hrs." << std::endl;
2623 std::for_each( hosts.begin(), hosts.end(), [ & ](
const std::string &hostname ) {
2626 if ( zypp::PathInfo( geoIPCache / hostname ).isExist() ) {
2627 MIL <<
"Skipping GeoIP request for " << hostname <<
" since a valid cache entry exists." << std::endl;
2631 MIL <<
"Query GeoIP for " << hostname << std::endl;
2636 url.setHost(hostname);
2637 url.setScheme(
"https");
2642 MIL <<
"Ignoring invalid GeoIP hostname: " << hostname << std::endl;
2654 MIL <<
"Failed to query GeoIP from hostname: " << hostname << std::endl;
2657 if ( !file->
empty() ) {
2659 constexpr auto writeHostToFile = [](
const Pathname &fName,
const std::string &host ){
2661 out.open( fName.
asString(), std::ios_base::trunc );
2662 if ( out.is_open() ) {
2663 out << host << std::endl;
2665 MIL <<
"Failed to create/open GeoIP cache file " << fName << std::endl;
2669 std::string geoipMirror;
2672 if ( reader.seekToNode( 1,
"host" ) ) {
2673 const auto &
str = reader.nodeText().asString();
2681 MIL <<
"Storing geoIP redirection: " << hostname <<
" -> " <<
str << std::endl;
2686 MIL <<
"No host entry or empty file returned for GeoIP, remembering for 24hrs" << std::endl;
2690 MIL <<
"Empty or invalid GeoIP file, not requesting again for 24hrs" << std::endl;
2693 writeHostToFile( geoIPCache / hostname, geoipMirror );
2699 MIL <<
"Failed to query GeoIP data." << std::endl;
2710 : _pimpl( new
Impl(opt) )
2717 {
return _pimpl->repoEmpty(); }
2720 {
return _pimpl->repoSize(); }
2723 {
return _pimpl->repoBegin(); }
2726 {
return _pimpl->repoEnd(); }
2729 {
return _pimpl->getRepo( alias ); }
2732 {
return _pimpl->hasRepo( alias ); }
2742 std::string host( url_r.
getHost() );
2743 if ( ! host.empty() )
2755 {
return _pimpl->metadataStatus( info ); }
2758 {
return _pimpl->checkIfToRefreshMetadata( info, url, policy ); }
2761 {
return _pimpl->metadataPath( info ); }
2764 {
return _pimpl->packagesPath( info ); }
2767 {
return _pimpl->refreshMetadata( info, policy, progressrcv ); }
2770 {
return _pimpl->cleanMetadata( info, progressrcv ); }
2773 {
return _pimpl->cleanPackages( info, progressrcv ); }
2776 {
return _pimpl->cacheStatus( info ); }
2779 {
return _pimpl->buildCache( info, policy, progressrcv ); }
2782 {
return _pimpl->cleanCache( info, progressrcv ); }
2785 {
return _pimpl->isCached( info ); }
2788 {
return _pimpl->loadFromCache( info, progressrcv ); }
2791 {
return _pimpl->cleanCacheDirGarbage( progressrcv ); }
2794 {
return _pimpl->probe( url, path ); }
2797 {
return _pimpl->probe( url ); }
2800 {
return _pimpl->addRepository( info, progressrcv ); }
2803 {
return _pimpl->addRepositories( url, progressrcv ); }
2806 {
return _pimpl->removeRepository( info, progressrcv ); }
2809 {
return _pimpl->modifyRepository( alias, newinfo, progressrcv ); }
2812 {
return _pimpl->getRepositoryInfo( alias, progressrcv ); }
2815 {
return _pimpl->getRepositoryInfo( url, urlview, progressrcv ); }
2818 {
return _pimpl->serviceEmpty(); }
2821 {
return _pimpl->serviceSize(); }
2824 {
return _pimpl->serviceBegin(); }
2827 {
return _pimpl->serviceEnd(); }
2830 {
return _pimpl->getService( alias ); }
2833 {
return _pimpl->hasService( alias ); }
2836 {
return _pimpl->probeService( url ); }
2839 {
return _pimpl->addService( alias, url ); }
2842 {
return _pimpl->addService( service ); }
2845 {
return _pimpl->removeService( alias ); }
2848 {
return _pimpl->removeService( service ); }
2851 {
return _pimpl->refreshServices( options_r ); }
2854 {
return _pimpl->refreshService( alias, options_r ); }
2857 {
return _pimpl->refreshService( service, options_r ); }
2860 {
return _pimpl->modifyService( oldAlias, service ); }
2863 {
return _pimpl->refreshGeoIPData( urls ); }
media::MediaAccessId _mid
scoped_ptr< media::CredentialManager > _cmPtr
RepoManager implementation.
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
Stream output.
Progress callback from another progress.
Store and operate on date (time_t).
static const ValueType day
static Date now()
Return the current time.
Integral type with defined initial value when default constructed.
std::string digest()
get hex string representation of the digest
static const std::string & sha1()
sha1
Base class for Exception.
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
std::string asUserString() const
Translated error message as string suitable for the user.
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
std::vector< std::string > Arguments
Writing the zypp history file.
void modifyRepository(const RepoInfo &oldrepo, const RepoInfo &newrepo)
Log certain modifications to a repository.
void addRepository(const RepoInfo &repo)
Log a newly added repository.
void removeRepository(const RepoInfo &repo)
Log recently removed repository.
Maintain [min,max] and counter (value) for progress counting.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
void name(const std::string &name_r)
Set counter name.
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
What is known about a repository.
Pathname metadataPath() const
Path where this repo metadata was read from.
bool baseUrlsEmpty() const
whether repository urls are available
void setBaseUrl(const Url &url)
Clears current base URL list and adds url.
repo::RepoType type() const
Type of repository,.
urls_size_type baseUrlsSize() const
number of repository urls
Url url() const
Pars pro toto: The first repository url.
urls_const_iterator baseUrlsEnd() const
iterator that points at end of repository urls
void setPackagesPath(const Pathname &path)
set the path where the local packages are stored
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Write this RepoInfo object into str in a .repo file format.
Pathname path() const
Repository path.
url_set baseUrls() const
The complete set of repository urls.
bool requireStatusWithMediaFile() const
Returns true if this repository requires the media.1/media file to be included in the metadata status...
bool usesAutoMethadataPaths() const
Whether metadataPath uses AUTO% setup.
void setProbedType(const repo::RepoType &t) const
This allows to adjust the RepoType lazy, from NONE to some probed value, even for const objects.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
void setMetadataPath(const Pathname &path)
Set the path where the local metadata is stored.
Pathname packagesPath() const
Path where this repo packages are cached.
transform_iterator< repo::RepoVariablesUrlReplacer, url_set::const_iterator > urls_const_iterator
std::string targetDistribution() const
Distribution for which is this repository meant.
void setType(const repo::RepoType &t)
set the repository type
Track changing files or directories.
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
Date timestamp() const
The time the data were changed the last time.
bool empty() const
Whether the status is empty (empty checksum)
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
static const std::string & systemRepoAlias()
Reserved system repository alias @System .
void eraseFromPool()
Remove this Repository from its Pool.
repo::ServiceType type() const
Service type.
Date::Duration ttl() const
Sugested TTL between two metadata auto-refreshs.
void setLrf(Date lrf_r)
Set date of last refresh.
Date lrf() const
Date of last refresh (if known).
bool repoToDisableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToDisable.
bool repoToEnableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToEnable.
const RepoStates & repoStates() const
Access the remembered repository states.
Url url() const
The service url.
void setProbedType(const repo::ServiceType &t) const
Lazy init service type.
std::map< std::string, RepoState > RepoStates
Url rawUrl() const
The service raw url (no variables replaced)
void addRepoToEnable(const std::string &alias_r)
Add alias_r to the set of ReposToEnable.
void clearReposToDisable()
Clear the set of ReposToDisable.
void delRepoToEnable(const std::string &alias_r)
Remove alias_r from the set of ReposToEnable.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Writes ServiceInfo to stream in ".service" format.
void setRepoStates(RepoStates newStates_r)
Remember a new set of repository states.
bool reposToDisableEmpty() const
std::string targetDistribution() const
This is register.target attribute of the installed base product.
std::string getScheme() const
Returns the scheme name of the URL.
std::string asCompleteString() const
Returns a complete string representation of the Url object.
std::string asString() const
Returns a default string representation of the Url object.
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
void setPathName(const std::string &path, EEncoding eflag=zypp::url::E_DECODED)
Set the path name.
std::string getHost(EEncoding eflag=zypp::url::E_DECODED) const
Returns the hostname or IP from the URL authority.
void setHost(const std::string &host)
Set the hostname or IP in the URL authority.
static bool schemeIsLocal(const std::string &scheme_r)
hd cd dvd dir file iso
bool isValid() const
Verifies the Url.
void setPassword(const std::string &pass, EEncoding eflag=zypp::url::E_DECODED)
Set the password in the URL authority.
static bool schemeIsPlugin(const std::string &scheme_r)
plugin
bool hasCredentialsInAuthority() const
Returns true if username and password are encoded in the authority component.
void setScheme(const std::string &scheme)
Set the scheme name in the URL.
static bool schemeIsDownloading(const std::string &scheme_r)
http https ftp sftp tftp
static bool schemeIsVolatile(const std::string &scheme_r)
cd dvd
unsigned repo_refresh_delay() const
Amount of time in minutes that must pass before another refresh.
Pathname builtinRepoSolvfilesPath() const
The builtin config file value.
bool repo_add_probe() const
Whether repository urls should be probed.
Pathname geoipCachePath() const
Path where the geoip caches are kept (/var/cache/zypp/geoip)
static ZConfig & instance()
Singleton ctor.
Pathname builtinRepoPackagesPath() const
The builtin config file value.
Pathname builtinRepoMetadataPath() const
The builtin config file value.
Wrapper class for stat/lstat.
const Pathname & path() const
Return current Pathname.
bool isExist() const
Return whether valid stat info exists.
const std::string & asString() const
Return current Pathname as String.
Pathname extend(const std::string &r) const
Append string r to the last component of the path.
Pathname dirname() const
Return all but the last component od this path.
const char * c_str() const
String representation.
const std::string & asString() const
String representation.
std::string basename() const
Return the last component of this path.
bool empty() const
Test for an empty path.
static Pathname assertprefix(const Pathname &root_r, const Pathname &path_r)
Return path_r prefixed with root_r, unless it is already prefixed.
Provide a new empty temporary directory and recursively delete it when no longer needed.
static TmpDir makeSibling(const Pathname &sibling_r)
Provide a new empty temporary directory as sibling.
Read repository data from a .repo file.
Read service data from a .service file.
Repository already exists and some unique attribute can't be duplicated.
Exception for repository handling.
std::string label() const
Label for use in messages for the user interface.
std::string escaped_alias() const
Same as alias(), just escaped in a way to be a valid file name.
void setFilepath(const Pathname &filename)
set the path to the .repo file
void setAlias(const std::string &alias)
set the repository alias
Pathname filepath() const
File where this repo was read from.
bool enabled() const
If enabled is false, then this repository must be ignored as if does not exists, except when checking...
std::string alias() const
unique identifier for this source.
Thrown when the repo alias is found to be invalid.
thrown when it was impossible to determine an alias for this repo.
thrown when it was impossible to determine one url for this repo.
The repository cache is not built yet so you can't create the repostories from the cache.
thrown when it was impossible to match a repository
thrown when it was impossible to determine this repo type.
Service already exists and some unique attribute can't be duplicated.
Base Exception for service handling.
Thrown when the repo alias is found to be invalid.
Service without alias was used in an operation.
Service has no or invalid url defined.
Service plugin is immutable.
Retrieval of repository list for a service.
Downloader for YUM (rpm-nmd) repositories Encapsulates all the knowledge of which files have to be do...
RepoStatus status(MediaSetAccess &media_r) override
Status of the remote repository.
Lightweight repository attribute value lookup.
void reposErase(const std::string &alias_r)
Remove a Repository named alias_r.
Repository addRepoSolv(const Pathname &file_r, const std::string &name_r)
Load Solvables from a solv-file into a Repository named name_r.
static Pool instance()
Singleton ctor.
static const SolvAttr repositoryToolVersion
xmlTextReader based interface to iterate xml streams.
Repository metadata verification beyond GPG.
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
std::string asString(TInt val, char zero='0', char one='1')
For printing bits.
bool ZYPP_PLUGIN_APPDATA_FORCE_COLLECT()
To trigger appdata refresh unconditionally.
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
int unlink(const Pathname &path)
Like 'unlink'.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
int touch(const Pathname &path)
Change file's modification and access times.
int exchange(const Pathname &lpath, const Pathname &rpath)
Exchanges two files or directories.
int dirForEachExt(const Pathname &dir_r, const function< bool(const Pathname &, const DirEntry &)> &fnc_r)
Simiar to.
void updateSolvFileIndex(const Pathname &solvfile_r)
Create solv file content digest for zypper bash completion.
std::string & replaceAll(std::string &str_r, const std::string &from_r, const std::string &to_r)
Replace all occurrences of from_r with to_r in str_r (inplace).
std::string numstring(char n, int w=0)
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
\relates regex \ingroup ZYPP_STR_REGEX \relates regex \ingroup ZYPP_STR_REGEX
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
std::string hexstring(char n, int w=4)
int compareCI(const C_Str &lhs, const C_Str &rhs)
Easy-to use interface to the ZYPP dependency resolver.
std::list< RepoInfo > readRepoFile(const Url &repo_file)
Parses repo_file and returns a list of RepoInfo objects corresponding to repositories found within th...
AutoDispose< const Pathname > ManagedFile
A Pathname plus associated cleanup code to be executed when path is no longer needed.
bool any_of(const Container &c, Fnc &&cb)
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
static bool warning(const std::string &msg_r, const UserData &userData_r=UserData())
send warning text
static bool error(const std::string &msg_r, const UserData &userData_r=UserData())
send error text
static RepoManagerOptions makeTestSetup(const Pathname &root_r)
Test setup adjusting all paths to be located below one root_r directory.
Pathname repoSolvCachePath
Pathname rootDir
remembers root_r value for later use
Pathname knownServicesPath
Pathname repoRawCachePath
Pathname repoPackagesCachePath
RepoManagerOptions(const Pathname &root_r=Pathname())
Default ctor following ZConfig global settings.
Functor thats filter RepoInfo by service which it belongs to.
creates and provides information about known sources.
bool hasRepo(const std::string &alias) const
ServiceSet::const_iterator ServiceConstIterator
bool serviceEmpty() const
bool hasService(const std::string &alias) const
RefreshCheckStatus
Possibly return state of checkIfRefreshMEtadata function.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
Impl * clone() const
clone for RWCOW_pointer
void refreshService(const ServiceInfo &service, const RefreshServiceOptions &options_r)
void addRepository(const RepoInfo &info, OPT_PROGRESS)
RepoSet::const_iterator RepoConstIterator
RepoInfo getRepositoryInfo(const Url &url, const url::ViewOption &urlview, OPT_PROGRESS)
void addService(const std::string &alias, const Url &url)
std::string generateFilename(const ServiceInfo &info) const
bool isCached(const RepoInfo &info) const
void cleanPackages(const RepoInfo &info, OPT_PROGRESS, bool isAutoClean=false)
void modifyRepository(const std::string &alias, const RepoInfo &newinfo_r, OPT_PROGRESS)
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
void removeService(const std::string &alias)
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r)
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
RepoManager(const RepoManagerOptions &options=RepoManagerOptions())
RepoInfo getRepo(const std::string &alias) const
repo::ServiceType probeService(const Url &url) const
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
RepoInfo getRepositoryInfo(const std::string &alias, OPT_PROGRESS)
void cleanCacheDirGarbage(OPT_PROGRESS)
void addService(const ServiceInfo &service)
void init_knownRepositories()
Pathname metadataPath(const RepoInfo &info) const
ServiceSet::size_type ServiceSizeType
std::set< RepoInfo > RepoSet
RepoInfo typedefs.
Pathname packagesPath(const RepoInfo &info) const
DefaultIntegral< bool, false > _reposDirty
RepoManagerOptions _options
RepoStatus cacheStatus(const RepoInfo &info) const
void touchIndexFile(const RepoInfo &info)
repo::RepoType probeCache(const Pathname &path_r) const
void refreshGeoIp(const RepoInfo::url_set &urls)
void modifyService(const std::string &oldAlias, const ServiceInfo &newService)
ServiceConstIterator serviceEnd() const
ServiceConstIterator serviceBegin() const
void cleanCache(const RepoInfo &info, OPT_PROGRESS)
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
void removeRepository(const RepoInfo &info, OPT_PROGRESS)
RepoSizeType repoSize() const
void removeService(const ServiceInfo &service)
ServiceSizeType serviceSize() const
RepoSet::size_type RepoSizeType
void saveService(ServiceInfo &service) const
void addRepositories(const Url &url, OPT_PROGRESS)
void cleanMetadata(const RepoInfo &info, OPT_PROGRESS)
ServiceInfo getService(const std::string &alias) const
Pathname generateNonExistingName(const Pathname &dir, const std::string &basefilename) const
void refreshServices(const RefreshServiceOptions &options_r)
RepoConstIterator repoBegin() const
const RepoSet & repos() const
Iterate the known repositories.
void init_knownServices()
Impl(const RepoManagerOptions &opt)
RefreshServiceFlags RefreshServiceOptions
Options tuning RefreshService.
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
std::set< ServiceInfo > ServiceSet
ServiceInfo typedefs.
RepoConstIterator repoEnd() const
void setCacheStatus(const RepoInfo &info, const RepoStatus &status)
RepoStatus metadataStatus(const RepoInfo &info) const
static std::string makeStupidAlias(const Url &url_r=Url())
Some stupid string but suitable as alias for your url if nothing better is available.
std::string generateFilename(const RepoInfo &info) const
PluginRepoverification _pluginRepoverification
void refreshGeoIPData(const RepoInfo::url_set &urls)
Listentry returned by readdir.
Repository type enumeration.
static const RepoType YAST2
static const RepoType RPMMD
static const RepoType NONE
static const RepoType RPMPLAINDIR
Service type enumeration.
static const ServiceType NONE
No service set.
static const ServiceType RIS
Repository Index Service (RIS) (formerly known as 'Novell Update' (NU) service)
static const ServiceType PLUGIN
Plugin services are scripts installed on your system that provide the package manager with repositori...
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Url::asString() view options.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
#define PL_(MSG1, MSG2, N)