import framework for core3
This commit is contained in:
		
							parent
							
								
									8134360614
								
							
						
					
					
						commit
						7f27d987cc
					
				
							
								
								
									
										4
									
								
								qubes/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								qubes/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes._pluginloader | ||||
| 
 | ||||
							
								
								
									
										6
									
								
								qubes/_pluginloader.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								qubes/_pluginloader.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| from qubes.vm import * | ||||
| from qubes.ext import * | ||||
| 
 | ||||
| import qubes.ext | ||||
| 
 | ||||
| qubes.ext.init() | ||||
							
								
								
									
										34
									
								
								qubes/events.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								qubes/events.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import collections | ||||
| 
 | ||||
| import qubes.vm | ||||
| 
 | ||||
| system_hooks = collections.defaultdict(list) | ||||
| 
 | ||||
| def hook(event, vm=None, system=False): | ||||
|     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): | ||||
|     return callable(o) \ | ||||
|         and hasattr(o, 'ho_event') \ | ||||
|         and hasattr(o, 'ho_vm') | ||||
| 
 | ||||
| def add_system_hook(event, f): | ||||
|     global_hooks[event].append(f) | ||||
| 
 | ||||
| def fire_system_hooks(event, *args, **kwargs): | ||||
|     for hook in system_hooks[event]: | ||||
|         hook(self, *args, **kwargs) | ||||
							
								
								
									
										36
									
								
								qubes/ext/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								qubes/ext/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import inspect | ||||
| 
 | ||||
| import qubes.events | ||||
| import qubes.plugins | ||||
| 
 | ||||
| class ExtensionPlugin(qubes.plugins.Plugin): | ||||
|     def __init__(cls, name, bases, dict_): | ||||
|         super(ExtensionPlugin, cls).__init__(name, bases, dict_) | ||||
|         cls._instance = None | ||||
| 
 | ||||
|     def __call__(cls, *args, **kwargs): | ||||
|         if cls._instance is None: | ||||
|             cls._instance = super(ExtensionPlugin, cls).__call__(*args, **kwargs) | ||||
|         return cls._instance | ||||
| 
 | ||||
| class Extension(object): | ||||
|     __metaclass__ = ExtensionPlugin | ||||
|     def __init__(self): | ||||
|         for name in dir(self): | ||||
|             attr = getattr(self, name) | ||||
|             if not ishook(attr): | ||||
|                 continue | ||||
| 
 | ||||
|             if attr.ho_vm is not None: | ||||
|                 attr.ho_vm.add_hook(event, attr) | ||||
|             else: | ||||
|                 # global hook | ||||
|                 qubes.events.add_system_hook(event, attr) | ||||
| 
 | ||||
| def init(): | ||||
|     for ext in Extension.register.values(): | ||||
|         instance = ext() | ||||
| 
 | ||||
| __all__ = qubes.plugins.load(__file__) | ||||
							
								
								
									
										30
									
								
								qubes/plugins.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								qubes/plugins.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| import imp | ||||
| import inspect | ||||
| import os | ||||
| import sys | ||||
| 
 | ||||
| class Plugin(type): | ||||
|     def __init__(cls, name, bases, dict_): | ||||
|         if hasattr(cls, 'register'): | ||||
|             cls.register[cls.__name__] = cls | ||||
|         else: | ||||
|             # we've got root class | ||||
|             cls.register = {} | ||||
| 
 | ||||
|     def __getitem__(cls, name): | ||||
|         return cls.register[name] | ||||
| 
 | ||||
| def load(modfile): | ||||
|     path = os.path.dirname(modfile) | ||||
|     listdir = os.listdir(path) | ||||
|     ret = set() | ||||
|     for suffix, mode, type_ in imp.get_suffixes(): | ||||
|         for filename in listdir: | ||||
|             if filename.endswith(suffix): | ||||
|                 ret.add(filename[:-len(suffix)]) | ||||
|     if '__init__' in ret: | ||||
|         ret.remove('__init__') | ||||
|     return list(sorted(ret)) | ||||
							
								
								
									
										89
									
								
								qubes/vm/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								qubes/vm/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,89 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import collections | ||||
| import functools | ||||
| import sys | ||||
| 
 | ||||
| import dateutil.parser | ||||
| 
 | ||||
| import qubes.plugins | ||||
| 
 | ||||
| class property(object): | ||||
|     def __init__(self, name, default=None, type=None, order=0, doc=None): | ||||
|         self.__name__ = name | ||||
|         self._default = default | ||||
|         self._type = type | ||||
|         self.order = order | ||||
|         self.__doc__ = doc | ||||
| 
 | ||||
|         self._attr_name = '_qubesprop_' + self.__name__ | ||||
| 
 | ||||
|     def __get__(self, instance, owner): | ||||
|         if instance is None: | ||||
|             return self | ||||
| 
 | ||||
|         try: | ||||
|             return getattr(instance, self._attr_name) | ||||
| 
 | ||||
