qubes/ext: convert extensions to singletons
From now the extensions are instantiated once. They no longer have .app attribute, but can access it from event handlers via vm.app.
This commit is contained in:
parent
eaf5efd814
commit
540942de47
@ -1186,9 +1186,7 @@ class Qubes(PropertyHolder):
|
||||
#: logger instance for logging global messages
|
||||
self.log = logging.getLogger('app')
|
||||
|
||||
# pylint: disable=no-member
|
||||
self.extensions = set(ext.load()(self)
|
||||
for ext in pkg_resources.iter_entry_points('qubes.ext'))
|
||||
self._extensions = qubes.ext.get_extensions()
|
||||
|
||||
#: collection of all VMs managed by this Qubes instance
|
||||
self.domains = VMCollection(self)
|
||||
|
@ -29,30 +29,37 @@ some systems. They may be OS- or architecture-dependent or custom-developed for
|
||||
particular customer.
|
||||
'''
|
||||
|
||||
import pkg_resources
|
||||
import qubes.events
|
||||
|
||||
|
||||
class Extension(object):
|
||||
'''Base class for all extensions
|
||||
''' # pylint: disable=too-few-public-methods
|
||||
|
||||
:param qubes.Qubes app: application object
|
||||
''' # pylint: disable=too-few-public-methods
|
||||
def __new__(cls):
|
||||
if '_instance' not in cls.__dict__:
|
||||
cls._instance = super(Extension, cls).__new__(cls)
|
||||
|
||||
def __init__(self, app):
|
||||
self.app = app
|
||||
for name in cls.__dict__:
|
||||
attr = getattr(cls._instance, name)
|
||||
if not qubes.events.ishandler(attr):
|
||||
continue
|
||||
|
||||
for name in dir(self):
|
||||
attr = getattr(self, name)
|
||||
if not qubes.events.ishandler(attr):
|
||||
continue
|
||||
if attr.ha_vm is not None:
|
||||
for event in attr.ha_events:
|
||||
attr.ha_vm.add_handler(event, attr)
|
||||
else:
|
||||
# global hook
|
||||
for event in attr.ha_events:
|
||||
qubes.Qubes.add_handler(event, attr)
|
||||
|
||||
if attr.ha_vm is not None:
|
||||
for event in attr.ha_events:
|
||||
attr.ha_vm.add_handler(event, attr)
|
||||
else:
|
||||
# global hook
|
||||
for event in attr.ha_events:
|
||||
self.app.add_handler(event, attr)
|
||||
return cls._instance
|
||||
|
||||
|
||||
def get_extensions():
|
||||
return set(ext.load()()
|
||||
for ext in pkg_resources.iter_entry_points('qubes.ext'))
|
||||
|
||||
|
||||
def handler(*events, **kwargs):
|
||||
|
Loading…
Reference in New Issue
Block a user