backups: Update for new API - backup code moved to qubes.backup module

Also some improvements/fixes for handling new backup format
This commit is contained in:
Marek Marczykowski-Górecki 2013-11-28 03:50:17 +01:00
parent 6ad6e7c661
commit ced6fc672b
3 changed files with 79 additions and 45 deletions

View File

@ -31,6 +31,7 @@ from qubes.qubes import QubesVmCollection
from qubes.qubes import QubesException from qubes.qubes import QubesException
from qubes.qubes import QubesDaemonPidfile from qubes.qubes import QubesDaemonPidfile
from qubes.qubes import QubesHost from qubes.qubes import QubesHost
from qubes import backup
from qubes import qubesutils from qubes import qubesutils
import qubesmanager.resources_rc import qubesmanager.resources_rc
@ -65,9 +66,9 @@ class BackupVMsWindow(Ui_Backup, QWizard):
self.shutdown_vm_func = shutdown_vm_func self.shutdown_vm_func = shutdown_vm_func
self.dev_mount_path = None self.dev_mount_path = None
self.backup_dir = None self.backup_location = None
self.func_output = [] self.func_output = []
self.excluded = [] self.selected_vms = []
for vm in self.qvm_collection.values(): for vm in self.qvm_collection.values():
if vm.qid == 0: if vm.qid == 0:
@ -116,7 +117,7 @@ class BackupVMsWindow(Ui_Backup, QWizard):
if vm.qid == 0: if vm.qid == 0:
local_user = grp.getgrnam('qubes').gr_mem[0] local_user = grp.getgrnam('qubes').gr_mem[0]
home_dir = pwd.getpwnam(local_user).pw_dir home_dir = pwd.getpwnam(local_user).pw_dir
self.size = qubesutils.get_disk_usage(home_dir) self.size = backup.get_disk_usage(home_dir)
else: else:
self.size = self.get_vm_size(vm) self.size = self.get_vm_size(vm)
super(BackupVMsWindow.VmListItem, self).__init__(vm.name+ " (" + qubesutils.size_to_human(self.size) + ")") super(BackupVMsWindow.VmListItem, self).__init__(vm.name+ " (" + qubesutils.size_to_human(self.size) + ")")
@ -231,16 +232,14 @@ class BackupVMsWindow(Ui_Backup, QWizard):
def validateCurrentPage(self): def validateCurrentPage(self):
if self.currentPage() is self.select_vms_page: if self.currentPage() is self.select_vms_page:
for i in range(self.select_vms_widget.selected_list.count()): if self.check_running():
if self.check_running() == True: QMessageBox.information(None, "Wait!", "Some selected VMs are running. Running VMs can not be backuped. Please shut them down or remove them from the list.")
QMessageBox.information(None, "Wait!", "Some selected VMs are running. Running VMs can not be backuped. Please shut them down or remove them from the list.") return False
return False
self.selected_vms = []
for i in range(self.select_vms_widget.selected_list.count()):
self.selected_vms.append(self.select_vms_widget.selected_list.item(i).vm)
del self.excluded[:]
for i in range(self.select_vms_widget.available_list.count()):
vmname = self.select_vms_widget.available_list.item(i).vm.name
self.excluded.append(vmname)
return True return True
def gather_output(self, s): def gather_output(self, s):
@ -260,8 +259,13 @@ class BackupVMsWindow(Ui_Backup, QWizard):
msg = [] msg = []
try: try:
qubesutils.backup_do_copy(str(self.backup_dir), self.files_to_backup, str(self.passphrase_line_edit.text()), self.update_progress_bar, encrypt=self.encryption_checkbox.isChecked(), appvm=self.target_appvm) backup.backup_do(str(self.backup_location),
#simulate_long_lasting_proces(10, self.update_progress_bar) self.files_to_backup,
str(self.passphrase_line_edit.text()),
progress_callback=self.update_progress_bar,
encrypt=self.encryption_checkbox.isChecked(),
appvm=self.target_appvm)
#simulate_long_lasting_proces(10, self.update_progress_bar)
except Exception as ex: except Exception as ex:
print "Exception:",ex print "Exception:",ex
msg.append(str(ex)) msg.append(str(ex))
@ -276,14 +280,16 @@ class BackupVMsWindow(Ui_Backup, QWizard):
if self.currentPage() is self.confirm_page: if self.currentPage() is self.confirm_page:
self.target_appvm = None self.target_appvm = None
if self.appvm_combobox.currentText() != "None": #An existing appvm chosen if self.appvm_combobox.currentIndex() != 0: #An existing appvm chosen
self.target_appvm = str(self.appvm_combobox.currentText()) self.target_appvm = self.qvm_collection.get_vm_by_name(
self.appvm_combobox.currentText())
# FIXME: ensure that at least a non empty passphrase has been provided
del self.func_output[:] del self.func_output[:]
try: try:
self.files_to_backup = qubesutils.backup_prepare(str(self.backup_dir), exclude_list = self.excluded, print_callback = self.gather_output) self.files_to_backup = backup.backup_prepare(
self.selected_vms,
print_callback = self.gather_output,
hide_vm_names=self.encryption_checkbox.isChecked())
except Exception as ex: except Exception as ex:
print "Exception:",ex print "Exception:",ex
QMessageBox.critical(None, "Error while preparing backup.", "ERROR: {0}".format(ex)) QMessageBox.critical(None, "Error while preparing backup.", "ERROR: {0}".format(ex))

