/lib/galaxy/webapps/reports/config.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 118 lines · 115 code · 2 blank · 1 comment · 0 complexity · 2d69c5b6305f82b3957080e6d5edc762 MD5 · raw file

  1. """Universe configuration builder."""
  2. import sys, os, logging, logging.config, ConfigParser
  3. from optparse import OptionParser
  4. from galaxy.util import string_as_bool
  5. log = logging.getLogger( __name__ )
  6. def resolve_path( path, root ):
  7. """If 'path' is relative make absolute by prepending 'root'"""
  8. if not( os.path.isabs( path ) ):
  9. path = os.path.join( root, path )
  10. return path
  11. class ConfigurationError( Exception ):
  12. pass
  13. class Configuration( object ):
  14. def __init__( self, **kwargs ):
  15. self.config_dict = kwargs
  16. self.root = kwargs.get( 'root_dir', '.' )
  17. # Database related configuration
  18. self.database = resolve_path( kwargs.get( "database_file", "database/universe.d" ), self.root )
  19. self.database_connection = kwargs.get( "database_connection", False )
  20. self.database_engine_options = get_database_engine_options( kwargs )
  21. # Where dataset files are stored
  22. self.file_path = resolve_path( kwargs.get( "file_path", "database/files" ), self.root )
  23. self.new_file_path = resolve_path( kwargs.get( "new_file_path", "database/tmp" ), self.root )
  24. self.id_secret = kwargs.get( "id_secret", "USING THE DEFAULT IS NOT SECURE!" )
  25. self.use_remote_user = string_as_bool( kwargs.get( "use_remote_user", "False" ) )
  26. self.require_login = string_as_bool( kwargs.get( "require_login", "False" ) )
  27. self.template_path = resolve_path( kwargs.get( "template_path", "templates" ), self.root )
  28. self.template_cache = resolve_path( kwargs.get( "template_cache_path", "database/compiled_templates/reports" ), self.root )
  29. self.sendmail_path = kwargs.get('sendmail_path',"/usr/sbin/sendmail")
  30. self.allow_user_creation = string_as_bool( kwargs.get( "allow_user_creation", "True" ) )
  31. self.allow_user_deletion = string_as_bool( kwargs.get( "allow_user_deletion", "False" ) )
  32. self.log_actions = string_as_bool( kwargs.get( 'log_actions', 'False' ) )
  33. self.brand = kwargs.get( 'brand', None )
  34. # Configuration for the message box directly below the masthead.
  35. self.message_box_visible = kwargs.get( 'message_box_visible', False )
  36. self.message_box_content = kwargs.get( 'message_box_content', None )
  37. self.message_box_class = kwargs.get( 'message_box_class', 'info' )
  38. self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.g2.bx.psu.edu/FrontPage' )
  39. self.blog_url = kwargs.get( 'blog_url', None )
  40. self.screencasts_url = kwargs.get( 'screencasts_url', None )
  41. self.log_events = False
  42. self.cookie_path = kwargs.get( "cookie_path", "/" )
  43. # Error logging with sentry
  44. self.sentry_dsn = kwargs.get( 'sentry_dsn', None )
  45. #Parse global_conf
  46. global_conf = kwargs.get( 'global_conf', None )
  47. global_conf_parser = ConfigParser.ConfigParser()
  48. if global_conf and "__file__" in global_conf:
  49. global_conf_parser.read(global_conf['__file__'])
  50. def get( self, key, default ):
  51. return self.config_dict.get( key, default )
  52. def check( self ):
  53. # Check that required directories exist
  54. for path in self.root, self.file_path, self.template_path:
  55. if not os.path.isdir( path ):
  56. raise ConfigurationError("Directory does not exist: %s" % path )
  57. def get_database_engine_options( kwargs ):
  58. """
  59. Allow options for the SQLAlchemy database engine to be passed by using
  60. the prefix "database_engine_option".
  61. """
  62. conversions = {
  63. 'convert_unicode': string_as_bool,
  64. 'pool_timeout': int,
  65. 'echo': string_as_bool,
  66. 'echo_pool': string_as_bool,
  67. 'pool_recycle': int,
  68. 'pool_size': int,
  69. 'max_overflow': int,
  70. 'pool_threadlocal': string_as_bool
  71. }
  72. prefix = "database_engine_option_"
  73. prefix_len = len( prefix )
  74. rval = {}
  75. for key, value in kwargs.iteritems():
  76. if key.startswith( prefix ):
  77. key = key[prefix_len:]
  78. if key in conversions:
  79. value = conversions[key](value)
  80. rval[ key ] = value
  81. return rval
  82. def configure_logging( config ):
  83. """
  84. Allow some basic logging configuration to be read from the cherrpy
  85. config.
  86. """
  87. format = config.get( "log_format", "%(name)s %(levelname)s %(asctime)s %(message)s" )
  88. level = logging._levelNames[ config.get( "log_level", "DEBUG" ) ]
  89. destination = config.get( "log_destination", "stdout" )
  90. log.info( "Logging at '%s' level to '%s'" % ( level, destination ) )
  91. # Get root logger
  92. root = logging.getLogger()
  93. # Set level
  94. root.setLevel( level )
  95. # Turn down paste httpserver logging
  96. if level <= logging.DEBUG:
  97. logging.getLogger( "paste.httpserver.ThreadPool" ).setLevel( logging.WARN )
  98. # Remove old handlers
  99. for h in root.handlers[:]:
  100. root.removeHandler(h)
  101. # Create handler
  102. if destination == "stdout":
  103. handler = logging.StreamHandler( sys.stdout )
  104. else:
  105. handler = logging.FileHandler( destination )
  106. # Create formatter
  107. formatter = logging.Formatter( format )
  108. # Hook everything up
  109. handler.setFormatter( formatter )
  110. root.addHandler( handler )