tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

remote_output_manager.py (2766B)


      1 # Copyright 2017 The Chromium Authors
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import hashlib
      6 import os
      7 
      8 from pylib.base import output_manager
      9 from pylib.output import noop_output_manager
     10 from pylib.utils import logdog_helper
     11 from pylib.utils import google_storage_helper
     12 
     13 
     14 class RemoteOutputManager(output_manager.OutputManager):
     15 
     16  def __init__(self, bucket):
     17    """Uploads output files to Google Storage or LogDog.
     18 
     19    Files will either be uploaded directly to Google Storage or LogDog
     20    depending on the datatype.
     21 
     22    Args
     23      bucket: Bucket to use when saving to Google Storage.
     24    """
     25    super().__init__()
     26    self._bucket = bucket
     27 
     28  #override
     29  def _CreateArchivedFile(self, out_filename, out_subdir, datatype):
     30    if datatype == output_manager.Datatype.TEXT:
     31      try:
     32        logdog_helper.get_logdog_client()
     33        return LogdogArchivedFile(out_filename, out_subdir, datatype)
     34      except RuntimeError:
     35        return noop_output_manager.NoopArchivedFile()
     36    else:
     37      if self._bucket is None:
     38        return noop_output_manager.NoopArchivedFile()
     39      return GoogleStorageArchivedFile(
     40          out_filename, out_subdir, datatype, self._bucket)
     41 
     42 
     43 class LogdogArchivedFile(output_manager.ArchivedFile):
     44 
     45  def __init__(self, out_filename, out_subdir, datatype):
     46    super().__init__(out_filename, out_subdir, datatype)
     47    self._stream_name = '%s_%s' % (out_subdir, out_filename)
     48 
     49  def _Link(self):
     50    return logdog_helper.get_viewer_url(self._stream_name)
     51 
     52  def _Archive(self):
     53    with open(self.name, 'r') as f:
     54      logdog_helper.text(self._stream_name, f.read())
     55 
     56 
     57 class GoogleStorageArchivedFile(output_manager.ArchivedFile):
     58 
     59  def __init__(self, out_filename, out_subdir, datatype, bucket):
     60    super().__init__(out_filename, out_subdir, datatype)
     61    self._bucket = bucket
     62    self._upload_path = None
     63    self._content_addressed = None
     64 
     65  def _PrepareArchive(self):
     66    self._content_addressed = (self._datatype in (
     67        output_manager.Datatype.HTML,
     68        output_manager.Datatype.PNG,
     69        output_manager.Datatype.JSON))
     70    if self._content_addressed:
     71      sha1 = hashlib.sha1()
     72      with open(self.name, 'rb') as f:
     73        sha1.update(f.read())
     74      self._upload_path = sha1.hexdigest()
     75    else:
     76      self._upload_path = os.path.join(self._out_subdir, self._out_filename)
     77 
     78  def _Link(self):
     79    return google_storage_helper.get_url_link(
     80        self._upload_path, self._bucket)
     81 
     82  def _Archive(self):
     83    if (self._content_addressed and
     84        google_storage_helper.exists(self._upload_path, self._bucket)):
     85      return
     86 
     87    google_storage_helper.upload(
     88        self._upload_path, self.name, self._bucket, content_type=self._datatype)