Use the new QubesDaemonAccessError
Replaces the old, unified approach.
This commit is contained in:
		
							parent
							
								
									8eb61b11ae
								
							
						
					
					
						commit
						ee5625b65c
					
				| @ -36,7 +36,6 @@ import pwd | |||||||
| import os | import os | ||||||
| import shutil | import shutil | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| # pylint: disable=too-few-public-methods | # pylint: disable=too-few-public-methods | ||||||
| class BackupThread(QtCore.QThread): | class BackupThread(QtCore.QThread): | ||||||
|     def __init__(self, vm): |     def __init__(self, vm): | ||||||
| @ -50,7 +49,9 @@ class BackupThread(QtCore.QThread): | |||||||
|             if not self.vm.is_running(): |             if not self.vm.is_running(): | ||||||
|                 self.vm.start() |                 self.vm.start() | ||||||
|         except exc.QubesException: |         except exc.QubesException: | ||||||
|             # we may have insufficient exceptions to ensure the qube is running |             # we may have insufficient permissions to ensure the qube is running | ||||||
|  |             # let us hope for the best (worst case scenario, we will fail at the | ||||||
|  |             # next step | ||||||
|             pass |             pass | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
| @ -94,6 +95,8 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): | |||||||
|         self.select_dir_page.isComplete = self.has_selected_dir_and_pass |         self.select_dir_page.isComplete = self.has_selected_dir_and_pass | ||||||
|         # FIXME |         # FIXME | ||||||
|         # this causes to run isComplete() twice, I don't know why |         # this causes to run isComplete() twice, I don't know why | ||||||
|  |         # update 2020-08: selectedChanged is emitted once, | ||||||
|  |         # but completeChanged twice. Somehow. | ||||||
|         self.select_vms_widget.selectedChanged.connect( |         self.select_vms_widget.selectedChanged.connect( | ||||||
|             self.select_vms_page.completeChanged.emit) |             self.select_vms_page.completeChanged.emit) | ||||||
|         self.passphrase_line_edit.textChanged.connect( |         self.passphrase_line_edit.textChanged.connect( | ||||||
| @ -144,7 +147,7 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): | |||||||
|         result = [] |         result = [] | ||||||
| 
 | 
 | ||||||
|         for domain in self.qubes_app.domains: |         for domain in self.qubes_app.domains: | ||||||
|             if getattr(domain, 'include_in_backups', None): |             if getattr(domain, 'include_in_backups', False): | ||||||
|                 result.append(domain.name) |                 result.append(domain.name) | ||||||
| 
 | 
 | ||||||
|         return result |         return result | ||||||
| @ -209,14 +212,23 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): | |||||||
|         # pylint: disable=too-few-public-methods |         # pylint: disable=too-few-public-methods | ||||||
|         def __init__(self, vm): |         def __init__(self, vm): | ||||||
|             self.vm = vm |             self.vm = vm | ||||||
|             if vm.qid == 0: |             if vm.klass == 'AdminVM': | ||||||
|                 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 = shutil.disk_usage(home_dir)[1] |                 self.size = shutil.disk_usage(home_dir)[1] | ||||||
|             else: |             else: | ||||||
|  |                 try: | ||||||
|                     self.size = vm.get_disk_utilization() |                     self.size = vm.get_disk_utilization() | ||||||
|             super(BackupVMsWindow.VmListItem, self).__init__( |                 except exc.QubesDaemonAccessError: | ||||||
|                 vm.name + " (" + admin_utils.size_to_human(self.size) + ")") |                     self.size = None | ||||||
|  | 
 | ||||||
|  |             if self.size is not None: | ||||||
|  |                 text = vm.name + " (" + admin_utils.size_to_human( | ||||||
|  |                     self.size) + ")" | ||||||
|  |             else: | ||||||
|  |                 text = vm.name + " (size unavailable)" | ||||||
|  |                 self.size = 0 | ||||||
|  |             super(BackupVMsWindow.VmListItem, self).__init__(text) | ||||||
| 
 | 
 | ||||||
|     def __fill_vms_list__(self, selected=None): |     def __fill_vms_list__(self, selected=None): | ||||||
|         for vm in self.qubes_app.domains: |         for vm in self.qubes_app.domains: | ||||||
| @ -307,7 +319,7 @@ class BackupVMsWindow(ui_backupdlg.Ui_Backup, QtWidgets.QWizard): | |||||||
|                 backup_summary = self.qubes_app.qubesd_call( |                 backup_summary = self.qubes_app.qubesd_call( | ||||||
|                     'dom0', 'admin.backup.Info', |                     'dom0', 'admin.backup.Info', | ||||||
|                     backup_utils.get_profile_name(True)).decode() |                     backup_utils.get_profile_name(True)).decode() | ||||||
|             except exc.QubesDaemonCommunicationError: |             except exc.QubesDaemonAccessError: | ||||||
|                 backup_summary = "Failed to get backup summary: " \ |                 backup_summary = "Failed to get backup summary: " \ | ||||||
|                                  "insufficient permissions" |                                  "insufficient permissions" | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -46,7 +46,7 @@ def fill_appvms_list(dialog): | |||||||
|         if utils.get_feature(vm, 'internal', False) or vm.klass == 'TemplateVM': |         if utils.get_feature(vm, 'internal', False) or vm.klass == 'TemplateVM': | ||||||
|             continue |             continue | ||||||
| 
 | 
 | ||||||
