25 #include <QStringList>
27 #include <QDirIterator>
29 #include <zypp/RepoManager.h>
30 #include <zypp/RepoInfo.h>
42 #include "../constants.h"
44 SsuRepoManager::SsuRepoManager()
61 if (repoUrl.isEmpty()) {
63 QStringList enabledRepos;
64 if (ssuSettings->contains(
"enabled-repos"))
65 enabledRepos = ssuSettings->value(
"enabled-repos").toStringList();
67 enabledRepos.append(repo);
68 enabledRepos.removeDuplicates();
69 ssuSettings->setValue(
"enabled-repos", enabledRepos);
71 ssuSettings->setValue(
"repository-urls/" + repo, repoUrl);
84 (domain.isEmpty() ? settings->
domain() : domain) +
"-domain",
85 "_ca-certificate").toString();
90 if (settings->contains(
"ca-certificate"))
91 return settings->value(
"ca-certificate").toString();
99 QStringList disabledRepos;
101 if (ssuSettings->contains(
"disabled-repos"))
102 disabledRepos = ssuSettings->value(
"disabled-repos").toStringList();
104 disabledRepos.append(repo);
105 disabledRepos.removeDuplicates();
107 ssuSettings->setValue(
"disabled-repos", disabledRepos);
116 QStringList disabledRepos;
118 if (ssuSettings->contains(
"disabled-repos")) {
119 disabledRepos = ssuSettings->value(
"disabled-repos").toStringList();
121 disabledRepos.removeAll(repo);
122 disabledRepos.removeDuplicates();
124 if (disabledRepos.size() > 0)
125 ssuSettings->setValue(
"disabled-repos", disabledRepos);
127 ssuSettings->remove(
"disabled-repos");
148 if (ssuSettings->contains(
"repository-urls/" + repo))
149 ssuSettings->remove(
"repository-urls/" + repo);
151 QStringList sections;
152 sections <<
"enabled-repos" <<
"disabled-repos";
153 for (
const QString §ion: sections) {
154 if (ssuSettings->contains(section)) {
155 QStringList
repos = ssuSettings->value(section).toStringList();
156 repos.removeAll(repo);
157 repos.removeDuplicates();
158 if (
repos.size() > 0)
159 ssuSettings->setValue(section,
repos);
161 ssuSettings->remove(section);
178 return repos(rnd, deviceInfo, filter);
185 return repos(rnd, deviceInfo, filter);
196 result = deviceInfo.
repos(rnd, filter);
202 result.append(featureManager.repos(rnd, filter));
211 bool updateMode =
false;
212 bool appInstallMode =
false;
219 appInstallMode =
true;
226 ssuSettings->beginGroup(
"repository-urls");
227 QStringList repoUrls = ssuSettings->allKeys();
228 ssuSettings->endGroup();
231 foreach (
const QString &key, repoUrls) {
232 if (result.contains(key))
236 result.append(repoUrls);
240 if (ssuSettings->contains(
"enabled-repos") && !updateMode)
241 result.append(ssuSettings->value(
"enabled-repos").toStringList());
244 if (ssuSettings->contains(
"enabled-repos") && appInstallMode) {
246 if (ssuSettings->value(
"enabled-repos").toStringList().contains(
"store"))
247 result.append(
"store");
255 if (ssuSettings->contains(
"disabled-repos") && !updateMode) {
256 foreach (
const QString &key, ssuSettings->value(
"disabled-repos").toStringList())
257 result.removeAll(key);
263 result.removeDuplicates();
276 SsuLog *ssuLog = SsuLog::instance();
279 ssuLog->
print(LOG_INFO,
"Repo management requested, but not enabled (option 'deviceMode')");
284 bool rndMode =
false;
290 QStringList repositoryList =
repos(rndMode);
292 zypp::RepoManager zyppManager;
293 std::list<zypp::RepoInfo> zyppRepos = zyppManager.knownRepositories();
299 foreach (zypp::RepoInfo zyppRepo, zyppRepos) {
300 if (zyppRepo.filepath().basename().substr(0, 4) !=
"ssu_") {
301 ssuLog->
print(LOG_INFO,
"Strict mode enabled, removing unmanaged repository " + QString::fromStdString(zyppRepo.name()));
302 zyppManager.removeRepository(zyppRepo);
308 zyppRepos = zyppManager.knownRepositories();
309 foreach (zypp::RepoInfo zyppRepo, zyppRepos) {
310 if (zyppRepo.filepath().basename().substr(0, 4) ==
"ssu_") {
311 QStringList parts = QString::fromStdString(zyppRepo.filepath().basename()).split(
"_");
313 if (parts.count() == 3) {
314 if (!repositoryList.contains(parts.at(1)) ||
315 parts.at(2) != (rndMode ?
"rnd.repo" :
"release.repo" )) {
317 zyppManager.removeRepository(zyppRepo);
321 zyppManager.removeRepository(zyppRepo);
327 foreach (
const QString &repo, repositoryList) {
330 QString repoName = repo;
332 if (repo.endsWith(
"-debuginfo")) {
333 debugSplit =
"&debug";
334 repoName = repo.left(repo.size() - 10);
339 QString repoFilePath = QString(
"%1/ssu_%2_%3.repo")
342 .arg(rndMode ?
"rnd" :
"release");
344 if (
url(repoName, rndMode).isEmpty()) {
347 QTextStream qerr(stderr);
348 qerr <<
"Repository " << repo <<
" does not contain valid URL, skipping and disabling." << endl;
350 QFile(repoFilePath).remove();
354 QFile repoFile(repoFilePath);
356 if (repoFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
357 QTextStream out(&repoFile);
360 out <<
"[" << repo <<
"]" << endl
361 <<
"name=" << repo << endl
362 <<
"failovermethod=priority" << endl
363 <<
"type=rpm-md" << endl
364 <<
"gpgcheck=0" << endl
365 <<
"enabled=1" << endl;
368 out <<
"baseurl=plugin:ssu?rnd&repo=" << repoName << debugSplit << endl;
370 out <<
"baseurl=plugin:ssu?repo=" << repoName << debugSplit << endl;
381 QStringList configSections;
385 var.
variableSection(settings,
"repository-url-variables", storageHash);
395 storageHash->insert(
"flavour",
397 settings->
flavour() +
"-flavour/flavour-pattern").toString());
398 storageHash->insert(
"flavourPattern",
400 settings->
flavour() +
"-flavour/flavour-pattern").toString());
401 storageHash->insert(
"flavourName", settings->
flavour());
402 configSections << settings->
flavour() +
"-flavour" <<
"rnd" <<
"all";
408 configSections <<
"release" <<
"all";
411 storageHash->insert(
"release", settings->
release(rnd));
413 if (!storageHash->contains(
"debugSplit"))
414 storageHash->insert(
"debugSplit",
"packages");
416 if (!storageHash->contains(
"arch"))
417 storageHash->insert(
"arch", settings->value(
"arch").toString());
419 return configSections;
425 QHash<QString, QString> repoParameters,
426 QHash<QString, QString> parametersOverride)
433 if (repoName.endsWith(
"-debuginfo") && !repoParameters.contains(
"debugSplit"))
434 repoParameters.insert(
"debugSplit",
"debug");
436 QStringList configSections =
repoVariables(&repoParameters, rndRepo);
439 if (parametersOverride.contains(
"model"))
442 repoParameters.insert(
"deviceFamily", deviceInfo.
deviceFamily());
443 repoParameters.insert(
"deviceModel", deviceInfo.
deviceModel());
444 repoParameters.insert(
"deviceVariant", deviceInfo.
deviceVariant(
true));
451 if (parametersOverride.contains(
"domain")) {
452 domain = parametersOverride.value(
"domain");
453 domain.replace(
"-",
":");
455 domain = settings->
domain();
458 repoParameters.insert(
"brand", settings->
brand());
463 var.
variableSection(&repoSettings, domain +
"-domain", &repoParameters);
466 QHash<QString, QString>::const_iterator i = parametersOverride.constBegin();
467 while (i != parametersOverride.constEnd()) {
468 repoParameters.insert(i.key(), i.value());
480 if (settings->contains(
"repository-urls/" + adaptationRepoName)) {
481 r = settings->value(
"repository-urls/" + adaptationRepoName).toString();
482 }
else if (!featureManager.url(adaptationRepoName, rndRepo).isEmpty()) {
483 r = featureManager.url(adaptationRepoName, rndRepo);
485 foreach (
const QString §ion, configSections) {
486 repoSettings.beginGroup(section);
487 if (repoSettings.contains(adaptationRepoName)) {
488 r = repoSettings.value(adaptationRepoName).toString();
489 repoSettings.endGroup();
492 repoSettings.endGroup();