mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-19 10:51:34 +08:00
123 lines
4.7 KiB
Python
123 lines
4.7 KiB
Python
from __future__ import print_function
|
|
|
|
import os
|
|
import sys
|
|
|
|
from six import string_types
|
|
from six.moves import shlex_quote
|
|
|
|
sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'lib')))
|
|
|
|
from galaxy.util.path import get_ext
|
|
from galaxy.util.properties import load_app_properties, nice_config_parser
|
|
from galaxy.util.script import main_factory
|
|
|
|
|
|
DESCRIPTION = "Script to determine uWSGI command line arguments"
|
|
# socket is not an alias for http, but it is assumed that if you configure a socket in your uwsgi config you do not
|
|
# want to run the default http server (or you can configure it yourself)
|
|
ALIASES = {
|
|
'virtualenv': ('home', 'venv', 'pyhome'),
|
|
'pythonpath': ('python-path', 'pp'),
|
|
'http': ('httprouter', 'socket', 'uwsgi-socket', 'suwsgi-socket', 'ssl-socket'),
|
|
'module': ('mount',), # mount is not actually an alias for module, but we don't want to set module if mount is set
|
|
}
|
|
DEFAULT_ARGS = {
|
|
'_all_': ('pythonpath', 'threads', 'buffer-size', 'http', 'static-map', 'static-safe', 'die-on-term', 'hook-master-start', 'enable-threads'),
|
|
'galaxy': ('py-call-osafterfork',),
|
|
'reports': (),
|
|
'tool_shed': (),
|
|
}
|
|
DEFAULT_PORTS = {
|
|
'galaxy': 8080,
|
|
'reports': 9001,
|
|
'tool_shed': 9009,
|
|
}
|
|
|
|
|
|
def __arg_set(arg, kwargs):
|
|
if arg in kwargs:
|
|
return True
|
|
for alias in ALIASES.get(arg, ()):
|
|
if alias in kwargs:
|
|
return True
|
|
return False
|
|
|
|
|
|
def __add_arg(args, arg, value):
|
|
optarg = '--%s' % arg
|
|
if isinstance(value, bool):
|
|
if value is True:
|
|
args.append(optarg)
|
|
elif isinstance(value, string_types):
|
|
# the = in --optarg=value is usually, but not always, optional
|
|
if value.startswith('='):
|
|
args.append(shlex_quote(optarg + value))
|
|
else:
|
|
args.append(optarg)
|
|
args.append(shlex_quote(value))
|
|
else:
|
|
[__add_arg(args, arg, v) for v in value]
|
|
|
|
|
|
def __add_config_file_arg(args, config_file, app):
|
|
ext = None
|
|
if config_file:
|
|
ext = get_ext(config_file)
|
|
if ext in ('yaml', 'json'):
|
|
__add_arg(args, ext, config_file)
|
|
elif ext == 'ini':
|
|
config = nice_config_parser(config_file)
|
|
has_logging = config.has_section('loggers')
|
|
if config.has_section('app:main'):
|
|
# uWSGI does not have any way to set the app name when loading with paste.deploy:loadapp(), so hardcoding
|
|
# the name to `main` is fine
|
|
__add_arg(args, 'ini-paste' if not has_logging else 'ini-paste-logged', config_file)
|
|
return # do not add --module
|
|
else:
|
|
__add_arg(args, ext, config_file)
|
|
if has_logging:
|
|
__add_arg(args, 'paste-logger', True)
|
|
|
|
|
|
def _get_uwsgi_args(cliargs, kwargs):
|
|
# it'd be nice if we didn't have to reparse here but we need things out of more than one section
|
|
config_file = cliargs.config_file or kwargs.get('__file__')
|
|
uwsgi_kwargs = load_app_properties(config_file=config_file, config_section='uwsgi')
|
|
args = []
|
|
defaults = {
|
|
'pythonpath': 'lib',
|
|
'threads': '4',
|
|
'buffer-size': '16384', # https://github.com/galaxyproject/galaxy/issues/1530
|
|
'http': 'localhost:{port}'.format(port=DEFAULT_PORTS[cliargs.app]),
|
|
'static-map': ('/static/style={here}/static/style/blue'.format(here=os.getcwd()),
|
|
'/static={here}/static'.format(here=os.getcwd())),
|
|
'static-safe': ('{here}/config/plugins/visualizations'.format(here=os.getcwd()),
|
|
'{here}/config/plugins/interactive_environments'.format(here=os.getcwd())),
|
|
'die-on-term': True,
|
|
'enable-threads': True,
|
|
'hook-master-start': ('unix_signal:2 gracefully_kill_them_all',
|
|
'unix_signal:15 gracefully_kill_them_all'),
|
|
'py-call-osafterfork': True,
|
|
}
|
|
__add_config_file_arg(args, config_file, cliargs.app)
|
|
if not __arg_set('module', uwsgi_kwargs):
|
|
__add_arg(args, 'module', 'galaxy.webapps.{app}.buildapp:uwsgi_app()'.format(app=cliargs.app))
|
|
# only include virtualenv if it's set/exists, otherwise this breaks conda-env'd Galaxy
|
|
if not __arg_set('virtualenv', uwsgi_kwargs) and ('VIRTUAL_ENV' in os.environ or os.path.exists('.venv')):
|
|
__add_arg(args, 'virtualenv', os.environ.get('VIRTUAL_ENV', '.venv'))
|
|
for arg in DEFAULT_ARGS['_all_'] + DEFAULT_ARGS[cliargs.app]:
|
|
if not __arg_set(arg, uwsgi_kwargs):
|
|
__add_arg(args, arg, defaults[arg])
|
|
print(' '.join(args))
|
|
|
|
|
|
ACTIONS = {
|
|
"get_uwsgi_args": _get_uwsgi_args,
|
|
}
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main = main_factory(description=DESCRIPTION, actions=ACTIONS, default_action="get_uwsgi_args")
|
|
main()
|