|         if utils.is_running(vm, False) and vm.qid != 0: |         if utils.is_running(vm, False) and vm.klass != 'AdminVM': | ||||||
|             dialog.appvm_combobox.addItem(vm.name) |             dialog.appvm_combobox.addItem(vm.name) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -83,7 +83,7 @@ class VMBootFromDeviceWindow(ui_bootfromdevice.Ui_BootDialog, | |||||||
|                     self.tr("Warning!"), |                     self.tr("Warning!"), | ||||||
|                     self.tr("Qube must be turned off before booting it from " |                     self.tr("Qube must be turned off before booting it from " | ||||||
|                             "device. Please turn off the qube.")) |                             "device. Please turn off the qube.")) | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             QtWidgets.QMessageBox.warning( |             QtWidgets.QMessageBox.warning( | ||||||
|                 self, |                 self, | ||||||
|                 self.tr("Warning!"), |                 self.tr("Warning!"), | ||||||
| @ -111,7 +111,7 @@ class VMBootFromDeviceWindow(ui_bootfromdevice.Ui_BootDialog, | |||||||
|             try: |             try: | ||||||
|                 for device in domain.devices["block"]: |                 for device in domain.devices["block"]: | ||||||
|                     device_choice.append((str(device), device)) |                     device_choice.append((str(device), device)) | ||||||
|             except exc.QubesException: |             except exc.QubesDaemonAccessError: | ||||||
|                 # insufficient permissions |                 # insufficient permissions | ||||||
|                 pass |                 pass | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -60,12 +60,16 @@ class CloneVMDlg(QtWidgets.QDialog, Ui_CloneVMDlg): | |||||||
| 
 | 
 | ||||||
|         self.update_label() |         self.update_label() | ||||||
| 
 | 
 | ||||||
|  |         try: | ||||||
|             utils.initialize_widget_with_default( |             utils.initialize_widget_with_default( | ||||||
|                 widget=self.storage_pool, |                 widget=self.storage_pool, | ||||||
|                 choices=[(str(pool), pool) for pool in self.app.pools.values()], |                 choices=[(str(pool), pool) for pool in self.app.pools.values()], | ||||||
|                 add_qubes_default=True, |                 add_qubes_default=True, | ||||||
|                 mark_existing_as_default=True, |                 mark_existing_as_default=True, | ||||||
|                 default_value=self.app.default_pool) |                 default_value=self.app.default_pool) | ||||||
|  |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|  |             self.storage_pool.clear() | ||||||
|  |             self.storage_pool.addItem("(default)", qubesadmin.DEFAULT) | ||||||
| 
 | 
 | ||||||
|         self.set_clone_name() |         self.set_clone_name() | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -123,7 +123,7 @@ class NewVmDlg(QtWidgets.QDialog, Ui_NewVMDlg): | |||||||
|                 add_qubes_default=True, |                 add_qubes_default=True, | ||||||
|                 mark_existing_as_default=True, |                 mark_existing_as_default=True, | ||||||
|                 default_value=self.app.default_pool) |                 default_value=self.app.default_pool) | ||||||
|         except qubesadmin.exc.QubesPropertyAccessError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             self.storage_pool.clear() |             self.storage_pool.clear() | ||||||
|             self.storage_pool.addItem("(default)", qubesadmin.DEFAULT) |             self.storage_pool.addItem("(default)", qubesadmin.DEFAULT) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -90,41 +90,51 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|         self.app.setApplicationName(self.tr("Qubes Global Settings")) |         self.app.setApplicationName(self.tr("Qubes Global Settings")) | ||||||
|         self.app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) |         self.app.setWindowIcon(QtGui.QIcon.fromTheme("qubes-manager")) | ||||||
| 
 | 
 | ||||||
|  |     def setup_widget_with_vms(self, widget, filter_function, | ||||||
|  |                               allow_none, holder, property_name): | ||||||
|  |         try: | ||||||
|  |             utils.initialize_widget_with_vms( | ||||||
|  |                 widget=widget, | ||||||
|  |                 qubes_app=self.qubes_app, | ||||||
|  |                 filter_function=filter_function, | ||||||
|  |                 allow_none=allow_none, | ||||||
|  |                 holder=holder, | ||||||
|  |                 property_name=property_name | ||||||
|  |             ) | ||||||
|  |         except exc.QubesDaemonAccessError: | ||||||
|  |             widget.clear() | ||||||
|  |             widget.setCurrentText("unavailable") | ||||||
|  |             widget.setEnabled(False) | ||||||
|  | 
 | ||||||
|     def __init_system_defaults__(self): |     def __init_system_defaults__(self): | ||||||
|         # set up updatevm choice |         # set up updatevm choice | ||||||
|         utils.initialize_widget_with_vms( |         self.setup_widget_with_vms( | ||||||
|             widget=self.update_vm_combo, |             widget=self.update_vm_combo, | ||||||
|             qubes_app=self.qubes_app, |  | ||||||
|             filter_function=(lambda vm: vm.klass != 'TemplateVM'), |             filter_function=(lambda vm: vm.klass != 'TemplateVM'), | ||||||
|             allow_none=True, |             allow_none=True, | ||||||
|             holder=self.qubes_app, |             holder=self.qubes_app, | ||||||
|             property_name="updatevm" |             property_name="updatevm") | ||||||
|         ) |  | ||||||
| 
 | 
 | ||||||
|         # set up clockvm choice |         # set up clockvm choice | ||||||
|         utils.initialize_widget_with_vms( |         self.setup_widget_with_vms( | ||||||
|             widget=self.clock_vm_combo, |             widget=self.clock_vm_combo, | ||||||
|             qubes_app=self.qubes_app, |  | ||||||
|             filter_function=(lambda vm: vm.klass != 'TemplateVM'), |             filter_function=(lambda vm: vm.klass != 'TemplateVM'), | ||||||
|             allow_none=True, |             allow_none=True, | ||||||
|             holder=self.qubes_app, |             holder=self.qubes_app, | ||||||
|             property_name="clockvm" |             property_name="clockvm") | ||||||
|         ) |  | ||||||
| 
 | 
 | ||||||
|         # set up default netvm |         # set up default netvm | ||||||
|         utils.initialize_widget_with_vms( |         self.setup_widget_with_vms( | ||||||
|             widget=self.default_netvm_combo, |             widget=self.default_netvm_combo, | ||||||
|             qubes_app=self.qubes_app, |             filter_function=(lambda vm: getattr( | ||||||
|             filter_function=(lambda vm: getattr(vm, 'provides_network', False)), |                 vm, 'provides_network', False)), | ||||||
|             allow_none=True, |             allow_none=True, | ||||||
|             holder=self.qubes_app, |             holder=self.qubes_app, | ||||||
|             property_name="default_netvm" |             property_name="default_netvm") | ||||||
|         ) |  | ||||||
| 
 | 
 | ||||||
