Advertisement
Guest User

gandolf.py

a guest
Aug 29th, 2013
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.95 KB | None | 0 0
  1. # 2013.08.29 14:05:34 UTC
  2. #Embedded file name: dropbox/client/gandalf.py
  3. from __future__ import with_statement
  4. import build_number
  5. import os
  6. from Crypto.Random import random
  7. from dropbox.callbacks import Handler
  8. from dropbox.db_thread import db_thread
  9. from dropbox.native_event import AutoResetEvent
  10. from dropbox.read_write_lock import RWLock
  11. from dropbox.threadutils import StoppableThread
  12. from dropbox.trace import TRACE, unhandled_exc_handler
  13.  
  14. class Gandalf(object):
  15.  
  16.     def __init__(self, dropbox_app):
  17.         self.dropbox_app = dropbox_app
  18.         self.features = {}
  19.         self.logged = {}
  20.         self.logged_allows = {}
  21.         self.lock = RWLock()
  22.         self.got_features = False
  23.         self.enable_nonpresent_features = not (hasattr(build_number, 'frozen') or os.getenv('DB_USE_REAL_GANDALF'))
  24.         self._info_received_callbacks = Handler(recursive=False, handle_exc=unhandled_exc_handler)
  25.         self.gandalf_thread = db_thread(GandalfThread)(self, dropbox_app)
  26.  
  27.     def start(self):
  28.         self.gandalf_thread.start()
  29.  
  30.     def stop(self):
  31.         self.gandalf_thread.signal_stop()
  32.  
  33.     def handle_info(self, ret):
  34.         self.lock.acquire_write()
  35.         try:
  36.             if not self.got_features:
  37.                 TRACE('Gandalf: got features: %r', ret)
  38.                 self.got_features = True
  39.             self.features = ret
  40.         finally:
  41.             self.lock.release_write()
  42.  
  43.         self._info_received_callbacks.run_handlers()
  44.         self._info_received_callbacks.clear()
  45.  
  46.     def info_received(self, callback = None):
  47.         if self.got_features:
  48.             return True
  49.         else:
  50.             if callback:
  51.                 self._info_received_callbacks.add_handler(callback)
  52.             return False
  53.  
  54.     def allows(self, feature):
  55.         cols = None
  56.         with self.lock:
  57.             is_allowed = feature in self.features or self.enable_nonpresent_features
  58.             TRACE('Gandalf: allows() check for feature %s returning %r', feature, is_allowed)
  59.             if hasattr(build_number, 'frozen'):
  60.                 if feature in self.features:
  61.                     experiment_version, version, variant = self.features[feature]
  62.                 else:
  63.                     experiment_version, version, variant = (None, None, None)
  64.                 if feature not in self.logged_allows or self.logged_allows[feature] != is_allowed:
  65.                     self.logged_allows[feature] = is_allowed
  66.                     cols = {'is_allowed': is_allowed,
  67.                      'experiment_version': experiment_version,
  68.                      'name': feature,
  69.                      'version': version}
  70.         if cols:
  71.             self.dropbox_app.event.report('gandalf_allows', cols)
  72.         return is_allowed
  73.  
  74.     def get_variant(self, feature):
  75.         do_log = False
  76.         with self.lock:
  77.             if feature not in self.features:
  78.                 TRACE('Gandalf: feature %s not found', feature)
  79.                 return
  80.             experiment_version, version, variant = self.features[feature]
  81.             if hasattr(build_number, 'frozen') and (feature not in self.logged or self.logged[feature] != (experiment_version, version, variant)):
  82.                 if feature in self.logged:
  83.                     TRACE('Gandalf: feature %s changed (experiment_version, version, variant) to %r', feature, (experiment_version, version, variant))
  84.                 self.logged[feature] = (experiment_version, version, variant)
  85.                 do_log = True
  86.         TRACE('Gandalf: variant check for feature %s returning %r', feature, variant)
  87.         if do_log:
  88.             cols = {'name': feature,
  89.              'experiment_version': experiment_version,
  90.              'version': version,
  91.              'variant': variant}
  92.             self.dropbox_app.event.report('gandalf_variant', cols)
  93.         return variant
  94.  
  95.  
  96. class GandalfThread(StoppableThread):
  97.  
  98.     def __init__(self, gandalf, dropbox_app, *n, **kw):
  99.         kw['name'] = 'GANDALF'
  100.         super(GandalfThread, self).__init__(*n, **kw)
  101.         self.gandalf = gandalf
  102.         self.dropbox_app = dropbox_app
  103.         self.setDaemon(True)
  104.         self.bangp = AutoResetEvent()
  105.  
  106.     def set_wakeup_event(self):
  107.         self.bangp.set()
  108.  
  109.     def run(self):
  110.         TRACE('Gandalf thread starting.')
  111.         while not self.stopped():
  112.             try:
  113.                 ret = self.dropbox_app.conn.gandalf_get_variants()
  114.                 if ret['ret'] != 'ok':
  115.                     TRACE('gandalf_get_variants returned some form of error! %r', ret)
  116.                 else:
  117.                     self.gandalf.handle_info(ret['features'])
  118.             except Exception:
  119.                 unhandled_exc_handler()
  120.  
  121.             wait_period = random.randint(10800 / 4, 18000 / 4)
  122.             self.bangp.wait(wait_period)
  123.  
  124.         TRACE('Stopping...')
  125. +++ okay decompyling pyc_decrypted/dropbox/client/gandalf.pyc 102
  126. # decompiled 1 files: 1 okay, 0 failed, 0 verify failed
  127. # 2013.08.29 14:05:35 UTC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement