commit fc96d4528f26abc9c1a992177c51a92b8c3b04c8
Author: Damian Johnson <[email protected]>
Date: Sun Jan 24 12:34:34 2016 -0800
netstat support for ipv6 addresses
Supporting ipv6 addresses for the netstat resolver. Only bits we needed was
the
'-W' flag to avoid address truncation and converting 'tcp6' to 'tcp'.
Thanks to
both cypherpunks and toralf on...
https://trac.torproject.org/projects/tor/ticket/18079#comment:11
---
stem/util/connection.py | 11 ++++++-----
test/unit/util/connection.py | 23 +++++++++++++++++++++++
2 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/stem/util/connection.py b/stem/util/connection.py
index 567ca9e..ea7819e 100644
--- a/stem/util/connection.py
+++ b/stem/util/connection.py
@@ -84,8 +84,8 @@ PORT_USES = None # port number => description
RESOLVER_COMMAND = {
Resolver.PROC: '',
- # -n = prevents dns lookups, -p = include process
- Resolver.NETSTAT: 'netstat -np',
+ # -n = prevents dns lookups, -p = include process, -W = don't crop addresses
(needed for ipv6)
+ Resolver.NETSTAT: 'netstat -npW',
# -a = show all TCP/UDP connections, -n = numeric addresses and ports, -o =
include pid
Resolver.NETSTAT_WINDOWS: 'netstat -ano',
@@ -154,9 +154,7 @@ def get_connections(resolver, process_pid = None,
process_name = None):
.. versionadded:: 1.1.0
.. versionchanged:: 1.5.0
- Basic IPv6 support. This is incomplete in that resolver commands we run
- may not surface IPv6 connections. But when present this function now
- includes them in our results.
+ IPv6 support when resolving via netstat, lsof, or ss.
:param Resolver resolver: method of connection resolution to use
:param int process_pid: pid of the process to retrieve
@@ -243,6 +241,9 @@ def get_connections(resolver, process_pid = None,
process_name = None):
protocol = attr['protocol'].lower()
+ if protocol == 'tcp6':
+ protocol = 'tcp'
+
if protocol not in ('tcp', 'udp'):
_log('Unrecognized protocol (%s): %s' % (protocol, line))
continue
diff --git a/test/unit/util/connection.py b/test/unit/util/connection.py
index 2baedc5..e645c72 100644
--- a/test/unit/util/connection.py
+++ b/test/unit/util/connection.py
@@ -32,6 +32,16 @@ unix 3 [ ] STREAM CONNECTED 34164276
15843/tor
unix 3 [ ] STREAM CONNECTED 7951 -
"""
+NETSTAT_IPV6_OUTPUT = """\
+Active Internet connections (w/o servers)
+Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
+tcp6 0 0 5.9.158.75:5222 80.171.220.248:48910
ESTABLISHED 9820/beam
+tcp6 0 0 2a01:4f8:190:514a::2:443
2001:638:a000:4140::ffff:189:41046 ESTABLISHED 1904/tor
+tcp6 0 0 5.9.158.75:5269 146.255.57.226:38703
ESTABLISHED 9820/beam
+tcp6 0 0 2a01:4f8:190:514a::2:443
2001:858:2:2:aabb:0:563b:1526:38260 ESTABLISHED 1904/tor
+tcp6 0 0 5.9.158.75:5222 80.171.220.248:48966
ESTABLISHED 9820/beam
+"""
+
NETSTAT_WINDOWS_OUTPUT = """\
Active Connections
@@ -215,6 +225,19 @@ class TestConnection(unittest.TestCase):
call_mock.side_effect = OSError('Unable to call netstat')
self.assertRaises(IOError, stem.util.connection.get_connections,
Resolver.NETSTAT, process_pid = 1111)
+ @patch('stem.util.system.call', Mock(return_value =
NETSTAT_IPV6_OUTPUT.split('\n')))
+ def test_get_connections_by_netstat_ipv6(self):
+ """
+ Checks the get_connections function with the netstat resolver for IPv6.
+ """
+
+ expected = [
+ Connection('2a01:4f8:190:514a::2', 443, '2001:638:a000:4140::ffff:189',
41046, 'tcp', True),
+ Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526',
38260, 'tcp', True),
+ ]
+
+ self.assertEqual(expected,
stem.util.connection.get_connections(Resolver.NETSTAT, process_pid = 1904,
process_name = 'tor'))
+
@patch('stem.util.system.call')
def test_get_connections_by_windows_netstat(self, call_mock):
"""
_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits