shadowbrokers-exploits/windows/Resources/Ops/PyScripts/lib/util/DSZPyLogger.py

193 lines
6.1 KiB
Python
Raw Normal View History

try:
import dsz.script
import dsz.env
import dsz.ui
HASDSZ = True
except:
HASDSZ = False
import logging
import os
DEBUG = logging.DEBUG
INFO = logging.INFO
GOOD = (INFO + 5)
logging.addLevelName(GOOD, 'GOOD')
WARNING = logging.WARNING
ERROR = logging.ERROR
CRITICAL = logging.CRITICAL
LOG_FILE_DIR = ''
if HASDSZ:
LOG_FILE_DIR = os.path.join(dsz.script.Env['log_path'], 'GetFiles', 'NOSEND', 'OPLOGS')
DEFAULT_LOG_FILE = 'DSZPyLogger.log'
_TERM_LOG_FORMAT = '%(asctime)s (%(name)s) - %(message)s'
_FILE_LOG_FORMAT = '%(asctime)s (%(name)s) %(levelname)s - %(message)s'
LOG_EXC_TO_TERM = False
def getLogger(name=None):
log = logging.getLogger(name)
return log
def CheckEnvVar(name):
if HASDSZ:
dsz.env.Check(name)
else:
return None
def GetEnvVar(name):
if HASDSZ:
dsz.env.Get(name)
else:
return None
def SetEnvVar(name, value):
if HASDSZ:
dsz.env.Set(name, value)
class DSZLogger(logging.Logger, ):
def __init__(self, name, fileloglevel=DEBUG, termloglevel=GOOD, **kwargs):
logging.Logger.__init__(self, name, **kwargs)
if (not os.path.exists(LOG_FILE_DIR)):
os.makedirs(LOG_FILE_DIR)
logging.basicConfig(filename=os.path.join(LOG_FILE_DIR, DEFAULT_LOG_FILE), format=_FILE_LOG_FORMAT, level=fileloglevel)
self.propagate = False
ch = self._getHandler(logging.FileHandler)
if (ch is None):
ch = logging.FileHandler(os.path.join(LOG_FILE_DIR, (name + '.log')))
formatter = logging.Formatter(_FILE_LOG_FORMAT)
ch.setFormatter(formatter)
level = fileloglevel
try:
rootFH = root._getHandler(logging.FileHandler)
if (rootFH is not None):
level = rootFH.level
except NameError:
pass
ch.setLevel(level)
self.addHandler(ch)
ch = self._getHandler(DSZTerminalHandler)
if (ch is None):
ch = DSZTerminalHandler()
formatter = logging.Formatter(_TERM_LOG_FORMAT, '[%H:%M:%S]')
ch.setFormatter(formatter)
level = termloglevel
try:
rootSH = root._getHandler(DSZTerminalHandler)
if (rootSH is not None):
level = rootSH.level
except NameError:
pass
ch.setLevel(level)
self.addHandler(ch)
ch = None
self.setFileLogLevel(fileloglevel)
self.setTermLogLevel(termloglevel)
logging.addLevelName(21, 'USER')
def logProblem(self, src, details):
try:
eLog = logging.getLogger(src)
eLog.propagate = False
ch = self._getHandler(logging.FileHandler, eLog)
if (ch is None):
ch = logging.FileHandler(os.path.join(LOG_FILE_DIR, 'UserProblems.log'))
formatter = logging.Formatter(_FILE_LOG_FORMAT)
ch.setFormatter(formatter)
ch.setLevel(self.INFO)
eLog.addHandler(ch)
except:
raise TypeError, 'src must be a string [a valid windows filename]'
eLog.log(21, details)
eLog = None
def setFileLogLevel(self, level):
try:
level = int(level)
except:
raise TypeError, 'level must be one of DSZPyLogger.DEBUG|INFO|WARNING|ERROR|CRITICAL'
ch = self._getHandler(logging.FileHandler)
if (ch is not None):
ch.setLevel(level)
ch = None
def setTermLogLevel(self, level):
try:
level = int(level)
except:
raise TypeError, 'level must be one of DSZPyLogger.DEBUG|INFO|GOOD|WARNING|ERROR|CRITICAL'
ch = self._getHandler(DSZTerminalHandler)
if (ch is not None):
ch.setLevel(level)
ch = None
def _getHandler(self, cls):
for ch in self.handlers:
if (ch.__class__ == cls):
return ch
return None
def _getEffectiveHandler(self, cls):
ch = self._getHandler(cls)
if ((ch is None) and (self.parent is not None)):
ch = self._getEffectiveHandler(cls, self.parent)
return ch
def good(self, msg, *args, **kwargs):
if self.isEnabledFor(GOOD):
self._log(GOOD, msg, args, **kwargs)
if HASDSZ:
class DSZTerminalHandler(logging.Handler, ):
def __init__(self):
logging.Handler.__init__(self)
def emit(self, record):
try:
if (not LOG_EXC_TO_TERM):
record.exc_info = False
record.exc_text = None
msg = self.format(record)
if (record.levelno >= ERROR):
echocode = dsz.ERROR
elif (record.levelno >= WARNING):
echocode = dsz.WARNING
elif (record.levelno >= GOOD):
echocode = dsz.GOOD
else:
echocode = dsz.DEFAULT
dsz.ui.Echo(str(msg), echocode)
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
else:
DSZTerminalHandler = logging.StreamHandler
root = DSZLogger('DSZPyLogger', level=DEBUG)
logging.Logger.root = root
logging.setLoggerClass(DSZLogger)
class DSZPyLogger:
DEBUG = logging.DEBUG
INFO = logging.INFO
WARNING = logging.WARNING
ERROR = logging.ERROR
CRITICAL = logging.CRITICAL
def __init__(self):
pass
def getLogger(self, name):
return getLogger(name)
def setTermLogLevel(self, level, log=None):
if (log is None):
getLogger().setTermLogLevel(level)
else:
log.setTermLogLevel(level)
def setFileLogLevel(self, level, log=None):
if (log is None):
getLogger().setFileLogLevel(level)
else:
log.setFileLogLevel(level)