diff --git a/weboob/core/ouiboube.py b/weboob/core/ouiboube.py index f3b1f3fb..a8bae974 100644 --- a/weboob/core/ouiboube.py +++ b/weboob/core/ouiboube.py @@ -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 \ diff --git a/weboob/core/repositories.py b/weboob/core/repositories.py index b2122fb5..6c849524 100644 --- a/weboob/core/repositories.py +++ b/weboob/core/repositories.py @@ -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()): """