diff --git a/qubesmanager/global_settings.py b/qubesmanager/global_settings.py index c779326..e8ad420 100644 --- a/qubesmanager/global_settings.py +++ b/qubesmanager/global_settings.py @@ -27,15 +27,16 @@ import traceback from PyQt4 import QtCore, QtGui # pylint: disable=import-error from qubesadmin import Qubes -from qubesadmin.utils import parse_size, updates_vms_status +from qubesadmin.utils import parse_size from . import ui_globalsettingsdlg # pylint: disable=no-name-in-module +from . import utils from configparser import ConfigParser qmemman_config_path = '/etc/qubes/qmemman.conf' - +# pylint: disable=too-many-instance-attributes class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, QtGui.QDialog): @@ -59,126 +60,77 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, self.__init_updates__() def __init_system_defaults__(self): - # updatevm and clockvm - all_vms = [vm for vm in self.qvm_collection.domains - if (not vm.features.get('internal', False)) and vm.qid != 0] + # set up updatevm choice + self.update_vm_vmlist, self.update_vm_idx = utils.prepare_vm_choice( + self.update_vm_combo, self.qvm_collection, 'updatevm', + None, allow_none=True + ) - self.updatevm_idx = -1 + # set up clockvm choice + self.clock_vm_vmlist, self.clock_vm_idx = utils.prepare_vm_choice( + self.clock_vm_combo, self.qvm_collection, 'clockvm', + None, allow_none=True + ) - current_update_vm = self.qvm_collection.updatevm - for (i, vm) in enumerate(all_vms): - text = vm.name - if vm is current_update_vm: - self.updatevm_idx = i - text += self.tr(" (current)") - self.update_vm_combo.insertItem(i, text) - self.update_vm_combo.insertItem(len(all_vms), "none") - if current_update_vm is None: - self.updatevm_idx = len(all_vms) - self.update_vm_combo.setCurrentIndex(self.updatevm_idx) + # set up default netvm + self.default_netvm_vmlist, self.default_netvm_idx = \ + utils.prepare_vm_choice( + self.default_netvm_combo, + self.qvm_collection, 'default_netvm', + None, + filter_function=(lambda vm: vm.provides_network), + allow_none=True) - # clockvm - self.clockvm_idx = -1 - - current_clock_vm = self.qvm_collection.clockvm - for (i, vm) in enumerate(all_vms): - text = vm.name - if vm is current_clock_vm: - self.clockvm_idx = i - text += self.tr(" (current)") - self.clock_vm_combo.insertItem(i, text) - self.clock_vm_combo.insertItem(len(all_vms), "none") - if current_clock_vm is None: - self.clockvm_idx = len(all_vms) - self.clock_vm_combo.setCurrentIndex(self.clockvm_idx) - - # default netvm - netvms = [vm for vm in all_vms - if getattr(vm, 'provides_network', False)] - self.netvm_idx = -1 - - current_netvm = self.qvm_collection.default_netvm - for (i, vm) in enumerate(netvms): - text = vm.name - if vm is current_netvm: - self.netvm_idx = i - text += self.tr(" (current)") - self.default_netvm_combo.insertItem(i, text) - if current_netvm is not None: - self.default_netvm_combo.setCurrentIndex(self.netvm_idx) - - #default template - templates = [vm for vm in all_vms if vm.klass == 'TemplateVM'] - self.template_idx = -1 - - current_template = self.qvm_collection.default_template - for (i, vm) in enumerate(templates): - text = vm.name - if vm is current_template: - self.template_idx = i - text += self.tr(" (current)") - self.default_template_combo.insertItem(i, text) - if current_template is not None: - self.default_template_combo.setCurrentIndex(self.template_idx) + # default template + self.default_template_vmlist, self.default_template_idx = \ + utils.prepare_vm_choice( + self.default_template_combo, + self.qvm_collection, 'default_template', + None, + filter_function=(lambda vm: vm.klass == 'TemplateVM') + ) def __apply_system_defaults__(self): - #upatevm - if self.update_vm_combo.currentIndex() != self.updatevm_idx: - updatevm_name = str(self.update_vm_combo.currentText()) - updatevm_name = updatevm_name.split(' ')[0] - updatevm = self.qvm_collection.domains[updatevm_name] + # upatevm + if self.qvm_collection.updatevm != \ + self.update_vm_vmlist[self.update_vm_combo.currentIndex()]: + self.qvm_collection.updatevm = \ + self.update_vm_vmlist[self.update_vm_combo.currentIndex()] - self.qvm_collection.updatevm = updatevm + # clockvm + if self.qvm_collection.clockvm !=\ + self.clock_vm_vmlist[self.clock_vm_combo.currentIndex()]: + self.qvm_collection.clockvm = \ + self.clock_vm_vmlist[self.clock_vm_combo.currentIndex()] - #clockvm - if self.clock_vm_combo.currentIndex() != self.clockvm_idx: - clockvm_name = str(self.clock_vm_combo.currentText()) - clockvm_name = clockvm_name.split(' ')[0] - clockvm = self.qvm_collection.domains[clockvm_name] - - self.qvm_collection.clockvm = clockvm - - #default netvm - if self.default_netvm_combo.currentIndex() != self.netvm_idx: - name = str(self.default_netvm_combo.currentText()) - name = name.split(' ')[0] - vm = self.qvm_collection.domains[name] - - self.qvm_collection.default_netvm = vm - - #default template - if self.default_template_combo.currentIndex() != self.template_idx: - name = str(self.default_template_combo.currentText()) - name = name.split(' ')[0] - vm = self.qvm_collection.domains[name] - - self.qvm_collection.default_template = vm + # default netvm + if self.qvm_collection.default_netvm !=\ + self.default_netvm_vmlist[ + self.default_netvm_combo.currentIndex()]: + self.qvm_collection.default_netvm = \ + self.default_netvm_vmlist[ + self.default_netvm_combo.currentIndex()] + # default template + if self.qvm_collection.default_template != \ + self.default_template_vmlist[ + self.default_template_combo.currentIndex()]: + self.qvm_collection.default_template = \ + self.default_template_vmlist[ + self.default_template_combo.currentIndex()] def __init_kernel_defaults__(self): - kernel_list = [] - # TODO system_path["qubes_kernels_base_dir"] - # idea: qubes.pools['linux-kernel'].volumes - for k in os.listdir('/var/lib/qubes/vm-kernels'): - kernel_list.append(k) - - self.kernel_idx = 0 - - for (i, k) in enumerate(kernel_list): - text = k - if k == self.qvm_collection.default_kernel: - text += self.tr(" (current)") - self.kernel_idx = i - self.default_kernel_combo.insertItem(i, text) - self.default_kernel_combo.setCurrentIndex(self.kernel_idx) + self.kernels_list, self.kernels_idx = utils.prepare_kernel_choice( + self.default_kernel_combo, self.qvm_collection, 'default_kernel', + None, + allow_none=True + ) def __apply_kernel_defaults__(self): - if self.default_kernel_combo.currentIndex() != self.kernel_idx: - kernel = str(self.default_kernel_combo.currentText()) - kernel = kernel.split(' ')[0] - - self.qvm_collection.default_kernel = kernel - + if self.qvm_collection.default_kernel != \ + self.kernels_list[self.default_kernel_combo.currentIndex()]: + self.qvm_collection.default_kernel = \ + self.kernels_list[self.default_kernel_combo.currentIndex()] def __init_mem_defaults__(self): #qmemman settings @@ -260,27 +212,62 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, qmemman_config_file.writelines(config_lines) qmemman_config_file.close() - def __init_updates__(self): - self.updates_val = False - # TODO updates_dom0_status(self.qvm_collection) - self.updates_dom0_val = True + + # TODO: remove workaround when it is no longer needed + self.dom0_updates_file_path = '/var/lib/qubes/updates/disable-updates' + + try: + self.updates_dom0_val = self.qvm_collection.check_updates_dom0 + except AttributeError: + self.updates_dom0_val =\ + not os.path.isfile(self.dom0_updates_file_path) + self.updates_dom0.setChecked(self.updates_dom0_val) - updates_vms = updates_vms_status(self.qvm_collection) - if updates_vms is None: - self.updates_vm.setCheckState(QtCore.Qt.PartiallyChecked) - else: - self.updates_vm.setCheckState(updates_vms) + + self.updates_vm.setChecked(self.qvm_collection.check_updates_vm) + self.enable_updates_all.clicked.connect(self.__enable_updates_all) + self.disable_updates_all.clicked.connect(self.__disable_updates_all) + + def __enable_updates_all(self): + reply = QtGui.QMessageBox.question( + self, self.tr("Change state of all qubes"), + self.tr("Are you sure you want to set all qubes to check " + "for updates?"), + QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel) + if reply == QtGui.QMessageBox.Cancel: + return + + self.__set_updates_all(True) + + def __disable_updates_all(self): + reply = QtGui.QMessageBox.question( + self, self.tr("Change state of all qubes"), + self.tr("Are you sure you want to set all qubes to not check " + "for updates?"), + QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel) + if reply == QtGui.QMessageBox.Cancel: + return + + self.__set_updates_all(False) + + def __set_updates_all(self, state): + for vm in self.qvm_collection.domains: + vm.features['check-updates'] = state def __apply_updates__(self): if self.updates_dom0.isChecked() != self.updates_dom0_val: - # TODO updates_dom0_toggle( - # self.qvm_collection, self.updates_dom0.isChecked()) - raise NotImplementedError('Toggle dom0 updates not implemented') - if self.updates_vm.checkState() != QtCore.Qt.PartiallyChecked: - for vm in self.qvm_collection.domains: - vm.features['check-updates'] = \ - bool(self.updates_vm.checkState()) + # TODO: remove workaround when it is no longer needed + try: + self.qvm_collection.check_updates_dom0 = \ + self.updates_dom0.isChecked() + except AttributeError: + if self.updates_dom0.isChecked(): + os.remove(self.dom0_updates_file_path) + else: + open(self.dom0_updates_file_path, 'a').close() + + self.qvm_collection.check_updates_vm = self.updates_vm.isChecked() def reject(self): self.done(0) diff --git a/ui/globalsettingsdlg.ui b/ui/globalsettingsdlg.ui index de66b0e..7ade6e1 100644 --- a/ui/globalsettingsdlg.ui +++ b/ui/globalsettingsdlg.ui @@ -6,8 +6,8 @@ 0 0 - 678 - 331 + 651 + 386 @@ -195,6 +195,13 @@ Updates + + + + Disable checking for updates for all VMs + + + @@ -215,6 +222,13 @@ + + + + Enable checking for updates for all VMs + + +