mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-16 03:24:07 +00:00
net/py-pypcap: Update to 1.2.0
Maintainer's timeout expired wxs@. Additiojnal port changes: * Source from CHEESESHOP instead of GH * Removed LICENSE_FILE (not available) * Added USE_PYTHON=cython (instead of pyrex) * Removed post-patch * Now works for all python versions * Updated WWW PR: 223864 Reported by: yuri Approved by: portmgr (maintainer timeout, 14 days) Approved by: tcberner (mentor, implicit)
This commit is contained in:
parent
bbe3034dd2
commit
0a7d00f6c6
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=462881
@ -2,31 +2,21 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PORTNAME= pypcap
|
||||
DISTVERSIONPREFIX= ${PORTNAME:tu}_
|
||||
DISTVERSION= 1_1
|
||||
PORTREVISION= 6
|
||||
DISTVERSION= 1.2.0
|
||||
CATEGORIES= net python
|
||||
MASTER_SITES= CHEESESHOP
|
||||
PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
|
||||
|
||||
MAINTAINER= wxs@FreeBSD.org
|
||||
COMMENT= Simplified object-oriented Python extension module for libpcap
|
||||
|
||||
LICENSE= BSD3CLAUSE
|
||||
LICENSE_FILE= ${WRKSRC}/LICENSE
|
||||
|
||||
BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}pyrex>0:devel/pyrex@${FLAVOR}
|
||||
|
||||
USE_GITHUB= yes
|
||||
GH_ACCOUNT= dugsong
|
||||
|
||||
USES= python:2.7
|
||||
USE_PYTHON= distutils autoplist
|
||||
|
||||
post-patch:
|
||||
@${RM} ${WRKDIR}/${PORTNAME}-${PORTVERSION}/pcap.c
|
||||
USES= python
|
||||
USE_PYTHON= distutils cython autoplist
|
||||
|
||||
pre-build:
|
||||
(cd ${WRKSRC}; pyrexc pcap.pyx)
|
||||
@cd ${WRKSRC} && cython-${PYTHON_VER} pcap.pyx
|
||||
|
||||
post-install:
|
||||
@${STRIP_CMD} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}/pcap.so
|
||||
|
@ -1,3 +1,3 @@
|
||||
TIMESTAMP = 1493813267
|
||||
SHA256 (dugsong-pypcap-PYPCAP_1_1_GH0.tar.gz) = a75d165f70a71e6c14c46b77c1b9b7a395fa425d0f90a2e342e641c66c14e634
|
||||
SIZE (dugsong-pypcap-PYPCAP_1_1_GH0.tar.gz) = 22812
|
||||
TIMESTAMP = 1519513659
|
||||
SHA256 (pypcap-1.2.0.tar.gz) = 6981b95a975cb964806899735319ca71cfd0b5a4e9f9a45970b558f49eec0158
|
||||
SIZE (pypcap-1.2.0.tar.gz) = 123971
|
||||
|
@ -1,212 +0,0 @@
|
||||
--- pcap.pyx.orig 2005-10-17 00:08:17 UTC
|
||||
+++ pcap.pyx
|
||||
@@ -17,9 +17,11 @@ __url__ = 'http://monkey.org/~dugsong/py
|
||||
__version__ = '1.1'
|
||||
|
||||
import sys
|
||||
+import struct
|
||||
|
||||
cdef extern from "Python.h":
|
||||
object PyBuffer_FromMemory(char *s, int len)
|
||||
+ int PyObject_AsCharBuffer(object obj, char **buffer, int *buffer_len)
|
||||
int PyGILState_Ensure()
|
||||
void PyGILState_Release(int gil)
|
||||
void Py_BEGIN_ALLOW_THREADS()
|
||||
@@ -42,6 +44,10 @@ cdef extern from "pcap.h":
|
||||
unsigned int caplen
|
||||
ctypedef struct pcap_t:
|
||||
int __xxx
|
||||
+ ctypedef struct pcap_if_t # hack for win32
|
||||
+ ctypedef struct pcap_if_t:
|
||||
+ pcap_if_t *next
|
||||
+ char *name
|
||||
|
||||
ctypedef void (*pcap_handler)(void *arg, pcap_pkthdr *hdr, char *pkt)
|
||||
|
||||
@@ -62,6 +68,13 @@ cdef extern from "pcap.h":
|
||||
char *pcap_geterr(pcap_t *p)
|
||||
void pcap_close(pcap_t *p)
|
||||
int bpf_filter(bpf_insn *insns, char *buf, int len, int caplen)
|
||||
+ int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
|
||||
+ void pcap_freealldevs(pcap_if_t *alldevs)
|
||||
+ int pcap_lookupnet(char *device,
|
||||
+ unsigned int *netp,
|
||||
+ unsigned int *maskp,
|
||||
+ char *errbuf)
|
||||
+ int pcap_sendpacket(pcap_t *p, char *buf, int size)
|
||||
|
||||
cdef extern from "pcap_ex.h":
|
||||
# XXX - hrr, sync with libdnet and libevent
|
||||
@@ -134,16 +147,18 @@ cdef class bpf:
|
||||
raise IOError, 'bad filter'
|
||||
def filter(self, buf):
|
||||
"""Return boolean match for buf against our filter."""
|
||||
+ cdef char *p
|
||||
cdef int n
|
||||
- n = len(buf)
|
||||
- if bpf_filter(self.fcode.bf_insns, buf, n, n) == 0:
|
||||
+ if PyObject_AsCharBuffer(buf, &p, &n) < 0:
|
||||
+ raise TypeError
|
||||
+ if bpf_filter(self.fcode.bf_insns, p, n, n) == 0:
|
||||
return False
|
||||
return True
|
||||
def __dealloc__(self):
|
||||
pcap_freecode(&self.fcode)
|
||||
|
||||
cdef class pcap:
|
||||
- """pcap(name=None, snaplen=65535, promisc=True, immediate=False) -> packet capture object
|
||||
+ """pcap(name=None, snaplen=65535, promisc=True, timeout_ms=None, immediate=False) -> packet capture object
|
||||
|
||||
Open a handle to a packet capture descriptor.
|
||||
|
||||
@@ -152,6 +167,9 @@ cdef class pcap:
|
||||
or None to open the first available up interface
|
||||
snaplen -- maximum number of bytes to capture for each packet
|
||||
promisc -- boolean to specify promiscuous mode sniffing
|
||||
+ timeout_ms -- requests for the next packet will return None if the timeout
|
||||
+ (in milliseconds) is reached and no packets were received
|
||||
+ (Default: no timeout)
|
||||
immediate -- disable buffering, if possible
|
||||
"""
|
||||
cdef pcap_t *__pcap
|
||||
@@ -161,7 +179,7 @@ cdef class pcap:
|
||||
cdef int __dloff
|
||||
|
||||
def __init__(self, name=None, snaplen=65535, promisc=True,
|
||||
- timeout_ms=500, immediate=False):
|
||||
+ timeout_ms=0, immediate=False):
|
||||
global dltoff
|
||||
cdef char *p
|
||||
|
||||
@@ -171,7 +189,7 @@ cdef class pcap:
|
||||
raise OSError, self.__ebuf
|
||||
else:
|
||||
p = name
|
||||
-
|
||||
+
|
||||
self.__pcap = pcap_open_offline(p, self.__ebuf)
|
||||
if not self.__pcap:
|
||||
self.__pcap = pcap_open_live(pcap_ex_name(p), snaplen, promisc,
|
||||
@@ -184,7 +202,7 @@ cdef class pcap:
|
||||
try: self.__dloff = dltoff[pcap_datalink(self.__pcap)]
|
||||
except KeyError: pass
|
||||
if immediate and pcap_ex_immediate(self.__pcap) < 0:
|
||||
- raise OSError, "couldn't set BPF immediate mode"
|
||||
+ raise OSError, "couldn't enable immediate mode"
|
||||
|
||||
property name:
|
||||
"""Network interface or dumpfile name."""
|
||||
@@ -243,16 +261,6 @@ cdef class pcap:
|
||||
"""Return datalink type (DLT_* values)."""
|
||||
return pcap_datalink(self.__pcap)
|
||||
|
||||
- def next(self):
|
||||
- """Return the next (timestamp, packet) tuple, or None on error."""
|
||||
- cdef pcap_pkthdr hdr
|
||||
- cdef char *pkt
|
||||
- pkt = <char *>pcap_next(self.__pcap, &hdr)
|
||||
- if not pkt:
|
||||
- return None
|
||||
- return (hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
|
||||
- PyBuffer_FromMemory(pkt, hdr.caplen))
|
||||
-
|
||||
def __add_pkts(self, ts, pkt, pkts):
|
||||
pkts.append((ts, pkt))
|
||||
|
||||
@@ -288,18 +296,24 @@ cdef class pcap:
|
||||
raise exc[0], exc[1], exc[2]
|
||||
return n
|
||||
|
||||
- def loop(self, callback, *args):
|
||||
- """Loop forever, processing packets with a user callback.
|
||||
- The loop can be exited with an exception, including KeyboardInterrupt.
|
||||
+ def loop(self, cnt, callback, *args):
|
||||
+ """Processing packets with a user callback during a loop.
|
||||
+ The loop can be exited when cnt value is reached
|
||||
+ or with an exception, including KeyboardInterrupt.
|
||||
|
||||
Arguments:
|
||||
|
||||
+ cnt -- number of packets to process;
|
||||
+ 0 or -1 to process all packets until an error occurs,
|
||||
+ EOF is reached;
|
||||
callback -- function with (timestamp, pkt, *args) prototype
|
||||
*args -- optional arguments passed to callback on execution
|
||||
"""
|
||||
cdef pcap_pkthdr *hdr
|
||||
cdef char *pkt
|
||||
cdef int n
|
||||
+ cdef int i
|
||||
+ i = 1
|
||||
pcap_ex_setup(self.__pcap)
|
||||
while 1:
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
@@ -308,10 +322,22 @@ cdef class pcap:
|
||||
if n == 1:
|
||||
callback(hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
|
||||
PyBuffer_FromMemory(pkt, hdr.caplen), *args)
|
||||
+ elif n == 0:
|
||||
+ break
|
||||
elif n == -1:
|
||||
raise KeyboardInterrupt
|
||||
elif n == -2:
|
||||
break
|
||||
+ if i == cnt:
|
||||
+ break
|
||||
+ i = i + 1
|
||||
+
|
||||
+ def sendpacket(self, buf):
|
||||
+ """Send a raw network packet on the interface."""
|
||||
+ ret = pcap_sendpacket(self.__pcap, buf, len(buf))
|
||||
+ if ret == -1:
|
||||
+ raise OSError, pcap_geterr(self.__pcap)
|
||||
+ return len(buf)
|
||||
|
||||
def geterr(self):
|
||||
"""Return the last error message associated with this handle."""
|
||||
@@ -340,6 +366,8 @@ cdef class pcap:
|
||||
if n == 1:
|
||||
return (hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
|
||||
PyBuffer_FromMemory(pkt, hdr.caplen))
|
||||
+ elif n == 0:
|
||||
+ return None
|
||||
elif n == -1:
|
||||
raise KeyboardInterrupt
|
||||
elif n == -2:
|
||||
@@ -364,3 +392,36 @@ def lookupdev():
|
||||
raise OSError, ebuf
|
||||
return p
|
||||
|
||||
+def findalldevs():
|
||||
+ """Return a list of capture devices."""
|
||||
+ cdef pcap_if_t *devs, *curr
|
||||
+ cdef char ebuf[256]
|
||||
+
|
||||
+ status = pcap_findalldevs(&devs, ebuf)
|
||||
+ if status:
|
||||
+ raise OSError(ebuf)
|
||||
+ retval = []
|
||||
+ if not devs:
|
||||
+ return retval
|
||||
+ curr = devs
|
||||
+ while 1:
|
||||
+ retval.append(curr.name)
|
||||
+ if not curr.next:
|
||||
+ break
|
||||
+ curr = curr.next
|
||||
+ pcap_freealldevs(devs)
|
||||
+ return retval
|
||||
+
|
||||
+def lookupnet(char *dev):
|
||||
+ """
|
||||
+ Return the address and the netmask of a given device
|
||||
+ as network-byteorder integers.
|
||||
+ """
|
||||
+ cdef unsigned int netp
|
||||
+ cdef unsigned int maskp
|
||||
+ cdef char ebuf[256]
|
||||
+
|
||||
+ status = pcap_lookupnet(dev, &netp, &maskp, ebuf)
|
||||
+ if status:
|
||||
+ raise OSError(ebuf)
|
||||
+ return struct.pack('I', netp), struct.pack('I', maskp)
|
@ -1,22 +0,0 @@
|
||||
--- setup.py.orig 2005-10-17 00:08:17 UTC
|
||||
+++ setup.py
|
||||
@@ -25,7 +25,10 @@ class config_pcap(config.config):
|
||||
d = {}
|
||||
if os.path.exists(os.path.join(cfg['include_dirs'][0], 'pcap-int.h')):
|
||||
d['HAVE_PCAP_INT_H'] = 1
|
||||
- buf = open(os.path.join(cfg['include_dirs'][0], 'pcap.h')).read()
|
||||
+ if int(os.uname()[2].split('.')[0]) >= 8:
|
||||
+ buf = open(os.path.join(cfg['include_dirs'][1], 'pcap.h')).read()
|
||||
+ else:
|
||||
+ buf = open(os.path.join(cfg['include_dirs'][0], 'pcap.h')).read()
|
||||
if buf.find('pcap_file(') != -1:
|
||||
d['HAVE_PCAP_FILE'] = 1
|
||||
if buf.find('pcap_compile_nopcap(') != -1:
|
||||
@@ -46,6 +49,7 @@ class config_pcap(config.config):
|
||||
incdirs = [ os.path.join(d, sd) ]
|
||||
if os.path.exists(os.path.join(d, sd, 'pcap.h')):
|
||||
cfg['include_dirs'] = [ os.path.join(d, sd) ]
|
||||
+ cfg['include_dirs'].append(os.path.join(d, 'include/pcap'))
|
||||
for sd in ('lib', ''):
|
||||
for lib in (('pcap', 'libpcap.a'),
|
||||
('pcap', 'libpcap.dylib'),
|
@ -1,3 +1,3 @@
|
||||
A simplified object-oriented Python extension module for libpcap
|
||||
|
||||
WWW: https://github.com/dugsong/pypcap
|
||||
WWW: https://github.com/pynetwork/pypcap
|
||||
|
Loading…
Reference in New Issue
Block a user