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