|         # default template |         # default template | ||||||
|         utils.initialize_widget_with_vms( |         self.setup_widget_with_vms( | ||||||
|             widget=self.default_template_combo, |             widget=self.default_template_combo, | ||||||
|             qubes_app=self.qubes_app, |  | ||||||
|             filter_function=(lambda vm: vm.klass == 'TemplateVM'), |             filter_function=(lambda vm: vm.klass == 'TemplateVM'), | ||||||
|             allow_none=True, |             allow_none=True, | ||||||
|             holder=self.qubes_app, |             holder=self.qubes_app, | ||||||
| @ -132,9 +142,8 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         # default dispvm |         # default dispvm | ||||||
|         utils.initialize_widget_with_vms( |         self.setup_widget_with_vms( | ||||||
|             widget=self.default_dispvm_combo, |             widget=self.default_dispvm_combo, | ||||||
|             qubes_app=self.qubes_app, |  | ||||||
|             filter_function=(lambda vm: getattr( |             filter_function=(lambda vm: getattr( | ||||||
|                 vm, 'template_for_dispvms', False)), |                 vm, 'template_for_dispvms', False)), | ||||||
|             allow_none=True, |             allow_none=True, | ||||||
| @ -194,8 +203,9 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|                 allow_none=True, |                 allow_none=True, | ||||||
|                 holder=self.qubes_app, |                 holder=self.qubes_app, | ||||||
|                 property_name='default_kernel') |                 property_name='default_kernel') | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             self.default_kernel_combo.clear() |             self.default_kernel_combo.clear() | ||||||
|  |             self.default_kernel_combo.setCurrentText("unavailable") | ||||||
|             self.default_kernel_combo.setEnabled(False) |             self.default_kernel_combo.setEnabled(False) | ||||||
| 
 | 
 | ||||||
|     def __apply_kernel_defaults__(self): |     def __apply_kernel_defaults__(self): | ||||||
| @ -270,14 +280,14 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|             if widget.currentData() is None: |             if widget.currentData() is None: | ||||||
|                 try: |                 try: | ||||||
|                     del self.vm.features[feature] |                     del self.vm.features[feature] | ||||||
|                 except exc.QubesDaemonCommunicationError: |                 except exc.QubesDaemonAccessError: | ||||||
|                     self.errors.append( |                     self.errors.append( | ||||||
|                         "Failed to set {} due to insufficient " |                         "Failed to set {} due to insufficient " | ||||||
|                         "permissions".format(feature)) |                         "permissions".format(feature)) | ||||||
|             else: |             else: | ||||||
|                 try: |                 try: | ||||||
|                     self.vm.features[feature] = widget.currentData() |                     self.vm.features[feature] = widget.currentData() | ||||||
|                 except exc.QubesDaemonCommunicationError as ex: |                 except exc.QubesDaemonAccessError as ex: | ||||||
|                     self.errors.append( |                     self.errors.append( | ||||||
|                         "Failed to set {} due to insufficient " |                         "Failed to set {} due to insufficient " | ||||||
|                         "permissions".format(feature)) |                         "permissions".format(feature)) | ||||||
| @ -411,7 +421,7 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             self.updates_vm.setChecked(self.qubes_app.check_updates_vm) |             self.updates_vm.setChecked(self.qubes_app.check_updates_vm) | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             self.updates_vm.isEnabled(False) |             self.updates_vm.isEnabled(False) | ||||||
| 
 | 
 | ||||||
|         self.enable_updates_all.clicked.connect(self.__enable_updates_all) |         self.enable_updates_all.clicked.connect(self.__enable_updates_all) | ||||||
| @ -485,7 +495,7 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|             if vm.klass != "AdminVM": |             if vm.klass != "AdminVM": | ||||||
|                 try: |                 try: | ||||||
|                     vm.features['service.qubes-update-check'] = state |                     vm.features['service.qubes-update-check'] = state | ||||||
|                 except exc.QubesDaemonCommunicationError: |                 except exc.QubesDaemonAccessError: | ||||||
|                     errors.append(vm.name) |                     errors.append(vm.name) | ||||||
| 
 | 
 | ||||||
|         if errors: |         if errors: | ||||||
| @ -501,7 +511,7 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|                 self.qubes_app.domains['dom0'].features[ |                 self.qubes_app.domains['dom0'].features[ | ||||||
|                     'service.qubes-update-check'] = \ |                     'service.qubes-update-check'] = \ | ||||||
|                     self.updates_dom0.isChecked() |                     self.updates_dom0.isChecked() | ||||||
|             except exc.QubesDaemonCommunicationError: |             except exc.QubesDaemonAccessError: | ||||||
|                 self.errors.append("Failed to change dom0 update value due " |                 self.errors.append("Failed to change dom0 update value due " | ||||||
|                                    "to insufficient permissions.") |                                    "to insufficient permissions.") | ||||||
| 
 | 
 | ||||||
| @ -509,7 +519,7 @@ class GlobalSettingsWindow(ui_globalsettingsdlg.Ui_GlobalSettings, | |||||||
|                 self.qubes_app.check_updates_vm != self.updates_vm.isChecked(): |                 self.qubes_app.check_updates_vm != self.updates_vm.isChecked(): | ||||||
|             try: |             try: | ||||||
|                 self.qubes_app.check_updates_vm = self.updates_vm.isChecked() |                 self.qubes_app.check_updates_vm = self.updates_vm.isChecked() | ||||||
|             except exc.QubesPropertyAccessError: |             except exc.QubesDaemonAccessError: | ||||||
|                 self.errors.append("Failed to set qube update checking due " |                 self.errors.append("Failed to set qube update checking due " | ||||||
|                                    "to insufficient permissions.") |                                    "to insufficient permissions.") | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -209,25 +209,29 @@ class VmInfo(): | |||||||
|     def update_power_state(self): |     def update_power_state(self): | ||||||
|         try: |         try: | ||||||
|             self.state['power'] = self.vm.get_power_state() |             self.state['power'] = self.vm.get_power_state() | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             self.state['power'] = "" |             self.state['power'] = "" | ||||||
| 
 | 
 | ||||||
|         self.state['outdated'] = "" |         self.state['outdated'] = "" | ||||||
|         try: |         try: | ||||||
|             if self.vm.is_running(): |             if manager_utils.is_running(self.vm, False): | ||||||
|                 if hasattr(self.vm, 'template') and \ |                 if hasattr(self.vm, 'template') and \ | ||||||
|                         self.vm.template.is_running(): |                         manager_utils.is_running(self.vm.template, False): | ||||||
|                     self.state['outdated'] = "to-be-outdated" |                     self.state['outdated'] = "to-be-outdated" | ||||||
|                 else: |                 else: | ||||||
|  |                     try: | ||||||
|                         for vol in self.vm.volumes.values(): |                         for vol in self.vm.volumes.values(): | ||||||
|                             if vol.is_outdated(): |                             if vol.is_outdated(): | ||||||
|                                 self.state['outdated'] = "outdated" |                                 self.state['outdated'] = "outdated" | ||||||
|                                 break |                                 break | ||||||
|  |                     except exc.QubesDaemonAccessError: | ||||||
|  |                         pass | ||||||
| 
 | 
 | ||||||
|             if self.vm.klass in {'TemplateVM', 'StandaloneVM'} and \ |             if self.vm.klass in {'TemplateVM', 'StandaloneVM'} and \ | ||||||
|                     self.vm.features.get('updates-available', False): |                     manager_utils.get_feature( | ||||||
|  |                         self.vm, 'updates-available', False): | ||||||
|                 self.state['outdated'] = 'update' |                 self.state['outdated'] = 'update' | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             pass |             pass | ||||||
| 
 | 
 | ||||||
|     def update(self, update_size_on_disk=False, event=None): |     def update(self, update_size_on_disk=False, event=None): | ||||||
| @ -259,14 +263,12 @@ class VmInfo(): | |||||||
|                 if hasattr(self.vm, 'netvm') \ |                 if hasattr(self.vm, 'netvm') \ | ||||||
|                         and self.vm.property_is_default("netvm"): |                         and self.vm.property_is_default("netvm"): | ||||||
|                     self.netvm = "default (" + self.netvm + ")" |                     self.netvm = "default (" + self.netvm + ")" | ||||||
|             except exc.QubesPropertyAccessError: |             except exc.QubesDaemonAccessError: | ||||||
|                 pass |                 pass | ||||||
| 
 | 
 | ||||||
|         if not event or event.endswith(':internal'): |         if not event or event.endswith(':internal'): | ||||||
|             try: |             self.internal = manager_utils.get_boolean_feature( | ||||||
|                 self.internal = self.vm.features.get('internal', False) |                 self.vm, 'internal') | ||||||
|             except exc.QubesPropertyAccessError: |  | ||||||
|                 self.internal = False |  | ||||||
| 
 | 
 | ||||||
|         if not event or event.endswith(':ip'): |         if not event or event.endswith(':ip'): | ||||||
|             self.ip = getattr(self.vm, 'ip', "n/a") |             self.ip = getattr(self.vm, 'ip', "n/a") | ||||||
| @ -286,8 +288,9 @@ class VmInfo(): | |||||||
|                     self.dvm = "default (" + str(self.dvm) + ")" |                     self.dvm = "default (" + str(self.dvm) + ")" | ||||||
|                 elif self.dvm is not None: |                 elif self.dvm is not None: | ||||||
|                     self.dvm = str(self.dvm) |                     self.dvm = str(self.dvm) | ||||||
|             except exc.QubesPropertyAccessError: |             except exc.QubesDaemonAccessError: | ||||||
|                 self.dvm = None |                 if self.dvm is not None: | ||||||
|  |                     self.dvm = str(self.dvm) | ||||||
| 
 | 
 | ||||||
|         if not event or event.endswith(':template_for_dispvms'): |         if not event or event.endswith(':template_for_dispvms'): | ||||||
|             self.dvm_template = getattr(self.vm, 'template_for_dispvms', None) |             self.dvm_template = getattr(self.vm, 'template_for_dispvms', None) | ||||||
| @ -296,7 +299,7 @@ class VmInfo(): | |||||||
|             try: |             try: | ||||||
|                 self.disk_float = float(self.vm.get_disk_utilization()) |                 self.disk_float = float(self.vm.get_disk_utilization()) | ||||||
|                 self.disk = str(round(self.disk_float/(1024*1024), 2)) + " MiB" |                 self.disk = str(round(self.disk_float/(1024*1024), 2)) + " MiB" | ||||||
|             except exc.QubesPropertyAccessError: |             except exc.QubesDaemonAccessError: | ||||||
|                 self.disk_float = None |                 self.disk_float = None | ||||||
|                 self.disk = None |                 self.disk = None | ||||||
| 
 | 
 | ||||||
| @ -422,7 +425,7 @@ class QubesTableModel(QAbstractTableModel): | |||||||
|                     pixmap.load(icon_name) |                     pixmap.load(icon_name) | ||||||
|                     self.klass_pixmap[vm.klass] = pixmap.scaled(icon_size) |                     self.klass_pixmap[vm.klass] = pixmap.scaled(icon_size) | ||||||
|                     return self.klass_pixmap[vm.klass] |                     return self.klass_pixmap[vm.klass] | ||||||
|                 except exc.QubesPropertyAccessError: |                 except exc.QubesDaemonAccessError: | ||||||
|                     return None |                     return None | ||||||
| 
 | 
 | ||||||
|             if col_name == "Label": |             if col_name == "Label": | ||||||
| @ -432,7 +435,7 @@ class QubesTableModel(QAbstractTableModel): | |||||||
|                     icon = QIcon.fromTheme(vm.label.icon) |                     icon = QIcon.fromTheme(vm.label.icon) | ||||||
|                     self.label_pixmap[vm.label] = icon.pixmap(icon_size) |                     self.label_pixmap[vm.label] = icon.pixmap(icon_size) | ||||||
|                     return self.label_pixmap[vm.label] |                     return self.label_pixmap[vm.label] | ||||||
|                 except exc.QubesPropertyAccessError: |                 except exc.QubesDaemonAccessError: | ||||||
|                     return None |                     return None | ||||||
| 
 | 
 | ||||||
|         if role == Qt.FontRole: |         if role == Qt.FontRole: | ||||||
| @ -507,7 +510,7 @@ class VmShutdownMonitor(QObject): | |||||||
| 
 | 
 | ||||||
|     def check_if_vm_has_shutdown(self): |     def check_if_vm_has_shutdown(self): | ||||||
|         vm = self.vm |         vm = self.vm | ||||||
|         vm_is_running = vm.is_running() |         vm_is_running = manager_utils.is_running(vm, False) | ||||||
|         try: |         try: | ||||||
|             vm_start_time = datetime.fromtimestamp(float(vm.start_time)) |             vm_start_time = datetime.fromtimestamp(float(vm.start_time)) | ||||||
|         except (AttributeError, TypeError, ValueError): |         except (AttributeError, TypeError, ValueError): | ||||||
| @ -576,8 +579,12 @@ class UpdateVMThread(common_threads.QubesThread): | |||||||
|                 subprocess.check_call( |                 subprocess.check_call( | ||||||
|                     ["/usr/bin/qubes-dom0-update", "--clean", "--gui"]) |                     ["/usr/bin/qubes-dom0-update", "--clean", "--gui"]) | ||||||
|             else: |             else: | ||||||
|                 if not self.vm.is_running(): |                 if not manager_utils.is_running(self.vm, False): | ||||||
|  |                     try: | ||||||
|                         self.vm.start() |                         self.vm.start() | ||||||
|  |                     except exc.QubesDaemonAccessError: | ||||||
|  |                         # permission denied, let us hope for the best | ||||||
|  |                         pass | ||||||
|                 # apply DSA-4371 |                 # apply DSA-4371 | ||||||
|                 with open('/usr/libexec/qubes-manager/dsa-4371-update', 'rb') \ |                 with open('/usr/libexec/qubes-manager/dsa-4371-update', 'rb') \ | ||||||
|                         as dsa4371update: |                         as dsa4371update: | ||||||
| @ -848,9 +855,10 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             if info.vm.klass in {'TemplateVM', 'StandaloneVM'} and \ |             if info.vm.klass in {'TemplateVM', 'StandaloneVM'} and \ | ||||||
|                     info.vm.features.get('updates-available', False): |                     manager_utils.get_feature( | ||||||
|  |                         info.vm, 'updates-available', False): | ||||||
|                 info.state['outdated'] = 'update' |                 info.state['outdated'] = 'update' | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             return |             return | ||||||
| 
 | 
 | ||||||
|     def on_domain_added(self, _submitter, _event, vm, **_kwargs): |     def on_domain_added(self, _submitter, _event, vm, **_kwargs): | ||||||
| @ -874,7 +882,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|                             update(event="outdated") |                             update(event="outdated") | ||||||
|             self.proxy.invalidate() |             self.proxy.invalidate() | ||||||
|             self.table_selection_changed() |             self.table_selection_changed() | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             return  # the VM was deleted before its status could be updated |             return  # the VM was deleted before its status could be updated | ||||||
|         except KeyError:  # adding the VM failed for some reason |         except KeyError:  # adding the VM failed for some reason | ||||||
|             self.on_domain_added(None, None, vm) |             self.on_domain_added(None, None, vm) | ||||||
| @ -895,7 +903,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|         try: |         try: | ||||||
|             self.qubes_cache.get_vm(qid=vm.qid).update(event=event) |             self.qubes_cache.get_vm(qid=vm.qid).update(event=event) | ||||||
|             self.proxy.invalidate() |             self.proxy.invalidate() | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             return  # the VM was deleted before its status could be updated |             return  # the VM was deleted before its status could be updated | ||||||
| 
 | 
 | ||||||
|     def load_manager_settings(self): |     def load_manager_settings(self): | ||||||
| @ -1092,8 +1100,8 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|     def action_resumevm_triggered(self): |     def action_resumevm_triggered(self): | ||||||
|         for vm_info in self.get_selected_vms(): |         for vm_info in self.get_selected_vms(): | ||||||
|             vm = vm_info.vm |             vm = vm_info.vm | ||||||
|             if vm.get_power_state() in ["Paused", "Suspended"]: |  | ||||||
|             try: |             try: | ||||||
|  |                 if vm.get_power_state() in ["Paused", "Suspended"]: | ||||||
|                     vm.unpause() |                     vm.unpause() | ||||||
|             except exc.QubesException as ex: |             except exc.QubesException as ex: | ||||||
|                 QMessageBox.warning( |                 QMessageBox.warning( | ||||||
| @ -1104,7 +1112,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|             self.start_vm(vm) |             self.start_vm(vm) | ||||||
| 
 | 
 | ||||||
|     def start_vm(self, vm): |     def start_vm(self, vm): | ||||||
|         if vm.is_running(): |         if manager_utils.is_running(vm, False): | ||||||
|             return |             return | ||||||
| 
 | 
 | ||||||
|         thread = StartVMThread(vm) |         thread = StartVMThread(vm) | ||||||
| @ -1179,17 +1187,29 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
| 
 | 
 | ||||||
|             if reply == QMessageBox.Yes: |             if reply == QMessageBox.Yes: | ||||||
|                 # in case the user shut down the VM in the meantime |                 # in case the user shut down the VM in the meantime | ||||||
|                 if vm.is_running(): |                 try: | ||||||
|  |                     if manager_utils.is_running(vm, False): | ||||||
|                         self.shutdown_vm(vm, and_restart=True) |                         self.shutdown_vm(vm, and_restart=True) | ||||||
|                     else: |                     else: | ||||||
|                         self.start_vm(vm) |                         self.start_vm(vm) | ||||||
|  |                 except exc.QubesException as ex: | ||||||
|  |                     QMessageBox.warning( | ||||||
|  |                         self, | ||||||
|  |                         self.tr("Error restarting Qube!"), | ||||||
|  |                         self.tr("ERROR: {0}").format(ex)) | ||||||
| 
 | 
 | ||||||
|     # noinspection PyArgumentList |     # noinspection PyArgumentList | ||||||
|     @pyqtSlot(name='on_action_killvm_triggered') |     @pyqtSlot(name='on_action_killvm_triggered') | ||||||
|     def action_killvm_triggered(self): |     def action_killvm_triggered(self): | ||||||
|         for vm_info in self.get_selected_vms(): |         for vm_info in self.get_selected_vms(): | ||||||
|             vm = vm_info.vm |             vm = vm_info.vm | ||||||
|             if not (vm.is_running() or vm.is_paused()): | 
 | ||||||
|  |             try: | ||||||
|  |                 vm_not_running = not (vm.is_running() or vm.is_paused()) | ||||||
|  |             except exc.QubesDaemonAccessError: | ||||||
|  |                 vm_not_running = False | ||||||
|  | 
 | ||||||
|  |             if vm_not_running: | ||||||
|                 info = self.tr("Qube <b>'{0}'</b> is not running. Are you " |                 info = self.tr("Qube <b>'{0}'</b> is not running. Are you " | ||||||
|                                "absolutely sure you want to try to kill it?<br>" |                                "absolutely sure you want to try to kill it?<br>" | ||||||
|                                "<small>This will end <b>(not shutdown!)</b> " |                                "<small>This will end <b>(not shutdown!)</b> " | ||||||
| @ -1213,8 +1233,8 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|                     QMessageBox.critical( |                     QMessageBox.critical( | ||||||
|                         self, self.tr("Error while killing Qube!"), |                         self, self.tr("Error while killing Qube!"), | ||||||
|                         self.tr( |                         self.tr( | ||||||
|                             "<b>An exception ocurred while killing {0}.</b><br>" |                             "<b>An exception occurred while killing {0}.</b>" | ||||||
|                             "ERROR: {1}").format(vm.name, ex)) |                             "<br>ERROR: {1}").format(vm.name, ex)) | ||||||
|                     return |                     return | ||||||
| 
 | 
 | ||||||
|     def open_settings(self, vm, tab='basic'): |     def open_settings(self, vm, tab='basic'): | ||||||
| @ -1252,7 +1272,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|     def action_updatevm_triggered(self): |     def action_updatevm_triggered(self): | ||||||
|         for vm_info in self.get_selected_vms(): |         for vm_info in self.get_selected_vms(): | ||||||
|             vm = vm_info.vm |             vm = vm_info.vm | ||||||
|             if not vm.is_running(): |             if not manager_utils.is_running(vm, True): | ||||||
|                 reply = QMessageBox.question( |                 reply = QMessageBox.question( | ||||||
|                     self, self.tr("Qube Update Confirmation"), |                     self, self.tr("Qube Update Confirmation"), | ||||||
|                     self.tr( |                     self.tr( | ||||||
| @ -1417,7 +1437,7 @@ class VmManagerWindow(ui_qubemanager.Ui_VmManagerWindow, QMainWindow): | |||||||
|                         menu_empty = False |                         menu_empty = False | ||||||
| 
 | 
 | ||||||
|             self.logs_menu.setEnabled(not menu_empty) |             self.logs_menu.setEnabled(not menu_empty) | ||||||
|         except exc.QubesPropertyAccessError: |         except exc.QubesDaemonAccessError: | ||||||
|             pass |             pass | ||||||
| 
 | 
 | ||||||
|     @pyqtSlot('const QPoint&') |     @pyqtSlot('const QPoint&') | ||||||
|  | |||||||
| @ -337,7 +337,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|             no_firewall_state = \ |             no_firewall_state = \ | ||||||
|                 netvm is not None and \ |                 netvm is not None and \ | ||||||
|                 not netvm.features.check_with_template('qubes-firewall', False) |                 not netvm.features.check_with_template('qubes-firewall', False) | ||||||
|         except qubesadmin.exc.QubesDaemonCommunicationError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             no_firewall_state = False |             no_firewall_state = False | ||||||
| 
 | 
 | ||||||
|         self.netvm_no_firewall_label.setVisible(no_firewall_state) |         self.netvm_no_firewall_label.setVisible(no_firewall_state) | ||||||
| @ -372,7 +372,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|             self.delete_vm_button.setText( |             self.delete_vm_button.setText( | ||||||
|                 self.tr('Delete qube (cannot delete a running qube)')) |                 self.tr('Delete qube (cannot delete a running qube)')) | ||||||
| 
 | 
 | ||||||
|         if self.vm.qid == 0: |         if self.vm.klass == 'AdminVM': | ||||||
|             self.vmlabel.setVisible(False) |             self.vmlabel.setVisible(False) | ||||||
|         else: |         else: | ||||||
|             try: |             try: | ||||||
| @ -382,7 +382,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                     holder=self.vm) |                     holder=self.vm) | ||||||
|                 self.vmlabel.setVisible(True) |                 self.vmlabel.setVisible(True) | ||||||
|                 self.vmlabel.setEnabled(not utils.is_running(self.vm, False)) |                 self.vmlabel.setEnabled(not utils.is_running(self.vm, False)) | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 self.vmlabel.setEnabled(False) |                 self.vmlabel.setEnabled(False) | ||||||
| 
 | 
 | ||||||
|         if self.vm.klass == 'AppVM': |         if self.vm.klass == 'AppVM': | ||||||
| @ -393,7 +393,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                     filter_function=(lambda vm: vm.klass == 'TemplateVM'), |                     filter_function=(lambda vm: vm.klass == 'TemplateVM'), | ||||||
|                     holder=self.vm, |                     holder=self.vm, | ||||||
|                     property_name='template') |                     property_name='template') | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 self.template_name.setCurrentIndex(-1) |                 self.template_name.setCurrentIndex(-1) | ||||||
|                 self.template_name.setEnabled(False) |                 self.template_name.setEnabled(False) | ||||||
| 
 | 
 | ||||||
| @ -402,11 +402,11 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                 utils.initialize_widget_with_vms( |                 utils.initialize_widget_with_vms( | ||||||
|                     widget=self.template_name, |                     widget=self.template_name, | ||||||
|                     qubes_app=self.qubesapp, |                     qubes_app=self.qubesapp, | ||||||
|                     filter_function=(lambda vm: |                     filter_function=( | ||||||
|                                      getattr(vm, 'template_for_dispvms', False)), |                         lambda vm: getattr(vm, 'template_for_dispvms', False)), | ||||||
|                     holder=self.vm, |                     holder=self.vm, | ||||||
|                     property_name='template') |                     property_name='template') | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 self.template_name.setCurrentIndex(-1) |                 self.template_name.setCurrentIndex(-1) | ||||||
|                 self.template_name.setEnabled(False) |                 self.template_name.setEnabled(False) | ||||||
| 
 | 
 | ||||||
| @ -426,7 +426,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                 property_name='netvm', |                 property_name='netvm', | ||||||
|                 allow_default=True, |                 allow_default=True, | ||||||
|                 allow_none=True) |                 allow_none=True) | ||||||
|         except qubesadmin.exc.QubesPropertyAccessError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             self.netVM.setEnabled(False) |             self.netVM.setEnabled(False) | ||||||
|             self.netVM.setCurrentIndex(-1) |             self.netVM.setCurrentIndex(-1) | ||||||
| 
 | 
 | ||||||
| @ -434,13 +434,13 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             self.include_in_backups.setChecked(self.vm.include_in_backups) |             self.include_in_backups.setChecked(self.vm.include_in_backups) | ||||||
|         except qubesadmin.exc.QubesPropertyAccessError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             self.include_in_backups.setEnabled(False) |             self.include_in_backups.setEnabled(False) | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             self.autostart_vm.setChecked(self.vm.autostart) |             self.autostart_vm.setChecked(self.vm.autostart) | ||||||
|             self.autostart_vm.setVisible(True) |             self.autostart_vm.setVisible(True) | ||||||
|         except qubesadmin.exc.QubesPropertyAccessError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             self.autostart_vm.setEnabled(False) |             self.autostart_vm.setEnabled(False) | ||||||
|         except AttributeError: |         except AttributeError: | ||||||
|             self.autostart_vm.setVisible(False) |             self.autostart_vm.setVisible(False) | ||||||
| @ -602,7 +602,10 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|         own_netvm = self.netVM.currentData() |         own_netvm = self.netVM.currentData() | ||||||
| 
 | 
 | ||||||
|         if dispvm == qubesadmin.DEFAULT: |         if dispvm == qubesadmin.DEFAULT: | ||||||
|  |             try: | ||||||
|                 dispvm = self.vm.property_get_default('default_dispvm') |                 dispvm = self.vm.property_get_default('default_dispvm') | ||||||
|  |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|  |                 pass | ||||||
| 
 | 
 | ||||||
|         if dispvm == self.vm: |         if dispvm == self.vm: | ||||||
|             self.warn_netvm_dispvm.setVisible(False) |             self.warn_netvm_dispvm.setVisible(False) | ||||||
| @ -613,7 +616,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|         if own_netvm == qubesadmin.DEFAULT: |         if own_netvm == qubesadmin.DEFAULT: | ||||||
|             try: |             try: | ||||||
|                 own_netvm = self.vm.property_get_default('netvm') |                 own_netvm = self.vm.property_get_default('netvm') | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 # no point in warning if we don't know what we're warning about |                 # no point in warning if we don't know what we're warning about | ||||||
|                 self.warn_netvm_dispvm.setVisible(False) |                 self.warn_netvm_dispvm.setVisible(False) | ||||||
|                 return |                 return | ||||||
| @ -731,7 +734,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|         else: |         else: | ||||||
|             try: |             try: | ||||||
|                 maxmem = self.vm.property_get_default('maxmem') |                 maxmem = self.vm.property_get_default('maxmem') | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 maxmem = 0 |                 maxmem = 0 | ||||||
|             if maxmem == 0: |             if maxmem == 0: | ||||||
|                 maxmem = vm_memory |                 maxmem = vm_memory | ||||||
| @ -760,7 +763,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                     property_name='kernel') |                     property_name='kernel') | ||||||
|                 self.kernel.currentIndexChanged.connect(self.kernel_changed) |                 self.kernel.currentIndexChanged.connect(self.kernel_changed) | ||||||
|                 self.kernel_opts.setText(getattr(self.vm, 'kernelopts', '-')) |                 self.kernel_opts.setText(getattr(self.vm, 'kernelopts', '-')) | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 self.kernel_groupbox.setVisible(False) |                 self.kernel_groupbox.setVisible(False) | ||||||
|         else: |         else: | ||||||
|             self.kernel_groupbox.setVisible(False) |             self.kernel_groupbox.setVisible(False) | ||||||
| @ -783,7 +786,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                 ) |                 ) | ||||||
|                 self.default_dispvm.currentIndexChanged.connect( |                 self.default_dispvm.currentIndexChanged.connect( | ||||||
|                     self.check_warn_dispvmnetvm) |                     self.check_warn_dispvmnetvm) | ||||||
|             except qubesadmin.exc.QubesPropertyAccessError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 self.other_groupbox.setVisible(False) |                 self.other_groupbox.setVisible(False) | ||||||
| 
 | 
 | ||||||
|         self.check_warn_dispvmnetvm() |         self.check_warn_dispvmnetvm() | ||||||
| @ -1030,7 +1033,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                 choices=choices, |                 choices=choices, | ||||||
|                 holder=self.vm, |                 holder=self.vm, | ||||||
|                 property_name='virt_mode') |                 property_name='virt_mode') | ||||||
|         except qubesadmin.exc.QubesPropertyAccessError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             self.virt_mode.setEnabled(False) |             self.virt_mode.setEnabled(False) | ||||||
| 
 | 
 | ||||||
