Merge remote-tracking branch 'origin/pr/145'

* origin/pr/145:
  Added info to Restore Backup widget about dom0 restore
  More consistent 'include_in_backups' behavior
  Fixed Backup tool's QT bug
This commit is contained in:
Marek Marczykowski-Górecki 2019-01-17 22:26:17 +01:00
commit 2745266bf2
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
3 changed files with 35 additions and 11 deletions

View File

@ -130,7 +130,10 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, multiselectwidget.QtGui.QWizard):
allow_none=False
)
selected = self.load_settings()
self.unrecognized_config_label.setVisible(False)
self.load_settings()
selected = self.vms_to_include()
self.__fill_vms_list__(selected)
# Connect backup events for progress_bar
@ -142,14 +145,28 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, multiselectwidget.QtGui.QWizard):
def on_backup_progress(self, __submitter, _event, **kwargs):
self.progress_bar.setValue(int(float(kwargs['progress'])))
def vms_to_include(self):
"""
Helper function that returns list of VMs with 'include_in_backups'
attribute set to True.
:return: list of VM names
"""
result = []
for domain in self.qubes_app.domains:
if getattr(domain, 'include_in_backups', None):
result.append(domain.name)
return result
def load_settings(self):
"""
Helper function that tries to load existing backup profile
(default path: /etc/qubes/backup/qubes-manager-backup.conf )
and then apply its contents to the Backup window.
:return: list of vms to include in backup, if it exists in the profile,
or None if it does not
Ignores listed VMs, to prioritize include_in_backups feature.
:return: None
"""
try:
profile_data = backup_utils.load_backup_profile()
@ -168,6 +185,8 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, multiselectwidget.QtGui.QWizard):
dest_vm_idx = self.appvm_combobox.findText(dest_vm_name)
if dest_vm_idx > -1:
self.appvm_combobox.setCurrentIndex(dest_vm_idx)
else:
self.unrecognized_config_label.setVisible(True)
if 'destination_path' in profile_data:
dest_path = profile_data['destination_path']
@ -181,11 +200,6 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, multiselectwidget.QtGui.QWizard):
if 'compression' in profile_data:
self.compress_checkbox.setChecked(profile_data['compression'])
if 'include' in profile_data:
return profile_data['include']
return None
def save_settings(self, use_temp):
"""
Helper function that saves backup profile to either
@ -231,9 +245,6 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, multiselectwidget.QtGui.QWizard):
self.select_vms_widget.available_list.sortItems()
self.select_vms_widget.selected_list.sortItems()
self.unrecognized_config_label.setVisible(
selected is not None and
len(selected) != len(self.select_vms_widget.selected_list))
self.total_size_label.setText(
admin_utils.size_to_human(self.total_size))
@ -418,6 +429,7 @@ def main():
qt_app.setOrganizationName("The Qubes Project")
qt_app.setOrganizationDomain("http://qubes-os.org")
qt_app.setApplicationName("Qubes Backup VMs")
qt_app.lastWindowClosed.connect(loop_shutdown)
sys.excepthook = handle_exception

View File

@ -96,6 +96,8 @@ class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtGui.QWizard):
self.setupUi(self)
self.dom0_restored_label.setVisible(False)
self.select_vms_widget = multiselectwidget.MultiSelectWidget(self)
self.select_vms_layout.insertWidget(1, self.select_vms_widget)
@ -185,6 +187,9 @@ class RestoreVMsWindow(ui_restoredlg.Ui_Restore, QtGui.QWizard):
vmname = self.select_vms_widget.available_list.item(i).text()
del self.vms_to_restore[str(vmname)]
if 'dom0' in self.vms_to_restore.keys():
self.dom0_restored_label.setVisible(True)
self.vms_to_restore = self.backup_restore.restore_info_verify(
self.vms_to_restore)

View File

@ -265,6 +265,13 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="dom0_restored_label">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;WARNING: restored dom0 files are located in ~/backup-restore-&amp;lt;timestamp&amp;gt; directory&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>