File size: 6,251 Bytes
30ebce4 6690db1 e92cb36 c802cee 30ebce4 e92cb36 c802cee 30ebce4 c802cee 30ebce4 c802cee 30ebce4 dbd6004 30ebce4 c802cee 30ebce4 6690db1 c802cee 30ebce4 dbd6004 30ebce4 c802cee 30ebce4 6690db1 c802cee 30ebce4 e502576 0c19562 0a15658 30ebce4 094ca20 0c19562 0a15658 30ebce4 094ca20 c802cee 30ebce4 5ce2573 fb07bab 30ebce4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
import datetime
import time
import dropbox
from dropbox.files import WriteMode
from dropbox.exceptions import ApiError, AuthError
import sys,os
import firebase_handler as fbh
TOKEN=fbh.fb_get("d2_accesstoken")
APP_KEY=os.environ['DROPBOX_APP_KEY']
APP_SECRET=os.environ['DROPBOX_APP_SECRET']
REFRESH_TOKEN=fbh.fb_get("d2_refreshtoken")
#os.environ['DROP_DIR2']="C:/dockers/chroma/chroma1/"
#os.environ['APP_PATH']="/"
print("token::",TOKEN)
with dropbox.Dropbox(oauth2_access_token=TOKEN,app_key=APP_KEY,app_secret=APP_SECRET,oauth2_refresh_token=REFRESH_TOKEN) as dbx: #,app_key=APP_KEY,app_secret=APP_SECRET,oauth2_refresh_token=REFRESH_TOKEN) as dbx:
# Check that the access token is valid
try:
dbx.users_get_current_account()
if (TOKEN != dbx._oauth2_access_token):
fbh.fb_update("d2_accesstoken",dbx._oauth2_access_token)
TOKEN=dbx._oauth2_access_token
print("dropbox connection ok,",dbx._oauth2_access_token)
print(dbx._oauth2_refresh_token)
except AuthError:
try:
dbx.check_and_refresh_access_token()
fbh.fb_update("d2_accesstoken",dbx._oauth2_access_token)
print("dropbox connection refreshed and updated",dbx._oauth2_access_token)
print(dbx._oauth2_refresh_token)
except Exception:
sys.exit("ERROR: Invalid access token; try re-generating an "
"access token from the app console on the web.")
def normalizeFilename(filename):
while '//' in filename:
filename = filename.replace('//', '/')
return filename
def getDropboxFilename(localFilename):
""" localFilename is $DROP_DIR2/<subpath>/<filename>"""
""" dropboxFilename is $APP_PATH/<subpath>/<filename"""
#if not localFilename.startswith(os.environ['DROP_DIR2']):
# localFilename=os.environ['DROP_DIR2']+localFilename
localFilename=normalizeFilename(localFilename)
return normalizeFilename(localFilename.replace(os.environ['DROP_DIR2'],"/",1).replace("/",os.environ['APP_PATH'],1))
def getLocalFilename(dropboxFilename):
""" localFilename is $DROP_DIR2/<subpath>/<filename>"""
""" dropboxFilename is $APP_PATH/<subpath>/<filename"""
#if not dropboxFilename.startswith(os.environ['APP_PATH']):
# dropboxFilename=os.environ['APP_PATH']+dropboxFilename
dropboxFilename=normalizeFilename(dropboxFilename)
return normalizeFilename(dropboxFilename.replace(os.environ['APP_PATH'],"/",1).replace("/",os.environ['DROP_DIR2'],1))
def backupFile(localFilename):
"""Upload a file.
Return the request response, or None in case of error.
This will also create directory on dropbox if needed
"""
global TOKEN
localFilename=normalizeFilename(localFilename)
dropboxFilename=getDropboxFilename(localFilename)
print("backing file ",localFilename," to ",dropboxFilename)
mode = dropbox.files.WriteMode.overwrite
mtime = os.path.getmtime(localFilename)
with open(localFilename, 'rb') as f:
data = f.read()
try:
res = dbx.files_upload(
data, dropboxFilename, mode,
client_modified=datetime.datetime(*time.gmtime(mtime)[:6]),
mute=True)
if (TOKEN != dbx._oauth2_access_token):
fbh.fb_update("d2_accesstoken",dbx._oauth2_access_token)
TOKEN=dbx._oauth2_access_token
print(dbx._oauth2_refresh_token)
except dropbox.exceptions.ApiError as err:
print('*** API error', err)
return None
print('uploaded as', res.name.encode('utf8'))
return res
def restoreFile(dropboxFilename):
"""Download a file.
Return the bytes of the file, or None if it doesn't exist.
Will create dir+subdirs if possible
"""
global TOKEN
dropboxFilename=normalizeFilename(dropboxFilename)
localFilename=getLocalFilename(dropboxFilename)
print("restoring file ",localFilename," from ",dropboxFilename)
try:
md, res = dbx.files_download(dropboxFilename)
if (TOKEN != dbx._oauth2_access_token):
fbh.fb_update("d2_accesstoken",dbx._oauth2_access_token)
TOKEN=dbx._oauth2_access_token
print(dbx._oauth2_refresh_token)
except dropbox.exceptions.HttpError as err:
print('*** HTTP error', err)
return None
data = res.content
print(len(data), 'bytes; md:', md)
localdir=os.path.dirname(localFilename)
if not os.path.exists(localdir):
os.makedirs(localdir)
with open(localFilename, 'wb') as f:
f.write(data)
return data
def backupFolder(localFolder):
""" list all files in folder and subfolder and upload them"""
print("backup folder called for ",localFolder)
if not localFolder.startswith(os.environ['DROP_DIR2']):
localFolder=os.environ['DROP_DIR2']+localFolder
filenames=[]
for (root,dirs,files) in os.walk(localFolder, topdown=True):
print(root)
for filename in files:
filenames.append(root+"/"+filename)
print(root+"/"+filename)
backupFile(root+"/"+filename)
def restoreFolder(dropboxFolder):
""" list all files in dropbox folder and subfolders and restore them"""
global TOKEN
if not dropboxFolder.startswith(os.environ['APP_PATH']):
dropboxFolder=os.environ['APP_PATH']+dropboxFolder
try:
res=dbx.files_list_folder(dropboxFolder)
if (TOKEN != dbx._oauth2_access_token):
fbh.fb_update("d2_accesstoken",dbx._oauth2_access_token)
TOKEN=dbx._oauth2_access_token
print(dbx._oauth2_refresh_token)
except dropbox.exceptions.ApiError as err:
print('Folder listing failed for', dropboxFolder, '-- assumed empty:', err)
return
except dropbox.exceptions.AuthError as err1:
print('Folder listing failed for', dropboxFolder, '-- assumed empty:', err1)
return
for entry in res.entries:
if (isinstance(entry, dropbox.files.FileMetadata)):
restoreFile(entry.path_display)
else:
try:
restoreFolder(entry.path_display)
except Exception:
print("Error restoring folder,",entry.path_display)
print(entry.path_display)
|