qubes/mgmt: lifecycle and class listing

- mgmt.vmclass.List
- mgmt.vm.Start
- mgmt.vm.Shutdown
- mgmt.vm.Pause
- mgmt.vm.Unpause
- mgmt.vm.Kill

QubesOS/qubes-issues#2622
This commit is contained in:
Wojtek Porczyk 2017-04-03 13:11:34 +02:00
parent 45d5a1e049
commit c437f40284
3 changed files with 47 additions and 8 deletions

View File

@ -55,13 +55,15 @@ elif os.name == 'nt':
else:
raise RuntimeError("Qubes works only on POSIX or WinNT systems")
import qubes # pylint: disable=wrong-import-position
import qubes.ext # pylint: disable=wrong-import-position
import qubes.utils # pylint: disable=wrong-import-position
import qubes.vm.adminvm # pylint: disable=wrong-import-position
import qubes.vm.qubesvm # pylint: disable=wrong-import-position
import qubes.vm.templatevm # pylint: disable=wrong-import-position
# pylint: disable=wrong-import-position
import qubes
import qubes.ext
import qubes.utils
import qubes.vm
import qubes.vm.adminvm
import qubes.vm.qubesvm
import qubes.vm.templatevm
# pylint: enable=wrong-import-position
class VirDomainWrapper(object):
# pylint: disable=too-few-public-methods
@ -912,7 +914,8 @@ class Qubes(qubes.PropertyHolder):
'''
try:
return qubes.utils.get_entry_point_one('qubes.vm', clsname)
return qubes.utils.get_entry_point_one(
qubes.vm.VM_ENTRY_POINT, clsname)
except KeyError:
raise qubes.exc.QubesException(
'no such VM class: {!r}'.format(clsname))

View File

@ -27,6 +27,7 @@ import string
import pkg_resources
import qubes.vm
import qubes.vm.qubesvm
import qubes.storage
@ -157,6 +158,15 @@ class QubesMgmt(AbstractQubesMgmt):
https://www.qubes-os.org/doc/mgmt1/
'''
@api('mgmt.vmclass.List', no_payload=True)
async def vmclass_list(self):
'''List all VM classes'''
assert not self.arg
assert self.dest.name == 'dom0'
return ''.join('{}\n'.format(ep.name)
for ep in pkg_resources.iter_entry_points(qubes.vm.VM_ENTRY_POINT))
@api('mgmt.vm.List', no_payload=True)
async def vm_list(self):
'''List all the domains'''
@ -464,3 +474,28 @@ class QubesMgmt(AbstractQubesMgmt):
del self.app.labels[label.index]
self.app.save()
@api('mgmt.vm.Start', no_payload=True)
async def vm_start(self):
assert not self.arg
await self.dest.start()
@api('mgmt.vm.Shutdown', no_payload=True)
async def vm_shutdown(self):
assert not self.arg
await self.dest.shutdown()
@api('mgmt.vm.Pause', no_payload=True)
async def vm_pause(self):
assert not self.arg
await self.dest.pause()
@api('mgmt.vm.Unpause', no_payload=True)
async def vm_unpause(self):
assert not self.arg
await self.dest.unpause()
@api('mgmt.vm.Kill', no_payload=True)
async def vm_kill(self):
assert not self.arg
await self.dest.kill()

View File

@ -40,6 +40,7 @@ import qubes.events
import qubes.log
import qubes.tools.qvm_ls
VM_ENTRY_POINT = 'qubes.vm'
def validate_name(holder, prop, value):
''' Check if value is syntactically correct VM name '''