View File

@ -121,7 +121,7 @@ def dev_combobox_activated(dialog, idx):
#there was a change #there was a change
dialog.dir_line_edit.setText("") dialog.dir_line_edit.setText("")
dialog.backup_dir = None dialog.backup_location = None
if dialog.dev_mount_path != None: if dialog.dev_mount_path != None:
dialog.dev_mount_path = umount_device(dialog.dev_mount_path) dialog.dev_mount_path = umount_device(dialog.dev_mount_path)
@ -161,30 +161,35 @@ def dev_combobox_activated(dialog, idx):
if dialog.dev_mount_path != None: if dialog.dev_mount_path != None:
# Initialize path with root of mounted device # Initialize path with root of mounted device
dialog.dir_line_edit.setText(dialog.dev_mount_path) dialog.dir_line_edit.setText(dialog.dev_mount_path)
dialog.backup_dir = dialog.dev_mount_path dialog.backup_location = dialog.dev_mount_path
dialog.select_dir_page.emit(SIGNAL("completeChanged()")) dialog.select_dir_page.emit(SIGNAL("completeChanged()"))
def select_path_button_clicked(dialog): def select_path_button_clicked(dialog, select_file = False):
dialog.backup_dir = dialog.dir_line_edit.text() dialog.backup_location = dialog.dir_line_edit.text()
file_dialog = QFileDialog() file_dialog = QFileDialog()
file_dialog.setReadOnly(True) file_dialog.setReadOnly(True)
if select_file:
file_dialog_function = file_dialog.getOpenFileName
else:
file_dialog_function = file_dialog.getExistingDirectory
new_appvm = None new_appvm = None
new_path = None new_path = None
if dialog.appvm_combobox.currentText() != "None": #An existing appvm chosen if dialog.appvm_combobox.currentIndex() != 0: #An existing appvm chosen
new_appvm = str(dialog.appvm_combobox.currentText()) new_appvm = str(dialog.appvm_combobox.currentText())
elif dialog.dev_mount_path != None: elif dialog.dev_mount_path != None:
new_path = file_dialog.getExistingDirectory(dialog, "Select backup directory.", dialog.dev_mount_path) new_path = file_dialog_function(dialog, "Select backup location.", dialog.dev_mount_path)
else: else:
new_path = file_dialog.getExistingDirectory(dialog, "Select backup directory.", "~") new_path = file_dialog_function(dialog, "Select backup location.", "~")
if new_path != None: if new_path != None:
dialog.dir_line_edit.setText(new_path) dialog.dir_line_edit.setText(new_path)
dialog.backup_dir = new_path dialog.backup_location = new_path
if (new_path or new_appvm) and len(dialog.backup_dir) > 0: if (new_path or new_appvm) and len(dialog.backup_location) > 0:
dialog.select_dir_page.emit(SIGNAL("completeChanged()")) dialog.select_dir_page.emit(SIGNAL("completeChanged()"))
def simulate_long_lasting_proces(period, progress_callback): def simulate_long_lasting_proces(period, progress_callback):

View File

