commit d32bd6f09f7a2edae4c8e46787a252ab7df632a2
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sat Jan 23 15:59:38 2016 -0800
Expand Connetion enum with an is_ipv6 attribute
Providing an attribute to easily distinguish if the connection is IPv6 or IPv4.
---
docs/change_log.rst | 3 ++-
stem/util/connection.py | 5 ++--
stem/util/proc.py | 6 ++---
test/unit/util/connection.py | 58 +++++++++++++++++++++---------------------
test/unit/util/proc.py | 4 +--
5 files changed, 39 insertions(+), 37 deletions(-)
diff --git a/docs/change_log.rst b/docs/change_log.rst
index 9c6b88b..b1e26a1 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -72,9 +72,10 @@ The following are only available within Stem's `git repository
* **Utilities**
* Added :func:`~stem.util.__init__.datetime_to_unix`
- * Basic IPv6 support in :func:`~stem.util.connection.get_connections`
+ * IPv6 support in :func:`~stem.util.connection.get_connections`
* The 'ss' connection resolver didn't work on Gentoo (:trac:`18079`)
* Recognize IPv4-mapped IPv6 addresses in our utils (:trac:`18079`)
+ * Added an **is_ipv6** value to Connection instances
* Allow :func:`stem.util.conf.Config.set` to remove values when provided with a **None** value
* **Interpreter**
diff --git a/stem/util/connection.py b/stem/util/connection.py
index 09a1fff..567ca9e 100644
--- a/stem/util/connection.py
+++ b/stem/util/connection.py
@@ -132,7 +132,7 @@ RESOLVER_FILTER = {
}
-class Connection(collections.namedtuple('Connection', ['local_address', 'local_port', 'remote_address', 'remote_port', 'protocol'])):
+class Connection(collections.namedtuple('Connection', ['local_address', 'local_port', 'remote_address', 'remote_port', 'protocol', 'is_ipv6'])):
"""
Network connection information.
@@ -141,6 +141,7 @@ class Connection(collections.namedtuple('Connection', ['local_address', 'local_p
:var str remote_address: destionation ip address
:var int remote_port: destination port
:var str protocol: protocol of the connection ('tcp', 'udp', etc)
+ :var bool is_ipv6: addresses are ipv6 if true, and ipv4 otherwise
"""
@@ -246,7 +247,7 @@ def get_connections(resolver, process_pid = None, process_name = None):
_log('Unrecognized protocol (%s): %s' % (protocol, line))
continue
- conn = Connection(local_addr, local_port, remote_addr, remote_port, protocol)
+ conn = Connection(local_addr, local_port, remote_addr, remote_port, protocol, is_valid_ipv6_address(local_addr))
connections.append(conn)
_log(str(conn))
diff --git a/stem/util/proc.py b/stem/util/proc.py
index 5d2219c..1432710 100644
--- a/stem/util/proc.py
+++ b/stem/util/proc.py
@@ -333,8 +333,8 @@ def connections(pid):
:param int pid: process id of the process to be queried
:returns: A listing of connection tuples of the form **[(local_ipAddr1,
- local_port1, foreign_ipAddr1, foreign_port1, protocol), ...]** (addresses
- and protocols are strings and ports are ints)
+ local_port1, foreign_ipAddr1, foreign_port1, protocol, is_ipv6), ...]**
+ (addresses and protocols are strings and ports are ints)
:raises: **IOError** if it can't be determined
"""
@@ -403,7 +403,7 @@ def connections(pid):
local_ip, local_port = _decode_proc_address_encoding(l_addr)
foreign_ip, foreign_port = _decode_proc_address_encoding(f_addr)
protocol = proc_file_path[10:]
- conn.append((local_ip, local_port, foreign_ip, foreign_port, protocol))
+ conn.append((local_ip, local_port, foreign_ip, foreign_port, protocol, False))
proc_file.close()
except IOError as exc:
diff --git a/test/unit/util/connection.py b/test/unit/util/connection.py
index 3442326..2baedc5 100644
--- a/test/unit/util/connection.py
+++ b/test/unit/util/connection.py
@@ -185,13 +185,13 @@ class TestConnection(unittest.TestCase):
"""
proc_mock.return_value = [
- ('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp'),
- ('187.187.187.187', 48059, '204.204.204.204', 52428, 'tcp'),
+ ('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp', False),
+ ('187.187.187.187', 48059, '204.204.204.204', 52428, 'tcp', False),
]
expected = [
- Connection('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp'),
- Connection('187.187.187.187', 48059, '204.204.204.204', 52428, 'tcp'),
+ Connection('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp', False),
+ Connection('187.187.187.187', 48059, '204.204.204.204', 52428, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.PROC, process_pid = 1111))
@@ -206,7 +206,7 @@ class TestConnection(unittest.TestCase):
"""
call_mock.return_value = NETSTAT_OUTPUT.split('\n')
- expected = [Connection('192.168.0.1', 44284, '38.229.79.2', 443, 'tcp')]
+ expected = [Connection('192.168.0.1', 44284, '38.229.79.2', 443, 'tcp', False)]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.NETSTAT, process_pid = 15843, process_name = 'tor'))
self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT, process_pid = 15843, process_name = 'stuff')
@@ -222,7 +222,7 @@ class TestConnection(unittest.TestCase):
"""
call_mock.return_value = NETSTAT_WINDOWS_OUTPUT.split('\n')
- expected = [Connection('192.168.0.1', 44284, '38.229.79.2', 443, 'tcp')]
+ expected = [Connection('192.168.0.1', 44284, '38.229.79.2', 443, 'tcp', False)]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.NETSTAT_WINDOWS, process_pid = 15843, process_name = 'tor'))
self.assertRaises(IOError, stem.util.connection.get_connections, Resolver.NETSTAT_WINDOWS, process_pid = 1111, process_name = 'tor')
@@ -238,8 +238,8 @@ class TestConnection(unittest.TestCase):
call_mock.return_value = SS_OUTPUT.split('\n')
expected = [
- Connection('192.168.0.1', 44092, '23.112.135.72', 443, 'tcp'),
- Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp'),
+ Connection('192.168.0.1', 44092, '23.112.135.72', 443, 'tcp', False),
+ Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.SS, process_pid = 15843, process_name = 'tor'))
@@ -260,10 +260,10 @@ class TestConnection(unittest.TestCase):
"""
expected = [
- Connection('5.9.158.75', 443, '107.170.93.13', 56159, 'tcp'),
- Connection('5.9.158.75', 443, '159.203.97.91', 37802, 'tcp'),
- Connection('2a01:4f8:190:514a::2', 443, '2001:638:a000:4140::ffff:189', 38556, 'tcp'),
- Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 51428, 'tcp'),
+ Connection('5.9.158.75', 443, '107.170.93.13', 56159, 'tcp', False),
+ Connection('5.9.158.75', 443, '159.203.97.91', 37802, 'tcp', False),
+ Connection('2a01:4f8:190:514a::2', 443, '2001:638:a000:4140::ffff:189', 38556, 'tcp', True),
+ Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 51428, 'tcp', True),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.SS, process_pid = 25056, process_name = 'tor'))
self.assertEqual(2, len(stem.util.connection.get_connections(Resolver.SS, process_name = 'beam')))
@@ -276,8 +276,8 @@ class TestConnection(unittest.TestCase):
call_mock.return_value = LSOF_OUTPUT.split('\n')
expected = [
- Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp'),
- Connection('192.168.0.1', 44092, '68.169.35.102', 443, 'tcp'),
+ Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp', False),
+ Connection('192.168.0.1', 44092, '68.169.35.102', 443, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.LSOF, process_pid = 15843, process_name = 'tor'))
@@ -293,7 +293,7 @@ class TestConnection(unittest.TestCase):
Checks the get_connections function with the lsof resolver for IPv6.
"""
- expected = [Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 44811, 'tcp')]
+ expected = [Connection('2a01:4f8:190:514a::2', 443, '2001:858:2:2:aabb:0:563b:1526', 44811, 'tcp', True)]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.LSOF, process_pid = 1904, process_name = 'tor'))
@patch('stem.util.system.call', Mock(return_value = LSOF_OUTPUT_OSX.split('\n')))
@@ -304,9 +304,9 @@ class TestConnection(unittest.TestCase):
"""
expected = [
- Connection('192.168.1.20', 9090, '38.229.79.2', 14010, 'tcp'),
- Connection('192.168.1.20', 9090, '68.169.35.102', 14815, 'tcp'),
- Connection('192.168.1.20', 9090, '62.135.16.134', 14456, 'tcp'),
+ Connection('192.168.1.20', 9090, '38.229.79.2', 14010, 'tcp', False),
+ Connection('192.168.1.20', 9090, '68.169.35.102', 14815, 'tcp', False),
+ Connection('192.168.1.20', 9090, '62.135.16.134', 14456, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.LSOF, process_pid = 129, process_name = 'tor'))
@@ -319,8 +319,8 @@ class TestConnection(unittest.TestCase):
call_mock.return_value = SOCKSTAT_OUTPUT.split('\n')
expected = [
- Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp'),
- Connection('192.168.0.1', 44092, '68.169.35.102', 443, 'tcp'),
+ Connection('192.168.0.1', 44415, '38.229.79.2', 443, 'tcp', False),
+ Connection('192.168.0.1', 44092, '68.169.35.102', 443, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.SOCKSTAT, process_pid = 15843, process_name = 'tor'))
@@ -339,11 +339,11 @@ class TestConnection(unittest.TestCase):
call_mock.return_value = BSD_SOCKSTAT_OUTPUT.split('\n')
expected = [
- Connection('172.27.72.202', 54011, '38.229.79.2', 9001, 'tcp'),
- Connection('172.27.72.202', 59374, '68.169.35.102', 9001, 'tcp'),
- Connection('172.27.72.202', 59673, '213.24.100.160', 9001, 'tcp'),
- Connection('172.27.72.202', 51946, '32.188.221.72', 443, 'tcp'),
- Connection('172.27.72.202', 60344, '21.89.91.78', 9001, 'tcp'),
+ Connection('172.27.72.202', 54011, '38.229.79.2', 9001, 'tcp', False),
+ Connection('172.27.72.202', 59374, '68.169.35.102', 9001, 'tcp', False),
+ Connection('172.27.72.202', 59673, '213.24.100.160', 9001, 'tcp', False),
+ Connection('172.27.72.202', 51946, '32.188.221.72', 443, 'tcp', False),
+ Connection('172.27.72.202', 60344, '21.89.91.78', 9001, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.BSD_SOCKSTAT, process_pid = 4397, process_name = 'tor'))
@@ -361,10 +361,10 @@ class TestConnection(unittest.TestCase):
call_mock.return_value = BSD_PROCSTAT_OUTPUT.split('\n')
expected = [
- Connection('10.0.0.2', 9050, '10.0.0.1', 22370, 'tcp'),
- Connection('10.0.0.2', 9050, '10.0.0.1', 44381, 'tcp'),
- Connection('10.0.0.2', 33734, '38.229.79.2', 443, 'tcp'),
- Connection('10.0.0.2', 47704, '68.169.35.102', 9001, 'tcp'),
+ Connection('10.0.0.2', 9050, '10.0.0.1', 22370, 'tcp', False),
+ Connection('10.0.0.2', 9050, '10.0.0.1', 44381, 'tcp', False),
+ Connection('10.0.0.2', 33734, '38.229.79.2', 443, 'tcp', False),
+ Connection('10.0.0.2', 47704, '68.169.35.102', 9001, 'tcp', False),
]
self.assertEqual(expected, stem.util.connection.get_connections(Resolver.BSD_PROCSTAT, process_pid = 3561, process_name = 'tor'))
diff --git a/test/unit/util/proc.py b/test/unit/util/proc.py
index ea206b8..b6cb0d6 100644
--- a/test/unit/util/proc.py
+++ b/test/unit/util/proc.py
@@ -210,8 +210,8 @@ class TestProc(unittest.TestCase):
self.assertEqual([], proc.connections(0))
expected_results = [
- ('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp'),
- ('187.187.187.187', 48059, '204.204.204.204', 52428, 'udp'),
+ ('17.17.17.17', 4369, '34.34.34.34', 8738, 'tcp', False),
+ ('187.187.187.187', 48059, '204.204.204.204', 52428, 'udp', False),
]
self.assertEqual(expected_results, proc.connections(pid))