Merge branch 'master' of git.qubes-os.org:/var/lib/qubes/git/aga/qubes-manager

This commit is contained in:
Joanna Rutkowska 2012-03-16 10:33:01 +01:00
commit 7dfbde248c
5 changed files with 585 additions and 183 deletions

View File

@ -17,7 +17,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="title"> <property name="title">
<string>System defaults</string> <string>System defaults</string>
@ -37,7 +37,7 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="updateVMcombo"/> <widget class="QComboBox" name="update_vm_combo"/>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
@ -47,7 +47,7 @@
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QComboBox" name="clockVMcombo"/> <widget class="QComboBox" name="clock_vm_combo"/>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
@ -57,7 +57,7 @@
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QComboBox" name="defaultNetVMcombo"/> <widget class="QComboBox" name="default_netvm_combo"/>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
@ -73,7 +73,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QComboBox" name="defaultTemplateVMCombo"/> <widget class="QComboBox" name="default_template_combo"/>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -81,45 +81,26 @@
<item row="0" column="1"> <item row="0" column="1">
<widget class="QGroupBox" name="groupBox_3"> <widget class="QGroupBox" name="groupBox_3">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="title"> <property name="title">
<string>Default memory settings</string> <string>Default memory settings</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="geometry"> <property name="enabled">
<rect> <bool>false</bool>
<x>11</x>
<y>26</y>
<width>134</width>
<height>16</height>
</rect>
</property> </property>
<property name="text"> <property name="text">
<string>Minimal VM's memory:</string> <string>Minimal VM's memory:</string>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label_7"> </item>
<property name="geometry"> <item row="0" column="1">
<rect> <widget class="QSpinBox" name="min_vm_mem">
<x>11</x> <property name="enabled">
<y>57</y> <bool>false</bool>
<width>139</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>dom0 memory margin:</string>
</property>
</widget>
<widget class="QSpinBox" name="minVMmem">
<property name="geometry">
<rect>
<x>156</x>
<y>26</y>
<width>121</width>
<height>25</height>
</rect>
</property> </property>
<property name="suffix"> <property name="suffix">
<string> MB</string> <string> MB</string>
@ -131,14 +112,21 @@
<number>10</number> <number>10</number>
</property> </property>
</widget> </widget>
<widget class="QSpinBox" name="dom0memMargin"> </item>
<property name="geometry"> <item row="1" column="0">
<rect> <widget class="QLabel" name="label_7">
<x>156</x> <property name="enabled">
<y>57</y> <bool>false</bool>
<width>121</width> </property>
<height>25</height> <property name="text">
</rect> <string>dom0 memory margin:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="dom0_mem_margin">
<property name="enabled">
<bool>false</bool>
</property> </property>
<property name="suffix"> <property name="suffix">
<string> MB</string> <string> MB</string>
@ -150,12 +138,21 @@
<number>50</number> <number>50</number>
</property> </property>
</widget> </widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="dispvm_in_memory">
<property name="text">
<string>Keep dispVM in memory</string>
</property>
</widget>
</item>
</layout>
</widget> </widget>
</item> </item>
<item row="1" column="0" colspan="2"> <item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="title"> <property name="title">
<string>Kernel</string> <string>Kernel</string>
@ -169,7 +166,7 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="comboBox_5"/> <widget class="QComboBox" name="default_kernel_combo"/>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -30,6 +30,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.qubes import qubes_kernels_base_dir
import qubesmanager.resources_rc import qubesmanager.resources_rc
@ -42,18 +43,183 @@ from operator import itemgetter
from ui_globalsettingsdlg import * from ui_globalsettingsdlg import *
dont_keep_dvm_in_memory_path = '/var/lib/qubes/dvmdata/dont_use_shm'
class GlobalSettingsWindow(Ui_GlobalSettings, QDialog): class GlobalSettingsWindow(Ui_GlobalSettings, QDialog):
def __init__(self, parent=None): def __init__(self, app, qvm_collection, parent=None):
super(GlobalSettingsWindow, self).__init__(parent) super(GlobalSettingsWindow, self).__init__(parent)
self.app = app
self.qvm_collection = qvm_collection
self.setupUi(self) self.setupUi(self)
self.connect(self.buttonBox, SIGNAL("accepted()"), self.save_and_apply)
self.connect(self.buttonBox, SIGNAL("rejected()"), self.reject)
self.__init_system_defaults__()
self.__init_kernel_defaults__()
self.__init_mem_defaults__()
def __init_system_defaults__(self):
#updatevm and clockvm
all_vms = [vm for vm in self.qvm_collection.values() if not vm.internal]
self.updatevm_idx = -1
current_update_vm = self.qvm_collection.get_updatevm_vm()
for (i, vm) in enumerate(all_vms):
text = vm.name
if vm is current_update_vm:
self.updatevm_idx = i
text += " (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)
#clockvm
self.clockvm_idx = -1
current_clock_vm = self.qvm_collection.get_clockvm_vm()
for (i, vm) in enumerate(all_vms):
text = vm.name
if vm is current_clock_vm:
self.clockvm_idx = i
text += " (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 vm.is_netvm()]
self.netvm_idx = -1
current_netvm = self.qvm_collection.get_default_netvm()
for (i, vm) in enumerate(netvms):
text = vm.name
if vm is current_netvm:
self.netvm_idx = i
text += " (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.is_template()]
self.template_idx = -1
current_template = self.qvm_collection.get_default_template()
for (i, vm) in enumerate(templates):
text = vm.name
if vm is current_template:
self.template_idx = i
text += " (current)"
self.default_template_combo.insertItem(i, text)
if current_template is not None:
self.default_template_combo.setCurrentIndex(self.template_idx)
def __apply_system_defaults__(self):
#upatevm
if self.update_vm_combo.currentIndex() != self.updatevm_idx:
updatevm_name = self.update_vm_combo.currentText()
updatevm_name = updatevm_name.split(' ')[0]
updatevm = self.qvm_collection.get_vm_by_name(updatevm_name)
self.qvm_collection.set_updatevm_vm(updatevm)
self.anything_changed = True
#clockvm
if self.clock_vm_combo.currentIndex() != self.clockvm_idx:
clockvm_name = self.clock_vm_combo.currentText()
clockvm_name = clockvm_name.split(' ')[0]
clockvm = self.qvm_collection.get_vm_by_name(clockvm_name)
self.qvm_collection.set_clockvm_vm(clockvm)
self.anything_changed = True
#default netvm
if self.default_netvm_combo.currentIndex() != self.netvm_idx:
name = self.default_netvm_combo.currentText()
name = name.split(' ')[0]
vm = self.qvm_collection.get_vm_by_name(name)
self.qvm_collection.set_default_netvm(vm)
self.anything_changed = True
#default template
if self.default_template_combo.currentIndex() != self.template_idx:
name = self.default_template_combo.currentText()
name = name.split(' ')[0]
vm = self.qvm_collection.get_vm_by_name(name)
self.qvm_collection.set_default_template(vm)
self.anything_changed = True
def __init_kernel_defaults__(self):
kernel_list = []
for k in os.listdir(qubes_kernels_base_dir):
kernel_list.append(k)
self.kernel_idx = 0
for (i, k) in enumerate(kernel_list):
text = k
if k == self.qvm_collection.get_default_kernel():
text += " (current)"
self.kernel_idx = i
self.default_kernel_combo.insertItem(i,text)
self.default_kernel_combo.setCurrentIndex(self.kernel_idx)
def __apply_kernel_defaults__(self):
if self.default_kernel_combo.currentIndex() != self.kernel_idx:
kernel = self.default_kernel_combo.currentText()
kernel = kernel.split(' ')[0]
self.qvm_collection.set_default_kernel(kernel)
self.anything_changed = True
def __init_mem_defaults__(self):
#keep dispvm in memory
exists = os.path.exists(dont_keep_dvm_in_memory_path)
self.dispvm_in_memory.setChecked( not exists)
def __apply_mem_defaults__(self):
#keep dispvm in memory
was_checked = not os.path.exists(dont_keep_dvm_in_memory_path)
if was_checked != self.dispvm_in_memory.isChecked():
if was_checked:
#touch file
open(dont_keep_dvm_in_memory_path, 'w').close()
else:
#rm file
os.remove(dont_keep_dvm_in_memory_path)
self.anything_changed = True
def reject(self): def reject(self):
self.done(0) self.done(0)
def save_and_apply(self): def save_and_apply(self):
pass self.qvm_collection.lock_db_for_writing()
self.anything_changed = False
self.__apply_system_defaults__()
self.__apply_kernel_defaults__()
self.__apply_mem_defaults__()
if self.anything_changed == True:
self.qvm_collection.save()
self.qvm_collection.unlock_db()
# Bases on the original code by: # Bases on the original code by:
# Copyright (c) 2002-2007 Pascal Varet <p.varet@gmail.com> # Copyright (c) 2002-2007 Pascal Varet <p.varet@gmail.com>

