Check if repositories are ok at the application runtime

Closes #1072
This commit is contained in:
Florent 2013-03-20 15:19:03 +01:00
commit fc3eefff09
2 changed files with 48 additions and 23 deletions

View file

@ -29,6 +29,7 @@ from weboob.core.backendscfg import BackendsConfig
from weboob.core.repositories import Repositories, IProgress
from weboob.core.scheduler import Scheduler
from weboob.tools.backend import BaseBackend
from weboob.tools.config.iconfig import ConfigError
from weboob.tools.log import getLogger
@ -94,7 +95,6 @@ class Weboob(object):
# Repositories management
self.repositories = Repositories(workdir, datadir, self.VERSION)
# Backends loader
self.modules_loader = ModulesLoader(self.repositories)
@ -194,6 +194,10 @@ class Weboob(object):
if storage is None:
storage = self.storage
if not self.repositories.check_repositories():
self.logger.error(u'Repositories are not consistent with the sources.list')
raise ConfigError(u'Versions mismatch, please run "weboob-config update"')
for instance_name, module_name, params in self.backends_config.iter_backends():
if '_enabled' in params and not params['_enabled'].lower() in ('1', 'y', 'true', 'on', 'yes') or \
names is not None and instance_name not in names or \

View file

@ -535,6 +535,16 @@ class Repositories(object):
with open(dest_path, 'wb') as fp:
fp.write(icon.read())
def _parse_source_list(self):
l = []
with open(self.sources_list, 'r') as f:
for line in f.xreadlines():
line = line.strip() % {'version': self.version}
m = re.match('(file|https?)://.*', line)
if m:
l.append(line)
return l
def update_repositories(self, progress=IProgress()):
"""
Update list of repositories by downloading them
@ -548,28 +558,39 @@ class Repositories(object):
os.remove(os.path.join(self.repos_dir, name))
gpgv = Keyring.find_gpgv()
with open(self.sources_list, 'r') as f:
for line in f.xreadlines():
line = line.strip() % {'version': self.version}
m = re.match('(file|https?)://.*', line)
if m:
progress.progress(0.0, 'Getting %s' % line)
repository = Repository(line)
filename = self.url2filename(repository.url)
prio_filename = '%02d-%s' % (len(self.repositories), filename)
repo_path = os.path.join(self.repos_dir, prio_filename)
keyring_path = os.path.join(self.keyrings_dir, filename)
try:
repository.retrieve_index(repo_path)
if gpgv:
repository.retrieve_keyring(keyring_path)
else:
progress.error('Cannot find gpgv to check for repository authenticity.\n'
'You should install GPG for better security.')
except RepositoryUnavailable, e:
progress.error('Unable to load repository: %s' % e)
else:
self.repositories.append(repository)
for line in self._parse_source_list():
progress.progress(0.0, 'Getting %s' % line)
repository = Repository(line)
filename = self.url2filename(repository.url)
prio_filename = '%02d-%s' % (len(self.repositories), filename)
repo_path = os.path.join(self.repos_dir, prio_filename)
keyring_path = os.path.join(self.keyrings_dir, filename)
try:
repository.retrieve_index(repo_path)
if gpgv:
repository.retrieve_keyring(keyring_path)
else:
progress.error('Cannot find gpgv to check for repository authenticity.\n'
'You should install GPG for better security.')
except RepositoryUnavailable, e:
progress.error('Unable to load repository: %s' % e)
else:
self.repositories.append(repository)
def check_repositories(self):
"""
Check if sources.list is consistent with repositories
"""
l = []
for line in self._parse_source_list():
repository = Repository(line)
filename = self.url2filename(repository.url)
prio_filename = '%02d-%s' % (len(l), filename)
repo_path = os.path.join(self.repos_dir, prio_filename)
if not os.path.isfile(repo_path):
return False
l.append(repository)
return True
def update(self, progress=IProgress()):
"""