features: client-side API
This commit is contained in:
parent
8989c1c010
commit
e066656903
@ -103,6 +103,10 @@ class QubesMemoryError(QubesException, MemoryError):
|
|||||||
'''Cannot start domain, because not enough memory is available'''
|
'''Cannot start domain, because not enough memory is available'''
|
||||||
|
|
||||||
|
|
||||||
|
class QubesFeatureNotFoundError(QubesException, KeyError):
|
||||||
|
'''Feature not set for a given domain'''
|
||||||
|
|
||||||
|
|
||||||
class StoragePoolException(QubesException):
|
class StoragePoolException(QubesException):
|
||||||
''' A general storage exception '''
|
''' A general storage exception '''
|
||||||
|
|
||||||
|
69
qubesmgmt/features.py
Normal file
69
qubesmgmt/features.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# -*- encoding: utf8 -*-
|
||||||
|
#
|
||||||
|
# The Qubes OS Project, http://www.qubes-os.org
|
||||||
|
#
|
||||||
|
# Copyright (C) 2017 Marek Marczykowski-Górecki
|
||||||
|
# <marmarek@invisiblethingslab.com>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
# with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
'''VM features interface'''
|
||||||
|
|
||||||
|
|
||||||
|
class Features(object):
|
||||||
|
'''Manager of the features.
|
||||||
|
|
||||||
|
Features can have three distinct values: no value (not present in mapping,
|
||||||
|
which is closest thing to :py:obj:`None`), empty string (which is
|
||||||
|
interpreted as :py:obj:`False`) and non-empty string, which is
|
||||||
|
:py:obj:`True`. Anything assigned to the mapping is coerced to strings,
|
||||||
|
however if you assign instances of :py:class:`bool`, they are converted as
|
||||||
|
described above. Be aware that assigning the number `0` (which is considered
|
||||||
|
false in Python) will result in string `'0'`, which is considered true.
|
||||||
|
'''
|
||||||
|
# pylint: disable=too-few-public-methods
|
||||||
|
|
||||||
|
def __init__(self, vm):
|
||||||
|
super(Features, self).__init__()
|
||||||
|
self.vm = vm
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
self.vm.qubesd_call(self.vm.name, 'mgmt.vm.feature.Remove', key)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.vm.qubesd_call(self.vm.name, 'mgmt.vm.feature.Set', key, value)
|
||||||
|
|
||||||
|
def __getitem__(self, item):
|
||||||
|
return self.vm.qubesd_call(
|
||||||
|
self.vm.name, 'mgmt.vm.feature.Get', item).decode('utf-8')
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
qubesd_response = self.vm.qubesd_call(self.vm.name,
|
||||||
|
'mgmt.vm.feature.List')
|
||||||
|
return iter(qubesd_response.decode('utf-8').splitlines())
|
||||||
|
|
||||||
|
keys = __iter__
|
||||||
|
|
||||||
|
_NO_DEFAULT = object()
|
||||||
|
|
||||||
|
def check_with_template(self, feature, default=_NO_DEFAULT):
|
||||||
|
''' Check if the vm's template has the specified feature. '''
|
||||||
|
try:
|
||||||
|
qubesd_response = self.vm.qubesd_call(
|
||||||
|
self.vm.name, 'mgmt.vm.feature.CheckWithTemplate', feature)
|
||||||
|
return qubesd_response.decode('utf-8')
|
||||||
|
except KeyError:
|
||||||
|
if default is self._NO_DEFAULT:
|
||||||
|
raise
|
||||||
|
return default
|
@ -23,6 +23,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import qubesmgmt.base
|
import qubesmgmt.base
|
||||||
import qubesmgmt.storage
|
import qubesmgmt.storage
|
||||||
|
import qubesmgmt.features
|
||||||
|
|
||||||
|
|
||||||
class QubesVM(qubesmgmt.base.PropertyHolder):
|
class QubesVM(qubesmgmt.base.PropertyHolder):
|
||||||
@ -30,10 +31,13 @@ class QubesVM(qubesmgmt.base.PropertyHolder):
|
|||||||
|
|
||||||
log = None
|
log = None
|
||||||
|
|
||||||
|
features = None
|
||||||
|
|
||||||
def __init__(self, app, name):
|
def __init__(self, app, name):
|
||||||
super(QubesVM, self).__init__(app, 'mgmt.vm.property.', name)
|
super(QubesVM, self).__init__(app, 'mgmt.vm.property.', name)
|
||||||
self._volumes = None
|
self._volumes = None
|
||||||
self.log = logging.getLogger(name)
|
self.log = logging.getLogger(name)
|
||||||
|
self.features = qubesmgmt.features.Features(self)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user