debug.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #
  2. # This file is part of pyasn1 software.
  3. #
  4. # Copyright (c) 2005-2017, Ilya Etingof <etingof@gmail.com>
  5. # License: http://pyasn1.sf.net/license.html
  6. #
  7. import logging
  8. from pyasn1.compat.octets import octs2ints
  9. from pyasn1 import error
  10. from pyasn1 import __version__
  11. __all__ = ['Debug', 'setLogger', 'hexdump']
  12. flagNone = 0x0000
  13. flagEncoder = 0x0001
  14. flagDecoder = 0x0002
  15. flagAll = 0xffff
  16. flagMap = {
  17. 'encoder': flagEncoder,
  18. 'decoder': flagDecoder,
  19. 'all': flagAll
  20. }
  21. class Printer(object):
  22. # noinspection PyShadowingNames
  23. def __init__(self, logger=None, handler=None, formatter=None):
  24. if logger is None:
  25. logger = logging.getLogger('pyasn1')
  26. logger.setLevel(logging.DEBUG)
  27. if handler is None:
  28. handler = logging.StreamHandler()
  29. if formatter is None:
  30. formatter = logging.Formatter('%(asctime)s %(name)s: %(message)s')
  31. handler.setFormatter(formatter)
  32. handler.setLevel(logging.DEBUG)
  33. logger.addHandler(handler)
  34. self.__logger = logger
  35. def __call__(self, msg):
  36. self.__logger.debug(msg)
  37. def __str__(self):
  38. return '<python built-in logging>'
  39. if hasattr(logging, 'NullHandler'):
  40. NullHandler = logging.NullHandler
  41. else:
  42. # Python 2.6 and older
  43. class NullHandler(logging.Handler):
  44. def emit(self, record):
  45. pass
  46. class Debug(object):
  47. defaultPrinter = None
  48. def __init__(self, *flags, **options):
  49. self._flags = flagNone
  50. if options.get('printer') is not None:
  51. self._printer = options.get('printer')
  52. elif self.defaultPrinter is not None:
  53. self._printer = self.defaultPrinter
  54. if 'loggerName' in options:
  55. # route our logs to parent logger
  56. self._printer = Printer(
  57. logger=logging.getLogger(options['loggerName']),
  58. handler=NullHandler()
  59. )
  60. else:
  61. self._printer = Printer()
  62. self('running pyasn1 version %s' % __version__)
  63. for f in flags:
  64. inverse = f and f[0] in ('!', '~')
  65. if inverse:
  66. f = f[1:]
  67. try:
  68. if inverse:
  69. self._flags &= ~flagMap[f]
  70. else:
  71. self._flags |= flagMap[f]
  72. except KeyError:
  73. raise error.PyAsn1Error('bad debug flag %s' % f)
  74. self('debug category \'%s\' %s' % (f, inverse and 'disabled' or 'enabled'))
  75. def __str__(self):
  76. return 'logger %s, flags %x' % (self._printer, self._flags)
  77. def __call__(self, msg):
  78. self._printer(msg)
  79. def __and__(self, flag):
  80. return self._flags & flag
  81. def __rand__(self, flag):
  82. return flag & self._flags
  83. logger = 0
  84. def setLogger(l):
  85. global logger
  86. logger = l
  87. def hexdump(octets):
  88. return ' '.join(
  89. ['%s%.2X' % (n % 16 == 0 and ('\n%.5d: ' % n) or '', x)
  90. for n, x in zip(range(len(octets)), octs2ints(octets))]
  91. )
  92. class Scope(object):
  93. def __init__(self):
  94. self._list = []
  95. def __str__(self): return '.'.join(self._list)
  96. def push(self, token):
  97. self._list.append(token)
  98. def pop(self):
  99. return self._list.pop()
  100. scope = Scope()