commit ddb1a360dac0a22c084e884f10c1bc7327cf7f7d Author: Damian Johnson atagar@torproject.org Date: Mon Nov 26 13:04:23 2018 -0800
Use newer cached microdescriptors if available
Our data directory has up to two microdescriptor files: cached-microdescs and cached-microdescs.new.
If the former is unavailable but the later is present we should use it...
https://trac.torproject.org/projects/tor/ticket/28508
Maybe more important, when looking into this I realized that our attempt to get tor's data directory stacktraces if not explicitly present in the torrc...
>>> list(controller.get_microdescriptors()) Traceback (most recent call last): File "<console>", line 1, in <module> File "/home/atagar/Desktop/stem/stem/control.py", line 490, in wrapped for val in func(self, *args, **kwargs): File "/home/atagar/Desktop/stem/stem/control.py", line 1791, in get_microdescriptors if not os.path.exists(data_directory): File "/usr/lib/python2.7/genericpath.py", line 26, in exists os.stat(path) TypeError: coercing to Unicode: need string or buffer, NoneType found
Changed it so we'll instead provide a generic exception saying we were unable to determine the data directory. Fortunatley this whole thing is a fallback, so eventually we'll be able to remove it. --- stem/control.py | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-)
diff --git a/stem/control.py b/stem/control.py index 68873d76..6d926ff0 100644 --- a/stem/control.py +++ b/stem/control.py @@ -1783,27 +1783,34 @@ class Controller(BaseController): else: # TODO: remove when tor versions that require this are obsolete
- try: - data_directory = self.get_conf('DataDirectory') - except stem.ControllerError as exc: - raise stem.OperationFailed(message = 'Unable to determine the data directory (%s)' % exc) + data_directory = self.get_conf('DataDirectory', None)
- cached_descriptor_path = os.path.join(data_directory, 'cached-microdescs') + if data_directory is None: + raise stem.OperationFailed(message = "Unable to determine tor's data directory")
if not os.path.exists(data_directory): raise stem.OperationFailed(message = "Data directory reported by tor doesn't exist (%s)" % data_directory) - elif not os.path.exists(cached_descriptor_path): - raise stem.OperationFailed(message = "Data directory doesn't contain cached microdescriptors (%s)" % cached_descriptor_path)
- with stem.descriptor.reader.DescriptorReader([cached_descriptor_path]) as reader: - for desc in reader: - # It shouldn't be possible for these to be something other than - # microdescriptors but as the saying goes: trust but verify. + microdescriptor_file = None + + for filename in ('cached-microdescs', 'cached-microdescs.new'): + cached_descriptors = os.path.join(data_directory, filename) + + if os.path.exists(cached_descriptors): + microdescriptor_file = cached_descriptors + break + + if microdescriptor_file is None: + raise stem.OperationFailed(message = "Data directory doesn't contain cached microdescriptors (%s)" % data_directory)
- if not isinstance(desc, stem.descriptor.microdescriptor.Microdescriptor): - raise stem.OperationFailed(message = 'BUG: Descriptor reader provided non-microdescriptor content (%s)' % type(desc)) + for desc in stem.descriptor.parse_file(microdescriptor_file): + # It shouldn't be possible for these to be something other than + # microdescriptors but as the saying goes: trust but verify.
- yield desc + if not isinstance(desc, stem.descriptor.microdescriptor.Microdescriptor): + raise stem.OperationFailed(message = 'BUG: Descriptor reader provided non-microdescriptor content (%s)' % type(desc)) + + yield desc
@with_default() def get_server_descriptor(self, relay = None, default = UNDEFINED):
tor-commits@lists.torproject.org