diff --git a/qubesmanager/settings.py b/qubesmanager/settings.py
index 1353ffc..a564c61 100755
--- a/qubesmanager/settings.py
+++ b/qubesmanager/settings.py
@@ -68,22 +68,18 @@ class RenameVMThread(QtCore.QThread):
setattr(holder, prop, new_vm)
except qubesadmin.exc.QubesException:
failed_props += [(holder, prop)]
-
if not failed_props:
del self.vm.app.domains[self.vm.name]
else:
list_text = utils.format_dependencies_list(failed_props)
-
- QtGui.QMessageBox.warning(
- None,
- self.tr("Warning: rename partially unsuccessful"),
- self.tr("Some properties could not be changed to the new "
- "name. The system has now both {} and {} qubes. "
- "To resolve this, please check and change the "
- "following properties and remove the qube {} "
- "manually.
").format(
- self.vm.name, self.vm.name, self.vm.name)\
- + list_text)
+ self.msg = (self.tr("Warning: rename partially unsuccessful!"),
+ self.tr("Some properties could not be changed to "
+ "the new name. The system has now both {} "
+ "and {} qubes. To resolve this, please "
+ "check and change the following properties "
+ "and remove the qube {} manually.
"
+ ).format(self.vm.name, self.vm.name,
+ self.vm.name) + list_text)
except qubesadmin.exc.QubesException as ex:
self.msg = ("Rename error!", str(ex))
@@ -162,6 +158,17 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
self.tabWidget.currentChanged.connect(self.current_tab_changed)
+ # Initialize several auxillary variables for pylint's sake
+ self.netvm_idx = None
+ self.kernel_idx = None
+ self.label_idx = None
+ self.template_idx = None
+ self.root_img_size = None
+ self.priv_img_size = None
+ self.default_dispvm_idx = None
+ self.virt_mode_idx = None
+ self.virt_mode_list = None
+
###### basic tab
self.__init_basic_tab__()
self.rename_vm_button.clicked.connect(self.rename_vm)
@@ -414,6 +421,8 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
(lambda vm: vm.provides_network),
allow_default=True, allow_none=True)
+ self.netVM.currentIndexChanged.connect(self.check_warn_dispvmnetvm)
+
self.include_in_backups.setChecked(self.vm.include_in_backups)
try:
@@ -467,6 +476,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
if self.vmlabel.currentIndex() != self.label_idx:
label = self.label_list[self.vmlabel.currentIndex()]
self.vm.label = label
+ self.label_idx = self.vmlabel.currentIndex()
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
@@ -475,6 +485,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
if self.template_name.currentIndex() != self.template_idx:
self.vm.template = \
self.template_list[self.template_name.currentIndex()]
+ self.template_idx = self.template_name.currentIndex()
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
@@ -482,6 +493,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
try:
if self.netVM.currentIndex() != self.netvm_idx:
self.vm.netvm = self.netvm_list[self.netVM.currentIndex()]
+ self.netvm_idx = self.netVM.currentIndex()
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
@@ -514,6 +526,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
if self.priv_img_size != priv_size:
try:
self.vm.volumes['private'].resize(priv_size * 1024**2)
+ self.priv_img_size = priv_size
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
@@ -522,6 +535,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
if self.root_img_size != sys_size:
try:
self.vm.volumes['root'].resize(sys_size * 1024**2)
+ self.root_img_size = sys_size
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
@@ -547,6 +561,32 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
"allowed value."))
self.init_mem.setValue(self.max_mem_size.value() / 10)
+ def check_warn_dispvmnetvm(self):
+ if not hasattr(self.vm, 'default_dispvm'):
+ self.warn_netvm_dispvm.setVisible(False)
+ return
+ dispvm = self.default_dispvm_list[
+ self.default_dispvm.currentIndex()]
+ own_netvm = self.netvm_list[self.netVM.currentIndex()]
+
+ if dispvm == qubesadmin.DEFAULT:
+ dispvm = self.vm.property_get_default('default_dispvm')
+
+ if dispvm == self.vm:
+ self.warn_netvm_dispvm.setVisible(False)
+ return
+
+ dispvm_netvm = getattr(dispvm, 'netvm', None)
+
+ if own_netvm == qubesadmin.DEFAULT:
+ own_netvm = self.vm.property_get_default('netvm')
+
+ if dispvm_netvm and dispvm_netvm != own_netvm:
+ self.warn_netvm_dispvm.setVisible(True)
+ else:
+ self.warn_netvm_dispvm.setVisible(False)
+
+
def rename_vm(self):
dependencies = admin_utils.vm_dependencies(self.vm.app, self.vm)
@@ -691,7 +731,10 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
None,
(lambda vm: getattr(vm, 'template_for_dispvms', False)),
allow_default=True, allow_none=True)
+ self.default_dispvm.currentIndexChanged.connect(
+ self.check_warn_dispvmnetvm)
+ self.check_warn_dispvmnetvm()
self.update_virt_mode_list()
windows_running = \
@@ -704,6 +747,11 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
self.seamless_on_button.clicked.connect(self.enable_seamless)
self.seamless_off_button.clicked.connect(self.disable_seamless)
+ if hasattr(self.vm, "template_for_dispvms"):
+ self.dvm_template_checkbox.setChecked(self.vm.template_for_dispvms)
+ else:
+ self.dvm_template_checkbox.setVisible(False)
+
def enable_seamless(self):
self.vm.run_service_for_stdio("qubes.SetGuiMode", input=b'SEAMLESS')
@@ -742,6 +790,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
if self.kernel.currentIndex() != self.kernel_idx:
self.vm.kernel = self.kernel_list[
self.kernel.currentIndex()]
+ self.kernel_idx = self.kernel.currentIndex()
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
@@ -750,15 +799,29 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
if self.default_dispvm.currentIndex() != self.default_dispvm_idx:
self.vm.default_dispvm = \
self.default_dispvm_list[self.default_dispvm.currentIndex()]
+ self.default_dispvm_idx = self.default_dispvm.currentIndex()
except qubesadmin.exc.QubesException as ex:
msg.append(str(ex))
try:
if self.virt_mode.currentIndex() != self.virt_mode_idx:
self.vm.virt_mode = self.selected_virt_mode()
+ self.virt_mode_idx = self.virt_mode.currentIndex()
except Exception as ex: # pylint: disable=broad-except
msg.append(str(ex))
+ if getattr(self.vm, "template_for_dispvms", False) != \
+ self.dvm_template_checkbox.isChecked():
+ try:
+ self.vm.template_for_dispvms = \
+ self.dvm_template_checkbox.isChecked()
+ if self.dvm_template_checkbox.isChecked():
+ self.vm.features["appmenus-dispvm"] = True
+ else:
+ del self.vm.features["appmenus-dispvm"]
+ except Exception as ex: # pylint: disable=broad-except
+ msg.append(str(ex))
+
return msg
def include_in_balancing_changed(self, state):
@@ -811,7 +874,6 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtGui.QDialog):
self.virt_mode.clear()
- # pylint: disable=attribute-defined-outside-init
self.virt_mode_list, self.virt_mode_idx = utils.prepare_choice(\
self.virt_mode, self.vm, 'virt_mode', choices, None,\
allow_default=True, transform=(lambda x: str(x).upper()))
diff --git a/ui/settingsdlg.ui b/ui/settingsdlg.ui
index 833d31e..4c04ce4 100644
--- a/ui/settingsdlg.ui
+++ b/ui/settingsdlg.ui
@@ -29,7 +29,7 @@
- 1
+ 0
@@ -379,6 +379,19 @@
+ -
+
+
+ <html><head/><body><p>Caution: default DispVM template has a different Networking setting than this qube. Unexpected network access may occur!</p></body></html>
+
+
+
+
+
+ :/warning.png
+
+
+
@@ -779,7 +792,7 @@ border-width: 1px;
15
- -
+
-
Default DispVM:
@@ -789,17 +802,17 @@ border-width: 1px;
- -
+
-
- -
+
-
Boot qube from CDROM
- -
+
-
-
@@ -825,6 +838,16 @@ The qube must be running to disable seamless mode; this setting is not persisten
+ -
+
+
+
+
+
+ Allow starting DisposableVMs from this qube
+
+
+