def wait_for_domain_shutdown(vm, timeout): ''' Helper function to wait for domain shutdown. This function wait for domain shutdown, but do not initiate the shutdown itself. Note: you need to close event loop after calling this function. :param vm: QubesVM object to wait for shutdown on :param timeout: Timeout in seconds, use 0 for no timeout ''' events = qubesadmin.events.EventsDispatcher(vm.app) loop = asyncio.get_event_loop() events.add_handler('domain-shutdown', functools.partial(interrupt_on_vm_shutdown, vm)) events.add_handler('connection-established', functools.partial(interrupt_on_vm_shutdown, vm)) events_task = asyncio.ensure_future(events.listen_for_events(), loop=loop) if timeout: # pylint: disable=no-member loop.call_later(timeout, events_task.cancel) try: loop.run_until_complete(events_task) except asyncio.CancelledError: raise qubesadmin.exc.QubesVMShutdownTimeout( 'VM %s shutdown timeout expired', vm.name) except Interrupt: pass
def register_events(self, events): """Register domain startup events in app.events dispatcher""" events.add_handler('domain-spawn', self.on_domain_spawn) events.add_handler('domain-start', self.on_domain_start) events.add_handler('connection-established', self.on_connection_established) events.add_handler('domain-stopped', self.on_domain_stopped)
async def wait_for_domain_shutdown(vms): """ Helper function to wait for domain shutdown. This function wait for domain shutdown, but do not initiate the shutdown itself. :param vms: QubesVM object collection to wait for shutdown on """ if not vms: return app = list(vms)[0].app vms = set(vms) events = qubesadmin.events.EventsDispatcher(app, enable_cache=False) events.add_handler('domain-shutdown', functools.partial(interrupt_on_vm_shutdown, vms, events)) events.add_handler('connection-established', functools.partial(interrupt_on_vm_shutdown, vms, events)) await events.listen_for_events()
def wait_for_domain_shutdown(vms): ''' Helper function to wait for domain shutdown. This function wait for domain shutdown, but do not initiate the shutdown itself. :param vms: QubesVM object collection to wait for shutdown on ''' if not vms: return app = list(vms)[0].app vms = set(vms) events = qubesadmin.events.EventsDispatcher(app) events.add_handler('domain-shutdown', functools.partial(interrupt_on_vm_shutdown, vms)) events.add_handler('connection-established', functools.partial(interrupt_on_vm_shutdown, vms)) try: yield from events.listen_for_events() except Interrupt: pass