ports/137990: Update of net/Scapy 2.0.1_3
Aurélien Ansel
aurelien.ansel at netasq.com
Thu Aug 20 12:30:04 UTC 2009
>Number: 137990
>Category: ports
>Synopsis: Update of net/Scapy 2.0.1_3
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: maintainer-update
>Submitter-Id: current-users
>Arrival-Date: Thu Aug 20 12:30:03 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: Aurélien Ansel
>Release: 7.2-STABLE
>Organization:
NETASQ
>Environment:
FreeBSD aureliena2.netasq.com 7.2-STABLE FreeBSD 7.2-STABLE #17: Thu Aug 13 14:18:11 CEST 2009 root at aureliena2.netasq.com:/usr/obj/usr/src/sys/NOYAU i386
>Description:
* Fix a missing import
* Fix a bug due to libdnet with a patch that use BPF and libpcap
>How-To-Repeat:
>Fix:
Patch attached with submission follows:
diff -rNu -x '.git*' /usr/ports/net/scapy/Makefile ./Makefile
--- /usr/ports/net/scapy/Makefile 2009-07-28 16:11:27.000000000 +0200
+++ ./Makefile 2009-08-20 11:50:57.000000000 +0200
@@ -8,7 +8,7 @@
PORTNAME= scapy
PORTVERSION= 2.0.1
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= net
MASTER_SITES= http://secdev.org/projects/scapy/files/
@@ -33,7 +33,8 @@
NMAP "Support for nmap OS signatures database" off \
MANUF "Support for wireshark's MANUF MAC database" off \
VPYTHON "Support for 3D representation of traceroute" off \
- SOX "Support for VoIP" off
+ SOX "Support for VoIP" off \
+ BPF "Patch to use BPF and libpcap instead of libdnet" on
.include <bsd.port.pre.mk>
@@ -78,6 +79,12 @@
RUN_DEPENDS+= ${LOCALBASE}/bin/sox:${PORTSDIR}/audio/sox
.endif
+## The original patch comes from the Trac of Scapy
+## http://trac.secdev.org/scapy/ticket/165
+.if defined(WITH_BPF)
+EXTRA_PATCHES+= ${PATCHDIR}/libdnet-for-BSD.patch
+.endif
+
SCAPY_MODULES= nmap.py p0f.py queso.py
post-patch:
diff -rNu -x '.git*' /usr/ports/net/scapy/files/libdnet-for-BSD.patch ./files/libdnet-for-BSD.patch
--- /usr/ports/net/scapy/files/libdnet-for-BSD.patch 1970-01-01 01:00:00.000000000 +0100
+++ ./files/libdnet-for-BSD.patch 2009-08-20 10:44:45.000000000 +0200
@@ -0,0 +1,184 @@
+--- scapy/arch/__init__.py
++++ scapy/arch/__init__.py
+@@ -46,6 +46,8 @@ NETBSD = sys.platform.startswith("netbsd")
+ DARWIN=sys.platform.startswith("darwin")
+ SOLARIS=sys.platform.startswith("sunos")
+
++BROKEN_BPF = FREEBSD or DARWIN
++
+ X86_64 = (os.uname()[4] == 'x86_64')
+
+
+--- scapy/arch/bsd.py
++++ scapy/arch/bsd.py
+@@ -8,3 +8,129 @@
+ LOOPBACK_NAME="lo0"
+
+ from unix import *
++
++if conf.use_dnet == 0 and conf.use_pcap == 1:
++
++ BIOCSETIF = -2145369492 # 0x8020426c
++ BROKEN_BPF = False
++
++ def get_if_raw_addr(ifname):
++ try:
++ f = os.popen("%s %s" % (conf.prog.ifconfig, ifname))
++ except OSError, msg:
++ raise Scapy_Exception("Failed to execute ifconfig: (%s)" % msg)
++ l = f.readlines()
++ ip = ""
++ for i in l:
++ if i.find("netmask") >= 0:
++ ip = i
++ break
++ if ip == "":
++ raise Scapy_Exception("Error in attempting to get hw address for interface [%s]" % ifname)
++ ip = ip.split(' ')[1]
++ return socket.inet_pton(socket.AF_INET, ip)
++
++ def get_if_raw_hwaddr(ifname):
++ if ifname[:2] == "lo":
++ return (772, '\x00'*6)
++ try:
++ f = os.popen("%s %s" % (conf.prog.ifconfig, ifname))
++ except OSError, msg:
++ warning("Failed to execute ifconfig: (%s)" % msg)
++ return "\0\0\0\0"
++ l = f.readlines()
++ mac = ""
++ for i in l:
++ if i.find("ether") >= 0 or i.find("lladdr") >= 0 or i.find("address") >= 0:
++ mac = i
++ break
++ if mac == "":
++ return "\0\0\0\0"
++ mac = mac.split(' ')[1].split(':')
++ mac = map(lambda x: chr(int(x, 16)), mac)
++ return (1, "".join(mac))
++
++ def get_dev_bpf():
++ fd = None
++ for bpf in range(0, 8):
++ try:
++ fd = os.open('/dev/bpf%i' % bpf, os.O_RDWR)
++ if fd:
++ break
++ except OSError, err:
++ continue
++ if fd == None:
++ log_loading.warning("No /dev/bpf is available !")
++ bpf = None
++ return (fd, bpf)
++
++ class L2bpfpcapSocket(L2pcapListenSocket):
++ desc = "read/write packets at layer 2 using libpcap and BPF"
++
++ def __init__(self, iface=None, type=ETH_P_ALL, promisc=None, filter=None, nofilter=0):
++
++ if iface == None:
++ iface = conf.iface
++
++ self.ins = None
++ L2pcapListenSocket.__init__(self, iface=iface, type=type, promisc=promisc, filter=filter)
++ self.closed = False
++
++ (self.outs, self.dev_bpf) = get_dev_bpf()
++
++ try:
++ ioctl(self.outs,
++ BIOCSETIF,
++ struct.pack('16s16x', self.iface))
++ except IOError, err:
++ warning("BIOCSETIF failed on %s" % self.iface)
++
++ def send(self, x):
++ return os.write(self.outs, str(x))
++
++ def __del__(self):
++ if open_pcap != None and hasattr(self, "close"):
++ self.close()
++
++ def close(self):
++ if self.closed == False:
++ self.closed = True
++ if hasattr(self, "outs"):
++ os.close(self.outs)
++ if hasattr(self, "ins"):
++ self.ins.close()
++
++ class L3bpfpcapSocket(L2bpfpcapSocket):
++ desc = "read/write packets at layer 3 using libpcap and BPF"
++
++ def recv(self, x):
++ return L2pcapListenSocket.recv(self, x).payload
++
++ def send(self, x):
++ if isinstance(x, IPv6):
++ iff,a,gw = conf.route6.route(x.dst)
++ elif hasattr(x,"dst"):
++ iff,a,gw = conf.route.route(x.dst)
++ else:
++ iff = conf.iface
++
++ try:
++ ioctl(self.outs,
++ BIOCSETIF,
++ struct.pack('16s16x', iff))
++ except IOError, err:
++ warning("BIOCSETIF failed on %s" % iff)
++
++ ll = self.ins.datalink()
++ if ll in conf.l2types:
++ cls = conf.l2types[ll]
++ else:
++ cls = conf.default_l2
++ warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name))
++
++ frame = str(cls()/x)
++ x.sent_time = time.time()
++ L2bpfpcapSocket.send(self, frame)
++
++ conf.L3socket=L3bpfpcapSocket
++ conf.L2socket=L2bpfpcapSocket
+
+
+--- scapy/arch/pcapdnet.py
++++ scapy/arch/pcapdnet.py
+@@ -40,8 +40,16 @@ if conf.use_pcap:
+ def __init__(self, *args, **kargs):
+ self.pcap = pcap.pcapObject()
+ self.pcap.open_live(*args, **kargs)
++ self.closed = False
+ def setfilter(self, filter):
+ self.pcap.setfilter(filter, 0, 0)
++ def __del__(self):
++ self.close()
++ def close(self):
++ import os
++ if self.closed == False:
++ os.close(self.pcap.fileno())
++ self.closed = True
+ def next(self):
+ c = self.pcap.next()
+ if c is None:
+@@ -99,6 +107,7 @@ if conf.use_pcap:
+ self.ins.setfilter(filter)
+
+ def close(self):
++ print "Father closed"
+ del(self.ins)
+
+ def recv(self, x):
+
+
+--- scapy/config.py
++++ scapy/config.py
+@@ -43,6 +43,7 @@ class ProgPath(ConfClass):
+ tcpreplay = "tcpreplay"
+ hexedit = "hexer"
+ wireshark = "wireshark"
++ ifconfig = "ifconfig"
+
+ class Resolve:
+ def __init__(self):
diff -rNu -x '.git*' /usr/ports/net/scapy/files/patch-scapy-sendrecv.py ./files/patch-scapy-sendrecv.py
--- /usr/ports/net/scapy/files/patch-scapy-sendrecv.py 2009-07-28 16:11:27.000000000 +0200
+++ ./files/patch-scapy-sendrecv.py 2009-08-20 11:06:33.000000000 +0200
+@@ -9,9 +9,10 @@
from arch import *
from config import conf
from packet import Gen
@@ -8,4 +8,7 @@
+from utils import warning,PcapReader
import plist
from error import log_runtime,log_interactive
++from base_classes import SetGen
+ #################
+ ## Debug class ##
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list