first step in python3 support
This commit is contained in:
parent
7c1e08eb96
commit
6fcac89dd5
25 changed files with 302 additions and 208 deletions
|
|
@ -23,7 +23,10 @@
|
|||
import stat
|
||||
import os
|
||||
import sys
|
||||
from ConfigParser import RawConfigParser, DuplicateSectionError
|
||||
try:
|
||||
from ConfigParser import RawConfigParser, DuplicateSectionError
|
||||
except ImportError:
|
||||
from configparser import RawConfigParser, DuplicateSectionError
|
||||
from logging import warning
|
||||
|
||||
__all__ = ['BackendsConfig', 'BackendAlreadyExists']
|
||||
|
|
|
|||
|
|
@ -20,7 +20,10 @@
|
|||
|
||||
from copy import copy
|
||||
from threading import Thread
|
||||
import Queue
|
||||
try:
|
||||
import Queue
|
||||
except ImportError:
|
||||
import queue as Queue
|
||||
|
||||
from weboob.capabilities.base import CapBaseObject
|
||||
from weboob.tools.misc import get_backtrace
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
|
||||
from __future__ import print_function
|
||||
import imp
|
||||
import tarfile
|
||||
import posixpath
|
||||
|
|
@ -32,29 +32,24 @@ from tempfile import NamedTemporaryFile
|
|||
from datetime import datetime
|
||||
from contextlib import closing
|
||||
from compileall import compile_dir
|
||||
from StringIO import StringIO
|
||||
from io import BytesIO
|
||||
|
||||
from .modules import Module
|
||||
from weboob.tools.log import getLogger
|
||||
from weboob.tools.misc import to_unicode
|
||||
from weboob.tools.browser import StandardBrowser, BrowserUnavailable
|
||||
from ConfigParser import RawConfigParser, DEFAULTSECT
|
||||
from weboob.tools.browser2.browser import BaseBrowser, Weboob as WeboobProfile
|
||||
try:
|
||||
from configparser import RawConfigParser, DEFAULTSECT
|
||||
except ImportError:
|
||||
from ConfigParser import RawConfigParser, DEFAULTSECT
|
||||
|
||||
BrowserUnavailable = object()
|
||||
|
||||
|
||||
__all__ = ['IProgress', 'ModuleInstallError', 'ModuleInfo', 'RepositoryUnavailable',
|
||||
'Repository', 'Versions', 'Repositories', 'InvalidSignature', 'Keyring']
|
||||
|
||||
|
||||
class WeboobBrowser(StandardBrowser):
|
||||
"""
|
||||
Browser with a specific useragent.
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def set_version(klass, version):
|
||||
klass.USER_AGENT = 'weboob/%s' % version
|
||||
|
||||
|
||||
class ModuleInfo(object):
|
||||
"""
|
||||
Information about a module available on a repository.
|
||||
|
|
@ -125,7 +120,8 @@ class Repository(object):
|
|||
KEYDIR = '.keys'
|
||||
KEYRING = 'trusted.gpg'
|
||||
|
||||
def __init__(self, url):
|
||||
def __init__(self, browser, url):
|
||||
self.browser = browser
|
||||
self.url = url
|
||||
self.name = u''
|
||||
self.update = 0
|
||||
|
|
@ -179,9 +175,8 @@ class Repository(object):
|
|||
fp = open(filename, 'r')
|
||||
else:
|
||||
# This is a remote repository, download file
|
||||
browser = WeboobBrowser()
|
||||
try:
|
||||
fp = browser.openurl(posixpath.join(self.url, self.INDEX))
|
||||
fp = BytesIO(self.browser.open(posixpath.join(self.url, self.INDEX)).content)
|
||||
except BrowserUnavailable as e:
|
||||
raise RepositoryUnavailable(unicode(e))
|
||||
|
||||
|
|
@ -208,20 +203,19 @@ class Repository(object):
|
|||
|
||||
if not keyring.exists() or self.key_update > keyring.version:
|
||||
# This is a remote repository, download file
|
||||
browser = WeboobBrowser()
|
||||
try:
|
||||
keyring_data = browser.readurl(posixpath.join(self.url, self.KEYRING))
|
||||
sig_data = browser.readurl(posixpath.join(self.url, self.KEYRING + '.sig'))
|
||||
keyring_data = self.browser.open(posixpath.join(self.url, self.KEYRING)).content
|
||||
sig_data = self.browser.open(posixpath.join(self.url, self.KEYRING + '.sig')).content
|
||||
except BrowserUnavailable as e:
|
||||
raise RepositoryUnavailable(unicode(e))
|
||||
if keyring.exists():
|
||||
if not keyring.is_valid(keyring_data, sig_data):
|
||||
raise InvalidSignature('the keyring itself')
|
||||
print 'The keyring was updated (and validated by the previous one).'
|
||||
print('The keyring was updated (and validated by the previous one).')
|
||||
else:
|
||||
print 'First time saving the keyring, blindly accepted.'
|
||||
print('First time saving the keyring, blindly accepted.')
|
||||
keyring.save(keyring_data, self.key_update)
|
||||
print keyring
|
||||
print(keyring)
|
||||
|
||||
def parse_index(self, fp):
|
||||
"""
|
||||
|
|
@ -275,7 +269,7 @@ class Repository(object):
|
|||
:param filename: file to save index
|
||||
:type filename: str
|
||||
"""
|
||||
print 'Rebuild index'
|
||||
print('Rebuild index')
|
||||
self.modules.clear()
|
||||
|
||||
if os.path.isdir(os.path.join(path, self.KEYDIR)):
|
||||
|
|
@ -298,7 +292,7 @@ class Repository(object):
|
|||
if fp:
|
||||
fp.close()
|
||||
except Exception as e:
|
||||
print >>sys.stderr, 'Unable to build module %s: [%s] %s' % (name, type(e).__name__, e)
|
||||
print('Unable to build module %s: [%s] %s' % (name, type(e).__name__, e), file=sys.stderr)
|
||||
else:
|
||||
m = ModuleInfo(module.name)
|
||||
m.version = self.get_tree_mtime(module_path)
|
||||
|
|
@ -388,10 +382,10 @@ class Versions(object):
|
|||
|
||||
class IProgress(object):
|
||||
def progress(self, percent, message):
|
||||
print '=== [%3.0f%%] %s' % (percent*100, message)
|
||||
print('=== [%3.0f%%] %s' % (percent*100, message))
|
||||
|
||||
def error(self, message):
|
||||
print >>sys.stderr, 'ERROR: %s' % message
|
||||
print('ERROR: %s' % message, file=sys.stderr)
|
||||
|
||||
|
||||
class ModuleInstallError(Exception):
|
||||
|
|
@ -425,7 +419,11 @@ class Repositories(object):
|
|||
def __init__(self, workdir, datadir, version):
|
||||
self.logger = getLogger('repositories')
|
||||
self.version = version
|
||||
WeboobBrowser.set_version(version)
|
||||
|
||||
class WeboobBrowser(BaseBrowser):
|
||||
PROFILE = WeboobProfile(version)
|
||||
|
||||
self.browser = WeboobBrowser()
|
||||
|
||||
self.workdir = workdir
|
||||
self.datadir = datadir
|
||||
|
|
@ -503,10 +501,10 @@ class Repositories(object):
|
|||
for name in sorted(os.listdir(self.repos_dir)):
|
||||
path = os.path.join(self.repos_dir, name)
|
||||
try:
|
||||
repository = Repository(path)
|
||||
repository = Repository(self.browser, path)
|
||||
self.repositories.append(repository)
|
||||
except RepositoryUnavailable as e:
|
||||
print >>sys.stderr, 'Unable to load repository %s (%s), try to update repositories.' % (name, e)
|
||||
print('Unable to load repository %s (%s), try to update repositories.' % (name, e), file=sys.stderr)
|
||||
|
||||
def get_module_icon_path(self, module):
|
||||
return os.path.join(self.icons_dir, '%s.png' % module.name)
|
||||
|
|
@ -530,14 +528,13 @@ class Repositories(object):
|
|||
else:
|
||||
icon_url = module.url.replace('.tar.gz', '.png')
|
||||
|
||||
browser = WeboobBrowser()
|
||||
try:
|
||||
icon = browser.openurl(icon_url)
|
||||
icon = self.browser.open(icon_url)
|
||||
except BrowserUnavailable:
|
||||
pass # no icon, no problem
|
||||
else:
|
||||
with open(dest_path, 'wb') as fp:
|
||||
fp.write(icon.read())
|
||||
fp.write(icon.content)
|
||||
|
||||
def _parse_source_list(self):
|
||||
l = []
|
||||
|
|
@ -564,7 +561,7 @@ class Repositories(object):
|
|||
gpgv = Keyring.find_gpgv()
|
||||
for line in self._parse_source_list():
|
||||
progress.progress(0.0, 'Getting %s' % line)
|
||||
repository = Repository(line)
|
||||
repository = Repository(self.browser, line)
|
||||
filename = self.url2filename(repository.url)
|
||||
prio_filename = '%02d-%s' % (len(self.repositories), filename)
|
||||
repo_path = os.path.join(self.repos_dir, prio_filename)
|
||||
|
|
@ -587,7 +584,7 @@ class Repositories(object):
|
|||
"""
|
||||
l = []
|
||||
for line in self._parse_source_list():
|
||||
repository = Repository(line)
|
||||
repository = Repository(self.browser, line)
|
||||
filename = self.url2filename(repository.url)
|
||||
prio_filename = '%02d-%s' % (len(l), filename)
|
||||
repo_path = os.path.join(self.repos_dir, prio_filename)
|
||||
|
|
@ -657,17 +654,16 @@ class Repositories(object):
|
|||
else:
|
||||
raise ModuleInstallError('The latest version of %s is already installed' % module.name)
|
||||
|
||||
browser = WeboobBrowser()
|
||||
progress.progress(0.2, 'Downloading module...')
|
||||
try:
|
||||
tardata = browser.readurl(module.url)
|
||||
tardata = self.browser.open(module.url).content
|
||||
except BrowserUnavailable as e:
|
||||
raise ModuleInstallError('Unable to fetch module: %s' % e)
|
||||
|
||||
# Check signature
|
||||
if module.signed and Keyring.find_gpgv():
|
||||
progress.progress(0.5, 'Checking module authenticity...')
|
||||
sig_data = browser.readurl(posixpath.join(module.url + '.sig'))
|
||||
sig_data = self.browser.open(posixpath.join(module.url + '.sig')).content
|
||||
keyring_path = os.path.join(self.keyrings_dir, self.url2filename(module.repo_url))
|
||||
keyring = Keyring(keyring_path)
|
||||
if not keyring.exists():
|
||||
|
|
@ -679,7 +675,7 @@ class Repositories(object):
|
|||
if os.path.isdir(module_dir):
|
||||
shutil.rmtree(module_dir)
|
||||
progress.progress(0.7, 'Setting up module...')
|
||||
with closing(tarfile.open('', 'r:gz', StringIO(tardata))) as tar:
|
||||
with closing(tarfile.open('', 'r:gz', BytesIO(tardata))) as tar:
|
||||
tar.extractall(self.modules_dir)
|
||||
if not os.path.isdir(module_dir):
|
||||
raise ModuleInstallError('The archive for %s looks invalid.' % module.name)
|
||||
|
|
@ -776,7 +772,7 @@ class Keyring(object):
|
|||
stderr=subprocess.PIPE)
|
||||
out, err = proc.communicate(data)
|
||||
if proc.returncode or 'GOODSIG' not in out or 'VALIDSIG' not in out:
|
||||
print >>sys.stderr, out, err
|
||||
print(out, err, file=sys.stderr)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
|
|
|||
|
|
@ -18,9 +18,14 @@
|
|||
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
from threading import Event, RLock
|
||||
try:
|
||||
from threading import _Timer as Timer
|
||||
except ImportError:
|
||||
from threading import Timer
|
||||
|
||||
from threading import Timer, Event, RLock, _Timer
|
||||
from weboob.tools.log import getLogger
|
||||
from weboob.tools.misc import get_backtrace
|
||||
|
||||
|
|
@ -45,14 +50,14 @@ class IScheduler(object):
|
|||
raise NotImplementedError()
|
||||
|
||||
|
||||
class RepeatedTimer(_Timer):
|
||||
class RepeatedTimer(Timer):
|
||||
def run(self):
|
||||
while not self.finished.isSet():
|
||||
try:
|
||||
self.function(*self.args, **self.kwargs)
|
||||
except Exception:
|
||||
# do not stop timer because of an exception
|
||||
print get_backtrace()
|
||||
print(get_backtrace())
|
||||
self.finished.wait(self.interval)
|
||||
self.finished.set()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue