mirror of
https://github.com/janeczku/calibre-web
synced 2024-12-25 01:20:32 +00:00
Check file/folder permissions before update
This commit is contained in:
parent
67874e07b6
commit
1a0bf45c34
@ -1671,7 +1671,8 @@ def get_updater_status():
|
||||
"9": _(u'Update failed:') + u' ' + _(u'Connection error'),
|
||||
"10": _(u'Update failed:') + u' ' + _(u'Timeout while establishing connection'),
|
||||
"11": _(u'Update failed:') + u' ' + _(u'General error'),
|
||||
"12": _(u'Update failed:') + u' ' + _(u'Update File Could Not be Saved in Temp Dir')
|
||||
"12": _(u'Update failed:') + u' ' + _(u'Update file could not be saved in temp dir'),
|
||||
"13": _(u'Update failed:') + u' ' + _(u'Files could not be replaced during update')
|
||||
}
|
||||
status['text'] = text
|
||||
updater_thread.status = 0
|
||||
|
@ -239,14 +239,13 @@ $(function() {
|
||||
dataType: "json",
|
||||
url: window.location.pathname + "/../../get_updater_status",
|
||||
success: function success(data) {
|
||||
// console.log(data.status);
|
||||
$("#DialogContent").html(updateText[data.status]);
|
||||
if (data.status > 6) {
|
||||
cleanUp();
|
||||
}
|
||||
},
|
||||
error: function error() {
|
||||
$("#DialogContent").html(updateText[7]);
|
||||
$("#DialogContent").html(updateText[11]);
|
||||
cleanUp();
|
||||
},
|
||||
timeout: 2000
|
||||
@ -442,7 +441,6 @@ $(function() {
|
||||
success: function success(data) {
|
||||
updateText = data.text;
|
||||
$("#DialogContent").html(updateText[data.status]);
|
||||
// console.log(data.status);
|
||||
updateTimerID = setInterval(updateTimer, 2000);
|
||||
}
|
||||
});
|
||||
|
@ -94,14 +94,17 @@ class Updater(threading.Thread):
|
||||
return False
|
||||
self.status = 4
|
||||
log.debug(u'Replacing files')
|
||||
self.update_source(foldername, constants.BASE_DIR)
|
||||
self.status = 6
|
||||
log.debug(u'Preparing restart of server')
|
||||
time.sleep(2)
|
||||
web_server.stop(True)
|
||||
self.status = 7
|
||||
time.sleep(2)
|
||||
return True
|
||||
if self.update_source(foldername, constants.BASE_DIR):
|
||||
self.status = 6
|
||||
log.debug(u'Preparing restart of server')
|
||||
time.sleep(2)
|
||||
web_server.stop(True)
|
||||
self.status = 7
|
||||
time.sleep(2)
|
||||
return True
|
||||
else:
|
||||
self.status = 13
|
||||
|
||||
except requests.exceptions.HTTPError as ex:
|
||||
log.error(u'HTTP Error %s', ex)
|
||||
self.status = 8
|
||||
@ -181,6 +184,28 @@ class Updater(threading.Thread):
|
||||
rf.append(item)
|
||||
return rf
|
||||
|
||||
@classmethod
|
||||
def check_permissions(cls, root_src_dir, root_dst_dir):
|
||||
access = True
|
||||
remove_path = len(root_src_dir) + 1
|
||||
for src_dir, __, files in os.walk(root_src_dir):
|
||||
root_dir = os.path.join(root_dst_dir, src_dir[remove_path:])
|
||||
# Skip non existing folders on check
|
||||
if not os.path.isdir(root_dir): # root_dir.lstrip(os.sep).startswith('.') or
|
||||
continue
|
||||
if not os.access(root_dir, os.R_OK|os.W_OK):
|
||||
log.debug("Missing permissions for {}".format(root_dir))
|
||||
access = False
|
||||
for file_ in files:
|
||||
curr_file = os.path.join(root_dir, file_)
|
||||
# Skip non existing files on check
|
||||
if not os.path.isfile(curr_file): # or curr_file.startswith('.'):
|
||||
continue
|
||||
if not os.access(curr_file, os.R_OK|os.W_OK):
|
||||
log.debug("Missing permissions for {}".format(curr_file))
|
||||
access = False
|
||||
return access
|
||||
|
||||
@classmethod
|
||||
def moveallfiles(cls, root_src_dir, root_dst_dir):
|
||||
new_permissions = os.stat(root_dst_dir)
|
||||
@ -269,20 +294,25 @@ class Updater(threading.Thread):
|
||||
|
||||
remove_items = self.reduce_dirs(rf, new_list)
|
||||
|
||||
self.moveallfiles(source, destination)
|
||||
if self.check_permissions(source, destination):
|
||||
self.moveallfiles(source, destination)
|
||||
|
||||
for item in remove_items:
|
||||
item_path = os.path.join(destination, item[1:])
|
||||
if os.path.isdir(item_path):
|
||||
log.debug("Delete dir %s", item_path)
|
||||
shutil.rmtree(item_path, ignore_errors=True)
|
||||
else:
|
||||
try:
|
||||
os.remove(item_path)
|
||||
log.debug("Delete file %s", item_path)
|
||||
except OSError:
|
||||
log.debug("Could not remove: %s", item_path)
|
||||
shutil.rmtree(source, ignore_errors=True)
|
||||
for item in remove_items:
|
||||
item_path = os.path.join(destination, item[1:])
|
||||
if os.path.isdir(item_path):
|
||||
log.debug("Delete dir %s", item_path)
|
||||
shutil.rmtree(item_path, ignore_errors=True)
|
||||
else:
|
||||
try:
|
||||
os.remove(item_path)
|
||||
log.debug("Delete file %s", item_path)
|
||||
except OSError:
|
||||
log.debug("Could not remove: %s", item_path)
|
||||
shutil.rmtree(source, ignore_errors=True)
|
||||
return True
|
||||
else:
|
||||
log.debug("Permissions missing for update")
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def is_venv():
|
||||
@ -572,5 +602,5 @@ class Updater(threading.Thread):
|
||||
status['message'] = _(u'Timeout while establishing connection')
|
||||
except (requests.exceptions.RequestException, ValueError):
|
||||
status['message'] = _(u'General error')
|
||||
log.debug('Updater status: %s', status['message'])
|
||||
log.debug('Updater status: {}'.format(status['message'] or "OK"))
|
||||
return status, commit
|
||||
|
Loading…
Reference in New Issue
Block a user