blob: d7273447d018e12e15534362ebf43fd3ffdfccf8 [file] [log] [blame]
## This file is part of Scapy
## See http://www.secdev.org/projects/scapy for more informations
## Copyright (C) Philippe Biondi <phil@secdev.org>
## This program is published under a GPLv2 license
"""
Logging subsystem and basic exception class.
"""
#############################
##### Logging subsystem #####
#############################
class Scapy_Exception(Exception):
pass
import logging, traceback, time
class ScapyFreqFilter(logging.Filter):
def __init__(self):
logging.Filter.__init__(self)
self.warning_table = {}
def filter(self, record):
from scapy.config import conf
wt = conf.warning_threshold
if wt > 0:
stk = traceback.extract_stack()
caller=None
for f,l,n,c in stk:
if n == 'warning':
break
caller = l
tm,nb = self.warning_table.get(caller, (0,0))
ltm = time.time()
if ltm-tm > wt:
tm = ltm
nb = 0
else:
if conf.warning_next_only_once:
conf.warning_next_only_once = False
return 0
if nb < 2:
nb += 1
if nb == 2:
record.msg = "more "+record.msg
else:
return 0
self.warning_table[caller] = (tm,nb)
return 1
try:
from logging import NullHandler
except ImportError:
# compat for python 2.6
from logging import Handler
class NullHandler(Handler):
def emit(self, record):
pass
log_scapy = logging.getLogger("scapy")
log_scapy.addHandler(NullHandler())
log_runtime = logging.getLogger("scapy.runtime") # logs at runtime
log_runtime.addFilter(ScapyFreqFilter())
log_interactive = logging.getLogger("scapy.interactive") # logs in interactive functions
log_loading = logging.getLogger("scapy.loading") # logs when loading Scapy
def warning(x, *args, **kargs):
"""
Prints a warning during runtime.
onlyOnce - if True, the warning will never be printed again.
"""
if kargs.pop("onlyOnce", False):
from scapy.config import conf
conf.warning_next_only_once = True
log_runtime.warning(x, *args, **kargs)