core-admin/qubes/events.py
Wojtek Porczyk 65595e3b39 apidoc stub
2015-06-29 17:39:22 +02:00

72 lines
1.5 KiB
Python

#!/usr/bin/python2 -O
'''Qubes events.
Events are fired when something happens, like VM start or stop, property change
etc.
'''
import collections
import qubes.vm
#: collection of system-wide hooks
system_hooks = collections.defaultdict(list)
def hook(event, vm=None, system=False):
'''Decorator factory.
To hook an event, decorate a method in your plugin class with this
decorator.
:param str event: event type
:param type vm: VM to hook (leave as None to hook all VMs)
:param bool system: when :py:obj:`True`, hook is system-wide (not attached to any VM)
'''
def decorator(f):
f.ho_event = event
if system:
f.ho_vm = None
elif vm is None:
f.ho_vm = qubes.vm.BaseVM
else:
f.ho_vm = vm
return f
return decorator
def ishook(o):
'''Test if a method is hooked to an event.
:param object o: suspected hook
:return: :py:obj:`True` when function is a hook, :py:obj:`False` otherwise
:rtype: bool
'''
return callable(o) \
and hasattr(o, 'ho_event') \
and hasattr(o, 'ho_vm')
def add_system_hook(event, f):
'''Add system-wide hook.
:param callable f: function to call
'''
global_hooks[event].append(f)
def fire_system_hooks(event, *args, **kwargs):
'''Fire system-wide hooks.
:param str event: event type
*args* and *kwargs* are passed to all hooks.
'''
for hook in system_hooks[event]:
hook(self, *args, **kwargs)