shadowbrokers-exploits/windows/Resources/Ops/PyScripts/lib/ops/survey/engine/xmlhandler.py
2017-04-14 11:45:07 +02:00

85 lines
No EOL
2.6 KiB
Python

from __future__ import print_function
import os
import pickle
from xml.etree.ElementTree import ElementTree
import dsz.lp
class XMLConfigError(Exception, ):
pass
def enforce(condition, msg=None):
if (not condition):
if msg:
raise XMLConfigError, (msg if (type(msg) is not type((lambda : None))) else msg())
else:
raise XMLConfigError
class ConfigProcessor(object, ):
def __init__(self, file, flags):
self.flags = flags
self.file = file
def process(self):
enforce(False, (lambda : ('XML config processor not implemented for %s' % self.__class__)))
def validate(self):
enforce(False, (lambda : ('XML config validation not implemented for %s' % self.__class__)))
class Config(object, ):
def __init__(self, file, flags={}, **kwargs):
self.__file = file
self.flags = flags
self.kwargs = kwargs
@property
def file(self):
return self.__file
def validate(self):
return self.__process(validate_only=True)
def process(self):
self.__process(validate_only=False)
def __process(self, validate_only):
ver = version(self.file)
initargs = _processors[ver]['init']
processor = _processors[ver]['processor']
for i in self.kwargs:
if (i not in initargs):
initargs[i] = self.kwargs[i]
config = processor(file=self.file, flags=self.flags, **initargs)
if validate_only:
return config.validate()
else:
config.process()
_HANDLER_CACHE = os.path.normpath(os.path.join(dsz.lp.GetResourcesDirectory(), '..', 'tmp', 'survey', 'engines.pickle'))
def _loadhandlers():
if (not os.path.exists(_HANDLER_CACHE)):
return {}
with open(_HANDLER_CACHE, 'r') as input:
return pickle.load(input)
_processors = _loadhandlers()
def _savehandlers():
if (not os.path.exists(os.path.split(_HANDLER_CACHE)[0])):
os.makedirs(os.path.split(_HANDLER_CACHE)[0])
with open(_HANDLER_CACHE, 'w') as output:
pickle.dump(_processors, output)
def version(file):
tree = ElementTree(file=file)
version = tree.getroot().get('version', default=None)
enforce((version in _processors), (lambda : ("Unsupported XML configuration version '%s' read from file." % version)))
return version
def register_handler(version, processor, **initargs):
if (version in _processors):
return False
_processors[version] = {'processor': processor, 'init': initargs}
_savehandlers()
return True