@ -40,6 +40,7 @@ import time
from operator import itemgetter from operator import itemgetter
from thread_monitor import * from thread_monitor import *
from qubes import backup
from qubes import qubesutils from qubes import qubesutils
from ui_restoredlg import * from ui_restoredlg import *
@ -61,7 +62,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.blk_manager = blk_manager self.blk_manager = blk_manager
self.dev_mount_path = None self.dev_mount_path = None
self.backup_dir = None self.backup_location = None
self.restore_options = None self.restore_options = None
self.backup_vms_list = None self.backup_vms_list = None
self.func_output = [] self.func_output = []
@ -101,7 +102,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
@pyqtSlot(name='on_select_path_button_clicked') @pyqtSlot(name='on_select_path_button_clicked')
def select_path_button_clicked(self): def select_path_button_clicked(self):
select_path_button_clicked(self) select_path_button_clicked(self, True)
def on_ignore_missing_toggled(self, checked): def on_ignore_missing_toggled(self, checked):
self.restore_options['use-default-template'] = checked self.restore_options['use-default-template'] = checked
@ -120,13 +121,25 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.select_vms_widget.selected_list.clear() self.select_vms_widget.selected_list.clear()
self.select_vms_widget.available_list.clear() self.select_vms_widget.available_list.clear()
self.target_appvm = None
if self.appvm_combobox.currentText() != "None": #An existing appvm chosen
self.target_appvm = str(self.appvm_combobox.currentText())
self.restore_tmpdir, qubes_xml = qubesutils.backup_restore_header(str(self.backup_dir), str(self.passphrase_line_edit.text()), self.encryption_checkbox.isChecked(), appvm=self.target_appvm) self.target_appvm = None
self.vms_to_restore = qubesutils.backup_restore_prepare(str(self.backup_dir),os.path.join(self.restore_tmpdir, qubes_xml), str(self.passphrase_line_edit.text()), options=self.restore_options, host_collection=self.qvm_collection, encrypt=self.encryption_checkbox.isChecked(), appvm=self.target_appvm) if self.appvm_combobox.currentIndex() != 0: #An existing appvm chosen
self.target_appvm = self.qvm_collection.get_vm_by_name(
str(self.appvm_combobox.currentText()))
self.restore_tmpdir, qubes_xml = backup.backup_restore_header(
str(self.backup_location),
str(self.passphrase_line_edit.text()),
encrypted=self.encryption_checkbox.isChecked(),
appvm=self.target_appvm)
self.vms_to_restore = backup.backup_restore_prepare(
str(self.backup_location),
os.path.join(self.restore_tmpdir, qubes_xml),
str(self.passphrase_line_edit.text()),
options=self.restore_options,
host_collection=self.qvm_collection,
encrypt=self.encryption_checkbox.isChecked(),
appvm=self.target_appvm)
for vmname in self.vms_to_restore: for vmname in self.vms_to_restore:
self.select_vms_widget.available_list.addItem(vmname) self.select_vms_widget.available_list.addItem(vmname)
@ -134,8 +147,8 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
def __init_restore_options__(self): def __init_restore_options__(self):
if not self.restore_options: if not self.restore_options:
self.restore_options = {} self.restore_options = {}
qubesutils.backup_restore_set_defaults(self.restore_options) backup.backup_restore_set_defaults(self.restore_options)
if 'use-default-template' in self.restore_options and 'use-default-netvm' in self.restore_options: if 'use-default-template' in self.restore_options and 'use-default-netvm' in self.restore_options:
val = self.restore_options['use-default-template'] and self.restore_options['use-default-netvm'] val = self.restore_options['use-default-template'] and self.restore_options['use-default-netvm']
self.ignore_missing.setChecked(val) self.ignore_missing.setChecked(val)
@ -164,8 +177,17 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
err_msg = [] err_msg = []
self.qvm_collection.lock_db_for_writing() self.qvm_collection.lock_db_for_writing()
try: try:
qubesutils.backup_restore_do(str(self.backup_dir), self.restore_tmpdir, str(self.passphrase_line_edit.text()), self.vms_to_restore, self.qvm_collection, encrypted=self.encryption_checkbox.isChecked(), appvm=self.target_appvm, print_callback=self.restore_output, error_callback=self.restore_error_output, progress_callback backup.backup_restore_do(
=self.update_progress_bar) str(self.backup_location),
self.restore_tmpdir,
str(self.passphrase_line_edit.text()),
self.vms_to_restore,
self.qvm_collection,
encrypted=self.encryption_checkbox.isChecked(),
appvm=self.target_appvm,
print_callback=self.restore_output,
error_callback=self.restore_error_output,
progress_callback=self.update_progress_bar)
except Exception as ex: except Exception as ex:
print "Exception:",ex print "Exception:",ex
err_msg.append(str(ex)) err_msg.append(str(ex))
@ -194,7 +216,8 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
del self.vms_to_restore[str(vmname)] del self.vms_to_restore[str(vmname)]
del self.func_output[:] del self.func_output[:]
qubesutils.backup_restore_print_summary(self.vms_to_restore, print_callback = self.gather_output) backup.backup_restore_print_summary(
self.vms_to_restore, print_callback = self.gather_output)
self.confirm_text_edit.setReadOnly(True) self.confirm_text_edit.setReadOnly(True)
self.confirm_text_edit.setFontFamily("Monospace") self.confirm_text_edit.setFontFamily("Monospace")
self.confirm_text_edit.setText("\n".join(self.func_output)) self.confirm_text_edit.setText("\n".join(self.func_output))
@ -226,8 +249,8 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.done(0) self.done(0)
def has_selected_dir(self): def has_selected_dir(self):
return self.backup_dir != None return self.backup_location != None
def has_selected_vms(self): def has_selected_vms(self):
return self.select_vms_widget.selected_list.count() > 0 return self.select_vms_widget.selected_list.count() > 0