/lib/galaxy/webapps/community/config.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 174 lines · 137 code · 6 blank · 31 comment · 17 complexity · cc1db2bb9c452fa8414aea7ce824adc8 MD5 · raw file

  1. """
  2. Universe configuration builder.
  3. """
  4. import sys, os
  5. import logging, logging.config
  6. from optparse import OptionParser
  7. import ConfigParser
  8. from galaxy.util import string_as_bool
  9. from galaxy import eggs
  10. import pkg_resources
  11. log = logging.getLogger( __name__ )
  12. def resolve_path( path, root ):
  13. """If 'path' is relative make absolute by prepending 'root'"""
  14. if not( os.path.isabs( path ) ):
  15. path = os.path.join( root, path )
  16. return path
  17. class ConfigurationError( Exception ):
  18. pass
  19. class Configuration( object ):
  20. def __init__( self, **kwargs ):
  21. self.config_dict = kwargs
  22. self.root = kwargs.get( 'root_dir', '.' )
  23. # Collect the umask and primary gid from the environment
  24. self.umask = os.umask( 077 ) # get the current umask
  25. os.umask( self.umask ) # can't get w/o set, so set it back
  26. self.gid = os.getgid() # if running under newgrp(1) we'll need to fix the group of data created on the cluster
  27. # Database related configuration
  28. self.database = resolve_path( kwargs.get( "database_file", "database/universe.d" ), self.root )
  29. self.database_connection = kwargs.get( "database_connection", False )
  30. self.database_engine_options = get_database_engine_options( kwargs )
  31. self.database_create_tables = string_as_bool( kwargs.get( "database_create_tables", "True" ) )
  32. # Where dataset files are stored
  33. self.file_path = resolve_path( kwargs.get( "file_path", "database/files" ), self.root )
  34. self.new_file_path = resolve_path( kwargs.get( "new_file_path", "database/tmp" ), self.root )
  35. self.cookie_path = kwargs.get( "cookie_path", "/" )
  36. # web API
  37. self.enable_api = string_as_bool( kwargs.get( 'enable_api', False ) )
  38. self.datatypes_config = kwargs.get( 'datatypes_config_file', 'datatypes_conf.xml' )
  39. self.test_conf = resolve_path( kwargs.get( "test_conf", "" ), self.root )
  40. self.id_secret = kwargs.get( "id_secret", "USING THE DEFAULT IS NOT SECURE!" )
  41. # Tool stuff
  42. self.tool_secret = kwargs.get( "tool_secret", "" )
  43. self.tool_data_path = resolve_path( kwargs.get( "tool_data_path", "tool-data" ), os.getcwd() )
  44. self.tool_data_table_config_path = resolve_path( kwargs.get( 'tool_data_table_config_path', 'tool_data_table_conf.xml' ), self.root )
  45. self.ftp_upload_dir = kwargs.get( 'ftp_upload_dir', None )
  46. # Location for dependencies
  47. if 'tool_dependency_dir' in kwargs:
  48. self.tool_dependency_dir = resolve_path( kwargs.get( "tool_dependency_dir" ), self.root )
  49. self.use_tool_dependencies = True
  50. else:
  51. self.tool_dependency_dir = None
  52. self.use_tool_dependencies = False
  53. self.use_remote_user = string_as_bool( kwargs.get( "use_remote_user", "False" ) )
  54. self.remote_user_maildomain = kwargs.get( "remote_user_maildomain", None )
  55. self.remote_user_logout_href = kwargs.get( "remote_user_logout_href", None )
  56. self.require_login = string_as_bool( kwargs.get( "require_login", "False" ) )
  57. self.allow_user_creation = string_as_bool( kwargs.get( "allow_user_creation", "True" ) )
  58. self.enable_openid = string_as_bool( kwargs.get( 'enable_openid', False ) )
  59. self.template_path = resolve_path( kwargs.get( "template_path", "templates" ), self.root )
  60. self.template_cache = resolve_path( kwargs.get( "template_cache_path", "database/compiled_templates/community" ), self.root )
  61. self.admin_users = kwargs.get( "admin_users", "" )
  62. self.sendmail_path = kwargs.get('sendmail_path',"/usr/sbin/sendmail")
  63. self.mailing_join_addr = kwargs.get('mailing_join_addr',"galaxy-user-join@bx.psu.edu")
  64. self.error_email_to = kwargs.get( 'error_email_to', None )
  65. self.smtp_server = kwargs.get( 'smtp_server', None )
  66. self.smtp_username = kwargs.get( 'smtp_username', None )
  67. self.smtp_password = kwargs.get( 'smtp_password', None )
  68. self.start_job_runners = kwargs.get( 'start_job_runners', None )
  69. self.email_from = kwargs.get( 'email_from', None )
  70. self.nginx_upload_path = kwargs.get( 'nginx_upload_path', False )
  71. self.log_actions = string_as_bool( kwargs.get( 'log_actions', 'False' ) )
  72. self.brand = kwargs.get( 'brand', None )
  73. self.support_url = kwargs.get( 'support_url', 'http://wiki.g2.bx.psu.edu/Support' )
  74. self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.g2.bx.psu.edu/FrontPage' )
  75. self.blog_url = kwargs.get( 'blog_url', None )
  76. self.screencasts_url = kwargs.get( 'screencasts_url', None )
  77. self.log_events = False
  78. self.cloud_controller_instance = False
  79. # Proxy features
  80. self.apache_xsendfile = kwargs.get( 'apache_xsendfile', False )
  81. self.nginx_x_accel_redirect_base = kwargs.get( 'nginx_x_accel_redirect_base', False )
  82. # Parse global_conf and save the parser
  83. global_conf = kwargs.get( 'global_conf', None )
  84. global_conf_parser = ConfigParser.ConfigParser()
  85. self.global_conf_parser = global_conf_parser
  86. if global_conf and "__file__" in global_conf:
  87. global_conf_parser.read(global_conf['__file__'])
  88. def get( self, key, default ):
  89. return self.config_dict.get( key, default )
  90. def get_bool( self, key, default ):
  91. if key in self.config_dict:
  92. return string_as_bool( self.config_dict[key] )
  93. else:
  94. return default
  95. def check( self ):
  96. # Check that required directories exist
  97. for path in self.root, self.file_path, self.template_path:
  98. if not os.path.isdir( path ):
  99. raise ConfigurationError("Directory does not exist: %s" % path )
  100. def is_admin_user( self, user ):
  101. """
  102. Determine if the provided user is listed in `admin_users`.
  103. """
  104. admin_users = self.get( "admin_users", "" ).split( "," )
  105. return user is not None and user.email in admin_users
  106. def get_database_engine_options( kwargs ):
  107. """
  108. Allow options for the SQLAlchemy database engine to be passed by using
  109. the prefix "database_engine_option_".
  110. """
  111. conversions = {
  112. 'convert_unicode': string_as_bool,
  113. 'pool_timeout': int,
  114. 'echo': string_as_bool,
  115. 'echo_pool': string_as_bool,
  116. 'pool_recycle': int,
  117. 'pool_size': int,
  118. 'max_overflow': int,
  119. 'pool_threadlocal': string_as_bool,
  120. 'server_side_cursors': string_as_bool
  121. }
  122. prefix = "database_engine_option_"
  123. prefix_len = len( prefix )
  124. rval = {}
  125. for key, value in kwargs.iteritems():
  126. if key.startswith( prefix ):
  127. key = key[prefix_len:]
  128. if key in conversions:
  129. value = conversions[key](value)
  130. rval[ key ] = value
  131. return rval
  132. def configure_logging( config ):
  133. """
  134. Allow some basic logging configuration to be read from the cherrpy
  135. config.
  136. """
  137. # PasteScript will have already configured the logger if the appropriate
  138. # sections were found in the config file, so we do nothing if the
  139. # config has a loggers section, otherwise we do some simple setup
  140. # using the 'log_*' values from the config.
  141. if config.global_conf_parser.has_section( "loggers" ):
  142. return
  143. format = config.get( "log_format", "%(name)s %(levelname)s %(asctime)s %(message)s" )
  144. level = logging._levelNames[ config.get( "log_level", "DEBUG" ) ]
  145. destination = config.get( "log_destination", "stdout" )
  146. log.info( "Logging at '%s' level to '%s'" % ( level, destination ) )
  147. # Get root logger
  148. root = logging.getLogger()
  149. # Set level
  150. root.setLevel( level )
  151. # Turn down paste httpserver logging
  152. if level <= logging.DEBUG:
  153. logging.getLogger( "paste.httpserver.ThreadPool" ).setLevel( logging.WARN )
  154. # Remove old handlers
  155. for h in root.handlers[:]:
  156. root.removeHandler(h)
  157. # Create handler
  158. if destination == "stdout":
  159. handler = logging.StreamHandler( sys.stdout )
  160. else:
  161. handler = logging.FileHandler( destination )
  162. # Create formatter
  163. formatter = logging.Formatter( format )
  164. # Hook everything up
  165. handler.setFormatter( formatter )
  166. root.addHandler( handler )