backup: implemented progress feedback using tar checkpoint and a temporary file for tar output
This commit is contained in:
parent
aea789d0a1
commit
fbb26d89b4
@ -1030,9 +1030,9 @@ def backup_do_copy(appvm, base_backup_dir, files_to_backup, progress_callback =
|
|||||||
if not os.path.exists (backup_dir):
|
if not os.path.exists (backup_dir):
|
||||||
raise QubesException("Strange: couldn't create backup dir: {0}?!".format(backup_dir))
|
raise QubesException("Strange: couldn't create backup dir: {0}?!".format(backup_dir))
|
||||||
'''
|
'''
|
||||||
bytes_backedup = 0
|
blocks_backedup = 0
|
||||||
|
|
||||||
progress = bytes_backedup * 100 / total_backup_sz
|
progress = blocks_backedup * 11 / total_backup_sz
|
||||||
progress_callback(progress)
|
progress_callback(progress)
|
||||||
dest_dir = backup_dir + '/' + file["subdir"]
|
dest_dir = backup_dir + '/' + file["subdir"]
|
||||||
if file["subdir"] != "":
|
if file["subdir"] != "":
|
||||||
@ -1043,7 +1043,7 @@ def backup_do_copy(appvm, base_backup_dir, files_to_backup, progress_callback =
|
|||||||
file["basename"] = os.path.basename(file["path"])
|
file["basename"] = os.path.basename(file["path"])
|
||||||
vm.run("mkdir -p {0}".format(dest_dir))
|
vm.run("mkdir -p {0}".format(dest_dir))
|
||||||
|
|
||||||
tar_cmdline = ["tar", "-PcO",'--sparse','-C','/var/lib/qubes','--checkpoint=10000']
|
tar_cmdline = ["tar", "-PczO",'--sparse','-C','/var/lib/qubes','--checkpoint=10000']
|
||||||
|
|
||||||
for filename in files_to_backup:
|
for filename in files_to_backup:
|
||||||
tar_cmdline.append(filename["path"].split("/var/lib/qubes/")[1])
|
tar_cmdline.append(filename["path"].split("/var/lib/qubes/")[1])
|
||||||
@ -1051,13 +1051,20 @@ def backup_do_copy(appvm, base_backup_dir, files_to_backup, progress_callback =
|
|||||||
|
|
||||||
retcode = vm.run(command = "cat > {0}".format(dest_dir + file["basename"]), passio_popen = True)
|
retcode = vm.run(command = "cat > {0}".format(dest_dir + file["basename"]), passio_popen = True)
|
||||||
|
|
||||||
|
import tempfile
|
||||||
|
feedback_file = tempfile.NamedTemporaryFile()
|
||||||
|
print feedback_file
|
||||||
if encrypt:
|
if encrypt:
|
||||||
compressor = subprocess.Popen (tar_cmdline,stdout=subprocess.PIPE)
|
compressor = subprocess.Popen (tar_cmdline,stdout=subprocess.PIPE,stderr=feedback_file)
|
||||||
encryptor = subprocess.Popen (["gpg2", "-c", "--force-mdc", "-o-"], stdin=compressor.stdout, stdout=retcode.stdin)
|
encryptor = subprocess.Popen (["gpg2", "-c", "--force-mdc", "-o-"], stdin=compressor.stdout, stdout=retcode.stdin)
|
||||||
|
'''
|
||||||
|
print "Wait for encryptor"
|
||||||
encryptor.wait()
|
encryptor.wait()
|
||||||
|
print "End waiting"
|
||||||
|
|
||||||
if encryptor.returncode != 0:
|
if encryptor.returncode != 0:
|
||||||
raise QubesException("Failed to backup file {0} with error {1}".format(file["basename"]))
|
raise QubesException("Failed to backup file {0} with error {1}".format(file["basename"]))
|
||||||
|
'''
|
||||||
else:
|
else:
|
||||||
compressor = subprocess.Popen (tar_cmdline,stdout=retcode.stdin)
|
compressor = subprocess.Popen (tar_cmdline,stdout=retcode.stdin)
|
||||||
|
|
||||||
@ -1071,15 +1078,34 @@ def backup_do_copy(appvm, base_backup_dir, files_to_backup, progress_callback =
|
|||||||
progress = int(match.group(1)) * 100 / total_backup_sz
|
progress = int(match.group(1)) * 100 / total_backup_sz
|
||||||
progress_callback(progress)
|
progress_callback(progress)
|
||||||
'''
|
'''
|
||||||
|
'''
|
||||||
|
print "Wait for compressor"
|
||||||
compressor.wait()
|
compressor.wait()
|
||||||
retcode.terminate()
|
print "End waiting"
|
||||||
|
'''
|
||||||
|
feedback_file_r = open(feedback_file.name,'r')
|
||||||
|
while compressor.poll()==None or (encryptor!=None and encryptor.poll()==None):
|
||||||
|
time.sleep(1)
|
||||||
|
#print "Polling:", compressor.poll(),encryptor.poll()
|
||||||
|
#print feedback_file_r.tell(),feedback_file_r.closed,feedback_file_r.name,feedback_file_r.readline()
|
||||||
|
|
||||||
|
match = re.search("tar: [^0-9]+([0-9]+)",feedback_file_r.readline())
|
||||||
|
print match
|
||||||
|
if match:
|
||||||
|
blocks_backedup = int(match.group(1))
|
||||||
|
progress = blocks_backedup * 11.024 * 1024 / total_backup_sz
|
||||||
|
#print blocks_backedup,total_backup_sz,progress
|
||||||
|
progress_callback(round(progress*100,2))
|
||||||
|
|
||||||
|
feedback_file_r.close()
|
||||||
|
feedback_file.close()
|
||||||
|
|
||||||
|
retcode.terminate()
|
||||||
|
'''
|
||||||
if compressor.returncode != 0:
|
if compressor.returncode != 0:
|
||||||
raise QubesException("Failed to backup file {0} with error {1}".format(file["basename"]))
|
raise QubesException("Failed to backup file {0} with error {1}".format(file["basename"]))
|
||||||
|
'''
|
||||||
|
|
||||||
bytes_backedup += file["size"]
|
|
||||||
progress = bytes_backedup * 100 / total_backup_sz
|
|
||||||
progress_callback(progress)
|
|
||||||
|
|
||||||
|
|
||||||
def backup_restore_set_defaults(options):
|
def backup_restore_set_defaults(options):
|
||||||
|
Loading…
Reference in New Issue
Block a user