def __init__(self, disk_path, user_email=None, user_name=None, sessname=None, old_sessname=None): self.disk_path = disk_path self.user_email = user_email if user_name is not None: self.user_name = user_name elif user_email is not None: self.user_name = get_user_name(user_email) else: self.user_name = None if sessname is not None: self.sessname = sessname elif user_email is not None: self.sessname = unique_sessname(user_email) else: self.sessname = None if old_sessname is not None: self.old_sessname = old_sessname elif user_email is not None: self.old_sessname = esc_sessname(user_email) else: self.old_sessname = None self._dbg_str = str(self.sessname) + "(" + self.disk_path + ")"
def restore(self): sessname = unique_sessname(self.user_email) old_sessname = esc_sessname(self.user_email) src = os.path.join(JBoxVol.BACKUP_LOC, sessname + ".tar.gz") pull_from_bucketstore = JBoxVol.pull_from_bucketstore mig_hndl = JBPluginCloud.jbox_get_plugin(JBPluginCloud.JBP_MIGRATE) if mig_hndl and mig_hndl.should_migrate(self.user_email): pull_from_bucketstore = mig_hndl.pull_from_bucketstore k = pull_from_bucketstore(src) # download from S3 if exists if not os.path.exists(src): if old_sessname is not None: src = os.path.join(JBoxVol.BACKUP_LOC, old_sessname + ".tar.gz") k = pull_from_bucketstore(src) # download from S3 if exists if not os.path.exists(src): return JBoxVol.log_info("Filtering out restore info from backup " + src + " to " + self.disk_path) src_tar = tarfile.open(src, 'r:gz') try: perms = {} for info in src_tar.getmembers(): if not info.name.startswith('juser/'): continue extract_name = info.name[6:] if (info.type == tarfile.LNKTYPE or info.type == tarfile.SYMTYPE) and \ info.linkname.startswith('juser/'): info.linkname = info.linkname[6:] if info.name.startswith('juser/.'): if JBoxVol._is_path_user_home_essential(extract_name): continue info.name = extract_name if len(info.name) == 0: continue src_tar.extract(info, self.disk_path) extracted_path = os.path.join(self.disk_path, extract_name) if os.path.isdir(extracted_path) and not os.access(extracted_path, os.W_OK): st = os.stat(extracted_path) perms[extracted_path] = st os.chmod(extracted_path, st.st_mode | stat.S_IWRITE) if len(perms) > 0: JBoxVol.log_debug("resetting permissions on %d folders", len(perms)) for extracted_path, perm in perms.iteritems(): os.chmod(extracted_path, perm) JBoxVol.log_info("Restored backup at " + self.disk_path) except IOError as ioe: if ioe.errno == errno.ENOSPC: # continue login on ENOSPC to allow user to delete files JBoxVol.log_exception("No space left to restore backup for %s", sessname) else: raise finally: src_tar.close() # delete local copy of backup if we have it on bucketstore if k is not None: os.remove(src)
def restore(self): sessname = unique_sessname(self.user_email) old_sessname = esc_sessname(self.user_email) src = os.path.join(JBoxVol.BACKUP_LOC, sessname + ".tar.gz") k = JBoxVol.pull_from_bucketstore(src) # download from S3 if exists if not os.path.exists(src): if old_sessname is not None: src = os.path.join(JBoxVol.BACKUP_LOC, old_sessname + ".tar.gz") k = JBoxVol.pull_from_bucketstore( src) # download from S3 if exists if not os.path.exists(src): return JBoxVol.log_info("Filtering out restore info from backup " + src + " to " + self.disk_path) src_tar = tarfile.open(src, 'r:gz') try: perms = {} for info in src_tar.getmembers(): if not info.name.startswith('juser/'): continue extract_name = info.name[6:] if (info.type == tarfile.LNKTYPE or info.type == tarfile.SYMTYPE) and \ info.linkname.startswith('juser/'): info.linkname = info.linkname[6:] if info.name.startswith('juser/.'): if JBoxVol._is_path_user_home_essential(extract_name): continue info.name = extract_name if len(info.name) == 0: continue src_tar.extract(info, self.disk_path) extracted_path = os.path.join(self.disk_path, extract_name) if os.path.isdir(extracted_path) and not os.access( extracted_path, os.W_OK): st = os.stat(extracted_path) perms[extracted_path] = st os.chmod(extracted_path, st.st_mode | stat.S_IWRITE) if len(perms) > 0: JBoxVol.log_debug("resetting permissions on %d folders", len(perms)) for extracted_path, perm in perms.iteritems(): os.chmod(extracted_path, perm) JBoxVol.log_info("Restored backup at " + self.disk_path) except IOError, ioe: if ioe.errno == errno.ENOSPC: # continue login on ENOSPC to allow user to delete files JBoxVol.log_exception("No space left to restore backup for %s", sessname) else: raise