View File

@ -1119,7 +1119,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
@pyqtSlot(name='on_action_global_settings_triggered') @pyqtSlot(name='on_action_global_settings_triggered')
def action_global_settings_triggered(self): def action_global_settings_triggered(self):
global_settings_window = GlobalSettingsWindow() global_settings_window = GlobalSettingsWindow(app, self.qvm_collection)
global_settings_window.exec_() global_settings_window.exec_()
@ -1382,14 +1382,28 @@ def handle_exception( exc_type, exc_value, exc_traceback ):
filename = os.path.basename( filename ) filename = os.path.basename( filename )
error = "%s: %s" % ( exc_type.__name__, exc_value ) error = "%s: %s" % ( exc_type.__name__, exc_value )
QMessageBox.critical(None, "Houston, we have a problem...", strace = ""
"Whoops. A critical error has occured. This is most likely a bug " stacktrace = traceback.extract_tb( exc_traceback )
while len(stacktrace) > 0:
(filename, line, func, txt) = stacktrace.pop()
strace += "----\n"
strace += "line: %s\n" %txt
strace += "func: %s\n" %func
strace += "line no.: %d\n" %line
strace += "file: %s\n" %filename
msg_box = QMessageBox()
msg_box.setDetailedText(strace)
msg_box.setIcon(QMessageBox.Critical)
msg_box.setWindowTitle( "Houston, we have a problem...")
msg_box.setText("Whoops. A critical error has occured. This is most likely a bug "
"in Qubes Manager.<br><br>" "in Qubes Manager.<br><br>"
"<b><i>%s</i></b>" % error + "<b><i>%s</i></b>" % error +
"at <b>line %d</b> of file <b>%s</b>.<br/><br/>" "<br/>at line <b>%d</b><br/>of file %s.<br/><br/>"
% ( line, filename )) % ( line, filename ))
#sys.exit(1) msg_box.exec_()
def main(): def main():

