|
@@ -41,7 +41,7 @@ elif os.name == 'nt':
|
|
|
import win32file
|
|
|
import pywintypes
|
|
|
else:
|
|
|
- raise RuntimeError, "Qubes works only on POSIX or WinNT systems"
|
|
|
+ raise RuntimeError("Qubes works only on POSIX or WinNT systems")
|
|
|
|
|
|
import libvirt
|
|
|
try:
|
|
@@ -61,8 +61,10 @@ class QubesException(Exception):
|
|
|
'''Exception that can be shown to the user'''
|
|
|
pass
|
|
|
|
|
|
+
|
|
|
class VMMConnection(object):
|
|
|
'''Connection to Virtual Machine Manager (libvirt)'''
|
|
|
+
|
|
|
def __init__(self):
|
|
|
self._libvirt_conn = None
|
|
|
self._xs = None
|
|
@@ -77,7 +79,8 @@ class VMMConnection(object):
|
|
|
@offline_mode.setter
|
|
|
def offline_mode(self, value):
|
|
|
if value and self._libvirt_conn is not None:
|
|
|
- raise QubesException("Cannot change offline mode while already connected")
|
|
|
+ raise QubesException(
|
|
|
+ "Cannot change offline mode while already connected")
|
|
|
|
|
|
self._offline_mode = value
|
|
|
|
|
@@ -157,7 +160,7 @@ class QubesHost(object):
|
|
|
|
|
|
(model, memory, cpus, mhz, nodes, socket, cores, threads) = \
|
|
|
self._app.vmm.libvirt_conn.getInfo()
|
|
|
- self._total_mem = long(memory)*1024
|
|
|
+ self._total_mem = long(memory) * 1024
|
|
|
self._no_cpus = cpus
|
|
|
|
|
|
self.app.log.debug('QubesHost: no_cpus={} memory_total={}'.format(self.no_cpus, self.memory_total))
|
|
@@ -219,7 +222,7 @@ class QubesHost(object):
|
|
|
for vm in info:
|
|
|
previous[vm['domid']] = {}
|
|
|
previous[vm['domid']]['cpu_time'] = (
|
|
|
- vm['cpu_time'] / vm['online_vcpus'])
|
|
|
+ vm['cpu_time'] / vm['online_vcpus'])
|
|
|
previous[vm['domid']]['cpu_usage'] = 0
|
|
|
time.sleep(wait_time)
|
|
|
|
|
@@ -233,12 +236,12 @@ class QubesHost(object):
|
|
|
for vm in info:
|
|
|
current[vm['domid']] = {}
|
|
|
current[vm['domid']]['cpu_time'] = (
|
|
|
- vm['cpu_time'] / max(vm['online_vcpus'], 1))
|
|
|
+ vm['cpu_time'] / max(vm['online_vcpus'], 1))
|
|
|
if vm['domid'] in previous.keys():
|
|
|
current[vm['domid']]['cpu_usage'] = (
|
|
|
float(current[vm['domid']]['cpu_time'] -
|
|
|
previous[vm['domid']]['cpu_time']) /
|
|
|
- long(1000**3) / (current_time-previous_time) * 100)
|
|
|
+ long(1000 ** 3) / (current_time - previous_time) * 100)
|
|
|
if current[vm['domid']]['cpu_usage'] < 0:
|
|
|
# VM has been rebooted
|
|
|
current[vm['domid']]['cpu_usage'] = 0
|
|
@@ -294,7 +297,8 @@ class Label(object):
|
|
|
|
|
|
|
|
|
def __xml__(self):
|
|
|
- element = lxml.etree.Element('label', id='label-' + self.index, color=self.color)
|
|
|
+ element = lxml.etree.Element(
|
|
|
+ 'label', id='label-' + self.index, color=self.color)
|
|
|
element.text = self.name
|
|
|
return element
|
|
|
|
|
@@ -324,7 +328,8 @@ class Label(object):
|
|
|
.. deprecated:: 2.0
|
|
|
use :py:meth:`PyQt4.QtGui.QIcon.fromTheme` and :py:attr:`icon_dispvm`
|
|
|
'''
|
|
|
- return os.path.join(system_path['qubes_icon_dir'], self.icon_dispvm) + ".png"
|
|
|
+ return os.path.join(
|
|
|
+ system_path['qubes_icon_dir'], self.icon_dispvm) + ".png"
|
|
|
|
|
|
|
|
|
class VMCollection(object):
|
|
@@ -342,7 +347,8 @@ class VMCollection(object):
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
- return '<{} {!r}>'.format(self.__class__.__name__, list(sorted(self.keys())))
|
|
|
+ return '<{} {!r}>'.format(
|
|
|
+ self.__class__.__name__, list(sorted(self.keys())))
|
|
|
|
|
|
|
|
|
def items(self):
|
|
@@ -394,7 +400,8 @@ class VMCollection(object):
|
|
|
# this violates duck typing, but is needed
|
|
|
# for VMProperty to function correctly
|
|
|
if not isinstance(value, qubes.vm.BaseVM):
|
|
|
- raise TypeError('{} holds only BaseVM instances'.format(self.__class__.__name__))
|
|
|
+ raise TypeError(
|
|
|
+ '{} holds only BaseVM instances'.format(self.__class__.__name__))
|
|
|
|
|
|
if not hasattr(value, 'qid'):
|
|
|
value.qid = self.domains.get_new_unused_qid()
|
|
@@ -435,7 +442,8 @@ class VMCollection(object):
|
|
|
|
|
|
|
|
|
def __contains__(self, key):
|
|
|
- return any((key == vm or key == vm.qid or key == vm.name) for vm in self)
|
|
|
+ return any((key == vm or key == vm.qid or key == vm.name)
|
|
|
+ for vm in self)
|
|
|
|
|
|
|
|
|
def __len__(self):
|
|
@@ -478,7 +486,7 @@ class VMCollection(object):
|
|
|
|
|
|
|
|
|
def get_new_unused_netid(self):
|
|
|
- used_ids = set([vm.netid for vm in self]) # if vm.is_netvm()])
|
|
|
+ used_ids = set([vm.netid for vm in self]) # if vm.is_netvm()])
|
|
|
for i in range(1, MAX_NETID):
|
|
|
if i not in used_ids:
|
|
|
return i
|
|
@@ -536,7 +544,8 @@ class property(object):
|
|
|
load_stage=2, order=0, save_via_ref=False, doc=None):
|
|
|
self.__name__ = name
|
|
|
self._setter = setter
|
|
|
- self._saver = saver if saver is not None else (lambda self, prop, value: str(value))
|
|
|
+ self._saver = saver if saver is not None else (
|
|
|
+ lambda self, prop, value: str(value))
|
|
|
self._type = type
|
|
|
self._default = default
|
|
|
self.order = order
|
|
@@ -560,7 +569,8 @@ class property(object):
|
|
|
|
|
|
except AttributeError:
|
|
|
if self._default is self._NO_DEFAULT:
|
|
|
- raise AttributeError('property {!r} not set'.format(self.__name__))
|
|
|
+ raise AttributeError(
|
|
|
+ 'property {!r} not set'.format(self.__name__))
|
|
|
elif isinstance(self._default, collections.Callable):
|
|
|
return self._default(instance)
|
|
|
else:
|
|
@@ -584,14 +594,16 @@ class property(object):
|
|
|
value = self._type(value)
|
|
|
|
|
|
if has_oldvalue:
|
|
|
- instance.fire_event_pre('property-pre-set:' + self.__name__, value, oldvalue)
|
|
|
+ instance.fire_event_pre(
|
|
|
+ 'property-pre-set:' + self.__name__, value, oldvalue)
|
|
|
else:
|
|
|
instance.fire_event_pre('property-pre-set:' + self.__name__, value)
|
|
|
|
|
|
instance._init_property(self, value)
|
|
|
|
|
|
if has_oldvalue:
|
|
|
- instance.fire_event('property-set:' + self.__name__, value, oldvalue)
|
|
|
+ instance.fire_event(
|
|
|
+ 'property-set:' + self.__name__, value, oldvalue)
|
|
|
else:
|
|
|
instance.fire_event('property-set:' + self.__name__, value)
|
|
|
|
|
@@ -692,9 +704,12 @@ class property(object):
|
|
|
'''
|
|
|
|
|
|
lcvalue = value.lower()
|
|
|
- if lcvalue in ('0', 'no', 'false'): return False
|
|
|
- if lcvalue in ('1', 'yes', 'true'): return True
|
|
|
- raise ValueError('Invalid literal for boolean property: {!r}'.format(value))
|
|
|
+ if lcvalue in ('0', 'no', 'false'):
|
|
|
+ return False
|
|
|
+ if lcvalue in ('1', 'yes', 'true'):
|
|
|
+ return True
|
|
|
+ raise ValueError(
|
|
|
+ 'Invalid literal for boolean property: {!r}'.format(value))
|
|
|
|
|
|
|
|
|
|
|
@@ -765,7 +780,8 @@ class PropertyHolder(qubes.events.Emitter):
|
|
|
if load_stage is not None:
|
|
|
props = set(prop for prop in props
|
|
|
if prop.load_stage == load_stage)
|
|
|
- return sorted(props, key=lambda prop: (prop.load_stage, prop.order, prop.__name__))
|
|
|
+ return sorted(props,
|
|
|
+ key=lambda prop: (prop.load_stage, prop.order, prop.__name__))
|
|
|
|
|
|
|
|
|
def _init_property(self, prop, value):
|
|
@@ -825,7 +841,8 @@ class PropertyHolder(qubes.events.Emitter):
|
|
|
'''
|
|
|
|
|
|
self.events_enabled = False
|
|
|
- all_names = set(prop.__name__ for prop in self.get_props_list(load_stage))
|
|
|
+ all_names = set(
|
|
|
+ prop.__name__ for prop in self.get_props_list(load_stage))
|
|
|
for node in self.xml.xpath('./properties/property'):
|
|
|
name = node.get('name')
|
|
|
value = node.get('ref') or node.text
|
|
@@ -852,8 +869,9 @@ class PropertyHolder(qubes.events.Emitter):
|
|
|
|
|
|
for prop in self.get_props_list():
|
|
|
try:
|
|
|
- value = getattr(self, (prop.__name__ if with_defaults else prop._attr_name))
|
|
|
- except AttributeError, e:
|
|
|
+ value = getattr(
|
|
|
+ self, (prop.__name__ if with_defaults else prop._attr_name))
|
|
|
+ except AttributeError as e:
|
|
|
continue
|
|
|
|
|
|
try:
|
|
@@ -1033,7 +1051,8 @@ class Qubes(PropertyHolder):
|
|
|
|
|
|
|
|
|
def __init__(self, store='/var/lib/qubes/qubes.xml'):
|
|
|
- self._extensions = set(ext(self) for ext in qubes.ext.Extension.register.values())
|
|
|
+ self._extensions = set(ext(self)
|
|
|
+ for ext in qubes.ext.Extension.register.values())
|
|
|
|
|
|
#: collection of all VMs managed by this Qubes instance
|
|
|
self.domains = VMCollection()
|
|
@@ -1054,7 +1073,8 @@ class Qubes(PropertyHolder):
|
|
|
except IOError:
|
|
|
self._init()
|
|
|
|
|
|
- super(Qubes, self).__init__(xml=lxml.etree.parse(self.qubes_store_file))
|
|
|
+ super(Qubes, self).__init__(
|
|
|
+ xml=lxml.etree.parse(self.qubes_store_file))
|
|
|
|
|
|
|
|
|
def _open_store(self):
|
|
@@ -1064,7 +1084,7 @@ class Qubes(PropertyHolder):
|
|
|
self._storefd = open(self._store, 'r+')
|
|
|
|
|
|
if os.name == 'posix':
|
|
|
- fcntl.lockf (self.qubes_store_file, fcntl.LOCK_EX)
|
|
|
+ fcntl.lockf(self.qubes_store_file, fcntl.LOCK_EX)
|
|
|
elif os.name == 'nt':
|
|
|
overlapped = pywintypes.OVERLAPPED()
|
|
|
win32file.LockFileEx(win32file._get_osfhandle(self.qubes_store_file.fileno()),
|
|
@@ -1163,7 +1183,7 @@ class Qubes(PropertyHolder):
|
|
|
lxml.etree.ElementTree(self.__xml__()).write(
|
|
|
self._storefd, encoding='utf-8', pretty_print=True)
|
|
|
self._storefd.sync()
|
|
|
- os.chmod(self._store, 0660)
|
|
|
+ os.chmod(self._store, 0o660)
|
|
|
os.chown(self._store, -1, grp.getgrnam('qubes').gr_gid)
|
|
|
|
|
|
|