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)