1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#
# This file is part of pyasn1 software.
#
# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com>
# License: http://snmplabs.com/pyasn1/license.html
#
import logging
import sys
from pyasn1 import __version__
from pyasn1 import error
from pyasn1.compat.octets import octs2ints
__all__ = ["Debug", "setLogger", "hexdump"]
DEBUG_NONE = 0x0000
DEBUG_ENCODER = 0x0001
DEBUG_DECODER = 0x0002
DEBUG_ALL = 0xFFFF
FLAG_MAP = {
"none": DEBUG_NONE,
"encoder": DEBUG_ENCODER,
"decoder": DEBUG_DECODER,
"all": DEBUG_ALL,
}
LOGGEE_MAP = {}
class Printer(object):
# noinspection PyShadowingNames
def __init__(self, logger=None, handler=None, formatter=None):
if logger is None:
logger = logging.getLogger("pyasn1")
logger.setLevel(logging.DEBUG)
if handler is None:
handler = logging.StreamHandler()
if formatter is None:
formatter = logging.Formatter("%(asctime)s %(name)s: %(message)s")
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
self.__logger = logger
def __call__(self, msg):
self.__logger.debug(msg)
def __str__(self):
return "<python logging>"
if hasattr(logging, "NullHandler"):
NullHandler = logging.NullHandler
else:
# Python 2.6 and older
class NullHandler(logging.Handler):
def emit(self, record):
pass
class Debug(object):
defaultPrinter = Printer()
def __init__(self, *flags, **options):
self._flags = DEBUG_NONE
if "loggerName" in options:
# route our logs to parent logger
self._printer = Printer(
logger=logging.getLogger(options["loggerName"]), handler=NullHandler()
)
elif "printer" in options:
self._printer = options.get("printer")
else:
self._printer = self.defaultPrinter
self._printer(
"running pyasn1 %s, debug flags %s" % (__version__, ", ".join(flags))
)
for flag in flags:
inverse = flag and flag[0] in ("!", "~")
if inverse:
flag = flag[1:]
try:
if inverse:
self._flags &= ~FLAG_MAP[flag]
else:
self._flags |= FLAG_MAP[flag]
except KeyError:
raise error.PyAsn1Error("bad debug flag %s" % flag)
self._printer(
"debug category '%s' %s" % (flag, inverse and "disabled" or "enabled")
)
def __str__(self):
return "logger %s, flags %x" % (self._printer, self._flags)
def __call__(self, msg):
self._printer(msg)
def __and__(self, flag):
return self._flags & flag
def __rand__(self, flag):
return flag & self._flags
_LOG = DEBUG_NONE
def setLogger(userLogger):
global _LOG
if userLogger:
_LOG = userLogger
else:
_LOG = DEBUG_NONE
# Update registered logging clients
for module, (name, flags) in LOGGEE_MAP.items():
setattr(module, name, _LOG & flags and _LOG or DEBUG_NONE)
def registerLoggee(module, name="LOG", flags=DEBUG_NONE):
LOGGEE_MAP[sys.modules[module]] = name, flags
setLogger(_LOG)
return _LOG
def hexdump(octets):
return " ".join(
[
"%s%.2X" % (n % 16 == 0 and ("\n%.5d: " % n) or "", x)
for n, x in zip(range(len(octets)), octs2ints(octets))
]
)
class Scope(object):
def __init__(self):
self._list = []
def __str__(self):
return ".".join(self._list)
def push(self, token):
self._list.append(token)
def pop(self):
return self._list.pop()
scope = Scope()
|