From 32b710444f9b09fc06840be349eff54fa893f64c Mon Sep 17 00:00:00 2001 From: Pierre LALET Date: Mon, 26 Sep 2016 19:37:42 +0200 Subject: [PATCH 1/2] Arch: move constant values to a new submodule This avoids a circular import problem affecting Windows platforms. --- scapy/arch/__init__.py | 18 +++--------------- scapy/arch/consts.py | 24 ++++++++++++++++++++++++ scapy/sendrecv.py | 4 ++-- 3 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 scapy/arch/consts.py diff --git a/scapy/arch/__init__.py b/scapy/arch/__init__.py index a64907bad..f8687512f 100644 --- a/scapy/arch/__init__.py +++ b/scapy/arch/__init__.py @@ -7,9 +7,10 @@ Operating system specific functionality. """ +import socket -import sys,os,socket - +from scapy.arch.consts import LINUX, OPENBSD, FREEBSD, NETBSD, DARWIN, \ + SOLARIS, WINDOWS, BSD, X86_64, ARM_64 from scapy.error import * import scapy.config from scapy.pton_ntop import inet_pton @@ -54,19 +55,6 @@ def get_if_hwaddr(iff): raise Scapy_Exception("Unsupported address family (%i) for interface [%s]" % (addrfamily,iff)) -LINUX = sys.platform.startswith("linux") -OPENBSD = sys.platform.startswith("openbsd") -FREEBSD = "freebsd" in sys.platform -NETBSD = sys.platform.startswith("netbsd") -DARWIN = sys.platform.startswith("darwin") -SOLARIS = sys.platform.startswith("sunos") -WINDOWS = sys.platform.startswith("win32") -BSD = DARWIN or FREEBSD or OPENBSD or NETBSD - -X86_64 = not WINDOWS and (os.uname()[4] == 'x86_64') -ARM_64 = not WINDOWS and (os.uname()[4] == 'aarch64') - - # Next step is to import following architecture specific functions: # def get_if_raw_hwaddr(iff) # def get_if_raw_addr(iff): diff --git a/scapy/arch/consts.py b/scapy/arch/consts.py new file mode 100644 index 000000000..f475f5b9b --- /dev/null +++ b/scapy/arch/consts.py @@ -0,0 +1,24 @@ +## 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 + +import os +from sys import platform + +LINUX = platform.startswith("linux") +OPENBSD = platform.startswith("openbsd") +FREEBSD = "freebsd" in platform +NETBSD = platform.startswith("netbsd") +DARWIN = platform.startswith("darwin") +SOLARIS = platform.startswith("sunos") +WINDOWS = platform.startswith("win32") +BSD = DARWIN or FREEBSD or OPENBSD or NETBSD + +if WINDOWS: + X86_64 = False + ARM_64 = False +else: + uname = os.uname() + X86_64 = uname[4] == 'x86_64' + ARM_64 = uname[4] == 'aarch64' diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py index 0686bcb0d..d94f88a6c 100644 --- a/scapy/sendrecv.py +++ b/scapy/sendrecv.py @@ -11,8 +11,8 @@ import errno import cPickle,os,sys,time,subprocess import itertools from select import select +from scapy.arch.consts import DARWIN, FREEBSD from scapy.data import * -from scapy import arch from scapy.config import conf from scapy.packet import Gen from scapy.utils import warning,get_temp_file,PcapReader,wrpcap @@ -127,7 +127,7 @@ def sndrcv(pks, pkt, timeout = None, inter = 0, verbose=None, chainCC=0, retry=0 if remaintime <= 0: break r = None - if not isinstance(pks, StreamSocket) and (arch.FREEBSD or arch.DARWIN): + if not isinstance(pks, StreamSocket) and (FREEBSD or DARWIN): inp, out, err = select(inmask,[],[], 0.05) if len(inp) == 0 or pks in inp: r = pks.nonblock_recv() From d466c17729b666a8d9006b82e1e714efb2fdca9d Mon Sep 17 00:00:00 2001 From: Pierre LALET Date: Mon, 26 Sep 2016 20:24:23 +0200 Subject: [PATCH 2/2] Arch: factor LOOPBACK_NAME const This avoids a circular import problem affecting Windows platforms. --- scapy/arch/__init__.py | 3 +-- scapy/arch/bsd.py | 10 ---------- scapy/arch/consts.py | 2 ++ scapy/arch/linux.py | 3 +-- scapy/arch/solaris.py | 2 -- scapy/arch/windows/__init__.py | 2 +- scapy/route.py | 4 +++- 7 files changed, 8 insertions(+), 18 deletions(-) delete mode 100644 scapy/arch/bsd.py diff --git a/scapy/arch/__init__.py b/scapy/arch/__init__.py index f8687512f..92a714174 100644 --- a/scapy/arch/__init__.py +++ b/scapy/arch/__init__.py @@ -10,7 +10,7 @@ Operating system specific functionality. import socket from scapy.arch.consts import LINUX, OPENBSD, FREEBSD, NETBSD, DARWIN, \ - SOLARIS, WINDOWS, BSD, X86_64, ARM_64 + SOLARIS, WINDOWS, BSD, X86_64, ARM_64, LOOPBACK_NAME from scapy.error import * import scapy.config from scapy.pton_ntop import inet_pton @@ -73,7 +73,6 @@ if LINUX: if scapy.config.conf.use_pcap or scapy.config.conf.use_dnet: from scapy.arch.pcapdnet import * elif BSD: - from scapy.arch.bsd import LOOPBACK_NAME from scapy.arch.unix import read_routes, read_routes6, in6_getifaddr scapy.config.conf.use_pcap = True scapy.config.conf.use_dnet = True diff --git a/scapy/arch/bsd.py b/scapy/arch/bsd.py deleted file mode 100644 index 937c5b07d..000000000 --- a/scapy/arch/bsd.py +++ /dev/null @@ -1,10 +0,0 @@ -## 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 - -""" -Support for BSD-like operating systems such as FreeBSD, OpenBSD and Mac OS X. -""" - -LOOPBACK_NAME = "lo0" diff --git a/scapy/arch/consts.py b/scapy/arch/consts.py index f475f5b9b..581d09f03 100644 --- a/scapy/arch/consts.py +++ b/scapy/arch/consts.py @@ -22,3 +22,5 @@ else: uname = os.uname() X86_64 = uname[4] == 'x86_64' ARM_64 = uname[4] == 'aarch64' + +LOOPBACK_NAME = "lo" if LINUX else "lo0" diff --git a/scapy/arch/linux.py b/scapy/arch/linux.py index a9908bfc7..a5617f90d 100644 --- a/scapy/arch/linux.py +++ b/scapy/arch/linux.py @@ -12,6 +12,7 @@ import sys,os,struct,socket,time from select import select from fcntl import ioctl +from scapy.arch.consts import LOOPBACK_NAME import scapy.utils import scapy.utils6 from scapy.packet import Packet, Padding @@ -81,8 +82,6 @@ PACKET_FASTROUTE = 6 # Fastrouted frame # Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space -LOOPBACK_NAME="lo" - with os.popen("%s -V 2> /dev/null" % conf.prog.tcpdump) as _f: if _f.close() >> 8 == 0x7f: log_loading.warning("Failed to execute tcpdump. Check it is installed and in the PATH") diff --git a/scapy/arch/solaris.py b/scapy/arch/solaris.py index 13d23497a..5b997b80d 100644 --- a/scapy/arch/solaris.py +++ b/scapy/arch/solaris.py @@ -11,6 +11,4 @@ Customization for the Solaris operation system. import socket socket.IPPROTO_GRE = 47 -LOOPBACK_NAME="lo0" - from scapy.arch.unix import * diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py index 9a4142d8b..eec790302 100755 --- a/scapy/arch/windows/__init__.py +++ b/scapy/arch/windows/__init__.py @@ -13,6 +13,7 @@ import subprocess as sp from glob import glob import tempfile +from scapy.arch.consts import LOOPBACK_NAME from scapy.config import conf,ConfClass from scapy.error import Scapy_Exception,log_loading,log_runtime from scapy.utils import atol, itom, inet_aton, inet_ntoa, PcapReader @@ -38,7 +39,6 @@ if not hasattr(socket, 'IPPROTO_ESP'): from scapy.arch import pcapdnet from scapy.arch.pcapdnet import * -LOOPBACK_NAME="lo0" WINDOWS = True def _exec_query_ps(cmd, fields): diff --git a/scapy/route.py b/scapy/route.py index 7140a49bd..0da8958f7 100644 --- a/scapy/route.py +++ b/scapy/route.py @@ -8,7 +8,7 @@ Routing and handling of network interfaces. """ import socket -from scapy.arch import read_routes,get_if_addr,LOOPBACK_NAME +from scapy.arch.consts import LOOPBACK_NAME from scapy.utils import atol,ltoa,itom from scapy.config import conf from scapy.error import Scapy_Exception,warning @@ -26,6 +26,7 @@ class Route: self.cache = {} def resync(self): + from scapy.arch import read_routes self.invalidate_cache() self.routes = read_routes() @@ -40,6 +41,7 @@ class Route: return rt def make_route(self, host=None, net=None, gw=None, dev=None): + from scapy.arch import get_if_addr if host is not None: thenet,msk = host,32 elif net is not None: