commit 45558ac8118d78a04c5e560843d5bd54c91e04d7 Author: Damian Johnson atagar@torproject.org Date: Sun Aug 30 10:50:22 2015 -0700
Don't track start_time in the Entry
The entry has access to the connection so no reason for it to track the start time separately. This also lets us move the to_unix_time() with the circuit which is nice since that's the only spot where it's now needed. --- nyx/connections/circ_entry.py | 19 +++++++++++-------- nyx/connections/entries.py | 33 ++++++++++++++------------------- 2 files changed, 25 insertions(+), 27 deletions(-)
diff --git a/nyx/connections/circ_entry.py b/nyx/connections/circ_entry.py index b1d95c7..673777d 100644 --- a/nyx/connections/circ_entry.py +++ b/nyx/connections/circ_entry.py @@ -9,6 +9,7 @@ followed by an entry for each hop in the circuit. For instance: """
import curses +import datetime
import nyx.util.tracker import nyx.util.ui_tools @@ -18,6 +19,10 @@ from nyx.connections import entries, conn_entry from stem.util import str_tools
+def to_unix_time(dt): + return (dt - datetime.datetime(1970, 1, 1)).total_seconds() + + class CircHeaderLine(conn_entry.ConnectionLine): """ Initial line of a client entry. This has the same basic format as connection @@ -34,7 +39,7 @@ class CircHeaderLine(conn_entry.ConnectionLine): self.is_built = False self._remote_fingerprint = None
- conn_entry.ConnectionLine.__init__(self, entry, nyx.util.tracker.Connection(entries.to_unix_time(circ.created), False, '127.0.0.1', 0, exit_address, exit_port, 'tcp'), False, False) + conn_entry.ConnectionLine.__init__(self, entry, nyx.util.tracker.Connection(to_unix_time(circ.created), False, '127.0.0.1', 0, exit_address, exit_port, 'tcp'), False, False) self.circuit = circ
def get_fingerprint(self, default = None): @@ -77,16 +82,18 @@ class CircLine(conn_entry.ConnectionLine): caching, etc). """
- def __init__(self, entry, circ, fingerprint, timestamp): + def __init__(self, entry, circ, fingerprint): relay_ip, relay_port = nyx.util.tracker.get_consensus_tracker().get_relay_address(fingerprint, ('192.168.0.1', 0)) - conn_entry.ConnectionLine.__init__(self, entry, nyx.util.tracker.Connection(timestamp, False, '127.0.0.1', 0, relay_ip, relay_port, 'tcp'), False) + conn_entry.ConnectionLine.__init__(self, entry, nyx.util.tracker.Connection(to_unix_time(circ.created), False, '127.0.0.1', 0, relay_ip, relay_port, 'tcp'), False) self._fingerprint = fingerprint + self._is_last = False
circ_path = [path_entry[0] for path_entry in circ.path] circ_index = circ_path.index(fingerprint)
if circ_index == len(circ_path) - 1: placement_type = 'Exit' if circ.status == 'BUILT' else 'Extending' + self._is_last = True elif circ_index == 0: placement_type = 'Guard' else: @@ -94,15 +101,11 @@ class CircLine(conn_entry.ConnectionLine):
self.placement_label = '%i / %s' % (circ_index + 1, placement_type)
- # determines the sort of left hand bracketing we use - - self.is_last = circ_index == len(circ_path) - 1 - def get_fingerprint(self, default = None): self._fingerprint
def get_listing_prefix(self): - if self.is_last: + if self._is_last: return (ord(' '), curses.ACS_LLCORNER, curses.ACS_HLINE, ord(' ')) else: return (ord(' '), curses.ACS_VLINE, ord(' '), ord(' ')) diff --git a/nyx/connections/entries.py b/nyx/connections/entries.py index 00b0a0a..fb49f98 100644 --- a/nyx/connections/entries.py +++ b/nyx/connections/entries.py @@ -4,8 +4,6 @@ entry itself (ie, Tor connection, client circuit, etc) and the lines it consists of in the listing. """
-import datetime - from nyx.util import tor_controller
from stem.control import Listener @@ -39,22 +37,17 @@ CONFIG = conf.config_dict('nyx', { })
-def to_unix_time(dt): - return (dt - datetime.datetime(1970, 1, 1)).total_seconds() - - class Entry(object): - def __init__(self, connection_type, start_time): - self.lines = [] + def __init__(self, connection_type): + self._lines = [] self._connection_type = connection_type - self._start_time = start_time
@staticmethod def from_connection(conn): import nyx.connections.conn_entry
- entry = Entry(get_type(conn), conn.start_time) - entry.lines = [nyx.connections.conn_entry.ConnectionLine(entry, conn)] + entry = Entry(get_type(conn)) + entry._lines = [nyx.connections.conn_entry.ConnectionLine(entry, conn)] return entry
@staticmethod @@ -62,11 +55,11 @@ class Entry(object): import nyx.connections.circ_entry import nyx.connections.conn_entry
- entry = Entry(nyx.connections.conn_entry.Category.CIRCUIT, to_unix_time(circ.created)) - entry.lines = [nyx.connections.circ_entry.CircHeaderLine(entry, circ)] + entry = Entry(nyx.connections.conn_entry.Category.CIRCUIT) + entry._lines = [nyx.connections.circ_entry.CircHeaderLine(entry, circ)]
for fingerprint, _ in circ.path: - entry.lines.append(nyx.connections.circ_entry.CircLine(entry, circ, fingerprint, to_unix_time(circ.created))) + entry._lines.append(nyx.connections.circ_entry.CircLine(entry, circ, fingerprint))
return entry
@@ -95,16 +88,18 @@ class Entry(object): if not CONFIG['features.connection.showIps']: return True
+ connection = self._lines[0].connection + if self.get_type() == nyx.connections.conn_entry.Category.INBOUND: controller = tor_controller()
if controller.is_user_traffic_allowed().inbound: - return len(nyx.util.tracker.get_consensus_tracker().get_all_relay_fingerprints(self.connection.remote_address)) == 0 + return len(nyx.util.tracker.get_consensus_tracker().get_all_relay_fingerprints(connection.remote_address)) == 0 elif self.get_type() == nyx.connections.conn_entry.Category.EXIT: # DNS connections exiting us aren't private (since they're hitting our # resolvers). Everything else is.
- return self.connection.remote_port != 53 or self.connection.protocol != 'udp' + return connection.remote_port != 53 or connection.protocol != 'udp'
return False # for everything else this isn't a concern
@@ -115,7 +110,7 @@ class Entry(object): :returns: **list** of **ConnectionLine** concerning this entry """
- return self.lines + return self._lines
@lru_cache() def get_sort_value(self, attr): @@ -127,7 +122,7 @@ class Entry(object): :returns: comparable object by the given attribute """
- connection_line = self.lines[0] + connection_line = self._lines[0]
if attr == SortAttr.IP_ADDRESS: if self.is_private(): @@ -149,7 +144,7 @@ class Entry(object): import nyx.connections.conn_entry return nyx.connections.conn_entry.Category.index_of(self.get_type()) elif attr == SortAttr.UPTIME: - return self._start_time + return connection_line.connection.start_time elif attr == SortAttr.COUNTRY: return '' if self.is_private() else connection_line.get_locale('') else: