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.repositories import Repositories, IProgress
from weboob.core.scheduler import Scheduler from weboob.core.scheduler import Scheduler
from weboob.tools.backend import BaseBackend from weboob.tools.backend import BaseBackend
from weboob.tools.config.iconfig import ConfigError
from weboob.tools.log import getLogger from weboob.tools.log import getLogger
@ -94,7 +95,6 @@ class Weboob(object):
# Repositories management # Repositories management
self.repositories = Repositories(workdir, datadir, self.VERSION) self.repositories = Repositories(workdir, datadir, self.VERSION)
# Backends loader # Backends loader
self.modules_loader = ModulesLoader(self.repositories) self.modules_loader = ModulesLoader(self.repositories)
@ -194,6 +194,10 @@ class Weboob(object):
if storage is None: if storage is None:
storage = self.storage 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(): 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 \ 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 \ 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: with open(dest_path, 'wb') as fp:
fp.write(icon.read()) 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()): def update_repositories(self, progress=IProgress()):
""" """
Update list of repositories by downloading them Update list of repositories by downloading them
@ -548,28 +558,39 @@ class Repositories(object):
os.remove(os.path.join(self.repos_dir, name)) os.remove(os.path.join(self.repos_dir, name))
gpgv = Keyring.find_gpgv() gpgv = Keyring.find_gpgv()
with open(self.sources_list, 'r') as f: for line in self._parse_source_list():
for line in f.xreadlines(): progress.progress(0.0, 'Getting %s' % line)
line = line.strip() % {'version': self.version} repository = Repository(line)
m = re.match('(file|https?)://.*', line) filename = self.url2filename(repository.url)
if m: prio_filename = '%02d-%s' % (len(self.repositories), filename)
progress.progress(0.0, 'Getting %s' % line) repo_path = os.path.join(self.repos_dir, prio_filename)
repository = Repository(line) keyring_path = os.path.join(self.keyrings_dir, filename)
filename = self.url2filename(repository.url) try:
prio_filename = '%02d-%s' % (len(self.repositories), filename) repository.retrieve_index(repo_path)
repo_path = os.path.join(self.repos_dir, prio_filename) if gpgv:
keyring_path = os.path.join(self.keyrings_dir, filename) repository.retrieve_keyring(keyring_path)
try: else:
repository.retrieve_index(repo_path) progress.error('Cannot find gpgv to check for repository authenticity.\n'
if gpgv: 'You should install GPG for better security.')
repository.retrieve_keyring(keyring_path) except RepositoryUnavailable, e:
else: progress.error('Unable to load repository: %s' % e)
progress.error('Cannot find gpgv to check for repository authenticity.\n' else:
'You should install GPG for better security.') self.repositories.append(repository)
except RepositoryUnavailable, e:
progress.error('Unable to load repository: %s' % e) def check_repositories(self):
else: """
self.repositories.append(repository) 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()): def update(self, progress=IProgress()):
""" """