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