Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-
- #
- # Copyright 2011 Carlos Abalde <carlos.abalde@gmail.com>
- #
- # This file was originally part of duplicity.
- #
- # Duplicity is free software; you can redistribute it and/or modify it
- # under the terms of the GNU General Public License as published by the
- # Free Software Foundation; either version 2 of the License, or (at your
- # option) any later version.
- #
- # Duplicity is distributed in the hope that it will be useful, but
- # WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- # General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with duplicity; if not, write to the Free Software Foundation,
- # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- import os.path
- import string
- import urllib
- class GDocsBackend():
- """Connect to remote store using Google Google Documents List API"""
- ROOT_FOLDER_ID = 'folder%3Aroot'
- BACKUP_DOCUMENT_TYPE = 'application/binary'
- def __init__(self):
- # Import Google Data APIs libraries.
- try:
- global atom
- global gdata
- import atom.data
- import gdata.client
- import gdata.docs.client
- import gdata.docs.data
- except ImportError:
- raise BackendException('Google Docs backend requires Google Data APIs Python '
- 'Client Library (see http://code.google.com/p/gdata-python-client/).')
- # Setup client instance.
- self.client = gdata.docs.client.DocsClient(source='duplicity 0.7.01')
- self.client.ssl = True
- self.client.http_client.debug = False
- self._authorize('USERNAME' + '@' + 'DOMAIN', 'PASSWORD')
- # Fetch destination folder entry (and crete hierarchy if required).
- folder_names = [ 'test-gdata' ];
- parent_folder = None
- parent_folder_id = GDocsBackend.ROOT_FOLDER_ID
- for folder_name in folder_names:
- entries = self._fetch_entries(parent_folder_id, 'folder', folder_name)
- if entries is not None:
- if len(entries) == 1:
- parent_folder = entries[0]
- elif len(entries) == 0:
- folder = gdata.docs.data.Resource(type='folder', title=folder_name)
- parent_folder = self.client.create_resource(folder, collection=parent_folder)
- else:
- parent_folder = None
- if parent_folder:
- parent_folder_id = parent_folder.resource_id.text
- else:
- raise BackendException("Error while creating destination folder '%s'." % folder_name)
- else:
- raise BackendException("Error while fetching destination folder '%s'." % folder_name)
- self.folder = parent_folder
- def _get(self, remote_filename, local_path):
- entries = self._fetch_entries(self.folder.resource_id.text,
- GDocsBackend.BACKUP_DOCUMENT_TYPE,
- remote_filename)
- if len(entries) == 1:
- entry = entries[0]
- self.client.DownloadResource(entry, local_path) #.name)
- else:
- raise BackendException("Failed to find file '%s' in remote folder '%s'"
- % (remote_filename, self.folder.title.text))
- def _authorize(self, email, password, captcha_token=None, captcha_response=None):
- try:
- self.client.client_login(email,
- password,
- source='duplicity 0.7.01',
- service='writely',
- captcha_token=captcha_token,
- captcha_response=captcha_response)
- except gdata.client.CaptchaChallenge as challenge:
- print('A captcha challenge in required. Please visit ' + challenge.captcha_url)
- answer = None
- while not answer:
- answer = raw_input('Answer to the challenge? ')
- self._authorize(email, password, challenge.captcha_token, answer)
- except gdata.client.BadAuthentication:
- raise BackendException('Invalid user credentials given. Be aware that accounts '
- 'that use 2-step verification require creating an application specific '
- 'access code for using this Duplicity backend. Follow the instruction in '
- 'http://www.google.com/support/accounts/bin/static.py?page=guide.cs&guide=1056283&topic=1056286 '
- 'and create your application-specific password to run duplicity backups.')
- def _fetch_entries(self, folder_id, type, title=None):
- # Build URI.
- uri = '/feeds/default/private/full/%s/contents' % folder_id
- if type == 'folder':
- uri += '/-/folder?showfolders=true'
- elif type == GDocsBackend.BACKUP_DOCUMENT_TYPE:
- uri += '?showfolders=false'
- else:
- uri += '?showfolders=true'
- if title:
- uri += '&title=' + urllib.quote(title) + '&title-exact=true'
- # Fetch entries.
- entries = self.client.get_all_resources(uri=uri)
- # Done!
- return entries
- g=GDocsBackend()
- g._get('bigvid.avi', '/mnt/bigstore/tmp/testbigdownload.avi')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement