Skip to content

Latest commit

 

History

History
347 lines (275 loc) · 11.3 KB

ssurepomanager.cpp

File metadata and controls

347 lines (275 loc) · 11.3 KB
 
Mar 28, 2013
Mar 28, 2013
1
2
3
4
5
6
7
8
9
10
11
/**
* @file ssurepomanager.cpp
* @copyright 2013 Jolla Ltd.
* @author Bernd Wachter <bwachter@lart.info>
* @date 2013
*/
#include <QStringList>
#include <QRegExp>
#include <QDirIterator>
Oct 14, 2013
Oct 14, 2013
12
#include "sandbox_p.h"
Mar 28, 2013
Mar 28, 2013
13
14
#include "ssudeviceinfo.h"
#include "ssurepomanager.h"
Mar 30, 2013
Mar 30, 2013
15
#include "ssucoreconfig.h"
May 23, 2013
May 23, 2013
16
#include "ssusettings.h"
Mar 28, 2013
Mar 28, 2013
17
#include "ssulog.h"
Mar 30, 2013
Mar 30, 2013
18
#include "ssuvariables.h"
Oct 15, 2013
Oct 15, 2013
19
#include "ssufeaturemanager.h"
Mar 28, 2013
Mar 28, 2013
20
21
22
23
24
25
26
27
#include "ssu.h"
#include "../constants.h"
SsuRepoManager::SsuRepoManager(): QObject() {
}
Mar 30, 2013
Mar 30, 2013
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void SsuRepoManager::add(QString repo, QString repoUrl){
SsuCoreConfig *ssuSettings = SsuCoreConfig::instance();
if (repoUrl == ""){
// just enable a repository which has URL in repos.ini
QStringList enabledRepos;
if (ssuSettings->contains("enabled-repos"))
enabledRepos = ssuSettings->value("enabled-repos").toStringList();
enabledRepos.append(repo);
enabledRepos.removeDuplicates();
ssuSettings->setValue("enabled-repos", enabledRepos);
} else
ssuSettings->setValue("repository-urls/" + repo, repoUrl);
ssuSettings->sync();
}
Jul 6, 2013
Jul 6, 2013
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
QString SsuRepoManager::caCertificatePath(QString domain){
SsuCoreConfig *settings = SsuCoreConfig::instance();
SsuSettings repoSettings(SSU_REPO_CONFIGURATION, QSettings::IniFormat);
if (domain.isEmpty())
domain = settings->domain();
QString ca = SsuVariables::variable(&repoSettings, domain + "-domain",
"_ca-certificate").toString();
if (!ca.isEmpty())
return ca;
// compat setting, can go away after some time
if (settings->contains("ca-certificate"))
return settings->value("ca-certificate").toString();
return "";
}
Mar 30, 2013
Mar 30, 2013
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
void SsuRepoManager::disable(QString repo){
SsuCoreConfig *ssuSettings = SsuCoreConfig::instance();
QStringList disabledRepos;
if (ssuSettings->contains("disabled-repos"))
disabledRepos = ssuSettings->value("disabled-repos").toStringList();
disabledRepos.append(repo);
disabledRepos.removeDuplicates();
ssuSettings->setValue("disabled-repos", disabledRepos);
ssuSettings->sync();
}
void SsuRepoManager::enable(QString repo){
SsuCoreConfig *ssuSettings = SsuCoreConfig::instance();
QStringList disabledRepos;
if (ssuSettings->contains("disabled-repos"))
disabledRepos = ssuSettings->value("disabled-repos").toStringList();
disabledRepos.removeAll(repo);
disabledRepos.removeDuplicates();
ssuSettings->setValue("disabled-repos", disabledRepos);
ssuSettings->sync();
}
void SsuRepoManager::remove(QString repo){
SsuCoreConfig *ssuSettings = SsuCoreConfig::instance();
if (ssuSettings->contains("repository-urls/" + repo))
ssuSettings->remove("repository-urls/" + repo);
if (ssuSettings->contains("enabled-repos")){
QStringList enabledRepos = ssuSettings->value("enabled-repos").toStringList();
if (enabledRepos.contains(repo)){
enabledRepos.removeAll(repo);
enabledRepos.removeDuplicates();
ssuSettings->setValue("enabled-repos", enabledRepos);
}
}
ssuSettings->sync();
}
Oct 6, 2013
Oct 6, 2013
110
111
112
113
114
115
QStringList SsuRepoManager::repos(bool rnd, int filter){
SsuDeviceInfo deviceInfo;
return repos(rnd, deviceInfo, filter);
}
Oct 15, 2013
Oct 15, 2013
116
// @todo the non-device specific repository resolving should move from deviceInfo to repomanager
Oct 6, 2013
Oct 6, 2013
117
118
119
120
QStringList SsuRepoManager::repos(bool rnd, SsuDeviceInfo &deviceInfo, int filter){
QStringList result;
result = deviceInfo.repos(rnd, filter);
Nov 17, 2013
Nov 17, 2013
121
122
123
SsuFeatureManager featureManager;
result.append(featureManager.repos(rnd, filter));
Oct 6, 2013
Oct 6, 2013
124
125
126
127
128
129
result.sort();
result.removeDuplicates();
return result;
}
Mar 28, 2013
Mar 28, 2013
130
131
132
133
134
135
136
137
void SsuRepoManager::update(){
// - delete all non-ssu managed repositories (missing ssu_ prefix)
// - create list of ssu-repositories for current adaptation
// - go through ssu_* repositories, delete all which are not in the list; write others
SsuDeviceInfo deviceInfo;
QStringList ssuFilters;
Mar 30, 2013
Mar 30, 2013
138
139
SsuCoreConfig *ssuSettings = SsuCoreConfig::instance();
int deviceMode = ssuSettings->value("deviceMode").toInt();
Mar 28, 2013
Mar 28, 2013
140
141
142
143
144
145
SsuLog *ssuLog = SsuLog::instance();
// if device is misconfigured, always assume release mode
bool rndMode = false;
Mar 29, 2013
Mar 29, 2013
146
if ((deviceMode & Ssu::DisableRepoManager) == Ssu::DisableRepoManager){
Mar 28, 2013
Mar 28, 2013
147
148
149
150
151
152
153
ssuLog->print(LOG_INFO, "Repo management requested, but not enabled (option 'deviceMode')");
return;
}
if ((deviceMode & Ssu::RndMode) == Ssu::RndMode)
rndMode = true;
Mar 30, 2013
Mar 30, 2013
154
// get list of device-specific repositories...
Nov 17, 2013
Nov 17, 2013
155
QStringList repositoryList = repos(rndMode);
Mar 30, 2013
Mar 30, 2013
156
157
158
159
// strict mode enabled -> delete all repositories not prefixed by ssu
// assume configuration error if there are no device repos, and don't delete
// anything, even in strict mode
Nov 17, 2013
Nov 17, 2013
160
if ((deviceMode & Ssu::LenientMode) != Ssu::LenientMode && !repositoryList.isEmpty()){
Oct 14, 2013
Oct 14, 2013
161
QDirIterator it(Sandbox::map(ZYPP_REPO_PATH), QDir::AllEntries|QDir::NoDot|QDir::NoDotDot);
Mar 28, 2013
Mar 28, 2013
162
163
164
165
166
167
168
169
170
171
172
while (it.hasNext()){
it.next();
if (it.fileName().left(4) != "ssu_"){
ssuLog->print(LOG_INFO, "Strict mode enabled, removing unmanaged repository " + it.fileName());
QFile(it.filePath()).remove();
}
}
}
// ... delete all ssu-managed repositories not valid for this device ...
ssuFilters.append("ssu_*");
Oct 14, 2013
Oct 14, 2013
173
QDirIterator it(Sandbox::map(ZYPP_REPO_PATH), ssuFilters);
Mar 28, 2013
Mar 28, 2013
174
175
176
177
178
179
while (it.hasNext()){
QString f = it.next();
QStringList parts = it.fileName().split("_");
// repo file structure is ssu_<reponame>_<rnd|release>.repo -> splits to 3 parts
if (parts.count() == 3){
Nov 17, 2013
Nov 17, 2013
180
if (!repositoryList.contains(parts.at(1)) ||
Mar 29, 2013
Mar 29, 2013
181
parts.at(2) != (rndMode ? "rnd.repo" : "release.repo" ))
Mar 28, 2013
Mar 28, 2013
182
183
184
185
186
187
QFile(it.filePath()).remove();
} else
QFile(it.filePath()).remove();
}
// ... and create all repositories required for this device
Nov 17, 2013
Nov 17, 2013
188
foreach (const QString &repo, repositoryList){
Apr 12, 2013
Apr 12, 2013
189
190
191
192
193
194
195
196
197
// repo should be used where a unique identifier for silly human brains, or
// zypper is required. repoName contains the shortened form for ssu use
QString repoName = repo;
QString debugSplit;
if (repo.endsWith("-debuginfo")){
debugSplit = "&debug";
repoName = repo.left(repo.size() - 10);
}
Apr 10, 2013
Apr 10, 2013
198
QString repoFilePath = QString("%1/ssu_%2_%3.repo")
Oct 14, 2013
Oct 14, 2013
199
.arg(Sandbox::map(ZYPP_REPO_PATH))
Apr 10, 2013
Apr 10, 2013
200
201
202
.arg(repo)
.arg(rndMode ? "rnd" : "release");
Apr 12, 2013
Apr 12, 2013
203
if (url(repoName, rndMode) == ""){
Apr 10, 2013
Apr 10, 2013
204
205
206
207
208
209
210
211
212
213
// TODO, repositories should only be disabled if they're not required
// for this machine. For required repositories error is better
QTextStream qerr(stderr);
qerr << "Repository " << repo << " does not contain valid URL, skipping and disabling." << endl;
disable(repo);
QFile(repoFilePath).remove();
continue;
}
QFile repoFile(repoFilePath);
Mar 28, 2013
Mar 28, 2013
214
215
216
217
218
219
220
221
222
223
224
225
226
if (repoFile.open(QIODevice::WriteOnly | QIODevice::Text)){
QTextStream out(&repoFile);
// TODO, add -rnd or -release if we want to support having rnd and
// release enabled at the same time
out << "[" << repo << "]" << endl
<< "name=" << repo << endl
<< "failovermethod=priority" << endl
<< "type=rpm-md" << endl
<< "gpgcheck=0" << endl
<< "enabled=1" << endl;
if (rndMode)
Apr 12, 2013
Apr 12, 2013
227
out << "baseurl=plugin:ssu?rnd&repo=" << repoName << debugSplit << endl;
Mar 28, 2013
Mar 28, 2013
228
else
Apr 12, 2013
Apr 12, 2013
229
out << "baseurl=plugin:ssu?repo=" << repoName << debugSplit << endl;
Mar 28, 2013
Mar 28, 2013
230
231
232
233
234
out.flush();
}
}
}
Mar 30, 2013
Mar 30, 2013
235
Apr 5, 2013
Apr 5, 2013
236
QStringList SsuRepoManager::repoVariables(QHash<QString, QString> *storageHash, bool rnd){
Mar 30, 2013
Mar 30, 2013
237
238
SsuVariables var;
SsuCoreConfig *settings = SsuCoreConfig::instance();
Apr 5, 2013
Apr 5, 2013
239
QStringList configSections;
May 23, 2013
May 23, 2013
240
SsuSettings repoSettings(SSU_REPO_CONFIGURATION, QSettings::IniFormat);
Mar 30, 2013
Mar 30, 2013
241
Apr 1, 2013
Apr 1, 2013
242
// fill in all arbitrary variables from ssu.ini
Jul 5, 2013
Jul 5, 2013
243
var.variableSection(settings, "repository-url-variables", storageHash);
Mar 30, 2013
Mar 30, 2013
244
245
// add/overwrite some of the variables with sane ones
Apr 5, 2013
Apr 5, 2013
246
247
248
if (rnd){
storageHash->insert("flavour",
repoSettings.value(
Mar 30, 2013
Mar 30, 2013
249
settings->flavour()+"-flavour/flavour-pattern").toString());
Apr 5, 2013
Apr 5, 2013
250
251
storageHash->insert("flavourPattern",
repoSettings.value(
Mar 30, 2013
Mar 30, 2013
252
settings->flavour()+"-flavour/flavour-pattern").toString());
Apr 5, 2013
Apr 5, 2013
253
storageHash->insert("flavourName", settings->flavour());
Mar 30, 2013
Mar 30, 2013
254
255
256
257
configSections << settings->flavour()+"-flavour" << "rnd" << "all";
// Make it possible to give any values with the flavour as well.
// These values can be overridden later with domain if needed.
Jul 5, 2013
Jul 5, 2013
258
var.variableSection(&repoSettings, settings->flavour()+"-flavour", storageHash);
Mar 30, 2013
Mar 30, 2013
259
260
261
262
} else {
configSections << "release" << "all";
}
Apr 5, 2013
Apr 5, 2013
263
storageHash->insert("release", settings->release(rnd));
Mar 30, 2013
Mar 30, 2013
264
Apr 5, 2013
Apr 5, 2013
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
if (!storageHash->contains("debugSplit"))
storageHash->insert("debugSplit", "packages");
if (!storageHash->contains("arch"))
storageHash->insert("arch", settings->value("arch").toString());
return configSections;
}
// RND repos have flavour (devel, testing, release), and release (latest, next)
// Release repos only have release (latest, next, version number)
QString SsuRepoManager::url(QString repoName, bool rndRepo,
QHash<QString, QString> repoParameters,
QHash<QString, QString> parametersOverride){
QString r;
QStringList configSections;
SsuVariables var;
SsuCoreConfig *settings = SsuCoreConfig::instance();
May 23, 2013
May 23, 2013
283
SsuSettings repoSettings(SSU_REPO_CONFIGURATION, QSettings::IniFormat);
Apr 5, 2013
Apr 5, 2013
284
SsuDeviceInfo deviceInfo;
Mar 30, 2013
Mar 30, 2013
285
Apr 12, 2013
Apr 12, 2013
286
287
288
289
290
291
// set debugSplit for incorrectly configured debuginfo repositories (debugSplit
// should already be passed by the url resolver); might be overriden later on,
// if required
if (repoName.endsWith("-debuginfo") && !repoParameters.contains("debugSplit"))
repoParameters.insert("debugSplit", "debug");
Apr 5, 2013
Apr 5, 2013
292
configSections = repoVariables(&repoParameters, rndRepo);
Mar 30, 2013
Mar 30, 2013
293
Apr 12, 2013
Apr 12, 2013
294
Mar 30, 2013
Mar 30, 2013
295
296
297
298
299
300
301
// Override device model (and therefore all the family, ... stuff)
if (parametersOverride.contains("model"))
deviceInfo.setDeviceModel(parametersOverride.value("model"));
repoParameters.insert("deviceFamily", deviceInfo.deviceFamily());
repoParameters.insert("deviceModel", deviceInfo.deviceModel());
Apr 1, 2013
Apr 1, 2013
302
repoName = deviceInfo.adaptationVariables(repoName, &repoParameters);
Mar 30, 2013
Mar 30, 2013
303
Jul 5, 2013
Jul 5, 2013
304
305
306
307
308
309
310
311
312
313
314
QString domain;
if (parametersOverride.contains("domain")){
domain = parametersOverride.value("domain");
domain.replace("-", ":");
} else
domain = settings->domain();
// variableSection does autodetection for the domain default section
var.variableSection(&repoSettings,
domain + "-domain", &repoParameters);
Mar 30, 2013
Mar 30, 2013
315
316
317
318
319
320
321
322
// override arbitrary variables, mostly useful for generating mic URLs
QHash<QString, QString>::const_iterator i = parametersOverride.constBegin();
while (i != parametersOverride.constEnd()){
repoParameters.insert(i.key(), i.value());
i++;
}
Oct 15, 2013
Oct 15, 2013
323
324
325
326
327
328
329
// search for URLs for repositories. Lookup order is:
// 1. overrides in ssu.ini
// 2. URLs from features
// 3. URLs from repos.ini
SsuFeatureManager featureManager;
Mar 30, 2013
Mar 30, 2013
330
331
if (settings->contains("repository-urls/" + repoName))
r = settings->value("repository-urls/" + repoName).toString();
Nov 17, 2013
Nov 17, 2013
332
333
else if (featureManager.url(repoName, rndRepo) != "")
r = featureManager.url(repoName, rndRepo);
Mar 30, 2013
Mar 30, 2013
334
335
else {
foreach (const QString &section, configSections){
Apr 5, 2013
Apr 5, 2013
336
337
338
339
repoSettings.beginGroup(section);
if (repoSettings.contains(repoName)){
r = repoSettings.value(repoName).toString();
repoSettings.endGroup();
Mar 30, 2013
Mar 30, 2013
340
341
break;
}
Apr 5, 2013
Apr 5, 2013
342
repoSettings.endGroup();
Mar 30, 2013
Mar 30, 2013
343
344
345
346
347
}
}
return var.resolveString(r, &repoParameters);
}