|         if self.virt_mode.isEnabled() and old_mode is not None: |         if self.virt_mode.isEnabled() and old_mode is not None: | ||||||
| @ -1255,7 +1258,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                                    else ui_settingsdlg.QtCore.Qt.Unchecked) |                                    else ui_settingsdlg.QtCore.Qt.Unchecked) | ||||||
|                 self.services_list.addItem(item) |                 self.services_list.addItem(item) | ||||||
|                 self.new_srv_dict[service] = self.vm.features[feature] |                 self.new_srv_dict[service] = self.vm.features[feature] | ||||||
|         except qubesadmin.exc.QubesDaemonCommunicationError: |         except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|             self.tabWidget.setTabEnabled(self.tabs_indices["services"], False) |             self.tabWidget.setTabEnabled(self.tabs_indices["services"], False) | ||||||
|             return |             return | ||||||
| 
 | 
 | ||||||
| @ -1272,7 +1275,7 @@ class VMSettingsWindow(ui_settingsdlg.Ui_SettingsDialog, QtWidgets.QDialog): | |||||||
|                 for feature in self.vm.template.features: |                 for feature in self.vm.template.features: | ||||||
|                     if feature.startswith(service_prefix): |                     if feature.startswith(service_prefix): | ||||||
|                         supported_services.add(feature[len(service_prefix):]) |                         supported_services.add(feature[len(service_prefix):]) | ||||||
|             except qubesadmin.exc.QubesDaemonCommunicationError: |             except qubesadmin.exc.QubesDaemonAccessError: | ||||||
|                 pass |                 pass | ||||||
| 
 | 
 | ||||||