View File

@ -34,6 +34,7 @@ from qubes.qubes import qubes_appmenu_remove_cmd
from qubes.qubes import QubesDaemonPidfile from qubes.qubes import QubesDaemonPidfile
from qubes.qubes import QubesHost from qubes.qubes import QubesHost
from qubes.qubes import qrexec_client_path from qubes.qubes import qrexec_client_path
from qubes.qubes import qubes_kernels_base_dir
import qubesmanager.resources_rc import qubesmanager.resources_rc
@ -43,6 +44,7 @@ import subprocess
import time import time
import threading import threading
from operator import itemgetter from operator import itemgetter
from copy import copy
from ui_settingsdlg import * from ui_settingsdlg import *
from multiselectwidget import * from multiselectwidget import *
@ -86,6 +88,9 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
###### basic tab ###### basic tab
self.__init_basic_tab__() self.__init_basic_tab__()
###### advanced tab
self.__init_advanced_tab__()
###### firewall tab ###### firewall tab
if self.tabWidget.isTabEnabled(self.tabs_indices["firewall"]): if self.tabWidget.isTabEnabled(self.tabs_indices["firewall"]):
@ -98,8 +103,12 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
self.deleteRuleButton.clicked.connect(self.delete_rule_button_pressed) self.deleteRuleButton.clicked.connect(self.delete_rule_button_pressed)
####### devices tab ####### devices tab
self.dev_list = MultiSelectWidget(self) self.__init_devices_tab__()
self.devices_layout.addWidget(self.dev_list)
####### services tab
self.__init_services_tab__()
self.add_srv_button.clicked.connect(self.__add_service__)
self.remove_srv_button.clicked.connect(self.__remove_service__)
####### apps tab ####### apps tab
if self.tabWidget.isTabEnabled(self.tabs_indices["applications"]): if self.tabWidget.isTabEnabled(self.tabs_indices["applications"]):
@ -142,6 +151,9 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
self.anything_changed = False self.anything_changed = False
ret = self.__apply_basic_tab__() ret = self.__apply_basic_tab__()
self.__apply_advanced_tab__()
self.__apply_devices_tab__()
self.__apply_services_tab__()
if len(ret) > 0 : if len(ret) > 0 :
thread_monitor.set_error_msg('\n'.join(ret)) thread_monitor.set_error_msg('\n'.join(ret))
@ -189,7 +201,8 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
if not self.vm.is_template() and self.vm.template is not None: if not self.vm.is_template() and self.vm.template is not None:
template_vm_list = [vm for vm in self.qvm_collection.values() if not vm.internal and vm.is_template()] template_vm_list = [vm for vm in self.qvm_collection.values() if not vm.internal and vm.is_template()]
self.template_idx = 0 self.template_idx = -1
for (i, vm) in enumerate(template_vm_list): for (i, vm) in enumerate(template_vm_list):
text = vm.name text = vm.name
if vm is self.qvm_collection.get_default_template(): if vm is self.qvm_collection.get_default_template():
@ -201,27 +214,36 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
self.template_name.setCurrentIndex(self.template_idx) self.template_name.setCurrentIndex(self.template_idx)
else: else:
self.template_name.setEnabled(False) self.template_name.setEnabled(False)
self.template_idx = -1
if (not self.vm.is_netvm() or self.vm.is_proxyvm()): if (not self.vm.is_netvm() or self.vm.is_proxyvm()):
netvm_list = [vm for vm in self.qvm_collection.values() if not vm.internal and vm.is_netvm()] netvm_list = [vm for vm in self.qvm_collection.values() if not vm.internal and vm.is_netvm()]
self.netvm_idx = -1 self.netvm_idx = -1
text = "default ("+self.qvm_collection.get_default_netvm().name+")"
if self.vm.uses_default_netvm:
text += " (current)"
self.netvm_idx = 0
self.netVM.insertItem(0, text)
for (i, vm) in enumerate(netvm_list): for (i, vm) in enumerate(netvm_list):
text = vm.name text = vm.name
if vm is self.qvm_collection.get_default_netvm(): if self.vm.netvm is not None and vm.qid == self.vm.netvm.qid and not self.vm.uses_default_netvm:
text += " (default)" self.netvm_idx = i+1
if self.vm.netvm is not None and vm.qid == self.vm.netvm.qid:
self.netvm_idx = i
text += " (current)" text += " (current)"
self.netVM.insertItem(i, text) self.netVM.insertItem(i+1, text)
none_text = "none" none_text = "none"
if self.vm.netvm is None: if self.vm.netvm is None:
none_text += " (current)" none_text += " (current)"
self.netvm_idx = len(netvm_list) self.netvm_idx = len(netvm_list)+1
self.netVM.insertItem(len(netvm_list), none_text) self.netVM.insertItem(len(netvm_list)+1, none_text)
self.netVM.setCurrentIndex(self.netvm_idx) self.netVM.setCurrentIndex(self.netvm_idx)
else: else:
self.netVM.setEnabled(False) self.netVM.setEnabled(False)
self.netvm_idx = -1
self.include_in_backups.setChecked(self.vm.include_in_backups) self.include_in_backups.setChecked(self.vm.include_in_backups)
@ -241,13 +263,11 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
else: else:
self.networking_groupbox.setEnabled(False); self.networking_groupbox.setEnabled(False);
#max priv storage
self.priv_img_size = self.vm.get_private_img_sz()/1024/1024
self.max_priv_storage.setMinimum(self.priv_img_size)
self.max_priv_storage.setValue(self.priv_img_size)
#max priv size
self.priv_size.setValue(int(self.vm.memory))
self.priv_size.setMaximum(QubesHost().memory_total/1024)
#self.vmname.selectAll()
#self.vmname.setFocus()
def __apply_basic_tab__(self): def __apply_basic_tab__(self):
msg = [] msg = []
@ -262,9 +282,7 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
else: else:
oldname = self.vm.name oldname = self.vm.name
try: try:
self.vm.pre_rename(vmname)
self.vm.set_name(vmname) self.vm.set_name(vmname)
self.vm.post_rename(oldname)
self.anything_changed = True self.anything_changed = True
except Exception as ex: except Exception as ex:
msg.append(str(ex)) msg.append(str(ex))
@ -289,25 +307,218 @@ class VMSettingsWindow(Ui_SettingsDialog, QDialog):
if self.netVM.currentIndex() != self.netvm_idx: if self.netVM.currentIndex() != self.netvm_idx:
new_netvm_name = self.netVM.currentText() new_netvm_name = self.netVM.currentText()
new_netvm_name = new_netvm_name.split(' ')[0] new_netvm_name = new_netvm_name.split(' ')[0]
uses_default_netvm = False
if new_netvm_name == "default":
new_netvm_name = self.qvm_collection.get_default_netvm().name
uses_default_netvm = True
if new_netvm_name == "none":
netvm = None
else:
netvm = self.qvm_collection.get_vm_by_name(new_netvm_name) netvm = self.qvm_collection.get_vm_by_name(new_netvm_name)
assert (netvm is not None and netvm.qid in self.qvm_collection) assert (netvm is None or (netvm is not None and netvm.qid in self.qvm_collection and netvm.is_netvm()))
assert netvm.is_netvm()
self.vm.uses_default_netvm = (self.vm is self.qvm_collection.get_default_netvm())
self.vm.netvm = netvm self.vm.netvm = netvm
self.vm.uses_default_netvm = uses_default_netvm
self.anything_changed = True self.anything_changed = True
#include in backups #include in backups
if self.vm.include_in_backups != self.include_in_backups.isChecked(): if self.vm.include_in_backups != self.include_in_backups.isChecked():
self.vm.include_in_backups = self.include_in_backups.isChecked() self.vm.include_in_backups = self.include_in_backups.isChecked()
#max priv size #max priv storage
priv_size = self.priv_size.value() priv_size = self.max_priv_storage.value()
if self.vm.memory != priv_size: if self.priv_img_size != priv_size:
self.vm.memory = priv_size try:
self.vm.resize_private_img(priv_size*1024*1024)
self.anything_changed = True self.anything_changed = True
except Exception as ex:
msg.append(str(ex))
return msg return msg
######### advanced tab
def __init_advanced_tab__(self):
#mem/cpu
self.init_mem.setValue(int(self.vm.memory))
self.init_mem.setMaximum(int(self.vm.maxmem))
self.max_mem_size.setValue(int(self.vm.maxmem))
self.max_mem_size.setMaximum(QubesHost().memory_total/1024)
self.vcpus.setMinimum(1);
self.vcpus.setMaximum(QubesHost().no_cpus)
self.vcpus.setValue(int(self.vm.vcpus))
self.include_in_balancing.setChecked('meminfo-writer' in self.vm.services and self.vm.services['meminfo-writer']==True)
#kernel
if self.vm.template is not None:
text = self.vm.kernel
self.kernel.insertItem(0, text)
self.kernel.setEnabled(False)
self.kernel_idx = 0
else:
text = "default (" + self.qvm_collection.get_default_kernel() +")"
kernel_list = [text]
for k in os.listdir(qubes_kernels_base_dir):
kernel_list.append(k)
kernel_list.append("none")
self.kernel_idx = 0
for (i, k) in enumerate(kernel_list):
text = k
if (text.startswith("default") and self.vm.uses_default_kernel) or ( self.vm.kernel == k and not self.vm.uses_default_kernel) or (k=="none" and self.vm.kernel==None):
text += " (current)"
self.kernel_idx = i
self.kernel.insertItem(i,text)
self.kernel.setCurrentIndex(self.kernel_idx)
#kernel opts
if self.vm.uses_default_kernelopts:
self.kernel_opts.setText(self.vm.kernelopts + " (default)")
else:
self.kernel_opts.setText(self.vm.kernelopts)
#paths
self.dir_path.setText(self.vm.dir_path)
self.config_path.setText(self.vm.conf_file)
if self.vm.template is not None:
self.root_img_path.setText(self.vm.template.root_img)
else:
self.root_img_path.setText("n/a")
self.volatile_img_path.setText(self.vm.volatile_img)
self.private_img_path.setText(self.vm.private_img)
def __apply_advanced_tab__(self):
#mem/cpu
if self.init_mem.value() != int(self.vm.memory):
self.vm.memory = self.init_mem.value()
self.anything_changed = True
if self.max_mem_size.value() != int(self.vm.maxmem):
self.vm.maxmem = self.max_mem_size.value()
self.anything_changed = True
if self.vcpus.value() != int(self.vm.vcpus):
self.vm.vcpus = self.vcpus.value()
self.anything_changed = True
balancing_was_checked = ('meminfo-writer' in self.vm.services and self.vm.services['meminfo-writer']==True)
if self.include_in_balancing.isChecked() != balancing_was_checked:
self.new_srv_dict['meminfo-writer'] = self.include_in_balancing.isChecked()
self.anything_changed = True
#kernel changed
if self.kernel.currentIndex() != self.kernel_idx:
new_kernel = self.kernel.currentText()
new_kernel = new_kernel.split(' ')[0]
if(new_kernel == "default"):
kernel = self.qvm_collection.get_default_kernel()
self.vm.uses_default_kernel = True
elif(new_kernel == "none"):
kernel = None
self.vm.uses_default_kernel = False;
else:
kernel = new_kernel
self.vm.uses_default_kernel = False;
self.vm.kernel = kernel
self.anything_changed = True
######## devices tab
def __init_devices_tab__(self):
self.dev_list = MultiSelectWidget(self)
self.devices_layout.addWidget(self.dev_list)
devs = []
lspci = subprocess.Popen(["lspci",], stdout = subprocess.PIPE)
for dev in lspci.stdout:
devs.append( (dev.rstrip(), dev.split(' ')[0]) )
class DevListWidgetItem(QListWidgetItem):
def __init__(self, name, slot, parent = None):
super(DevListWidgetItem, self).__init__(name, parent)
self.slot = slot
for d in devs:
if d[1] in self.vm.pcidevs:
self.dev_list.selected_list.addItem( DevListWidgetItem(d[0], d[1]))
else:
self.dev_list.available_list.addItem( DevListWidgetItem(d[0], d[1]))
def __apply_devices_tab__(self):
sth_changed = False
added = []
for i in range(self.dev_list.selected_list.count()):
item = self.dev_list.selected_list.item(i)
if item.slot not in self.vm.pcidevs:
added.append(item)
if self.dev_list.selected_list.count() - len(added) < len(self.vm.pcidevs): #sth removed
sth_changed = True;
elif len(added) > 0:
sth_changed = True;
if sth_changed == True:
pcidevs = []
for i in range(self.dev_list.selected_list.count()):
slot = self.dev_list.selected_list.item(i).slot
pcidevs.append(slot)
self.vm.pcidevs = pcidevs
self.anything_changed = True
######## services tab
def __init_services_tab__(self):
for srv in self.vm.services:
item = QListWidgetItem(srv)
if self.vm.services[srv] == True:
item.setCheckState(QtCore.Qt.Checked)
else:
item.setCheckState(QtCore.Qt.Unchecked)
self.services_list.addItem(item)
self.new_srv_dict = copy(self.vm.services)
def __add_service__(self):
srv = str(self.service_line_edit.text()).strip()
if srv != "" and srv not in self.new_srv_dict:
item = QListWidgetItem(srv)
item.setCheckState(QtCore.Qt.Checked)
self.services_list.addItem(item)
self.new_srv_dict[srv] = True
def __remove_service__(self):
row = self.services_list.currentRow()
if row:
item = self.services_list.takeItem(row)
print item.text()
del self.new_srv_dict[str(item.text())]
def __apply_services_tab__(self):
new_dict = {}
for r in range (self.services_list.count()):
item = self.services_list.item(r)
self.new_srv_dict[str(item.text())] = (item.checkState() == QtCore.Qt.Checked)
if self.new_srv_dict != self.vm.services:
self.vm.services = self.new_srv_dict
self.anything_changed = True
######### firewall tab related ######### firewall tab related
def set_fw_model(self, model): def set_fw_model(self, model):
@ -420,13 +631,28 @@ def handle_exception( exc_type, exc_value, exc_traceback ):
filename = os.path.basename( filename ) filename = os.path.basename( filename )
error = "%s: %s" % ( exc_type.__name__, exc_value ) error = "%s: %s" % ( exc_type.__name__, exc_value )
QMessageBox.critical(None, "Houston, we have a problem...", strace = ""
"Whoops. A critical error has occured. This is most likely a bug " stacktrace = traceback.extract_tb( exc_traceback )
"in Qubes VM Settings application.<br><br>" while len(stacktrace) > 0:
(filename, line, func, txt) = stacktrace.pop()
strace += "----\n"
strace += "line: %s\n" %txt
strace += "func: %s\n" %func
strace += "line no.: %d\n" %line
strace += "file: %s\n" %filename
msg_box = QMessageBox()
msg_box.setDetailedText(strace)
msg_box.setIcon(QMessageBox.Critical)
msg_box.setWindowTitle( "Houston, we have a problem...")
msg_box.setText("Whoops. A critical error has occured. This is most likely a bug "
"in Qubes Manager.<br><br>"
"<b><i>%s</i></b>" % error + "<b><i>%s</i></b>" % error +
"at <b>line %d</b> of file <b>%s</b>.<br/><br/>" "<br/>at line <b>%d</b><br/>of file %s.<br/><br/>"
% ( line, filename )) % ( line, filename ))
msg_box.exec_()
def main(): def main():

