2013-12-20 15:12:23 +11:00
class GlobalSetting
2014-01-02 10:46:09 +11:00
def self . register ( key , default )
define_singleton_method ( key ) do
provider . lookup ( key , default )
end
end
2013-12-20 16:38:51 +11:00
def self . load_defaults
2013-12-20 17:41:12 +11:00
default_provider = FileProvider . from ( File . expand_path ( '../../../config/discourse_defaults.conf' , __FILE__ ) )
2014-01-02 10:46:09 +11:00
default_provider . keys . concat ( @provider . keys ) . uniq . each do | key |
default = default_provider . lookup ( key , nil )
define_singleton_method ( key ) do
provider . lookup ( key , default )
2013-12-20 15:12:23 +11:00
end
end
end
2014-01-14 16:59:55 +11:00
def self . database_config
hash = { " adapter " = > " postgresql " }
2016-01-25 14:27:59 +08:00
%w{ pool timeout socket host port username password replica_host replica_port } . each do | s |
2014-01-14 16:59:55 +11:00
if val = self . send ( " db_ #{ s } " )
hash [ s ] = val
end
end
2016-01-25 14:27:59 +08:00
hash [ " adapter " ] = " postgresql_fallback " if hash [ " replica_host " ]
2015-07-23 15:22:54 +10:00
hostnames = [ hostname ]
2015-07-23 15:33:38 +10:00
hostnames << backup_hostname if backup_hostname . present?
2015-07-23 15:22:54 +10:00
hash [ " host_names " ] = hostnames
2014-01-14 16:59:55 +11:00
hash [ " database " ] = db_name
2015-02-18 11:16:53 +11:00
hash [ " prepared_statements " ] = ! ! self . db_prepared_statements
2014-01-14 16:59:55 +11:00
{ " production " = > hash }
end
2015-06-25 16:51:48 +10:00
def self . redis_config
@config || =
begin
c = { }
c [ :host ] = redis_host if redis_host
c [ :port ] = redis_port if redis_port
2016-03-02 22:01:48 +08:00
c [ :slave_host ] = redis_slave_host if redis_slave_host
c [ :slave_port ] = redis_slave_port if redis_slave_port
2015-06-30 22:19:02 -04:00
c [ :password ] = redis_password if redis_password . present?
2015-06-25 16:51:48 +10:00
c [ :db ] = redis_db if redis_db != 0
c [ :db ] = 1 if Rails . env == " test "
if redis_sentinels . present?
c [ :sentinels ] = redis_sentinels . split ( " , " ) . map do | address |
host , port = address . split ( " : " )
{ host : host , port : port }
end . to_a
end
2016-03-02 22:01:48 +08:00
c [ :connector ] = DiscourseRedis :: Connector
2015-06-25 16:51:48 +10:00
c . freeze
end
end
2013-12-20 15:12:23 +11:00
class BaseProvider
2013-12-20 16:17:21 +11:00
def self . coerce ( setting )
return setting == " true " if setting == " true " || setting == " false "
return $1 . to_i if setting . to_s . strip =~ / ^([0-9]+)$ /
setting
end
def resolve ( current , default )
BaseProvider . coerce (
if current . present?
current
else
default . present? ? default : nil
end
)
2013-12-20 15:12:23 +11:00
end
end
2013-12-20 16:17:21 +11:00
class FileProvider < BaseProvider
2013-12-20 16:38:51 +11:00
attr_reader :data
2013-12-20 16:17:21 +11:00
def self . from ( file )
if File . exists? ( file )
parse ( file )
end
end
def initialize ( file )
@file = file
@data = { }
end
def read
2014-02-14 13:35:30 -08:00
ERB . new ( File . read ( @file ) ) . result ( ) . split ( " \n " ) . each do | line |
2015-08-14 17:01:06 +10:00
if line =~ / ^ \ s*([a-z_]+[a-z0-9_]*) \ s*= \ s*( \ "([^ \ "]*) \ "| \ '([^ \ ']*) \ '|[^ # ]*) /
2013-12-20 16:17:21 +11:00
@data [ $1 . strip . to_sym ] = ( $4 || $3 || $2 ) . strip
end
end
end
def lookup ( key , default )
2013-12-20 17:09:51 +11:00
var = @data [ key ]
resolve ( var , var . nil? ? default : " " )
2013-12-20 16:17:21 +11:00
end
2014-01-02 10:46:09 +11:00
def keys
@data . keys
end
2013-12-20 16:17:21 +11:00
def self . parse ( file )
provider = self . new ( file )
provider . read
provider
2013-12-20 15:12:23 +11:00
end
2014-10-04 08:37:20 +05:30
private_class_method :parse
2013-12-20 15:12:23 +11:00
end
2013-12-20 16:17:21 +11:00
class EnvProvider < BaseProvider
def lookup ( key , default )
2013-12-20 17:07:08 +11:00
var = ENV [ " DISCOURSE_ " << key . to_s . upcase ]
resolve ( var , var . nil? ? default : nil )
2013-12-20 16:17:21 +11:00
end
2014-01-02 10:46:09 +11:00
def keys
ENV . keys . select { | k | k =~ / ^DISCOURSE_ / } . map { | k | k [ 10 .. - 1 ] . downcase . to_sym }
end
2013-12-20 15:12:23 +11:00
end
2015-03-09 12:21:41 +11:00
class BlankProvider < BaseProvider
def lookup ( key , default )
default
end
def keys
[ ]
end
end
2013-12-20 15:12:23 +11:00
class << self
attr_accessor :provider
end
2013-12-20 16:38:51 +11:00
2015-03-09 12:21:41 +11:00
if Rails . env == " test "
@provider = BlankProvider . new
else
@provider =
FileProvider . from ( File . expand_path ( '../../../config/discourse.conf' , __FILE__ ) ) ||
EnvProvider . new
end
2014-01-02 10:46:09 +11:00
load_defaults
2013-12-20 15:12:23 +11:00
end