From 0544854eb0b2a787f53d5e38952ce4388956cd87 Mon Sep 17 00:00:00 2001 From: Nils Tekampe Date: Mon, 14 Nov 2016 21:56:44 +0100 Subject: [PATCH 1/2] added some robustness to dpbxbackend.py --- duplicity/backends/dpbxbackend.py | 38 ++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/duplicity/backends/dpbxbackend.py b/duplicity/backends/dpbxbackend.py index d7525b66..e7b882bc 100644 --- a/duplicity/backends/dpbxbackend.py +++ b/duplicity/backends/dpbxbackend.py @@ -35,6 +35,7 @@ import traceback import urllib import re +import urllib2 from dropbox import Dropbox from dropbox.exceptions import AuthError, BadInputError, ApiError @@ -57,6 +58,12 @@ DPBX_AUTORENAMED_FILE_RE = re.compile(r' \([0-9]+\)\.[^\.]+$') +def internet_on(): + try: + urllib2.urlopen('http://8.8.8.8', timeout=1) + return True + except urllib2.URLError as err: + return False def log_exception(e): log.Error('Exception [%s]:' % (e,)) @@ -98,7 +105,14 @@ def __init__(self, parsed_url): self.auth_flow = None self.login() - + def user_authenticated(self): + try: + account = self.api_client.users_get_current_account() + log.Debug("User authenticated as ,%s" % account) + return True + except: + log.Debug('User not authenticated') + return False def load_access_token(self): return os.environ.get('DPBX_ACCESS_TOKEN', None) @@ -196,6 +210,9 @@ def _put(self, source_path, remote_filename): (res_metadata.size, file_size)) def put_file_small(self, source_path, remote_path): + if not self.user_authenticated(): + self.login() + file_size = os.path.getsize(source_path.name) f = source_path.open('rb') try: @@ -212,6 +229,9 @@ def put_file_small(self, source_path, remote_path): f.close() def put_file_chunked(self, source_path, remote_path): + if not self.user_authenticated(): + self.login() + file_size = os.path.getsize(source_path.name) f = source_path.open('rb') try: @@ -295,6 +315,10 @@ def put_file_chunked(self, source_path, remote_path): log.Debug('dpbx,files_upload_session_append: %s' % e) retry_number -= 1 + + if not self.user_authenticated(): + self.login() + if retry_number == 0: raise @@ -320,6 +344,9 @@ def put_file_chunked(self, source_path, remote_path): @command() def _get(self, remote_filename, local_path): + if not self.user_authenticated(): + self.login() + remote_dir = urllib.unquote(self.parsed_url.path.lstrip('/')) remote_path = '/' + os.path.join(remote_dir, remote_filename).rstrip() @@ -353,6 +380,8 @@ def _get(self, remote_filename, local_path): @command() def _list(self): # Do a long listing to avoid connection reset + if not self.user_authenticated(): + self.login() remote_dir = '/' + urllib.unquote(self.parsed_url.path.lstrip('/')).rstrip() log.Debug('dpbx.files_list_folder(%s)' % remote_dir) @@ -373,6 +402,9 @@ def _list(self): @command() def _delete(self, filename): + if not self.user_authenticated(): + self.login() + remote_dir = urllib.unquote(self.parsed_url.path.lstrip('/')) remote_path = '/' + os.path.join(remote_dir, filename).rstrip() @@ -390,6 +422,8 @@ def _close(self): @command() def _query(self, filename): + if not self.user_authenticated(): + self.login() remote_dir = urllib.unquote(self.parsed_url.path.lstrip('/')) remote_path = '/' + os.path.join(remote_dir, filename).rstrip() @@ -399,6 +433,8 @@ def _query(self, filename): return {'size': info.size} def check_renamed_files(self, file_list): + if not self.user_authenticated(): + self.login() bad_list = [x for x in file_list if DPBX_AUTORENAMED_FILE_RE.search(x) is not None] if len(bad_list) == 0: return From 33656ff7cfed6d62e35fd0b35d01508e487b985b Mon Sep 17 00:00:00 2001 From: Nils Tekampe Date: Tue, 15 Nov 2016 14:06:39 +0100 Subject: [PATCH 2/2] stripping unnecessary code --- duplicity/backends/dpbxbackend.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/duplicity/backends/dpbxbackend.py b/duplicity/backends/dpbxbackend.py index e7b882bc..4b70e50f 100644 --- a/duplicity/backends/dpbxbackend.py +++ b/duplicity/backends/dpbxbackend.py @@ -35,7 +35,6 @@ import traceback import urllib import re -import urllib2 from dropbox import Dropbox from dropbox.exceptions import AuthError, BadInputError, ApiError @@ -58,12 +57,6 @@ DPBX_AUTORENAMED_FILE_RE = re.compile(r' \([0-9]+\)\.[^\.]+$') -def internet_on(): - try: - urllib2.urlopen('http://8.8.8.8', timeout=1) - return True - except urllib2.URLError as err: - return False def log_exception(e): log.Error('Exception [%s]:' % (e,)) @@ -217,6 +210,7 @@ def put_file_small(self, source_path, remote_path): f = source_path.open('rb') try: log.Debug('dpbx,files_upload(%s, [%d bytes])' % (remote_path, file_size)) + res_metadata = self.api_client.files_upload(f, remote_path, mode=WriteMode.overwrite, autorename=False,