|         for service in sorted(supported_services): |         for service in sorted(supported_services): | ||||||
|  | |||||||
| @ -345,7 +345,7 @@ class VMRow: | |||||||
|         table_widget.setItem(row_no, columns.index('New template'), |         table_widget.setItem(row_no, columns.index('New template'), | ||||||
|                              self.dummy_new_item) |                              self.dummy_new_item) | ||||||
| 
 | 
 | ||||||
|         self.vm_state_change(is_vm_running(self.vm), row_no) |         self.vm_state_change(utils.is_running(self.vm, False), row_no) | ||||||
| 
 | 
 | ||||||
|     def vm_state_change(self, is_running, row=None): |     def vm_state_change(self, is_running, row=None): | ||||||
|         self.state_item.set_state(is_running) |         self.state_item.set_state(is_running) | ||||||
| @ -385,13 +385,6 @@ class VMRow: | |||||||
|                 self.checkbox = None |                 self.checkbox = None | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def is_vm_running(vm): |  | ||||||
|     try: |  | ||||||
|         return vm.is_running() |  | ||||||
|     except exc.QubesPropertyAccessError: |  | ||||||
|         return False |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def main(): | def main(): | ||||||
|     utils.run_asynchronous(TemplateManagerWindow) |     utils.run_asynchronous(TemplateManagerWindow) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -54,7 +54,7 @@ def is_internal(vm): | |||||||
|     try: |     try: | ||||||
|         return (vm.klass == 'AdminVM' |         return (vm.klass == 'AdminVM' | ||||||
|                 or vm.features.get('internal', False)) |                 or vm.features.get('internal', False)) | ||||||
|     except exc.QubesDaemonCommunicationError: |     except exc.QubesDaemonAccessError: | ||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -63,7 +63,7 @@ def is_running(vm, default_state): | |||||||
|     insufficient permissions to deteremine that.""" |     insufficient permissions to deteremine that.""" | ||||||
|     try: |     try: | ||||||
|         return vm.is_running() |         return vm.is_running() | ||||||
|     except exc.QubesPropertyAccessError: |     except exc.QubesDaemonAccessError: | ||||||
|         return default_state |         return default_state | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -107,7 +107,7 @@ class SizeSpinBox(QtWidgets.QSpinBox): | |||||||
| def get_feature(vm, feature_name, default_value): | def get_feature(vm, feature_name, default_value): | ||||||
|     try: |     try: | ||||||
|         return vm.features.get(feature_name, default_value) |         return vm.features.get(feature_name, default_value) | ||||||
|     except exc.QubesDaemonCommunicationError: |     except exc.QubesDaemonAccessError: | ||||||
|         return default_value |         return default_value | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -186,7 +186,10 @@ def initialize_widget_for_property( | |||||||
|     :return: |     :return: | ||||||
|     """ |     """ | ||||||
|     if allow_default: |     if allow_default: | ||||||
|  |         try: | ||||||
|             default_property = holder.property_get_default(property_name) |             default_property = holder.property_get_default(property_name) | ||||||
|  |         except exc.QubesDaemonAccessError: | ||||||
|  |             default_property = "ERROR: unavailable" | ||||||
|         if default_property is None: |         if default_property is None: | ||||||
|             default_property = "none" |             default_property = "none" | ||||||
|         choices.append( |         choices.append( | ||||||
| @ -194,7 +197,12 @@ def initialize_widget_for_property( | |||||||
|              qubesadmin.DEFAULT)) |              qubesadmin.DEFAULT)) | ||||||
| 
 | 
 | ||||||
|     # calculate current (can be default) |     # calculate current (can be default) | ||||||
|     if holder.property_is_default(property_name): |     try: | ||||||
|  |         is_default = holder.property_is_default(property_name) | ||||||
|  |     except exc.QubesDaemonAccessError: | ||||||
|  |         is_default = False | ||||||
|  | 
 | ||||||
|  |     if is_default: | ||||||
|         current_value = qubesadmin.DEFAULT |         current_value = qubesadmin.DEFAULT | ||||||
|     else: |     else: | ||||||
|         current_value = getattr(holder, property_name) |         current_value = getattr(holder, property_name) | ||||||
|  | |||||||
| @ -11,6 +11,9 @@ class QubesVMNotStartedError(BaseException): | |||||||
| class QubesPropertyAccessError(BaseException): | class QubesPropertyAccessError(BaseException): | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
|  | class QubesDaemonAccessError(BaseException): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
| class QubesNoSuchPropertyError(BaseException): | class QubesNoSuchPropertyError(BaseException): | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marta Marczykowska-Górecka
						Marta Marczykowska-Górecka