debug.py 3.0 KB

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