From 08bd6776640a0659e8f7e49da47c6250396799a0 Mon Sep 17 00:00:00 2001 From: webnotes Date: Mon, 11 Mar 2013 10:43:33 +0530 Subject: [PATCH 1/4] Commit all these files. --- .../doctype/backup_manager/backup_dropbox.py | 65 +++++++++---------- .../doctype/backup_manager/backup_manager.py | 8 ++- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/setup/doctype/backup_manager/backup_dropbox.py b/setup/doctype/backup_manager/backup_dropbox.py index 3b0857fdd9..0cd82c9601 100644 --- a/setup/doctype/backup_manager/backup_dropbox.py +++ b/setup/doctype/backup_manager/backup_dropbox.py @@ -1,6 +1,9 @@ import os import webnotes -from webnotes.utils import get_request_site_address +from webnotes.utils import get_request_site_address, get_base_path +from webnotes import _ + +filename = '' @webnotes.whitelist() def get_dropbox_authorize_url(): @@ -9,8 +12,7 @@ def get_dropbox_authorize_url(): return_address = get_request_site_address(True) \ + "?cmd=setup.doctype.backup_manager.backup_dropbox.dropbox_callback" - url = sess.build_authorize_url(request_token, return_address) - + url = sess.build_authorize_url(request_token, return_address) return { "url": url, "key": request_token.key, @@ -49,7 +51,7 @@ def dropbox_callback(oauth_token=None, not_approved=False): webnotes.response['page_name'] = 'message.html' def backup_to_dropbox(): - from dropbox import client, session + from dropbox import client, session, rest from conf import dropbox_access_key, dropbox_secret_key from webnotes.utils.backups import new_backup if not webnotes.conn: @@ -67,22 +69,19 @@ def backup_to_dropbox(): backup = new_backup() filename = backup.backup_path_db upload_file_to_dropbox(filename, "database", dropbox_client) - # upload files - response = dropbox_client.metadata("files") - - - # add missing files - for filename in os.listdir(os.path.join("public", "files")): - found = False - for file_metadata in response["contents"]: - if filename==os.path.basename(file_metadata["path"]): - if os.stat(os.path.join("public", "files", filename)).st_size==file_metadata["bytes"]: - found=True - - if not found: - upload_file_to_dropbox(os.path.join("public", "files", filename), "files", dropbox_client) + response = dropbox_client.metadata("/database") + #add missing files + # for filename in os.listdir(filename): + # found = False + # for file_metadata in response["contents"]: + # if filename==os.path.basename(file_metadata["path"]): + # if os.stat(filename).st_size==file_metadata["bytes"]: + # found=True + + # if not found: + # upload_file_to_dropbox(filename, "database", dropbox_client) def get_dropbox_session(): from dropbox import session @@ -91,25 +90,25 @@ def get_dropbox_session(): except ImportError, e: webnotes.msgprint(_("Please set Dropbox access keys in") + " conf.py", raise_exception=True) - sess = session.DropboxSession(dropbox_access_key, dropbox_secret_key, "app_folder") return sess def upload_file_to_dropbox(filename, folder, dropbox_client): - if __name__=="__main__": - print "Uploading " + filename - size = os.stat(filename).st_size - f = open(filename,'r') - - if size > 4194304: - uploader = dropbox_client.get_chunked_uploader(f, size) - while uploader.offset < size: - try: - uploader.upload_chunked() - except rest.ErrorResponse, e: - pass - else: - response = dropbox_client.put_file(folder + "/" + os.path.basename(filename), f, overwrite=True) + path = os.path.join(get_base_path(),"public", "backups") + for files in os.listdir(path): + file_name = path + "/" + files + size = os.stat(file_name).st_size + f = open(filename,'r') + + if size > 4194304: + uploader = dropbox_client.get_chunked_uploader(f, size) + while uploader.offset < size: + try: + uploader.upload_chunked() + except rest.ErrorResponse, e: + pass + else: + response = dropbox_client.put_file(folder + "/" + os.path.basename(file_name), f, overwrite=True) if __name__=="__main__": backup_to_dropbox() \ No newline at end of file diff --git a/setup/doctype/backup_manager/backup_manager.py b/setup/doctype/backup_manager/backup_manager.py index 48d48e817c..ed2c64b0b9 100644 --- a/setup/doctype/backup_manager/backup_manager.py +++ b/setup/doctype/backup_manager/backup_manager.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import webnotes from webnotes import _ +from backup_dropbox import dropbox_callback, get_dropbox_session, get_dropbox_authorize_url class DocType: def __init__(self, d, dl): @@ -26,7 +27,6 @@ def take_backups(): send_email(True, "Dropbox") except Exception, e: send_email(False, "Dropbox", e) - def send_email(success, service_name, error_status=None): if success: subject = "Backup Upload Successful" @@ -44,5 +44,7 @@ def send_email(success, service_name, error_status=None): # email system managers from webnotes.utils.email_lib import sendmail - sendmail(webnotes.conn.get_value("Backup Manager", None, "send_notifications_to").split(","), - subject=subject, msg=message) + sendmail(webnotes.conn.get_value("Backup Manager", None, "send_notifications_to").split(","), + subject=subject, msg=message) + +get_dropbox_authorize_url() \ No newline at end of file From 479af526b023dbf07e45ebe7595503a97d09ef3d Mon Sep 17 00:00:00 2001 From: Akhilesh Darjee Date: Fri, 15 Mar 2013 16:17:31 +0530 Subject: [PATCH 2/4] Backup commited. --- .../doctype/backup_manager/backup_dropbox.py | 77 +++++++++---------- .../doctype/backup_manager/backup_manager.js | 68 ++++++++++++---- .../doctype/backup_manager/backup_manager.py | 23 ++++-- .../doctype/backup_manager/backup_manager.txt | 72 ++++++++++++++++- 4 files changed, 178 insertions(+), 62 deletions(-) diff --git a/setup/doctype/backup_manager/backup_dropbox.py b/setup/doctype/backup_manager/backup_dropbox.py index 0cd82c9601..6cdae7aa1b 100644 --- a/setup/doctype/backup_manager/backup_dropbox.py +++ b/setup/doctype/backup_manager/backup_dropbox.py @@ -3,8 +3,6 @@ import webnotes from webnotes.utils import get_request_site_address, get_base_path from webnotes import _ -filename = '' - @webnotes.whitelist() def get_dropbox_authorize_url(): sess = get_dropbox_session() @@ -12,7 +10,8 @@ def get_dropbox_authorize_url(): return_address = get_request_site_address(True) \ + "?cmd=setup.doctype.backup_manager.backup_dropbox.dropbox_callback" - url = sess.build_authorize_url(request_token, return_address) + url = sess.build_authorize_url(request_token, return_address) + return { "url": url, "key": request_token.key, @@ -21,31 +20,32 @@ def get_dropbox_authorize_url(): @webnotes.whitelist(allow_guest=True) def dropbox_callback(oauth_token=None, not_approved=False): + from dropbox import client if not not_approved: if webnotes.conn.get_value("Backup Manager", None, "dropbox_access_key")==oauth_token: - webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_allowed", 1) + allowed = 1 message = "Dropbox access allowed." sess = get_dropbox_session() sess.set_request_token(webnotes.conn.get_value("Backup Manager", None, "dropbox_access_key"), webnotes.conn.get_value("Backup Manager", None, "dropbox_access_secret")) access_token = sess.obtain_access_token() + webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_key", access_token.key) + webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_secret", access_token.secret) + webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_allowed", allowed) + dropbox_client = client.DropboxClient(sess) + dropbox_client.file_create_folder("files") - webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_key", - access_token.key) - webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_secret", - access_token.secret) - else: - webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_allowed", 0) + allowed = 0 message = "Illegal Access Token Please try again." else: - webnotes.conn.set_value("Backup Manager", "Backup Manager", "dropbox_access_allowed", 0) + allowed = 0 message = "Dropbox Access not approved." - + webnotes.message_title = "Dropbox Approval" webnotes.message = "

%s

Please close this window.

" % message - + webnotes.conn.commit() webnotes.response['type'] = 'page' webnotes.response['page_name'] = 'message.html' @@ -57,7 +57,6 @@ def backup_to_dropbox(): if not webnotes.conn: webnotes.connect() - sess = session.DropboxSession(dropbox_access_key, dropbox_secret_key, "app_folder") sess.set_token(webnotes.conn.get_value("Backup Manager", None, "dropbox_access_key"), @@ -69,19 +68,20 @@ def backup_to_dropbox(): backup = new_backup() filename = backup.backup_path_db upload_file_to_dropbox(filename, "database", dropbox_client) - # upload files - response = dropbox_client.metadata("/database") - #add missing files - # for filename in os.listdir(filename): - # found = False - # for file_metadata in response["contents"]: - # if filename==os.path.basename(file_metadata["path"]): - # if os.stat(filename).st_size==file_metadata["bytes"]: - # found=True + response = dropbox_client.metadata("/files") + + # upload files to files folder + filename = os.path.join(get_base_path(),"public", "files") + for filename in os.listdir(filename): + found = False + for file_metadata in response["contents"]: + if filename==os.path.basename(file_metadata["path"]): + if os.stat(filename).st_size==file_metadata["bytes"]: + found=True - # if not found: - # upload_file_to_dropbox(filename, "database", dropbox_client) + if not found: + upload_file_to_dropbox(os.path.join(get_base_path(),"public", "files", filename), "files", dropbox_client) def get_dropbox_session(): from dropbox import session @@ -94,21 +94,18 @@ def get_dropbox_session(): return sess def upload_file_to_dropbox(filename, folder, dropbox_client): - path = os.path.join(get_base_path(),"public", "backups") - for files in os.listdir(path): - file_name = path + "/" + files - size = os.stat(file_name).st_size - f = open(filename,'r') - - if size > 4194304: - uploader = dropbox_client.get_chunked_uploader(f, size) - while uploader.offset < size: - try: - uploader.upload_chunked() - except rest.ErrorResponse, e: - pass - else: - response = dropbox_client.put_file(folder + "/" + os.path.basename(file_name), f, overwrite=True) + size = os.stat(filename).st_size + f = open(filename,'r') + if size > 4194304: + uploader = dropbox_client.get_chunked_uploader(f, size) + while uploader.offset < size: + try: + uploader.upload_chunked() + finish(folder + '/' + os.path.basename(filename), overwrite='True') + except rest.ErrorResponse, e: + pass + else: + response = dropbox_client.put_file(folder + "/" + os.path.basename(filename), f, overwrite=True) if __name__=="__main__": backup_to_dropbox() \ No newline at end of file diff --git a/setup/doctype/backup_manager/backup_manager.js b/setup/doctype/backup_manager/backup_manager.js index 154c72ec0e..073e0a0906 100644 --- a/setup/doctype/backup_manager/backup_manager.js +++ b/setup/doctype/backup_manager/backup_manager.js @@ -1,24 +1,66 @@ +cur_frm.cscript.refresh = function(doc) { + cur_frm.disable_save(); +} + +//dropbox cur_frm.cscript.allow_dropbox_access = function(doc) { - wn.call({ - method: "setup.doctype.backup_manager.backup_dropbox.get_dropbox_authorize_url", - callback: function(r) { - if(!r.exc) { - cur_frm.set_value("dropbox_access_secret", r.message.secret); - cur_frm.set_value("dropbox_access_key", r.message.key); - cur_frm.save(null, function() { - window.open(r.message.url); - }); + if (doc.send_notifications_to == '') { + msgprint("Please enter email address.") + } + else { + wn.call({ + method: "setup.doctype.backup_manager.backup_dropbox.get_dropbox_authorize_url", + callback: function(r) { + if(!r.exc) { + cur_frm.set_value("dropbox_access_secret", r.message.secret); + cur_frm.set_value("dropbox_access_key", r.message.key); + cur_frm.save(null, function() { + window.open(r.message.url); + }); + } } - } - }) + }) + } } cur_frm.cscript.backup_right_now = function(doc) { msgprint("Backing up and uploading. This may take a few minutes.") wn.call({ - method: "setup.doctype.backup_manager.backup_manager.take_backups", + method: "setup.doctype.backup_manager.backup_manager.take_backups_dropbox", callback: function(r) { msgprint("Backups taken. Please check your email for the response.") } }) -} \ No newline at end of file +} +//gdrive +cur_frm.cscript.allow_gdrive_access = function(doc) { + if (doc.send_notifications_to == '') { + msgprint("Please enter email address.") + } + else { + wn.call({ + method: "setup.doctype.backup_manager.backup_googledrive.get_gdrive_authorize_url", + callback: function(r) { + window.open(r.message.authorize_url); + } + }) + } +} + +cur_frm.cscript.validate_gdrive_code = function(doc) { + wn.call({ + method: "setup.doctype.backup_manager.backup_manager.gdrive_callback", + args: { + verification_code: doc.verification_code + }, + }); +} +// cur_frm.cscript.backup_to_gdrive = function(doc) { +// msgprint("Backing up and uploading. This may take a few minutes.") +// wn.call({ +// method: "setup.doctype.backup_manager.backup_manager.take_backups_gdrive", +// callback: function(r) { +// msgprint("Backups taken. Please check your email for the response.") +// } +// }) +// } \ No newline at end of file diff --git a/setup/doctype/backup_manager/backup_manager.py b/setup/doctype/backup_manager/backup_manager.py index ed2c64b0b9..71d8ad7625 100644 --- a/setup/doctype/backup_manager/backup_manager.py +++ b/setup/doctype/backup_manager/backup_manager.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import webnotes from webnotes import _ from backup_dropbox import dropbox_callback, get_dropbox_session, get_dropbox_authorize_url +from backup_googledrive import gdrive_callback, get_gdrive_flow, get_gdrive_authorize_url class DocType: def __init__(self, d, dl): @@ -17,16 +18,28 @@ def take_backups_weekly(): def take_backups_if(freq): if webnotes.conn.get_value("Backup Manager", None, "upload_backups_to_dropbox")==freq: - take_backups() - + take_backups_dropbox() + take_backups_gdrive() +#backup to dropbox @webnotes.whitelist() -def take_backups(): +def take_backups_dropbox(): try: from setup.doctype.backup_manager.backup_dropbox import backup_to_dropbox backup_to_dropbox() send_email(True, "Dropbox") except Exception, e: send_email(False, "Dropbox", e) + +#backup to gdrive +@webnotes.whitelist() +def take_backups_gdrive(): + try: + from setup.doctype.backup_manager.backup_googledrive import backup_to_gdrive + backup_to_gdrive() + send_email(True, "Google Drive") + except Exception, e: + send_email(False, "Google Drive", e) + def send_email(success, service_name, error_status=None): if success: subject = "Backup Upload Successful" @@ -45,6 +58,4 @@ def send_email(success, service_name, error_status=None): # email system managers from webnotes.utils.email_lib import sendmail sendmail(webnotes.conn.get_value("Backup Manager", None, "send_notifications_to").split(","), - subject=subject, msg=message) - -get_dropbox_authorize_url() \ No newline at end of file + subject=subject, msg=message) \ No newline at end of file diff --git a/setup/doctype/backup_manager/backup_manager.txt b/setup/doctype/backup_manager/backup_manager.txt index a994e7da53..bdb9c50605 100644 --- a/setup/doctype/backup_manager/backup_manager.txt +++ b/setup/doctype/backup_manager/backup_manager.txt @@ -1,8 +1,8 @@ [ { - "creation": "2013-03-05 16:35:50", + "creation": "2013-03-15 11:06:59", "docstatus": 0, - "modified": "2013-03-07 12:18:07", + "modified": "2013-03-15 16:10:05", "modified_by": "Administrator", "owner": "Administrator" }, @@ -56,7 +56,9 @@ "doctype": "DocField", "fieldname": "backup_right_now", "fieldtype": "Button", - "label": "Backup Right Now" + "hidden": 1, + "label": "Backup Right Now", + "read_only": 1 }, { "description": "Note: Backups and files are not deleted from Dropbox, you will have to delete them manually.", @@ -102,6 +104,70 @@ "fieldtype": "Button", "label": "Allow Dropbox Access" }, + { + "description": "Note: Backups and files are not deleted from Google Drive, you will have to delete them manually.", + "doctype": "DocField", + "fieldname": "sync_with_gdrive", + "fieldtype": "Section Break", + "label": "Sync with Google Drive" + }, + { + "doctype": "DocField", + "fieldname": "upload_backups_to_gdrive", + "fieldtype": "Select", + "label": "Upload Backups to Google Drive", + "options": "Never\nDaily\nWeekly" + }, + { + "doctype": "DocField", + "fieldname": "allow_gdrive_access", + "fieldtype": "Button", + "label": "Allow Google Drive Access" + }, + { + "doctype": "DocField", + "fieldname": "verification_code", + "fieldtype": "Data", + "label": "Enter Verification Code" + }, + { + "doctype": "DocField", + "fieldname": "validate_gdrive", + "fieldtype": "Button", + "label": "Validate" + }, + { + "doctype": "DocField", + "fieldname": "gdrive_access_allowed", + "fieldtype": "Check", + "hidden": 1, + "label": "Google Drive Access Allowed", + "read_only": 1 + }, + { + "doctype": "DocField", + "fieldname": "gdrive_credentials", + "fieldtype": "Text", + "hidden": 1, + "label": "Credentials", + "read_only": 1 + }, + { + "doctype": "DocField", + "fieldname": "database_folder_id", + "fieldtype": "Data", + "hidden": 1, + "label": "Database Folder ID", + "read_only": 1 + }, + { + "doctype": "DocField", + "fieldname": "files_folder_id", + "fieldtype": "Data", + "hidden": 1, + "label": "Files Folder ID", + "read_only": 1 + }, { "doctype": "DocPerm" } From b0f0e7a82f2f5e2ed765e17b16c5d9241c98755c Mon Sep 17 00:00:00 2001 From: Akhilesh Darjee Date: Mon, 18 Mar 2013 11:15:44 +0530 Subject: [PATCH 3/4] added backup_googledrive.py in backup_manager --- .../backup_manager/backup_googledrive.py | 134 ++++++++++++++++++ .../doctype/backup_manager/backup_manager.txt | 2 +- 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 setup/doctype/backup_manager/backup_googledrive.py diff --git a/setup/doctype/backup_manager/backup_googledrive.py b/setup/doctype/backup_manager/backup_googledrive.py new file mode 100644 index 0000000000..b1cb73a6d0 --- /dev/null +++ b/setup/doctype/backup_manager/backup_googledrive.py @@ -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() \ No newline at end of file diff --git a/setup/doctype/backup_manager/backup_manager.txt b/setup/doctype/backup_manager/backup_manager.txt index bdb9c50605..9a43f34746 100644 --- a/setup/doctype/backup_manager/backup_manager.txt +++ b/setup/doctype/backup_manager/backup_manager.txt @@ -2,7 +2,7 @@ { "creation": "2013-03-15 11:06:59", "docstatus": 0, - "modified": "2013-03-15 16:10:05", + "modified": "2013-03-15 17:27:33", "modified_by": "Administrator", "owner": "Administrator" }, From edf639b607bf7ceb2dc047f6dcd424dcdef62d04 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Mar 2013 12:48:34 +0530 Subject: [PATCH 4/4] fixed backup/gdrive --- .../doctype/backup_manager/backup_dropbox.py | 15 +++- .../backup_manager/backup_googledrive.py | 87 ++++++++++++------- .../doctype/backup_manager/backup_manager.js | 19 ++-- .../doctype/backup_manager/backup_manager.py | 4 +- 4 files changed, 82 insertions(+), 43 deletions(-) diff --git a/setup/doctype/backup_manager/backup_dropbox.py b/setup/doctype/backup_manager/backup_dropbox.py index 6cdae7aa1b..2c7fda6ca9 100644 --- a/setup/doctype/backup_manager/backup_dropbox.py +++ b/setup/doctype/backup_manager/backup_dropbox.py @@ -1,3 +1,13 @@ +# SETUP: +# install pip install --upgrade dropbox +# +# Create new Dropbox App +# +# in conf.py, set oauth2 settings +# dropbox_access_key +# dropbox_access_secret + + import os import webnotes from webnotes.utils import get_request_site_address, get_base_path @@ -66,13 +76,14 @@ def backup_to_dropbox(): # upload database backup = new_backup() - filename = backup.backup_path_db + filename = os.path.join(get_base_path(), "public", "backups", + os.path.basename(backup.backup_path_db)) upload_file_to_dropbox(filename, "database", dropbox_client) response = dropbox_client.metadata("/files") # upload files to files folder - filename = os.path.join(get_base_path(),"public", "files") + filename = os.path.join(get_base_path(), "public", "files") for filename in os.listdir(filename): found = False for file_metadata in response["contents"]: diff --git a/setup/doctype/backup_manager/backup_googledrive.py b/setup/doctype/backup_manager/backup_googledrive.py index b1cb73a6d0..c794672de5 100644 --- a/setup/doctype/backup_manager/backup_googledrive.py +++ b/setup/doctype/backup_manager/backup_googledrive.py @@ -1,3 +1,15 @@ +# SETUP: +# install pip install --upgrade google-api-python-client +# +# In Google API +# - create new API project +# - create new oauth2 client (create installed app type as google \ +# does not support subdomains) +# +# in conf.py, set oauth2 settings +# gdrive_client_id +# gdrive_client_secret + import httplib2 import sys import os @@ -11,34 +23,12 @@ 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: @@ -74,11 +64,15 @@ def backup_to_gdrive(): # upload database backup = new_backup() - filename = os.path.basename(backup.backup_path_db) + path = os.path.join(get_base_path(), "public", "backups") + filename = os.path.join(path, 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(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") + path = os.path.join(get_base_path(), "public", "files") for files in os.listdir(path): filename = path + "/" + files ext = filename.split('.')[-1] @@ -89,7 +83,9 @@ def backup_to_gdrive(): 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() + 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']): @@ -100,13 +96,44 @@ def backup_to_gdrive(): def get_gdrive_flow(): from oauth2client.client import OAuth2WebServerFlow - try: - from conf import client_id, client_secret, oauth_scope, redirect_url - except ImportError, e: + import conf + + if not hasattr(conf, "gdrive_client_id"): webnotes.msgprint(_("Please set Google Drive access keys in") + " conf.py", raise_exception=True) - flow = OAuth2WebServerFlow(client_id, client_secret, oauth_scope, redirect_url) + + #callback_url = get_request_site_address(True) \ + # + "?cmd=setup.doctype.backup_manager.backup_googledrive.googledrive_callback" + + # for installed apps since google does not support subdomains + redirect_uri = "urn:ietf:wg:oauth:2.0:oob" + + flow = OAuth2WebServerFlow(conf.gdrive_client_id, conf.gdrive_client_secret, + "https://www.googleapis.com/auth/drive", redirect_uri) return flow + +@webnotes.whitelist() +def gdrive_callback(verification_code = None): + flow = get_gdrive_flow() + if verification_code: + credentials = flow.step2_exchange(verification_code) + allowed = 1 + + # make folders to save id + http = httplib2.Http() + http = credentials.authorize(http) + 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.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) + final_credentials = credentials.to_json() + webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_credentials", final_credentials) + + webnotes.msgprint("Updated") def create_erpnext_folder(service): if not webnotes.conn: diff --git a/setup/doctype/backup_manager/backup_manager.js b/setup/doctype/backup_manager/backup_manager.js index 073e0a0906..28315c5bc5 100644 --- a/setup/doctype/backup_manager/backup_manager.js +++ b/setup/doctype/backup_manager/backup_manager.js @@ -47,7 +47,7 @@ cur_frm.cscript.allow_gdrive_access = function(doc) { } } -cur_frm.cscript.validate_gdrive_code = function(doc) { +cur_frm.cscript.validate_gdrive = function(doc) { wn.call({ method: "setup.doctype.backup_manager.backup_manager.gdrive_callback", args: { @@ -55,12 +55,11 @@ cur_frm.cscript.validate_gdrive_code = function(doc) { }, }); } -// cur_frm.cscript.backup_to_gdrive = function(doc) { -// msgprint("Backing up and uploading. This may take a few minutes.") -// wn.call({ -// method: "setup.doctype.backup_manager.backup_manager.take_backups_gdrive", -// callback: function(r) { -// msgprint("Backups taken. Please check your email for the response.") -// } -// }) -// } \ No newline at end of file + +cur_frm.cscript.upload_backups_to_dropbox = function(doc) { + cur_frm.save() +} + +cur_frm.cscript.upload_backups_to_gdrive = function(doc) { + cur_frm.save() +} diff --git a/setup/doctype/backup_manager/backup_manager.py b/setup/doctype/backup_manager/backup_manager.py index 71d8ad7625..213aa85500 100644 --- a/setup/doctype/backup_manager/backup_manager.py +++ b/setup/doctype/backup_manager/backup_manager.py @@ -19,8 +19,10 @@ def take_backups_weekly(): def take_backups_if(freq): if webnotes.conn.get_value("Backup Manager", None, "upload_backups_to_dropbox")==freq: take_backups_dropbox() + + if webnotes.conn.get_value("Backup Manager", None, "upload_backups_to_gdrive")==freq: take_backups_gdrive() -#backup to dropbox + @webnotes.whitelist() def take_backups_dropbox(): try: