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'''
|
||||
|
||||
|
||||
class QubesFeatureNotFoundError(QubesException, KeyError):
|
||||
'''Feature not set for a given domain'''
|
||||
|
||||
|
||||
class StoragePoolException(QubesException):
|
||||
''' 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 qubesmgmt.base
|
||||
import qubesmgmt.storage
|
||||
import qubesmgmt.features
|
||||
|
||||
|
||||
class QubesVM(qubesmgmt.base.PropertyHolder):
|
||||
@ -30,10 +31,13 @@ class QubesVM(qubesmgmt.base.PropertyHolder):
|
||||
|
||||
log = None
|
||||
|
||||
features = None
|
||||
|
||||
def __init__(self, app, name):
|
||||
super(QubesVM, self).__init__(app, 'mgmt.vm.property.', name)
|
||||
self._volumes = None
|
||||
self.log = logging.getLogger(name)
|
||||
self.features = qubesmgmt.features.Features(self)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
Loading…
Reference in New Issue
Block a user