Эх сурвалжийг харах

tools/qvm-start-gui: do not crash on qubesd restart

Do not crash if qubesd restart exactly the moment event handler was
called.
Event listener properly handle qubesd restarts (reconnects), but exists
if any handler raise an exception. Avoid this by logging such exceptions
but not propagating them.
Marek Marczykowski-Górecki 5 жил өмнө
parent
commit
72a2fd646d

+ 16 - 8
qubesadmin/tools/qvm_start_gui.py

@@ -30,6 +30,7 @@ import xcffib.xproto  # pylint: disable=unused-import
 
 import daemon.pidfile
 import qubesadmin
+import qubesadmin.exc
 import qubesadmin.tools
 import qubesadmin.vm
 have_events = False
@@ -306,17 +307,24 @@ class GUILauncher(object):
 
     def on_domain_spawn(self, vm, _event, **kwargs):
         '''Handler of 'domain-spawn' event, starts GUI daemon for stubdomain'''
-        if not vm.features.check_with_template('gui', True):
-            return
-        if vm.virt_mode == 'hvm' and kwargs.get('start_guid', 'True') == 'True':
-            asyncio.ensure_future(self.start_gui_for_stubdomain(vm))
+        try:
+            if not vm.features.check_with_template('gui', True):
+                return
+            if vm.virt_mode == 'hvm' and \
+                    kwargs.get('start_guid', 'True') == 'True':
+                asyncio.ensure_future(self.start_gui_for_stubdomain(vm))
+        except qubesadmin.exc.QubesException as e:
+            vm.log.warning('Failed to start GUI for %s: %s', vm.name, str(e))
 
     def on_domain_start(self, vm, _event, **kwargs):
         '''Handler of 'domain-start' event, starts GUI daemon for actual VM'''
-        if not vm.features.check_with_template('gui', True):
-            return
-        if kwargs.get('start_guid', 'True') == 'True':
-            asyncio.ensure_future(self.start_gui_for_vm(vm))
+        try:
+            if not vm.features.check_with_template('gui', True):
+                return
+            if kwargs.get('start_guid', 'True') == 'True':
+                asyncio.ensure_future(self.start_gui_for_vm(vm))
+        except qubesadmin.exc.QubesException as e:
+            vm.log.warning('Failed to start GUI for %s: %s', vm.name, str(e))
 
     def on_connection_established(self, _subject, _event, **_kwargs):
         '''Handler of 'connection-established' event, used to launch GUI