|         except AttributeError: | ||||
|             if self._default is None: | ||||
|                 raise AttributeError('property not set') | ||||
|             else: | ||||
|                 return self._default | ||||
| 
 | ||||
|     def __set__(self, instance, value): | ||||
|         setattr(instance, self._attr_name, | ||||
|             (self._type(value) if self._type is not None else value)) | ||||
| 
 | ||||
|     def __repr__(self): | ||||
|         return '<{} object at {:#x} name={!r} default={!r}>'.format( | ||||
|             self.__class__.__name__, id(self), self.__name__, self._default) | ||||
| 
 | ||||
|     def __hash__(self): | ||||
|         return hash(self.__name__) | ||||
| 
 | ||||
|     def __eq__(self, other): | ||||
|         return self.__name__ == other.__name__ | ||||
| 
 | ||||
| class VMPlugin(qubes.plugins.Plugin): | ||||
|     def __init__(cls, name, bases, dict_): | ||||
|         super(VMPlugin, cls).__init__(name, bases, dict_) | ||||
|         cls.__hooks__ = collections.defaultdict(list) | ||||
| 
 | ||||
| class BaseVM(object): | ||||
|     __metaclass__ = VMPlugin | ||||
| 
 | ||||
|     def get_props_list(self): | ||||
|         props = set() | ||||
|         for class_ in self.__class__.__mro__: | ||||
|             props.update(prop for prop in class_.__dict__.values() | ||||
|                 if isinstance(prop, property)) | ||||
|         return sorted(props, key=lambda prop: (prop.order, prop.__name__)) | ||||
| 
 | ||||
|     def __init__(self, D): | ||||
|         for prop in self.get_props_list(): | ||||
|             if prop.__name__ in D: | ||||
|                 setattr(self, prop.__name__, D[prop.__name__]) | ||||
| 
 | ||||
|     def __repr__(self): | ||||
|         return '<{} object at {:#x} {}>'.format( | ||||
|             self.__class__.__name__, id(self), | ||||
|             ' '.join('{}={}'.format(prop.__name__, getattr(self, prop.__name__)) | ||||
|                 for prop in self.get_props_list())) | ||||
| 
 | ||||
|     @classmethod | ||||
|     def add_hook(cls, event, f): | ||||
|         cls.__hooks__[event].append(f) | ||||
| 
 | ||||
|     def fire_hooks(self, event, *args, **kwargs): | ||||
|         for cls in self.__class__.__mro__: | ||||
|             if not hasattr(cls, '__hooks__'): continue | ||||
|             for hook in cls.__hooks__[event]: | ||||
|                 hook(self, *args, **kwargs) | ||||
| 
 | ||||
| 
 | ||||
| def load(class_, D): | ||||
|     cls = BaseVM[class_] | ||||
|     return cls(D) | ||||
| 
 | ||||
| __all__ = qubes.plugins.load(__file__) | ||||
							
								
								
									
										7
									
								
								qubes/vm/adminvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/adminvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.netvm | ||||
| 
 | ||||
| class AdminVM(qubes.vm.netvm.NetVM): | ||||
|     def __init__(self, D): | ||||
|         super(AdminVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/appvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/appvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.qubesvm | ||||
| 
 | ||||
| class AppVM(qubes.vm.qubesvm.QubesVM): | ||||
|     def __init__(self, D): | ||||
|         super(AppVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/dispvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/dispvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.qubesvm | ||||
| 
 | ||||
| class DispVM(qubes.vm.qubesvm.QubesVM): | ||||
|     def __init__(self, D): | ||||
|         super(DispVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/hvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/hvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.qubesvm | ||||
| 
 | ||||
| class HVM(qubes.vm.qubesvm.QubesVM): | ||||
|     def __init__(self, D): | ||||
|         super(HVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/netvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/netvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.qubesvm | ||||
| 
 | ||||
| class NetVM(qubes.vm.qubesvm.QubesVM): | ||||
|     def __init__(self, D): | ||||
|         super(NetVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/proxyvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/proxyvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.netvm | ||||
| 
 | ||||
| class ProxyVM(qubes.vm.netvm.NetVM): | ||||
|     def __init__(self, D): | ||||
|         super(ProxyVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/qubesvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/qubesvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm | ||||
| 
 | ||||
| class QubesVM(qubes.vm.BaseVM): | ||||
|     def __init__(self, D): | ||||
|         super(QubesVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/templatehvm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/templatehvm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.hvm | ||||
| 
 | ||||
| class TemplateHVM(qubes.vm.hvm.HVM): | ||||
|     def __init__(self, D): | ||||
|         super(TemplateHVM, self).__init__(D) | ||||
							
								
								
									
										7
									
								
								qubes/vm/templatevm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								qubes/vm/templatevm.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| #!/usr/bin/python2 -O | ||||
| 
 | ||||
| import qubes.vm.qubesvm | ||||
| 
 | ||||
| class TemplateVM(qubes.vm.qubesvm.QubesVM): | ||||
|     def __init__(self, D): | ||||
|         super(TemplateVM, self).__init__(D) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Wojtek Porczyk
						Wojtek Porczyk