Spaces:
Runtime error
Runtime error
File size: 6,262 Bytes
ebd06cc |
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 baseInfra.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)
|