def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ global_conf.setdefault("debug", False) self.config = ConfigValueParser(global_conf) self.config.add_spec(self.spec) self.plugins = PluginLoader(self.config.get("plugins", [])) self.stats = Stats(self.config.get('statsd_addr'), self.config.get('statsd_sample_rate')) self.startup_timer = self.stats.get_timer("app_startup") self.startup_timer.start() self.paths = paths self.running_as_script = global_conf.get('running_as_script', False) # turn on for language support self.lang = getattr(self, 'site_lang', 'en') self.languages, self.lang_name = \ get_active_langs(default_lang=self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages # set default time zone if one is not set tz = global_conf.get('timezone', 'UTC') self.tz = pytz.timezone(tz) dtz = global_conf.get('display_timezone', tz) self.display_tz = pytz.timezone(dtz) self.startup_timer.intermediate("init")
def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ global_conf.setdefault("debug", False) # reloading site ensures that we have a fresh sys.path to build our # working set off of. this means that forked worker processes won't get # the sys.path that was current when the master process was spawned # meaning that new plugins will be picked up on regular app reload # rather than having to restart the master process as well. reload(site) self.pkg_resources_working_set = pkg_resources.WorkingSet() self.config = ConfigValueParser(global_conf) self.config.add_spec(self.spec) self.plugins = PluginLoader(self.pkg_resources_working_set, self.config.get("plugins", [])) self.stats = Stats(self.config.get('statsd_addr'), self.config.get('statsd_sample_rate')) self.startup_timer = self.stats.get_timer("app_startup") self.startup_timer.start() self.paths = paths self.running_as_script = global_conf.get('running_as_script', False) # turn on for language support self.lang = getattr(self, 'site_lang', 'en') self.languages, self.lang_name = \ get_active_langs(default_lang=self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages # set default time zone if one is not set tz = global_conf.get('timezone', 'UTC') self.tz = pytz.timezone(tz) dtz = global_conf.get('display_timezone', tz) self.display_tz = pytz.timezone(dtz) self.startup_timer.intermediate("init")
def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ global_conf.setdefault("debug", False) # slop over all variables to start with for k, v in global_conf.iteritems(): if not k.startswith("_") and not hasattr(self, k): if k in self.int_props: v = int(v) elif k in self.float_props: v = float(v) elif k in self.bool_props: v = self.to_bool(v) elif k in self.tuple_props: v = tuple(self.to_iter(v)) elif k in self.choice_props: if v not in self.choice_props[k]: raise ValueError("Unknown option for %r: %r not in %r" % (k, v, self.choice_props[k])) v = self.choice_props[k][v] setattr(self, k, v) self.paths = paths self.running_as_script = global_conf.get('running_as_script', False) # turn on for language support if not hasattr(self, 'lang'): self.lang = 'en' self.languages, self.lang_name = \ get_active_langs(default_lang= self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages # set default time zone if one is not set tz = global_conf.get('timezone', 'UTC') self.tz = pytz.timezone(tz) dtz = global_conf.get('display_timezone', tz) self.display_tz = pytz.timezone(dtz)
def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ # slop over all variables to start with for k, v in global_conf.iteritems(): if not k.startswith("_") and not hasattr(self, k): if k in self.int_props: v = int(v) elif k in self.float_props: v = float(v) elif k in self.bool_props: v = self.to_bool(v) elif k in self.tuple_props: v = tuple(self.to_iter(v)) setattr(self, k, v) self.running_as_script = global_conf.get('running_as_script', False) # initialize caches. Any cache-chains built here must be added # to cache_chains (closed around by reset_caches) so that they # can properly reset their local components localcache_cls = (SelfEmptyingCache if self.running_as_script else LocalCache) num_mc_clients = self.num_mc_clients self.cache_chains = [] self.permacache = self.init_cass_cache('permacache', self.permacache_memcaches, self.cassandra_seeds) self.urlcache = self.init_cass_cache('urls', self.url_caches, self.url_seeds) # hardcache is done after the db info is loaded, and then the # chains are reset to use the appropriate initial entries self.cache = self.init_memcached(self.memcaches) self.memcache = self.cache.caches[1] # used by lock.py self.rendercache = self.init_memcached(self.rendercaches, noreply=True, no_block=True) self.servicecache = self.init_memcached(self.servicecaches) self.make_lock = make_lock_factory(self.memcache) # set default time zone if one is not set tz = global_conf.get('timezone') dtz = global_conf.get('display_timezone', tz) self.tz = pytz.timezone(tz) self.display_tz = pytz.timezone(dtz) #load the database info self.dbm = self.load_db_params(global_conf) # can't do this until load_db_params() has been called self.hardcache = HardcacheChain( (localcache_cls(), self.memcache, HardCache(self)), cache_negative_results=True) self.cache_chains.append(self.hardcache) # I know this sucks, but we need non-request-threads to be # able to reset the caches, so we need them be able to close # around 'cache_chains' without being able to call getattr on # 'g' cache_chains = self.cache_chains[::] def reset_caches(): for chain in cache_chains: chain.reset() self.reset_caches = reset_caches self.reset_caches() #make a query cache self.stats_collector = QueryStats() # set the modwindow self.MODWINDOW = timedelta(self.MODWINDOW) self.REDDIT_MAIN = bool(os.environ.get('REDDIT_MAIN')) # turn on for language support self.languages, self.lang_name = \ get_active_langs(default_lang= self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages self.paths = paths # load the md5 hashes of files under static static_files = os.path.join(paths.get('static_files'), 'static') self.static_md5 = {} if os.path.exists(static_files): for f in os.listdir(static_files): if f.endswith('.md5'): key = f.strip('.md5') f = os.path.join(static_files, f) with open(f, 'r') as handle: md5 = handle.read().strip('\n') self.static_md5[key] = md5 #set up the logging directory log_path = self.log_path process_iden = global_conf.get('scgi_port', 'default') self.reddit_port = process_iden if log_path: if not os.path.exists(log_path): os.makedirs(log_path) for fname in os.listdir(log_path): if fname.startswith(process_iden): full_name = os.path.join(log_path, fname) os.remove(full_name) #setup the logger self.log = logging.getLogger('reddit') self.log.addHandler(logging.StreamHandler()) if self.debug: self.log.setLevel(logging.DEBUG) else: self.log.setLevel(logging.WARNING) # set log level for pycountry which is chatty logging.getLogger('pycountry.db').setLevel(logging.CRITICAL) if not self.media_domain: self.media_domain = self.domain if self.media_domain == self.domain: print("Warning: g.media_domain == g.domain. " + "This may give untrusted content access to user cookies") #read in our CSS so that it can become a default for subreddit #stylesheets stylesheet_path = os.path.join(paths.get('static_files'), self.static_path.lstrip('/'), self.stylesheet) with open(stylesheet_path) as s: self.default_stylesheet = s.read() self.profanities = None if self.profanity_wordlist and os.path.exists(self.profanity_wordlist): with open(self.profanity_wordlist, 'r') as handle: words = [] for line in handle: words.append(line.strip(' \n\r')) if words: self.profanities = re.compile( r"\b(%s)\b" % '|'.join(words), re.I | re.U) self.reddit_host = socket.gethostname() self.reddit_pid = os.getpid() #the shutdown toggle self.shutdown = False #if we're going to use the query_queue, we need amqp if self.write_query_queue and not self.amqp_host: raise Exception("amqp_host must be defined to use the query queue") # try to set the source control revision number try: popen = subprocess.Popen( ["git", "log", "--date=short", "--pretty=format:%H %h", '-n1'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) resp, stderrdata = popen.communicate() resp = resp.strip().split(' ') self.version, self.short_version = resp except object, e: self.log.info("Couldn't read source revision (%r)" % e) self.version = self.short_version = '(unknown)'
def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ # slop over all variables to start with for k, v in global_conf.iteritems(): if not k.startswith("_") and not hasattr(self, k): if k in self.int_props: v = int(v) elif k in self.float_props: v = float(v) elif k in self.bool_props: v = self.to_bool(v) elif k in self.tuple_props: v = tuple(self.to_iter(v)) elif k in self.choice_props: if v not in self.choice_props[k]: raise ValueError("Unknown option for %r: %r not in %r" % (k, v, self.choice_props[k])) v = self.choice_props[k][v] setattr(self, k, v) self.running_as_script = global_conf.get('running_as_script', False) # initialize caches. Any cache-chains built here must be added # to cache_chains (closed around by reset_caches) so that they # can properly reset their local components localcache_cls = (SelfEmptyingCache if self.running_as_script else LocalCache) num_mc_clients = self.num_mc_clients self.cache_chains = [] self.memcache = CMemcache(self.memcaches, num_clients = num_mc_clients) self.make_lock = make_lock_factory(self.memcache) if not self.cassandra_seeds: raise ValueError("cassandra_seeds not set in the .ini") if not self.url_seeds: raise ValueError("url_seeds not set in the .ini") self.cassandra_seeds = list(self.cassandra_seeds) random.shuffle(self.cassandra_seeds) self.cassandra = pycassa.connect_thread_local(self.cassandra_seeds) perma_memcache = (CMemcache(self.permacache_memcaches, num_clients = num_mc_clients) if self.permacache_memcaches else None) self.permacache = self.init_cass_cache('permacache', 'permacache', self.cassandra, self.make_lock, memcache = perma_memcache, read_consistency_level = self.cassandra_rcl, write_consistency_level = self.cassandra_wcl, localcache_cls = localcache_cls) self.cache_chains.append(self.permacache) self.url_seeds = list(self.url_seeds) random.shuffle(self.url_seeds) self.url_cassandra = pycassa.connect_thread_local(self.url_seeds) self.urlcache = self.init_cass_cache('urls', 'urls', self.url_cassandra, self.make_lock, # until we've merged this # with the regular # cluster, this will # always be CL_ONE read_consistency_level = CL_ONE, write_consistency_level = CL_ONE, localcache_cls = localcache_cls) self.cache_chains.append(self.urlcache) # hardcache is done after the db info is loaded, and then the # chains are reset to use the appropriate initial entries self.cache = MemcacheChain((localcache_cls(), self.memcache)) self.cache_chains.append(self.cache) self.rendercache = MemcacheChain((localcache_cls(), CMemcache(self.rendercaches, noreply=True, no_block=True, num_clients = num_mc_clients))) self.cache_chains.append(self.rendercache) self.servicecache = MemcacheChain((localcache_cls(), CMemcache(self.servicecaches, num_clients = num_mc_clients))) self.cache_chains.append(self.servicecache) self.thing_cache = CacheChain((localcache_cls(),)) self.cache_chains.append(self.thing_cache) # set default time zone if one is not set tz = global_conf.get('timezone') dtz = global_conf.get('display_timezone', tz) self.tz = pytz.timezone(tz) self.display_tz = pytz.timezone(dtz) #load the database info self.dbm = self.load_db_params(global_conf) # can't do this until load_db_params() has been called self.hardcache = HardcacheChain((localcache_cls(), self.memcache, HardCache(self)), cache_negative_results = True) self.cache_chains.append(self.hardcache) # I know this sucks, but we need non-request-threads to be # able to reset the caches, so we need them be able to close # around 'cache_chains' without being able to call getattr on # 'g' cache_chains = self.cache_chains[::] def reset_caches(): for chain in cache_chains: chain.reset() self.reset_caches = reset_caches self.reset_caches() #make a query cache self.stats_collector = QueryStats() # set the modwindow self.MODWINDOW = timedelta(self.MODWINDOW) self.REDDIT_MAIN = bool(os.environ.get('REDDIT_MAIN')) # turn on for language support self.languages, self.lang_name = \ get_active_langs(default_lang= self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages self.paths = paths # load the md5 hashes of files under static static_files = os.path.join(paths.get('static_files'), 'static') self.static_md5 = {} if os.path.exists(static_files): for f in os.listdir(static_files): if f.endswith('.md5'): key = f[0:-4] f = os.path.join(static_files, f) with open(f, 'r') as handle: md5 = handle.read().strip('\n') self.static_md5[key] = md5 #set up the logging directory log_path = self.log_path process_iden = global_conf.get('scgi_port', 'default') self.reddit_port = process_iden if log_path: if not os.path.exists(log_path): os.makedirs(log_path) for fname in os.listdir(log_path): if fname.startswith(process_iden): full_name = os.path.join(log_path, fname) os.remove(full_name) #setup the logger self.log = logging.getLogger('reddit') self.log.addHandler(logging.StreamHandler()) if self.debug: self.log.setLevel(logging.DEBUG) else: self.log.setLevel(logging.INFO) # set log level for pycountry which is chatty logging.getLogger('pycountry.db').setLevel(logging.CRITICAL) if not self.media_domain: self.media_domain = self.domain #if self.media_domain == self.domain: #print ("Warning: g.media_domain == g.domain. " + # "This may give untrusted content access to user cookies") #read in our CSS so that it can become a default for subreddit #stylesheets stylesheet_path = os.path.join(paths.get('static_files'), self.static_path.lstrip('/'), self.stylesheet) with open(stylesheet_path) as s: self.default_stylesheet = s.read() self.profanities = None if self.profanity_wordlist and os.path.exists(self.profanity_wordlist): with open(self.profanity_wordlist, 'r') as handle: words = [] for line in handle: words.append(line.strip(' \n\r')) if words: self.profanities = re.compile(r"\b(%s)\b" % '|'.join(words), re.I | re.U) self.reddit_host = socket.gethostname() self.reddit_pid = os.getpid() #the shutdown toggle self.shutdown = False #if we're going to use the query_queue, we need amqp if self.write_query_queue and not self.amqp_host: raise Exception("amqp_host must be defined to use the query queue") # This requirement doesn't *have* to be a requirement, but there are # bugs at the moment that will pop up if you violate it if self.write_query_queue and not self.use_query_cache: raise Exception("write_query_queue requires use_query_cache") # try to set the source control revision number try: popen = subprocess.Popen(["git", "log", "--date=short", "--pretty=format:%H %h", '-n1'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) resp, stderrdata = popen.communicate() resp = resp.strip().split(' ') self.version, self.short_version = resp except object, e: self.log.info("Couldn't read source revision (%r)" % e) self.version = self.short_version = '(unknown)'
def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ global_conf.setdefault("debug", False) # slop over all variables to start with for k, v in global_conf.iteritems(): if not k.startswith("_") and not hasattr(self, k): if k in self.int_props: v = int(v) elif k in self.float_props: v = float(v) elif k in self.bool_props: v = self.to_bool(v) elif k in self.tuple_props: v = tuple(self.to_iter(v)) elif k in self.choice_props: if v not in self.choice_props[k]: raise ValueError( "Unknown option for %r: %r not in %r" % (k, v, self.choice_props[k])) v = self.choice_props[k][v] setattr(self, k, v) self.paths = paths self.running_as_script = global_conf.get('running_as_script', False) # turn on for language support if not hasattr(self, 'lang'): self.lang = 'en' self.languages, self.lang_name = \ get_active_langs(default_lang=self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages # set default time zone if one is not set tz = global_conf.get('timezone', 'UTC') self.tz = pytz.timezone(tz) dtz = global_conf.get('display_timezone', tz) self.display_tz = pytz.timezone(dtz)
def __init__(self, global_conf, app_conf, paths, **extra): """ Globals acts as a container for objects available throughout the life of the application. One instance of Globals is created by Pylons during application initialization and is available during requests via the 'g' variable. ``global_conf`` The same variable used throughout ``config/middleware.py`` namely, the variables from the ``[DEFAULT]`` section of the configuration file. ``app_conf`` The same ``kw`` dictionary used throughout ``config/middleware.py`` namely, the variables from the section in the config file for your application. ``extra`` The configuration returned from ``load_config`` in ``config/middleware.py`` which may be of use in the setup of your global variables. """ # slop over all variables to start with for k, v in global_conf.iteritems(): if not k.startswith("_") and not hasattr(self, k): if k in self.int_props: v = int(v) elif k in self.float_props: v = float(v) elif k in self.bool_props: v = self.to_bool(v) elif k in self.tuple_props: v = tuple(self.to_iter(v)) setattr(self, k, v) self.paid_sponsors = set(x.lower() for x in self.paid_sponsors) # initialize caches mc = Memcache(self.memcaches, pickleProtocol=1) self.memcache = mc self.cache = CacheChain((LocalCache(), mc)) self.permacache = Memcache(self.permacaches, pickleProtocol=1) self.rendercache = Memcache(self.rendercaches, pickleProtocol=1) self.make_lock = make_lock_factory(mc) self.rec_cache = Memcache(self.rec_cache, pickleProtocol=1) # set default time zone if one is not set tz = global_conf.get("timezone") dtz = global_conf.get("display_timezone", tz) self.tz = pytz.timezone(tz) self.display_tz = pytz.timezone(dtz) # load the database info self.dbm = self.load_db_params(global_conf) # make a query cache self.stats_collector = QueryStats() # set the modwindow self.MODWINDOW = timedelta(self.MODWINDOW) self.REDDIT_MAIN = bool(os.environ.get("REDDIT_MAIN")) # turn on for language support self.languages, self.lang_name = get_active_langs(default_lang=self.lang) all_languages = self.lang_name.keys() all_languages.sort() self.all_languages = all_languages # load the md5 hashes of files under static static_files = os.path.join(paths.get("static_files"), "static") self.static_md5 = {} if os.path.exists(static_files): for f in os.listdir(static_files): if f.endswith(".md5"): key = f.strip(".md5") f = os.path.join(static_files, f) with open(f, "r") as handle: md5 = handle.read().strip("\n") self.static_md5[key] = md5 # set up the logging directory log_path = self.log_path process_iden = global_conf.get("scgi_port", "default") if log_path: if not os.path.exists(log_path): os.makedirs(log_path) for fname in os.listdir(log_path): if fname.startswith(process_iden): full_name = os.path.join(log_path, fname) os.remove(full_name) # setup the logger self.log = logging.getLogger("digg") self.log.addHandler(logging.StreamHandler()) if self.debug: self.log.setLevel(logging.DEBUG) else: self.log.setLevel(logging.WARNING) # set log level for pycountry which is chatty logging.getLogger("pycountry.db").setLevel(logging.CRITICAL) if not self.media_domain: self.media_domain = self.domain if self.media_domain == self.domain: print "Warning: g.media_domain == g.domain. This may give untrusted content access to user cookies" # read in our CSS so that it can become a default for subdigg # stylesheets stylesheet_path = os.path.join(paths.get("static_files"), self.static_path.lstrip("/"), self.stylesheet) with open(stylesheet_path) as s: self.default_stylesheet = s.read() self.digg_host = socket.gethostname() self.digg_pid = os.getpid() # the shutdown toggle self.shutdown = False # if we're going to use the query_queue, we need amqp if self.write_query_queue and not self.amqp_host: raise Exception("amqp_host must be defined to use the query queue")