added backup_googledrive.py in backup_manager
This commit is contained in:
parent
d3a30d84df
commit
b0f0e7a82f
134
setup/doctype/backup_manager/backup_googledrive.py
Normal file
134
setup/doctype/backup_manager/backup_googledrive.py
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
import httplib2
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import mimetypes
|
||||||
|
import webnotes
|
||||||
|
import oauth2client.client
|
||||||
|
from webnotes.utils import get_request_site_address, get_base_path
|
||||||
|
from webnotes import _, msgprint
|
||||||
|
from apiclient.discovery import build
|
||||||
|
from apiclient.http import MediaFileUpload
|
||||||
|
|
||||||
|
@webnotes.whitelist()
|
||||||
|
def get_gdrive_authorize_url():
|
||||||
|
from conf import client_id, client_secret, oauth_scope, redirect_url
|
||||||
|
flow = get_gdrive_flow()
|
||||||
|
authorize_url = flow.step1_get_authorize_url()
|
||||||
|
return_address = get_request_site_address(True) \
|
||||||
|
+ "?cmd=setup.doctype.backup_manager.backup_googledrive.gdrive_callback"
|
||||||
|
return {
|
||||||
|
"authorize_url": authorize_url,
|
||||||
|
}
|
||||||
|
|
||||||
|
@webnotes.whitelist(allow_guest=True)
|
||||||
|
def gdrive_callback(verification_code = None):
|
||||||
|
flow = get_gdrive_flow()
|
||||||
|
if verification_code:
|
||||||
|
credentials = flow.step2_exchange(verification_code)
|
||||||
|
allowed = 1
|
||||||
|
http = httplib2.Http()
|
||||||
|
http = credentials.authorize(http)
|
||||||
|
final_credentials = credentials.to_json()
|
||||||
|
drive_service = build('drive', 'v2', http=http)
|
||||||
|
erpnext_folder_id = create_erpnext_folder(drive_service)
|
||||||
|
database_folder_id = create_folder('database', drive_service, erpnext_folder_id)
|
||||||
|
files_folder_id = create_folder('files', drive_service, erpnext_folder_id)
|
||||||
|
webnotes.msgprint(_("Google Drive Access Approved."))
|
||||||
|
webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_access_allowed", allowed)
|
||||||
|
webnotes.conn.set_value("Backup Manager", "Backup Manager", "database_folder_id", database_folder_id)
|
||||||
|
webnotes.conn.set_value("Backup Manager", "Backup Manager", "files_folder_id", files_folder_id)
|
||||||
|
webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_credentials", final_credentials)
|
||||||
|
|
||||||
|
@webnotes.whitelist()
|
||||||
|
def upload_files(name, mimetype, service, folder_id):
|
||||||
|
if not webnotes.conn:
|
||||||
|
webnotes.connect()
|
||||||
|
file_name = os.path.basename(name)
|
||||||
|
media_body = MediaFileUpload(name, mimetype=mimetype, resumable=True)
|
||||||
|
body = {
|
||||||
|
'title': file_name,
|
||||||
|
'description': 'Backup File',
|
||||||
|
'mimetype': mimetype,
|
||||||
|
'parents': [{
|
||||||
|
'kind': 'drive#filelink',
|
||||||
|
'id': folder_id
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
request = service.files().insert(body=body, media_body=media_body)
|
||||||
|
response = None
|
||||||
|
while response is None:
|
||||||
|
status, response = request.next_chunk()
|
||||||
|
|
||||||
|
def backup_to_gdrive():
|
||||||
|
from webnotes.utils.backups import new_backup
|
||||||
|
found_database = False
|
||||||
|
found_files = False
|
||||||
|
if not webnotes.conn:
|
||||||
|
webnotes.connect()
|
||||||
|
flow = get_gdrive_flow()
|
||||||
|
credentials_json = webnotes.conn.get_value("Backup Manager", None, "gdrive_credentials")
|
||||||
|
credentials = oauth2client.client.Credentials.new_from_json(credentials_json)
|
||||||
|
http = httplib2.Http()
|
||||||
|
http = credentials.authorize(http)
|
||||||
|
drive_service = build('drive', 'v2', http=http)
|
||||||
|
|
||||||
|
# upload database
|
||||||
|
backup = new_backup()
|
||||||
|
filename = os.path.basename(backup.backup_path_db)
|
||||||
|
# upload files to database folder
|
||||||
|
upload_files(filename, 'application/x-gzip', drive_service, webnotes.conn.get_value("Backup Manager", None, "database_folder_id"))
|
||||||
|
# upload files to files folder
|
||||||
|
path = os.path.join(get_base_path(),"public", "files")
|
||||||
|
for files in os.listdir(path):
|
||||||
|
filename = path + "/" + files
|
||||||
|
ext = filename.split('.')[-1]
|
||||||
|
size = os.path.getsize(filename)
|
||||||
|
if ext == 'gz' or ext == 'gzip':
|
||||||
|
mimetype = 'application/x-gzip'
|
||||||
|
else:
|
||||||
|
mimetype = mimetypes.types_map["." + ext]
|
||||||
|
#Compare Local File with Server File
|
||||||
|
param = {}
|
||||||
|
children = drive_service.children().list(folderId=webnotes.conn.get_value("Backup Manager", None, "files_folder_id"), **param).execute()
|
||||||
|
for child in children.get('items', []):
|
||||||
|
file = drive_service.files().get(fileId=child['id']).execute()
|
||||||
|
if files == file['title'] and size == int(file['fileSize']):
|
||||||
|
found_files = True
|
||||||
|
break
|
||||||
|
if not found_files:
|
||||||
|
upload_files(filename, mimetype, drive_service, webnotes.conn.get_value("Backup Manager", None, "files_folder_id"))
|
||||||
|
|
||||||
|
def get_gdrive_flow():
|
||||||
|
from oauth2client.client import OAuth2WebServerFlow
|
||||||
|
try:
|
||||||
|
from conf import client_id, client_secret, oauth_scope, redirect_url
|
||||||
|
except ImportError, e:
|
||||||
|
webnotes.msgprint(_("Please set Google Drive access keys in") + " conf.py",
|
||||||
|
raise_exception=True)
|
||||||
|
flow = OAuth2WebServerFlow(client_id, client_secret, oauth_scope, redirect_url)
|
||||||
|
return flow
|
||||||
|
|
||||||
|
def create_erpnext_folder(service):
|
||||||
|
if not webnotes.conn:
|
||||||
|
webnotes.connect()
|
||||||
|
erpnext = {
|
||||||
|
'title': 'erpnext',
|
||||||
|
'mimeType': 'application/vnd.google-apps.folder'
|
||||||
|
}
|
||||||
|
erpnext = service.files().insert(body=erpnext).execute()
|
||||||
|
return erpnext['id']
|
||||||
|
|
||||||
|
def create_folder(name, service, folder_id):
|
||||||
|
database = {
|
||||||
|
'title': name,
|
||||||
|
'mimeType': 'application/vnd.google-apps.folder',
|
||||||
|
'parents': [{
|
||||||
|
'kind': 'drive#fileLink',
|
||||||
|
'id': folder_id
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
database = service.files().insert(body=database).execute()
|
||||||
|
return database['id']
|
||||||
|
|
||||||
|
if __name__=="__main__":
|
||||||
|
backup_to_gdrive()
|
@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-03-15 11:06:59",
|
"creation": "2013-03-15 11:06:59",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-03-15 16:10:05",
|
"modified": "2013-03-15 17:27:33",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user