codekingpro/portable-devtools
115k
1#2# This file is part of pyasn1 software.3#4# Copyright (c) 2005-2020, Ilya Etingof <etingof@gmail.com>5# License: https://pyasn1.readthedocs.io/en/latest/license.html6#7import logging8import sys9 10from pyasn1 import __version__11from pyasn1 import error12 13__all__ = ['Debug', 'setLogger', 'hexdump']14 15DEBUG_NONE = 0x000016DEBUG_ENCODER = 0x000117DEBUG_DECODER = 0x000218DEBUG_ALL = 0xffff19 20FLAG_MAP = {21 'none': DEBUG_NONE,22 'encoder': DEBUG_ENCODER,23 'decoder': DEBUG_DECODER,24 'all': DEBUG_ALL25}26 27LOGGEE_MAP = {}28 29 30class Printer(object):31 # noinspection PyShadowingNames32 def __init__(self, logger=None, handler=None, formatter=None):33 if logger is None:34 logger = logging.getLogger('pyasn1')35 36 logger.setLevel(logging.DEBUG)37 38 if handler is None:39 handler = logging.StreamHandler()40 41 if formatter is None:42 formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s')43 44 handler.setFormatter(formatter)45 handler.setLevel(logging.DEBUG)46 logger.addHandler(handler)47 48 self.__logger = logger49 50 def __call__(self, msg):51 self.__logger.debug(msg)52 53 def __str__(self):54 return '<python logging>'55 56 57class Debug(object):58 defaultPrinter = Printer()59 60 def __init__(self, *flags, **options):61 self._flags = DEBUG_NONE62 63 if 'loggerName' in options:64 # route our logs to parent logger65 self._printer = Printer(66 logger=logging.getLogger(options['loggerName']),67 handler=logging.NullHandler()68 )69 70 elif 'printer' in options:71 self._printer = options.get('printer')72 73 else:74 self._printer = self.defaultPrinter75 76 self._printer('running pyasn1 %s, debug flags %s' % (__version__, ', '.join(flags)))77 78 for flag in flags:79 inverse = flag and flag[0] in ('!', '~')80 if inverse:81 flag = flag[1:]82 try:83 if inverse:84 self._flags &= ~FLAG_MAP[flag]85 else:86 self._flags |= FLAG_MAP[flag]87 except KeyError:88 raise error.PyAsn1Error('bad debug flag %s' % flag)89 90 self._printer("debug category '%s' %s" % (flag, inverse and 'disabled' or 'enabled'))91 92 def __str__(self):93 return 'logger %s, flags %x' % (self._printer, self._flags)94 95 def __call__(self, msg):96 self._printer(msg)97 98 def __and__(self, flag):99 return self._flags & flag100 101 def __rand__(self, flag):102 return flag & self._flags103 104_LOG = DEBUG_NONE105 106 107def setLogger(userLogger):108 global _LOG109 110 if userLogger:111 _LOG = userLogger112 else:113 _LOG = DEBUG_NONE114 115 # Update registered logging clients116 for module, (name, flags) in LOGGEE_MAP.items():117 setattr(module, name, _LOG & flags and _LOG or DEBUG_NONE)118 119 120def registerLoggee(module, name='LOG', flags=DEBUG_NONE):121 LOGGEE_MAP[sys.modules[module]] = name, flags122 setLogger(_LOG)123 return _LOG124 125 126def hexdump(octets):127 return ' '.join(128 ['%s%.2X' % (n % 16 == 0 and ('\n%.5d: ' % n) or '', x)129 for n, x in zip(range(len(octets)), octets)]130 )131 132 133class Scope(object):134 def __init__(self):135 self._list = []136 137 def __str__(self): return '.'.join(self._list)138 139 def push(self, token):140 self._list.append(token)141 142 def pop(self):143 return self._list.pop()144 145 146scope = Scope()147 