21#include <zypp-core/base/InputStream>
22#include <zypp-core/Digest.h>
23#include <zypp/base/LogTools.h>
24#include <zypp/base/Gettext.h>
25#include <zypp-core/base/DefaultIntegral>
26#include <zypp/base/Function.h>
27#include <zypp/base/Regex.h>
28#include <zypp/PathInfo.h>
29#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>
61#include <zypp-core/zyppng/pipelines/Lift>
71#define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc()
82 const char * env =
getenv(
"ZYPP_PLUGIN_APPDATA_FORCE_COLLECT");
97 MediaMounter(
const Url &
url_r )
104 MediaMounter(
const MediaMounter &) =
delete;
105 MediaMounter(MediaMounter &&) =
delete;
106 MediaMounter &operator=(
const MediaMounter &) =
delete;
107 MediaMounter &operator=(MediaMounter &&) =
delete;
121 Pathname getPathName(
const Pathname &
path_r = Pathname() )
const
155 _pluginRepoverification(_options.pluginsPath /
"repoverification",
157 init_knownServices();
158 init_knownRepositories();
169 if ( ( _reposDirty || env::ZYPP_PLUGIN_APPDATA_FORCE_COLLECT() )
170 &&
geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
173 std::list<Pathname> entries;
174 filesystem::readdir( entries, _options.pluginsPath/
"appdata",
false );
175 if ( ! entries.empty() )
178 cmd.push_back(
"<" );
179 cmd.push_back(
">" );
180 cmd.push_back(
"PROGRAM" );
181 for (
const auto &
rinfo : repos() )
183 if ( !
rinfo.enabled() )
185 cmd.push_back(
"-R" );
187 cmd.push_back(
"-t" );
188 cmd.push_back(
rinfo.type().asString() );
189 cmd.push_back(
"-p" );
190 cmd.push_back( (
rinfo.metadataPath()/
rinfo.path()).asString() );
193 for_(
it, entries.begin(), entries.end() )
197 if (
pi.isFile() &&
pi.userMayRX() )
200 cmd[2] =
pi.asString();
211 RefreshCheckStatus checkIfToRefreshMetadata(
const RepoInfo & info,
const Url & url, RawMetadataRefreshPolicy policy );
245 {
return new Impl( *
this ); }
251 {
return str <<
"RepoManager::Impl"; }
255 using namespace zyppng::operators;
256 using zyppng::operators::operator|;
258 refreshGeoIPData( { url } );
260 auto ctx = zyppng::SyncContext::create();
278 using namespace zyppng::operators;
279 using zyppng::operators::operator|;
282 refreshGeoIPData( info.
baseUrls() );
289 "Valid metadata not found at specified URLs",
293 auto ctx = SyncContext::create();
298 for_(
it, repoBegin(), repoEnd() )
300 if ( info.
alias() == (*it).alias() )
334 ERR <<
"Trying another url..." << endl;
345 ERR <<
"No more urls..." << endl;
372 if ( isCached( info ) )
374 MIL << info.
alias() <<
" is already cached." << endl;
379 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
380 if ( policy == BuildIfNeeded )
384 if ( !
PathInfo(base/
"solv.idx").isExist() )
390 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
400 progress.name(
str::form(
_(
"Building repository '%s' cache"), info.
label().c_str()));
408 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
452 cmd.push_back(
PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
454 cmd.push_back(
"-o" );
456 cmd.push_back(
"-X" );
463 cmd.push_back(
"-R" );
497 MIL <<
"Commit cache.." << endl;
510 repo::RepoType RepoManager::Impl::probe(
const Url & url,
const Pathname & path )
const
513 using namespace zyppng::operators;
514 using zyppng::operators::operator|;
516 auto ctx = zyppng::SyncContext::create();
518 |
and_then( [&](
auto mediaHandle ) {
539 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
556 progress.name(
str::form(
_(
"Adding repository '%s'"), info.
label().c_str()));
559 MIL <<
"Try adding repo " << info << endl;
562 if ( repos().find(
tosave) != repos().end() )
566 if ( _options.probe )
568 DBG <<
"unknown repository type, probing" << endl;
583 MIL <<
"done" << endl;
590 for ( std::list<RepoInfo>::const_iterator
it = repos.begin();
595 for_ (
kit, repoBegin(), repoEnd() )
597 if ( (*it).alias() == (*kit).alias() )
599 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
605 std::string filename = Pathname(url.getPathName()).basename();
607 if ( filename == Pathname() )
616 Pathname
repofile = generateNonExistingName(_options.knownReposPath, filename);
618 MIL <<
"Saving " << repos.size() <<
" repo" << ( repos.size() ?
"s" :
"" ) <<
" in " <<
repofile << endl;
620 std::ofstream file(
repofile.c_str());
627 for ( std::list<RepoInfo>::iterator
it = repos.begin();
631 MIL <<
"Saving " << (*it).alias() << endl;
632 it->dumpAsIniOn(file);
636 reposManip().insert(*
it);
641 MIL <<
"done" << endl;
648 removeRepositoryImpl( info, std::ref(
adapt) );
657 void RepoManager::Impl::refreshServices(
const RefreshServiceOptions &
options_r )
661 ServiceSet services( serviceBegin(), serviceEnd() );
662 for_(
it, services.begin(), services.end() )
664 if ( !
it->enabled() )
675 void RepoManager::Impl::refreshService(
const std::string & alias,
const RefreshServiceOptions &
options_r )
680 MIL <<
"Going to refresh service '" << service.alias() <<
"', url: " << service.url() <<
", opts: " <<
options_r << endl;
682 if ( service.ttl() && !(
options_r.testFlag( RefreshService_forceRefresh) ||
options_r.testFlag( RefreshService_restoreStatus ) ) )
685 Date lrf = service.lrf();
691 if ( (lrf+=service.ttl()) > now )
693 MIL <<
"Skip: '" << service.alias() <<
"' metadata valid until " << lrf << endl;
698 WAR <<
"Force: '" << service.alias() <<
"' metadata last refresh in the future: " << lrf << endl;
715 service.setProbedType( type );
721 std::string servicesTargetDistro = _options.servicesTargetDistro;
722 if ( servicesTargetDistro.empty() )
726 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
751 if ( service.ttl() !=
origTtl )
753 if ( !service.ttl() )
754 service.setLrf( Date() );
763 for_(
it, collector.repos.begin(), collector.repos.end() )
766 it->setAlias(
str::form(
"%s:%s", service.alias().c_str(),
it->alias().c_str() ) );
768 it->setService( service.alias() );
779 if ( !
it->path().empty() )
781 if (
it->path() !=
"/" )
786 if (
it->baseUrlsEmpty() )
788 Url url( service.rawUrl() );
790 url.setPathName( url.getPathName() / path );
791 it->setBaseUrl( std::move(url) );
793 else if ( !path.empty() )
796 for ( Url & url : urls )
798 url.setPathName( url.getPathName() / path );
800 it->setBaseUrls( std::move(urls) );
808 getRepositoriesInService( service.alias(), std::back_inserter(
oldRepos ) );
819 const auto & last = service.repoStates().find(
oldRepo->alias() );
820 if ( last != service.repoStates().end() && ! last->second.enabled )
822 DBG <<
"Service removes user enabled repo " <<
oldRepo->alias() << endl;
823 service.addRepoToEnable(
oldRepo->alias() );
827 DBG <<
"Service removes enabled repo " <<
oldRepo->alias() << endl;
830 DBG <<
"Service removes disabled repo " <<
oldRepo->alias() << endl;
839 for_(
it, collector.repos.begin(), collector.repos.end() )
846 DBG <<
"Service request to " << (
it->enabled()?
"enable":
"disable") <<
" service repo " <<
it->alias() << endl;
848 if (
options_r.testFlag( RefreshService_restoreStatus ) )
850 DBG <<
"Opt RefreshService_restoreStatus " <<
it->alias() << endl;
855 service.delRepoToEnable(
it->alias() );
860 if ( service.repoToEnableFind(
it->alias() ) )
862 DBG <<
"User request to enable service repo " <<
it->alias() << endl;
867 service.delRepoToEnable(
it->alias() );
870 else if ( service.repoToDisableFind(
it->alias() ) )
872 DBG <<
"User request to disable service repo " <<
it->alias() << endl;
886 DBG <<
"Service adds repo " <<
it->alias() <<
" " << (
it->enabled()?
"enabled":
"disabled") << endl;
887 addRepository( *
it );
898 if (
oldRepo->enabled() ==
it->enabled() )
900 else if (
options_r.testFlag( RefreshService_restoreStatus ) )
903 DBG <<
"Opt RefreshService_restoreStatus " <<
it->alias() <<
" forces " << (
toBeEnabled?
"enabled":
"disabled") << endl;
907 const auto & last = service.repoStates().find(
oldRepo->alias() );
908 if ( last == service.repoStates().end() || last->second.enabled !=
it->enabled() )
913 DBG <<
"User modified service repo " <<
it->alias() <<
" may stay " << (
toBeEnabled?
"enabled":
"disabled") << endl;
921 DBG <<
"Service repo " <<
it->alias() <<
" stays " << (
oldRepo->enabled()?
"enabled":
"disabled") << endl;
925 DBG <<
"Service repo " <<
it->alias() <<
" gets enabled" << endl;
931 DBG <<
"Service repo " <<
it->alias() <<
" gets disabled" << endl;
939 if (
oldRepo->rawName() !=
it->rawName() )
941 DBG <<
"Service repo " <<
it->alias() <<
" gets new NAME " <<
it->rawName() << endl;
947 if (
oldRepo->autorefresh() !=
it->autorefresh() )
949 DBG <<
"Service repo " <<
it->alias() <<
" gets new AUTOREFRESH " <<
it->autorefresh() << endl;
950 oldRepo->setAutorefresh(
it->autorefresh() );
955 if (
oldRepo->priority() !=
it->priority() )
957 DBG <<
"Service repo " <<
it->alias() <<
" gets new PRIORITY " <<
it->priority() << endl;
968 DBG <<
"Service repo " <<
it->alias() <<
" gets new URLs " <<
newUrls << endl;
982#define Z_CHKGPG(I,N) \
983 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
985 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
986 oldRepo->set##N##Check( ngpg[I] ); \
987 oldRepoModified = true; \
1004 if ( ! service.reposToDisableEmpty() )
1006 service.clearReposToDisable();
1021 if ( service.ttl() )
1030 modifyService( service.alias(), service );
1047 if (
access.doesFileExist(
"/repo/repoindex.xml") )
1075 MIL <<
"GeoIp disabled via ZConfig, not refreshing the GeoIP information." << std::endl;
1079 std::vector<std::string>
hosts;
1080 for (
const auto &baseUrl : urls ) {
1081 const auto &host = baseUrl.getHost();
1083 hosts.push_back( host );
1088 if (
hosts.empty() ) {
1089 MIL <<
"No configured geoip URL found, not updating geoip data" << std::endl;
1096 MIL <<
"Unable to create cache directory for GeoIP." << std::endl;
1101 MIL <<
"No access rights for the GeoIP cache directory." << std::endl;
1111 auto age = std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t(
pi.mtime() );
1112 if (
age < std::chrono::hours(24) )
1115 MIL <<
"Removing GeoIP file for " <<
entry.name <<
" since it's older than 24hrs." << std::endl;
1121 std::for_each(
hosts.begin(),
hosts.end(), [ & ](
const std::string &hostname ) {
1124 if ( zypp::PathInfo( geoIPCache / hostname ).isExist() ) {
1125 MIL <<
"Skipping GeoIP request for " << hostname <<
" since a valid cache entry exists." << std::endl;
1129 MIL <<
"Query GeoIP for " << hostname << std::endl;
1140 MIL <<
"Ignoring invalid GeoIP hostname: " << hostname << std::endl;
1152 MIL <<
"Failed to query GeoIP from hostname: " << hostname << std::endl;
1155 if ( !file->
empty() ) {
1159 out.open(
fName.asString(), std::ios_base::trunc );
1160 if ( out.is_open() ) {
1161 out << host << std::endl;
1163 MIL <<
"Failed to create/open GeoIP cache file " <<
fName << std::endl;
1170 if (
reader.seekToNode( 1,
"host" ) ) {
1171 const auto &
str =
reader.nodeText().asString();
1179 MIL <<
"Storing geoIP redirection: " << hostname <<
" -> " <<
str << std::endl;
1184 MIL <<
"No host entry or empty file returned for GeoIP, remembering for 24hrs" << std::endl;
1188 MIL <<
"Empty or invalid GeoIP file, not requesting again for 24hrs" << std::endl;
1197 MIL <<
"Failed to query GeoIP data." << std::endl;
1215 {
return _pimpl->repoEmpty(); }
1218 {
return _pimpl->repoSize(); }
1221 {
return _pimpl->repoBegin(); }
1224 {
return _pimpl->repoEnd(); }
1227 {
return _pimpl->getRepo( alias ); }
1230 {
return _pimpl->hasRepo( alias ); }
1234 std::string
ret(
url_r.getScheme() );
1240 std::string host(
url_r.getHost() );
1241 if ( ! host.empty() )
1253 {
return _pimpl->metadataStatus( info ); }
1256 {
return _pimpl->checkIfToRefreshMetadata( info, url, policy ); }
1259 {
return _pimpl->metadataPath( info ); }
1262 {
return _pimpl->packagesPath( info ); }
1274 {
return _pimpl->cacheStatus( info ); }
1283 {
return _pimpl->isCached( info ); }
1292 {
return _pimpl->probe( url, path ); }
1295 {
return _pimpl->probe( url ); }
1310 {
return _pimpl->getRepositoryInfo( alias ); }
1316 {
return _pimpl->serviceEmpty(); }
1319 {
return _pimpl->serviceSize(); }
1322 {
return _pimpl->serviceBegin(); }
1325 {
return _pimpl->serviceEnd(); }
1328 {
return _pimpl->getService( alias ); }
1331 {
return _pimpl->hasService( alias ); }
1334 {
return _pimpl->probeService( url ); }
1337 {
return _pimpl->addService( alias, url ); }
1340 {
return _pimpl->addService( service ); }
1343 {
return _pimpl->removeService( alias ); }
1346 {
return _pimpl->removeService( service ); }
1358 {
return _pimpl->modifyService( oldAlias, service ); }
1361 {
return _pimpl->refreshGeoIPData( urls ); }
media::MediaAccessId _mid
RepoManager implementation.
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
Stream output.
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
void resetDispose()
Set no dispose function.
void reset()
Reset to default Ctor values.
shared_ptr< Impl > _pimpl
static Date now()
Return the current time.
std::string digest()
get hex string representation of the digest
static const std::string & sha1()
sha1
Base class for Exception.
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 addRepository(const RepoInfo &repo)
Log a newly added repository.
Maintain [min,max] and counter (value) for progress counting.
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
What is known about a repository.
transform_iterator< repo::RepoVariablesUrlReplacer, url_set::const_iterator > urls_const_iterator
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
Pathname path() const
Repository path.
url_set baseUrls() const
The complete set of repository urls.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
Track changing files or directories.
std::map< std::string, RepoState > RepoStates
std::string targetDistribution() const
This is register.target attribute of the installed base product.
void setHost(const std::string &host)
Set the hostname or IP in the URL authority.
void setScheme(const std::string &scheme)
Set the scheme name in the URL.
static ZConfig & instance()
Singleton ctor.
Wrapper class for stat/lstat.
bool empty() const
Test for an empty path.
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 alias() const
unique identifier for this source.
thrown when it was impossible to determine this repo type.
Retrieval of repository list for a service.
static Pool instance()
Singleton ctor.
xmlTextReader based interface to iterate xml streams.
Repository metadata verification beyond GPG.
static expected< repo::RefreshContextRef< ZyppContextRefType > > create(ZyppContextRefType zyppContext, zypp::RepoInfo info, zypp::RepoManagerOptions opts)
SignalProxy< void(zypp::repo::RepoType)> sigProbedTypeChanged()
String related utilities and Regular expression matching.
bool ZYPP_PLUGIN_APPDATA_FORCE_COLLECT()
To trigger appdata refresh unconditionally.
int unlink(const Pathname &path)
Like 'unlink'.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
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 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.
Pathname rawcache_path_for_repoinfo(const RepoManagerOptions &opt, const RepoInfo &info)
Calculates the raw cache path for a repository, this is usually /var/cache/zypp/alias.
bool isTmpRepo(const RepoInfo &info_r)
Whether repo is not under RM control and provides its own methadata paths.
std::list< RepoInfo > readRepoFile(const Url &repo_file)
Parses repo_file and returns a list of RepoInfo objects corresponding to repositories found within th...
void assert_alias(const RepoInfo &info)
Pathname solv_path_for_repoinfo(const RepoManagerOptions &opt, const RepoInfo &info)
Calculates the solv cache path for a repository.
std::list< RepoInfo > repositories_in_file(const Pathname &file)
Reads RepoInfo's from a repo file.
Pathname packagescache_path_for_repoinfo(const RepoManagerOptions &opt, const RepoInfo &info)
Calculates the packages cache path for a repository.
AutoDispose< const Pathname > ManagedFile
A Pathname plus associated cleanup code to be executed when path is no longer needed.
Pathname rawproductdata_path_for_repoinfo(const RepoManagerOptions &opt, const RepoInfo &info)
Calculates the raw product metadata path for a repository, this is inside the raw cache dir,...
bool any_of(const Container &c, Fnc &&cb)
void assert_url(const ServiceInfo &info)
void assert_urls(const RepoInfo &info)
bool foundAliasIn(const std::string &alias_r, Iterator begin_r, Iterator end_r)
Check if alias_r is present in repo/service container.
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
Iterator findAlias(const std::string &alias_r, Iterator begin_r, Iterator end_r)
Find alias_r in repo/service container.
AsyncOpRef< expected< zypp::repo::RepoType > > probeRepoType(ContextRef ctx, ProvideMediaHandle medium, zypp::Pathname path, std::optional< zypp::Pathname > targetPath={})
AsyncOpRef< expected< repo::AsyncRefreshContextRef > > buildCache(repo::AsyncRefreshContextRef refCtx, ProgressObserverRef progressObserver=nullptr)
AsyncOpRef< expected< repo::AsyncRefreshContextRef > > refreshMetadata(repo::AsyncRefreshContextRef refCtx, ProvideMediaHandle medium, ProgressObserverRef progressObserver)
AsyncOpRef< expected< repo::RefreshCheckStatus > > checkIfToRefreshMetadata(repo::AsyncRefreshContextRef refCtx, ProvideMediaHandle medium, ProgressObserverRef progressObserver=nullptr)
Simple callback to collect the results.
bool collect(const RepoInfo &repo)
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
void addProbedRepository(const RepoInfo &info, repo::RepoType probedType)
creates and provides information about known sources.
bool hasRepo(const std::string &alias) const
Return whether there is a known repository for alias.
void cleanCacheDirGarbage(const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove any subdirectories of cache directories which no longer belong to any of known repositories.
void cleanMetadata(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local metadata.
bool serviceEmpty() const
Gets true if no service is in RepoManager (so no one in specified location)
bool hasService(const std::string &alias) const
Return whether there is a known service for alias.
RefreshCheckStatus
Possibly return state of checkIfRefreshMEtadata function.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
Impl * clone() const
clone for RWCOW_pointer
ServiceSet::const_iterator ServiceConstIterator
void refreshService(const ServiceInfo &service, const RefreshServiceOptions &options_r)
void addRepository(const RepoInfo &info, OPT_PROGRESS)
void addService(const std::string &alias, const Url &url)
Adds a new service by its alias and URL.
Impl & operator=(Impl &&)=delete
bool isCached(const RepoInfo &info) const
Whether a repository exists in cache.
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
void removeService(const std::string &alias)
Removes service specified by its name.
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r)
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
RepoInfo getRepo(const std::string &alias) const
Find RepoInfo by alias or return RepoInfo::noRepo.
repo::ServiceType probeService(const Url &url) const
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
Impl & operator=(const Impl &)=delete
void cleanCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
clean local cache
RefreshServiceFlags RefreshServiceOptions
Options tuning RefreshService.
Pathname metadataPath(const RepoInfo &info) const
Path where the metadata is downloaded and kept.
zypp_private::repo::PluginRepoverification _pluginRepoverification
ServiceSet::size_type ServiceSizeType
Pathname packagesPath(const RepoInfo &info) const
Path where the rpm packages are downloaded and kept.
RepoStatus cacheStatus(const RepoInfo &info) const
Status of metadata cache.
void removeRepository(const RepoInfo &info, OPT_PROGRESS) override
void refreshGeoIp(const RepoInfo::url_set &urls)
ServiceConstIterator serviceEnd() const
Iterator to place behind last service in internal storage.
ServiceConstIterator serviceBegin() const
Iterator to first service in internal storage.
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
RepoSizeType repoSize() const
void modifyRepository(const std::string &alias, const RepoInfo &newinfo, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Modify repository attributes.
RepoInfo getRepositoryInfo(const std::string &alias, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Find a matching repository info.
ServiceSizeType serviceSize() const
Gets count of service in RepoManager (in specified location)
void addRepositories(const Url &url, OPT_PROGRESS)
ServiceInfo getService(const std::string &alias) const
Finds ServiceInfo by alias or return ServiceInfo::noService.
RepoSet::size_type RepoSizeType
void refreshServices(const RefreshServiceOptions &options_r)
Impl(const Impl &)=default
RepoConstIterator repoBegin() const
void cleanPackages(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local package cache.
RepoConstIterator repoEnd() const
RepoStatus metadataStatus(const RepoInfo &info) const
Status of local metadata.
void modifyService(const std::string &oldAlias, const ServiceInfo &service)
Modifies service file (rewrites it with new values) and underlying repositories if needed.
RepoSet::const_iterator RepoConstIterator
static std::string makeStupidAlias(const Url &url_r=Url())
Some stupid string but suitable as alias for your url if nothing better is available.
Impl(RepoManagerOptions &&opt)
void refreshGeoIPData(const RepoInfo::url_set &urls)
Listentry returned by readdir.
Repository type enumeration.
static const RepoType NONE
static const RepoType RPMPLAINDIR
Functor replacing repository variables.
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)