tools/qvm_template_postprocess: set vm.features['qrexec']
Enable 'qrexec' VM feature to wait for qrexec initialization - it is required to call qubes.PostInstall service. If VM start fails, assume there is no qrexec and drop that feature.
This commit is contained in:
parent
64f7eecf58
commit
9dd659d60f
@ -238,6 +238,8 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
|
|||||||
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
||||||
|
self.app.expected_calls[
|
||||||
|
('test-vm', 'admin.vm.feature.Set', 'qrexec', b'True')] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.Start', None, None)] = b'0\0'
|
('test-vm', 'admin.vm.Start', None, None)] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
@ -284,6 +286,8 @@ class TC_00_qvm_template_postprocess(qubesadmin.tests.QubesTestCase):
|
|||||||
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
('test-vm', 'admin.vm.property.Set', 'netvm', b'')] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
('test-vm', 'admin.vm.property.Reset', 'netvm', None)] = b'0\0'
|
||||||
|
self.app.expected_calls[
|
||||||
|
('test-vm', 'admin.vm.feature.Set', 'qrexec', b'True')] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
('test-vm', 'admin.vm.Start', None, None)] = b'0\0'
|
('test-vm', 'admin.vm.Start', None, None)] = b'0\0'
|
||||||
self.app.expected_calls[
|
self.app.expected_calls[
|
||||||
|
@ -168,29 +168,36 @@ def post_install(args):
|
|||||||
if not args.skip_start:
|
if not args.skip_start:
|
||||||
# just created, so no need to save previous value - we know what it was
|
# just created, so no need to save previous value - we know what it was
|
||||||
vm.netvm = None
|
vm.netvm = None
|
||||||
vm.start()
|
# temporarily enable qrexec feature - so vm.start() will wait for it;
|
||||||
|
# if start fails, rollback it
|
||||||
|
vm.features['qrexec'] = True
|
||||||
try:
|
try:
|
||||||
vm.run_service_for_stdio('qubes.PostInstall')
|
vm.start()
|
||||||
except qubesadmin.exc.QubesVMError:
|
except qubesadmin.exc.QubesException:
|
||||||
vm.log.error('qubes.PostInstall service failed')
|
del vm.features['qrexec']
|
||||||
vm.shutdown()
|
|
||||||
if have_events:
|
|
||||||
try:
|
|
||||||
# pylint: disable=no-member
|
|
||||||
qubesadmin.events.utils.wait_for_domain_shutdown(vm,
|
|
||||||
qubesadmin.config.defaults['shutdown_timeout'])
|
|
||||||
except qubesadmin.exc.QubesVMShutdownTimeout:
|
|
||||||
vm.kill()
|
|
||||||
asyncio.get_event_loop().close()
|
|
||||||
else:
|
else:
|
||||||
timeout = qubesadmin.config.defaults['shutdown_timeout']
|
try:
|
||||||
while timeout >= 0:
|
vm.run_service_for_stdio('qubes.PostInstall')
|
||||||
if vm.is_halted():
|
except qubesadmin.exc.QubesVMError:
|
||||||
break
|
vm.log.error('qubes.PostInstall service failed')
|
||||||
time.sleep(1)
|
vm.shutdown()
|
||||||
timeout -= 1
|
if have_events:
|
||||||
if not vm.is_halted():
|
try:
|
||||||
vm.kill()
|
# pylint: disable=no-member
|
||||||
|
qubesadmin.events.utils.wait_for_domain_shutdown(vm,
|
||||||
|
qubesadmin.config.defaults['shutdown_timeout'])
|
||||||
|
except qubesadmin.exc.QubesVMShutdownTimeout:
|
||||||
|
vm.kill()
|
||||||
|
asyncio.get_event_loop().close()
|
||||||
|
else:
|
||||||
|
timeout = qubesadmin.config.defaults['shutdown_timeout']
|
||||||
|
while timeout >= 0:
|
||||||
|
if vm.is_halted():
|
||||||
|
break
|
||||||
|
time.sleep(1)
|
||||||
|
timeout -= 1
|
||||||
|
if not vm.is_halted():
|
||||||
|
vm.kill()
|
||||||
|
|
||||||
vm.netvm = qubesadmin.DEFAULT
|
vm.netvm = qubesadmin.DEFAULT
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user