ronnie
2022-10-14 1504bb53e29d3d46222c0b3ea994fc494b48e153
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
## 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)