From 886970040ba3a61ecfd20efbe15cb3e3855437c5 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sun, 16 Jun 2013 16:23:36 +1200 Subject: Revert "Use lsof instead of pfctl to find target host on OSX in transparent mode." This reverts commit ffeede9b39c8d269766fd56d02eb7e78d8d13bb2. --- libmproxy/platform/lsof.py | 17 ----------------- libmproxy/platform/osx.py | 8 ++++---- libmproxy/platform/pf.py | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 21 deletions(-) delete mode 100644 libmproxy/platform/lsof.py create mode 100644 libmproxy/platform/pf.py (limited to 'libmproxy') diff --git a/libmproxy/platform/lsof.py b/libmproxy/platform/lsof.py deleted file mode 100644 index 25c0e33f..00000000 --- a/libmproxy/platform/lsof.py +++ /dev/null @@ -1,17 +0,0 @@ -import re - -def lookup(address, port, s): - """ - Parse the pfctl state output s, to look up the destination host - matching the client (address, port). - - Returns an (address, port) tuple, or None. - """ - spec = "%s:%s"%(address, port) - for i in s.split("\n"): - if "ESTABLISHED" in i and spec in i: - m = re.match(".* (\S*)->%s" % spec, i) - if m: - s = m.group(1).split(":") - if len(s) == 2: - return s[0], int(s[1]) diff --git a/libmproxy/platform/osx.py b/libmproxy/platform/osx.py index 1a474e94..dda5d9af 100644 --- a/libmproxy/platform/osx.py +++ b/libmproxy/platform/osx.py @@ -1,16 +1,16 @@ import subprocess -import lsof +import pf """ Doing this the "right" way by using DIOCNATLOOK on the pf device turns out to be a pain. Apple has made a number of modifications to the data structures returned, and compiling userspace tools to test and work with - this turns out to be a pain in the ass. Parsing lsof output is short, + this turns out to be a pain in the ass. Parsing pfctl output is short, simple, and works. """ class Resolver: - STATECMD = ("sudo", "-n", "/usr/sbin/lsof", "-n", "-P", "-i", "TCP") + STATECMD = ("sudo", "-n", "/sbin/pfctl", "-s", "state") def __init__(self): pass @@ -20,4 +20,4 @@ class Resolver: stxt = subprocess.check_output(self.STATECMD, stderr=subprocess.STDOUT) except subprocess.CalledProcessError: return None - return lsof.lookup(peer[0], peer[1], stxt) + return pf.lookup(peer[0], peer[1], stxt) diff --git a/libmproxy/platform/pf.py b/libmproxy/platform/pf.py new file mode 100644 index 00000000..062d3311 --- /dev/null +++ b/libmproxy/platform/pf.py @@ -0,0 +1,16 @@ + +def lookup(address, port, s): + """ + Parse the pfctl state output s, to look up the destination host + matching the client (address, port). + + Returns an (address, port) tuple, or None. + """ + spec = "%s:%s"%(address, port) + for i in s.split("\n"): + if "ESTABLISHED:ESTABLISHED" in i and spec in i: + s = i.split() + if len(s) > 4: + s = s[4].split(":") + if len(s) == 2: + return s[0], int(s[1]) -- cgit v1.2.3