View File

@ -122,8 +122,8 @@
<widget class="QLabel" name="type_label"> <widget class="QLabel" name="type_label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight> <weight>50</weight>
<bold>true</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -142,8 +142,8 @@
<widget class="QLabel" name="rpm_label"> <widget class="QLabel" name="rpm_label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight> <weight>50</weight>
<bold>true</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -163,8 +163,15 @@
<string>Disk storage</string> <string>Disk storage</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Private storage max. size:</string>
</property>
</widget>
</item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QSpinBox" name="priv_size"> <widget class="QSpinBox" name="max_priv_storage">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -172,16 +179,16 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property> </property>
<property name="minimum"> <property name="minimum">
<number>256</number> <number>0</number>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>10000</number> <number>1048576</number>
</property> </property>
<property name="singleStep"> <property name="singleStep">
<number>256</number> <number>1024</number>
</property> </property>
<property name="value"> <property name="value">
<number>256</number> <number>0</number>
</property> </property>
</widget> </widget>
</item> </item>
@ -192,13 +199,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Private storage max. size:</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -232,8 +232,8 @@
<widget class="QLabel" name="ip_label"> <widget class="QLabel" name="ip_label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight> <weight>50</weight>
<bold>true</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -252,8 +252,8 @@
<widget class="QLabel" name="netmask_label"> <widget class="QLabel" name="netmask_label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight> <weight>50</weight>
<bold>true</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -272,8 +272,8 @@
<widget class="QLabel" name="gateway_label"> <widget class="QLabel" name="gateway_label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight> <weight>50</weight>
<bold>true</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -288,7 +288,7 @@
</widget> </widget>
<widget class="QWidget" name="advanced_tab"> <widget class="QWidget" name="advanced_tab">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<attribute name="title"> <attribute name="title">
<string>Advanced</string> <string>Advanced</string>
@ -296,35 +296,50 @@
<layout class="QGridLayout" name="gridLayout_9"> <layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title"> <property name="title">
<string>Memory/CPU</string> <string>Memory/CPU</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_15"> <widget class="QLabel" name="label_15">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text"> <property name="text">
<string>Initial memory:</string> <string>Initial memory:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLabel" name="mem_size"> <widget class="QSpinBox" name="init_mem">
<property name="font"> <property name="enabled">
<font> <bool>true</bool>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>xx</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property> </property>
<property name="minimum">
<number>256</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="singleStep">
<number>256</number>
</property>
<property name="value">
<number>256</number>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QLabel" name="label_16"> <widget class="QLabel" name="label_16">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text"> <property name="text">
<string>MB</string> <string>MB</string>
</property> </property>
@ -340,7 +355,7 @@
<item row="1" column="1"> <item row="1" column="1">
<widget class="QSpinBox" name="max_mem_size"> <widget class="QSpinBox" name="max_mem_size">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@ -376,7 +391,7 @@
<item row="2" column="1"> <item row="2" column="1">
<widget class="QSpinBox" name="vcpus"> <widget class="QSpinBox" name="vcpus">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@ -388,6 +403,9 @@
</item> </item>
<item row="3" column="0" colspan="2"> <item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="include_in_balancing"> <widget class="QCheckBox" name="include_in_balancing">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text"> <property name="text">
<string>Include in memory balancing</string> <string>Include in memory balancing</string>
</property> </property>
@ -398,6 +416,9 @@
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QGroupBox" name="groupBox_10"> <widget class="QGroupBox" name="groupBox_10">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title"> <property name="title">
<string>Kernel</string> <string>Kernel</string>
</property> </property>
@ -423,8 +444,8 @@
<widget class="QLabel" name="kernel_opts"> <widget class="QLabel" name="kernel_opts">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight> <weight>50</weight>
<bold>true</bold> <bold>false</bold>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
@ -437,6 +458,9 @@
</item> </item>
<item row="1" column="0" colspan="2"> <item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_11"> <widget class="QGroupBox" name="groupBox_11">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title"> <property name="title">
<string>Paths</string> <string>Paths</string>
</property> </property>
@ -700,7 +724,7 @@
</widget> </widget>
<widget class="QWidget" name="devices_tab"> <widget class="QWidget" name="devices_tab">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<attribute name="title"> <attribute name="title">
<string>Devices</string> <string>Devices</string>
@ -727,17 +751,17 @@
</widget> </widget>
<widget class="QWidget" name="services_tab"> <widget class="QWidget" name="services_tab">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<attribute name="title"> <attribute name="title">
<string>Services</string> <string>Services</string>
</attribute> </attribute>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLineEdit" name="service_lineEdit"/> <widget class="QLineEdit" name="service_line_edit"/>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QPushButton" name="add_button"> <widget class="QPushButton" name="add_srv_button">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
@ -754,32 +778,7 @@
</widget> </widget>
</item> </item>
<item row="4" column="0" rowspan="2"> <item row="4" column="0" rowspan="2">
<widget class="QListWidget" name="services_list"> <widget class="QListWidget" name="services_list"/>
<item>
<property name="text">
<string>ntpd</string>
</property>
<property name="checkState">
<enum>Checked</enum>
</property>
</item>
<item>
<property name="text">
<string>cupsd</string>
</property>
<property name="checkState">
<enum>Checked</enum>
</property>
</item>
<item>
<property name="text">
<string>meminfo</string>
</property>
<property name="checkState">
<enum>Checked</enum>
</property>
</item>
</widget>
</item> </item>
<item row="6" column="0" colspan="2"> <item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="label_7">
@ -803,7 +802,7 @@
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QPushButton" name="remove_button"> <widget class="QPushButton" name="remove_srv_button">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>