## This file is part of Scapy ## See http://www.secdev.org/projects/scapy for more informations ## Copyright (C) Philippe Biondi ## 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)