[tor-commits] [nyx/master] Differentiate between app resolution by local/remote ports

atagar at torproject.org atagar at torproject.org
Tue Sep 22 17:08:40 UTC 2015


commit bca09d443ff450113f7d46a0da204e500ef26f4e
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu Jul 30 08:10:07 2015 -0700

    Differentiate between app resolution by local/remote ports
    
    Our helper for resolving applications by their port lets us differentiate
    between the local and remote port. When using it we said ports were both, but
    the connection lines know the difference. Plumbing it through to get more
    accurate results.
---
 nyx/connections/conn_panel.py           |   24 ++++++++----------------
 nyx/util/tracker.py                     |   27 +++++++++++++++++----------
 test/util/tracker/port_usage_tracker.py |    6 +++---
 3 files changed, 28 insertions(+), 29 deletions(-)

diff --git a/nyx/connections/conn_panel.py b/nyx/connections/conn_panel.py
index 5163ec9..b8f97ad 100644
--- a/nyx/connections/conn_panel.py
+++ b/nyx/connections/conn_panel.py
@@ -494,21 +494,13 @@ class ConnectionPanel(panel.Panel, threading.Thread):
       self.set_sort_order()
       self._last_resource_fetch = current_resolution_count
 
-      self._resolve_apps()
+      if CONFIG['features.connection.resolveApps']:
+        local_ports, remote_ports = []
 
-  def _resolve_apps(self):
-    """
-    Triggers an asynchronous query for all unresolved SOCKS, HIDDEN, and
-    CONTROL entries.
-    """
-
-    if not CONFIG['features.connection.resolveApps']:
-      return
-
-    app_ports = []
-
-    for line in self._entry_lines:
-      if line.get_type() in (conn_entry.Category.SOCKS, conn_entry.Category.HIDDEN, conn_entry.Category.CONTROL):
-        app_ports.append(line.connection.local_port if line.get_type() == conn_entry.Category.HIDDEN else line.connection.remote_port)
+        for line in self._entry_lines:
+          if line.get_type() == conn_entry.Category.HIDDEN:
+            local_ports.append(line.connection.local_port)
+          elif line.get_type() in (conn_entry.Category.SOCKS, conn_entry.Category.CONTROL):
+            remote_ports.append(line.connection.remote_port)
 
-    nyx.util.tracker.get_port_usage_tracker().query(app_ports)
+        nyx.util.tracker.get_port_usage_tracker().query(local_ports, remote_ports)
diff --git a/nyx/util/tracker.py b/nyx/util/tracker.py
index 5d9c81e..57562f5 100644
--- a/nyx/util/tracker.py
+++ b/nyx/util/tracker.py
@@ -666,7 +666,8 @@ class PortUsageTracker(Daemon):
   def __init__(self, rate):
     super(PortUsageTracker, self).__init__(rate)
 
-    self._last_requested_ports = []
+    self._last_requested_local_ports = []
+    self._last_requested_remote_ports = []
     self._processes_for_ports = {}
     self._failure_count = 0  # number of times in a row we've failed to get results
 
@@ -683,25 +684,28 @@ class PortUsageTracker(Daemon):
 
     return self._processes_for_ports.get(port)
 
-  def query(self, ports):
+  def query(self, local_ports, remote_ports):
     """
     Registers a given set of ports for further lookups, and returns the last
     set of 'port => process' mappings we retrieved. Note that this means that
     we will not return the requested ports unless they're requested again after
     a successful lookup has been performed.
 
-    :param list ports: port numbers to look up
+    :param list local_ports: local port numbers to look up
+    :param list remote_ports: remote port numbers to look up
 
     :returns: **dict** mapping port numbers to the **Process** using it
     """
 
-    self._last_requested_ports = ports
+    self._last_requested_local_ports = local_ports
+    self._last_requested_remote_ports = remote_ports
     return self._processes_for_ports
 
   def _task(self, process_pid, process_name):
-    ports = self._last_requested_ports
+    local_ports = self._last_requested_local_ports
+    remote_ports = self._last_requested_remote_ports
 
-    if not ports:
+    if not local_ports and not remote_ports:
       return True
 
     result = {}
@@ -709,13 +713,16 @@ class PortUsageTracker(Daemon):
     # Use cached results from our last lookup if available.
 
     for port, process in self._processes_for_ports.items():
-      if port in ports:
+      if port in local_ports:
         result[port] = process
-        ports.remove(port)
+        local_ports.remove(port)
+      elif port in remote_ports:
+        result[port] = process
+        remote_ports.remove(port)
 
     try:
-      if ports:
-        result.update(_process_for_ports(ports, ports))
+      if local_ports or remote_ports:
+        result.update(_process_for_ports(local_ports, remote_ports))
 
       self._processes_for_ports = result
       self._failure_count = 0
diff --git a/test/util/tracker/port_usage_tracker.py b/test/util/tracker/port_usage_tracker.py
index 41d88d0..64c4c09 100644
--- a/test/util/tracker/port_usage_tracker.py
+++ b/test/util/tracker/port_usage_tracker.py
@@ -91,10 +91,10 @@ class TestPortUsageTracker(unittest.TestCase):
     with PortUsageTracker(0.02) as daemon:
       time.sleep(0.01)
 
-      self.assertEqual({}, daemon.query([37277, 51849]))
+      self.assertEqual({}, daemon.query([37277, 51849], []))
       time.sleep(0.04)
 
-      self.assertEqual({37277: 'python', 51849: 'tor'}, daemon.query([37277, 51849]))
+      self.assertEqual({37277: 'python', 51849: 'tor'}, daemon.query([37277, 51849], []))
 
   @patch('nyx.util.tracker.tor_controller')
   @patch('nyx.util.tracker._process_for_ports')
@@ -110,7 +110,7 @@ class TestPortUsageTracker(unittest.TestCase):
       time.sleep(0.05)
       self.assertEqual(0, daemon._failure_count)
 
-      daemon.query([37277, 51849])
+      daemon.query([37277, 51849], [])
       time.sleep(0.03)
       self.assertTrue(daemon.is_alive())
       time.sleep(0.1)





More information about the tor-commits mailing list