diff --git a/scapy/all.py b/scapy/all.py index e28f0a91c71..0b177e66faa 100644 --- a/scapy/all.py +++ b/scapy/all.py @@ -11,6 +11,8 @@ from scapy.config import * from scapy.dadict import * from scapy.data import * +# MANUFDB is lazily loaded, so it isn't picked up by the * import above +from scapy.data import MANUFDB from scapy.error import * from scapy.themes import * from scapy.arch import * diff --git a/scapy/data.py b/scapy/data.py index ebc3f8e14d0..14b39e08729 100644 --- a/scapy/data.py +++ b/scapy/data.py @@ -627,18 +627,33 @@ def select_path(directories, filename): "services", )) ETHER_TYPES = load_ethertypes() - MANUFDB = load_manuf() else: IP_PROTOS = load_protocols("/etc/protocols") TCP_SERVICES, UDP_SERVICES, SCTP_SERVICES = load_services("/etc/services") ETHER_TYPES = load_ethertypes("/etc/ethertypes") - MANUFDB = load_manuf( - select_path( - ['/usr', '/usr/local', '/opt', '/opt/wireshark', - '/Applications/Wireshark.app/Contents/Resources'], - "share/wireshark/manuf" + + +def __getattr__(attr): + # type: (str) -> Any + """ + Lazily load MANUFDB on first access, as it is large and only used to + resolve MAC addresses. + """ + if attr != "MANUFDB": + raise AttributeError("module %r has no attribute %r" % (__name__, attr)) + if WINDOWS: + manufdb = load_manuf() + else: + manufdb = load_manuf( + select_path( + ['/usr', '/usr/local', '/opt', '/opt/wireshark', + '/Applications/Wireshark.app/Contents/Resources'], + "share/wireshark/manuf" + ) ) - ) + globals()["MANUFDB"] = manufdb + return manufdb + BLUETOOTH_CORE_COMPANY_IDENTIFIERS = load_bluetoothids() diff --git a/test/regression.uts b/test/regression.uts index a64d48d73a6..ac237d7346f 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -1065,6 +1065,23 @@ assert in6_addrtovendor("fe80::0200:0fff:fe01:0203").lower().startswith("next") assert conf.manufdb.lookup("00:00:0F:01:02:03") == ('Next', 'Next, Inc.') assert "00:00:0F" in conf.manufdb.reverse_lookup("Next") += Test manuf DB is lazily loaded +~ manufdb +import subprocess +out = subprocess.check_output([ + sys.executable, "-c", + "import scapy.data; print('MANUFDB' in vars(scapy.data))" +]) +assert out.strip() == b"False" +import scapy.data +assert scapy.data.MANUFDB is conf.manufdb +assert "MANUFDB" in vars(scapy.data) +try: + scapy.data.DOES_NOT_EXIST + assert False +except AttributeError: + pass + = Test multiple wireshark's manuf formats ~ manufdb