21#include <zypp-core/base/InputStream>
25#include <zypp-core/base/DefaultIntegral>
38#include <zypp-media/auth/CredentialManager>
39#include <zypp-media/MediaException>
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 )
101 mediamanager.
attach( _mid );
104 MediaMounter(
const MediaMounter &) =
delete;
105 MediaMounter(MediaMounter &&) =
delete;
106 MediaMounter &
operator=(
const MediaMounter &) =
delete;
107 MediaMounter &
operator=(MediaMounter &&) =
delete;
114 mediamanager.
close( _mid );
121 Pathname getPathName(
const Pathname & path_r = Pathname() )
const
124 return mediamanager.
localPath( _mid, path_r );
137 Url repoFileUrl { replaceVars(repo_file) };
140 DBG <<
"reading repo file " << repoFileUrl <<
", local path: " << local << endl;
148#define OUTS(V) case RepoManager::V: str << #V; break
149 OUTS( RefreshIfNeeded );
150 OUTS( RefreshForced );
151 OUTS( RefreshIfNeededIgnoreDelay );
160#define OUTS(V) case RepoManager::V: str << #V; break
161 OUTS( REFRESH_NEEDED );
162 OUTS( REPO_UP_TO_DATE );
163 OUTS( REPO_CHECK_DELAYED );
172#define OUTS(V) case RepoManager::V: str << #V; break
173 OUTS( BuildIfNeeded );
190 _pluginRepoverification(_options.pluginsPath /
"repoverification",
192 init_knownServices();
193 init_knownRepositories();
205 && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
208 std::list<Pathname> entries;
209 filesystem::readdir( entries, _options.pluginsPath/
"appdata",
false );
210 if ( ! entries.empty() )
213 cmd.push_back(
"<" );
214 cmd.push_back(
">" );
215 cmd.push_back(
"PROGRAM" );
216 for (
const auto & rinfo : repos() )
218 if ( ! rinfo.enabled() )
220 cmd.push_back(
"-R" );
221 cmd.push_back( rinfo.alias() );
222 cmd.push_back(
"-t" );
223 cmd.push_back( rinfo.type().asString() );
224 cmd.push_back(
"-p" );
225 cmd.push_back( (rinfo.metadataPath()/rinfo.path()).asString() );
228 for_( it, entries.begin(), entries.end() )
267 { refreshService( service.
alias(), options_r ); }
277 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
280 {
return new Impl( *
this ); }
286 {
return str <<
"RepoManager::Impl"; }
296 using zyppng::operators::operator|;
300 auto ctx = zyppng::SyncContext::create();
302 | and_then( [&]( zyppng::repo::SyncRefreshContextRef &&refCtx ) {
319 using zyppng::operators::operator|;
322 refreshGeoIPData( info.
baseUrls() );
328 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
329 "Valid metadata not found at specified URLs",
333 auto ctx = SyncContext::create();
340 if ( info.
alias() == (*it).alias() )
343 modifiedrepo.
setType( repokind );
362 | and_then( [&]( zyppng::repo::SyncRefreshContextRef refCtx ) {
380 ERR <<
"Trying another url..." << endl;
391 ERR <<
"No more urls..." << endl;
408 if ( raw_metadata_status.
empty() )
417 bool needs_cleaning =
false;
420 MIL << info.
alias() <<
" is already cached." << endl;
423 if ( cache_status == raw_metadata_status )
425 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
430 if ( !
PathInfo(base/
"solv.idx").isExist() )
436 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
440 needs_cleaning =
true;
454 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
475 switch ( repokind.
toEnum() )
479 repokind = probeCache( productdatapath );
485 MIL <<
"repo type is " << repokind << endl;
487 switch ( repokind.
toEnum() )
495 scoped_ptr<MediaMounter> forPlainDirs;
498 cmd.push_back(
PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
500 cmd.push_back(
"-o" );
501 cmd.push_back( solvfile.
asString() );
502 cmd.push_back(
"-X" );
507 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
509 cmd.push_back(
"-R" );
511 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
514 cmd.push_back( productdatapath.
asString() );
517 std::string errdetail;
520 WAR <<
" " << output;
524 int ret = prog.
close();
542 setCacheStatus(info, raw_metadata_status);
543 MIL <<
"Commit cache.." << endl;
560 using zyppng::operators::operator|;
562 auto ctx = zyppng::SyncContext::create();
564 | and_then( [&](
auto mediaHandle ) {
585 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
605 MIL <<
"Try adding repo " << info << endl;
612 if ( _options.probe )
614 DBG <<
"unknown repository type, probing" << endl;
629 MIL <<
"done" << endl;
636 for ( std::list<RepoInfo>::const_iterator it =
repos.begin();
643 if ( (*it).alias() == (*kit).alias() )
645 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
662 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
664 MIL <<
"Saving " <<
repos.size() <<
" repo" << (
repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
666 std::ofstream file(repofile.
c_str());
673 for ( std::list<RepoInfo>::iterator it =
repos.begin();
677 MIL <<
"Saving " << (*it).alias() << endl;
678 it->dumpAsIniOn(file);
679 it->setFilepath(repofile);
682 reposManip().insert(*it);
687 MIL <<
"done" << endl;
694 removeRepositoryImpl( info, std::ref(adapt) );
710 if ( !it->enabled() )
726 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
737 if ( (lrf+=service.
ttl()) > now )
739 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
744 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
751 bool serviceModified =
false;
756 if ( service.
type() == repo::ServiceType::NONE )
759 if ( type != ServiceType::NONE )
762 serviceModified =
true;
767 std::string servicesTargetDistro = _options.servicesTargetDistro;
768 if ( servicesTargetDistro.empty() )
772 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
794 uglyHack.first =
true;
797 if ( service.
ttl() != origTtl )
799 if ( !service.
ttl() )
801 serviceModified =
true;
812 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
814 it->setService( service.
alias() );
817 newRepoStates[it->alias()] = *it;
825 if ( !it->path().empty() )
827 if ( it->path() !=
"/" )
832 if ( it->baseUrlsEmpty() )
837 it->setBaseUrl( std::move(url) );
839 else if ( !path.
empty() )
842 for (
Url & url : urls )
844 url.setPathName( url.getPathName() / path );
846 it->setBaseUrls( std::move(urls) );
853 RepoInfoList oldRepos;
858 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
862 if ( oldRepo->enabled() )
865 const auto & last = service.
repoStates().find( oldRepo->alias() );
866 if ( last != service.
repoStates().end() && ! last->second.enabled )
868 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
870 serviceModified =
true;
873 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
876 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
891 TriBool toBeEnabled( indeterminate );
892 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
896 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
908 DBG <<
"User request to enable service repo " << it->alias() << endl;
914 serviceModified =
true;
918 DBG <<
"User request to disable service repo " << it->alias() << endl;
923 RepoInfoList::iterator oldRepo(
findAlias( it->alias(), oldRepos ) );
924 if ( oldRepo == oldRepos.end() )
929 if ( ! indeterminate(toBeEnabled) )
930 it->setEnabled( (
bool ) toBeEnabled );
932 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
938 bool oldRepoModified =
false;
940 if ( indeterminate(toBeEnabled) )
944 if ( oldRepo->enabled() == it->enabled() )
945 toBeEnabled = it->enabled();
948 toBeEnabled = it->enabled();
949 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
953 const auto & last = service.
repoStates().find( oldRepo->alias() );
954 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
955 toBeEnabled = it->enabled();
958 toBeEnabled = oldRepo->enabled();
959 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
965 if ( toBeEnabled == oldRepo->enabled() )
967 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
969 else if ( toBeEnabled )
971 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
972 oldRepo->setEnabled(
true );
973 oldRepoModified =
true;
977 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
978 oldRepo->setEnabled(
false );
979 oldRepoModified =
true;
985 if ( oldRepo->rawName() != it->rawName() )
987 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
988 oldRepo->setName( it->rawName() );
989 oldRepoModified =
true;
993 if ( oldRepo->autorefresh() != it->autorefresh() )
995 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
996 oldRepo->setAutorefresh( it->autorefresh() );
997 oldRepoModified =
true;
1001 if ( oldRepo->priority() != it->priority() )
1003 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
1004 oldRepo->setPriority( it->priority() );
1005 oldRepoModified =
true;
1011 urlCredentialExtractor.
extract( newUrls );
1012 if ( oldRepo->rawBaseUrls() != newUrls )
1014 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
1015 oldRepo->setBaseUrls( std::move(newUrls) );
1016 oldRepoModified =
true;
1022 if ( service.
type() == ServiceType::PLUGIN )
1026 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
1027 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
1028#define Z_CHKGPG(I,N) \
1029 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
1031 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
1032 oldRepo->set##N##Check( ngpg[I] ); \
1033 oldRepoModified = true; \
1042 if ( oldRepoModified )
1053 serviceModified =
true;
1060 serviceModified =
true;
1065 if ( service.
type() != ServiceType::PLUGIN )
1067 if ( service.
ttl() )
1070 serviceModified =
true;
1073 if ( serviceModified )
1080 if ( uglyHack.first )
1082 throw( uglyHack.second );
1094 return repo::ServiceType::RIS;
1113 return repo::ServiceType::NONE;
1121 MIL <<
"GeoIp disabled via ZConfig, not refreshing the GeoIP information." << std::endl;
1125 std::vector<std::string> hosts;
1126 for (
const auto &baseUrl : urls ) {
1127 const auto &host = baseUrl.getHost();
1129 hosts.push_back( host );
1134 if ( hosts.empty() ) {
1135 MIL <<
"No configured geoip URL found, not updating geoip data" << std::endl;
1142 MIL <<
"Unable to create cache directory for GeoIP." << std::endl;
1146 if ( !
PathInfo(geoIPCache).userMayRWX() ) {
1147 MIL <<
"No access rights for the GeoIP cache directory." << std::endl;
1157 auto age = std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t( pi.
mtime() );
1158 if ( age < std::chrono::hours(24) )
1161 MIL <<
"Removing GeoIP file for " << entry.
name <<
" since it's older than 24hrs." << std::endl;
1167 std::for_each( hosts.begin(), hosts.end(), [ & ](
const std::string &hostname ) {
1170 if ( zypp::PathInfo( geoIPCache / hostname ).isExist() ) {
1171 MIL <<
"Skipping GeoIP request for " << hostname <<
" since a valid cache entry exists." << std::endl;
1175 MIL <<
"Query GeoIP for " << hostname << std::endl;
1186 MIL <<
"Ignoring invalid GeoIP hostname: " << hostname << std::endl;
1198 MIL <<
"Failed to query GeoIP from hostname: " << hostname << std::endl;
1201 if ( !file->
empty() ) {
1203 constexpr auto writeHostToFile = [](
const Pathname &fName,
const std::string &host ){
1205 out.open( fName.
asString(), std::ios_base::trunc );
1206 if ( out.is_open() ) {
1207 out << host << std::endl;
1209 MIL <<
"Failed to create/open GeoIP cache file " << fName << std::endl;
1213 std::string geoipMirror;
1225 MIL <<
"Storing geoIP redirection: " << hostname <<
" -> " <<
str << std::endl;
1230 MIL <<
"No host entry or empty file returned for GeoIP, remembering for 24hrs" << std::endl;
1234 MIL <<
"Empty or invalid GeoIP file, not requesting again for 24hrs" << std::endl;
1237 writeHostToFile( geoIPCache / hostname, geoipMirror );
1243 MIL <<
"Failed to query GeoIP data." << std::endl;
1254 : _pimpl( new
Impl(
std::move(opt)) )
1286 std::string host( url_r.
getHost() );
1287 if ( ! host.empty() )
media::MediaAccessId _mid
void resetDispose()
Set no dispose function.
Store and operate on date (time_t).
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.
std::string asUserString() const
Translated error message as string suitable for the user.
void addHistory(const std::string &msg_r)
Add some message text to the history.
void remember(const Exception &old_r)
Store an other Exception as history.
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
int close() override
Wait for the progamm to complete.
const std::string & command() const
The command we're executing.
std::vector< std::string > Arguments
const std::string & execError() const
Some detail telling why the execution failed, if it failed.
Writing the zypp history file.
void addRepository(const RepoInfo &repo)
Log a newly added repository.
Maintain [min,max] and counter (value) for progress counting.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
bool toMax()
Set counter value to current max value (unless no range).
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.
bool toMin()
Set counter value to current min value.
bool set(value_type val_r)
Set new counter value.
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
void setType(const repo::RepoType &t)
set the repository type
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.
@ REFRESH_NEEDED
refresh is needed
@ REPO_UP_TO_DATE
repository not changed
ServiceSet::const_iterator ServiceConstIterator
void addService(const std::string &alias, const Url &url)
Adds a new service by its alias and URL.
bool isCached(const RepoInfo &info) const
Whether a repository exists in cache.
void removeService(const std::string &alias)
Removes service specified by its name.
RepoInfo getRepo(const std::string &alias) const
Find RepoInfo by alias or return RepoInfo::noRepo.
repo::ServiceType probeService(const Url &url) const
Probe the type or the service.
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
void cleanCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
clean local cache
RefreshServiceFlags RefreshServiceOptions
Options tuning RefreshService.
void refreshServices(const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refreshes all enabled services.
void addRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds a repository to the list of known repositories.
Pathname metadataPath(const RepoInfo &info) const
Path where the metadata is downloaded and kept.
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 addRepositories(const Url &url, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds repositores from a repo file to the list of known repositories.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy=RefreshIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local raw cache.
void refreshGeoIp(const RepoInfo::url_set &urls)
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refresh specific service.
ServiceConstIterator serviceEnd() const
Iterator to place behind last service in internal storage.
@ RefreshService_forceRefresh
Force refresh even if TTL is not reached.
@ RefreshService_restoreStatus
Force restoring repo enabled/disabled status.
ServiceConstIterator serviceBegin() const
Iterator to first service in internal storage.
RepoSizeType repoSize() const
void modifyRepository(const std::string &alias, const RepoInfo &newinfo, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Modify repository attributes.
Iterable< ServiceConstIterator > services() const
Iterate the known services.
void removeRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove the best matching repository from known repos list.
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)
ServiceInfo getService(const std::string &alias) const
Finds ServiceInfo by alias or return ServiceInfo::noService.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy=RefreshIfNeeded)
Checks whether to refresh metadata for specified repository and url.
RepoSet::size_type RepoSizeType
RepoConstIterator repoBegin() const
Iterable< RepoConstIterator > repos() const
Iterate the known repositories.
void buildCache(const RepoInfo &info, CacheBuildPolicy policy=BuildIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local cache.
RepoManager(RepoManagerOptions options=RepoManagerOptions())
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
fill to output iterator repositories in service name.
void loadFromCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Load resolvables into the pool.
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.
repo::RepoType probe(const Url &url, const Pathname &path) const
Probe repo metadata type.
Track changing files or directories.
bool empty() const
Whether the status is empty (empty checksum)
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.
std::map< std::string, RepoState > RepoStates
Url url() const
The service url.
void setProbedType(const repo::ServiceType &t) const
Lazy init service type.
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.
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.
bool isValid() const
Verifies the Url.
void setScheme(const std::string &scheme)
Set the scheme name in the URL.
static bool schemeIsVolatile(const std::string &scheme_r)
cd dvd
Pathname geoipCachePath() const
Path where the geoip caches are kept (/var/cache/zypp/geoip)
static ZConfig & instance()
Singleton ctor.
std::string receiveLine()
Read one line from the input stream.
Wrapper class for stat/lstat.
const std::string & asString() const
Return current Pathname as String.
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.
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.
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.
xmlTextReader based interface to iterate xml streams.
XmlString nodeText()
If the current node is not empty, advances the reader to the next node, and returns the value.
bool seekToNode(int depth_r, const std::string &name_r)
std::string asString() const
Explicit conversion to std::string.
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.
Namespace intended to collect all environment variables we use.
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.
SolvableSpec & operator=(const SolvableSpec &)=default
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.
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
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 > > 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)
RepoInfo getRepositoryInfo(const std::string &alias)
RepoInfo getRepo(const std::string &alias) const
void cleanCache(const RepoInfo &info, OPT_PROGRESS)
void removeService(const std::string &alias)
ServiceConstIterator serviceEnd() const
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
RepoConstIterator repoEnd() const
bool hasService(const std::string &alias) const
void cleanPackages(const RepoInfo &info, OPT_PROGRESS, bool isAutoClean=false)
RepoStatus cacheStatus(const RepoInfo &info) const
bool hasRepo(const std::string &alias) const
std::set< ServiceInfo > ServiceSet
ServiceInfo typedefs.
void modifyRepository(const std::string &alias, const RepoInfo &newinfo_r, OPT_PROGRESS)
void cleanMetadata(const RepoInfo &info, OPT_PROGRESS)
Pathname packagesPath(const RepoInfo &info) const
void modifyService(const std::string &oldAlias, const ServiceInfo &newService)
RepoSizeType repoSize() const
static RepoStatus metadataStatus(const RepoInfo &info, const RepoManagerOptions &options)
RepoManagerOptions _options
ServiceInfo getService(const std::string &alias) const
RepoConstIterator repoBegin() const
void cleanCacheDirGarbage(OPT_PROGRESS)
bool isCached(const RepoInfo &info) const
ServiceSizeType serviceSize() const
void addService(const ServiceInfo &service)
bool serviceEmpty() const
void addProbedRepository(const RepoInfo &info, repo::RepoType probedType)
ServiceConstIterator serviceBegin() const
Pathname metadataPath(const RepoInfo &info) const
RepoManager implementation.
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r)
Impl & operator=(const Impl &)=delete
repo::ServiceType probeService(const Url &url) const
void refreshServices(const RefreshServiceOptions &options_r)
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
Stream output.
Impl(RepoManagerOptions &&opt)
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
Impl * clone() const
clone for RWCOW_pointer
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
void addRepository(const RepoInfo &info, OPT_PROGRESS)
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
Impl(const Impl &)=default
void refreshGeoIPData(const RepoInfo::url_set &urls)
void addRepositories(const Url &url, OPT_PROGRESS)
void removeRepository(const RepoInfo &info, OPT_PROGRESS) override
zypp_private::repo::PluginRepoverification _pluginRepoverification
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
void refreshService(const ServiceInfo &service, const RefreshServiceOptions &options_r)
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
Probe the metadata type of a repository located at url.
Impl & operator=(Impl &&)=delete
Listentry returned by readdir.
Repository type enumeration.
static const RepoType NONE
static const RepoType RPMPLAINDIR
Functor replacing repository variables.
Service type enumeration.
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)