backups: fix handling of unicode in error messages, clean up "ERROR:" prefix usage

When non-english language is set, some processes can output non-ASCII
characters in error messages. Handle them nicely.

Also make error messages more consistent about "ERROR:" prefix. Do not
use this prefix in QubesException message, add it just before showing
the message to the user.
This commit is contained in:
Marek Marczykowski-Górecki 2014-09-17 14:34:45 +02:00
parent 228ae07543
commit ec74ebdc32

View File

@ -21,7 +21,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# #
# #
from __future__ import unicode_literals
from qubes import QubesException,QubesVmCollection from qubes import QubesException,QubesVmCollection
from qubes import QubesVmClasses from qubes import QubesVmClasses
from qubes import system_path,vm_files from qubes import system_path,vm_files
@ -339,7 +339,7 @@ def backup_prepare(vms_list = None, exclude_list = None,
for fileinfo in files_to_backup: for fileinfo in files_to_backup:
assert len(fileinfo["subdir"]) == 0 or fileinfo["subdir"][-1] == '/', \ assert len(fileinfo["subdir"]) == 0 or fileinfo["subdir"][-1] == '/', \
"'subdir' must ends with a '/': %s" % str(fileinfo) "'subdir' must ends with a '/': %s" % unicode(fileinfo)
return files_to_backup return files_to_backup
@ -845,7 +845,7 @@ class ExtractWorker(Process):
except OSError: except OSError:
pass pass
process.wait() process.wait()
self.error_callback(str(e)) self.error_callback("ERROR: " + unicode(e))
raise e, None, exc_traceback raise e, None, exc_traceback
def __run__(self): def __run__(self):
@ -881,7 +881,8 @@ class ExtractWorker(Process):
self.restore_pipe, self.restore_pipe,
os.path.relpath(filename.rstrip('.000'))] os.path.relpath(filename.rstrip('.000'))]
if BACKUP_DEBUG: if BACKUP_DEBUG:
self.print_callback("Running command "+str(tar2_cmdline)) self.print_callback("Running command "+
unicode(tar2_cmdline))
self.tar2_process = subprocess.Popen(tar2_cmdline, self.tar2_process = subprocess.Popen(tar2_cmdline,
stdin=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=(None if BACKUP_DEBUG else open('/dev/null', 'w'))) stderr=(None if BACKUP_DEBUG else open('/dev/null', 'w')))
@ -1051,7 +1052,7 @@ def restore_vm_dirs (backup_source, restore_tmpdir, passphrase, vms_dirs, vms,
tar1_env['UPDATES_MAX_FILES'] = str(2*(10*len(vms_dirs) + tar1_env['UPDATES_MAX_FILES'] = str(2*(10*len(vms_dirs) +
int(vms_size/(100*1024*1024)))) int(vms_size/(100*1024*1024))))
if BACKUP_DEBUG: if BACKUP_DEBUG:
print_callback("Run command"+str(tar1_command)) print_callback("Run command"+unicode(tar1_command))
command = subprocess.Popen(tar1_command, command = subprocess.Popen(tar1_command,
stdin=backup_stdin, stdin=backup_stdin,
stdout=vmproc.stdin if vmproc else subprocess.PIPE, stdout=vmproc.stdin if vmproc else subprocess.PIPE,
@ -1145,7 +1146,6 @@ def restore_vm_dirs (backup_source, restore_tmpdir, passphrase, vms_dirs, vms,
progress_callback=progress_callback) progress_callback=progress_callback)
extract_proc.start() extract_proc.start()
try: try:
filename = None filename = None
while True: while True:
@ -1205,12 +1205,12 @@ def restore_vm_dirs (backup_source, restore_tmpdir, passphrase, vms_dirs, vms,
if command.wait() != 0 and not expect_tar_error: if command.wait() != 0 and not expect_tar_error:
raise QubesException( raise QubesException(
"ERROR: unable to read the qubes backup file {0} ({1}). " \ "unable to read the qubes backup file {0} ({1}). " \
"Is it really a backup?".format(backup_source, command.wait())) "Is it really a backup?".format(backup_source, command.wait()))
if vmproc: if vmproc:
if vmproc.wait() != 0: if vmproc.wait() != 0:
raise QubesException( raise QubesException(
"ERROR: unable to read the qubes backup {0} " \ "unable to read the qubes backup {0} " \
"because of a VM error: {1}".format( "because of a VM error: {1}".format(
backup_source, vmproc.stderr.read(MAX_STDERR_BYTES))) backup_source, vmproc.stderr.read(MAX_STDERR_BYTES)))
@ -1232,7 +1232,7 @@ def restore_vm_dirs (backup_source, restore_tmpdir, passphrase, vms_dirs, vms,
str(extract_proc.exitcode)) str(extract_proc.exitcode))
if extract_proc.exitcode != 0: if extract_proc.exitcode != 0:
raise QubesException( raise QubesException(
"ERROR: unable to extract the qubes backup. " \ "unable to extract the qubes backup. " \
"Check extracting process errors.") "Check extracting process errors.")
return header_data return header_data
@ -1428,7 +1428,7 @@ def backup_restore_prepare(backup_location, passphrase, options = {},
if not os.path.isfile(backup_location): if not os.path.isfile(backup_location):
raise QubesException("Invalid backup location (not a file or " raise QubesException("Invalid backup location (not a file or "
"directory with qubes.xml)" "directory with qubes.xml)"
": %s" % str( ": %s" % unicode(
backup_location)) backup_location))
else: else:
raise QubesException("Unknown backup format version: %s" % str(format_version)) raise QubesException("Unknown backup format version: %s" % str(format_version))
@ -1580,7 +1580,7 @@ def backup_restore_print_summary(restore_info, print_callback = print_stdout):
for vm_info in restore_info.values(): for vm_info in restore_info.values():
if 'vm' in vm_info.keys(): if 'vm' in vm_info.keys():
vm = vm_info['vm'] vm = vm_info['vm']
l = len(str(eval(fields[f]["func"]))) l = len(unicode(eval(fields[f]["func"])))
if l > fields[f]["max_width"]: if l > fields[f]["max_width"]:
fields[f]["max_width"] = l fields[f]["max_width"] = l
total_width += fields[f]["max_width"] total_width += fields[f]["max_width"]