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
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki