## 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)
|