Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.config.script
#!/usr/bin/env python
import os
import string
import sys
from argparse import ArgumentParser
try:
import pip
except ImportError:
pip = None # type: ignore
CONFIGURE_URL = "https://docs.galaxyproject.org/en/master/admin/"
DESCRIPTION = "Initialize a directory with a minimal Galaxy config."
HELP_CONFIG_DIR = "Directory containing the configuration files for Galaxy."
HELP_DATA_DIR = "Directory containing Galaxy-created data."
HELP_FORCE = "Overwrite existing files if they already exist."
HELP_WSGI_SERVER = ("Web server stack used to host Galaxy web application, and if uWSGI, which protocol to use.")
HELP_LIBDRMAA = (
"Configure Galaxy to submit jobs to a cluster via DRMAA by supplying the path to a libdrmaa.so file using this "
"argument."
)
HELP_INSTALL = ("Install optional dependencies required by specified configuration (e.g. drmaa, etc...).")
HELP_HOST = (
'Host to bind Galaxy to - defaults to localhost. Specify an IP address or "all" to listen on all interfaces.'
)
HELP_PORT = ("Port to bind Galaxy to.")
HELP_DB_CONN = ("Galaxy database connection URI.")
DEFAULT_HOST = "localhost"
DEFAULT_YML = "galaxy.yml"
DEFAULT_DB_CONN = 'sqlite:///./database/universe.sqlite?isolation_level=IMMEDIATE'
SAMPLES_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), 'sample'))
GALAXY_CONFIG_TEMPLATE_FILE = os.path.join(SAMPLES_PATH, 'galaxy.yml.sample')
STATIC_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'web', 'framework', 'static'))
CLIENT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, 'client'))
MSG_CONFIG_SUMMARY = """
For help on configuring Galaxy, consult the documentation at: \n {}
Additional sample configuration files for various Galaxy components (jobs,
datatypes, etc.) can be found in:\n {}
Start Galaxy by running the command from directory [{}]:
"""
# The sample is used as the default config file for Galaxy started without a config, and we don't want to duplicate the
# whole thing into galaxy.config for templating, so for now just substitute some lines. In the future we will build
# configs differently.
GALAXY_CONFIG_SUBSTITUTIONS = {
' http: 127.0.0.1:8080': ' ${uwsgi_transport}: ${host}:${port}',
' static-map: /static=static': ' static-map: /static=${static_path}',
' static-map: /favicon.ico=static/favicon.ico': ' static-map: /static=${static_path}/favicon.ico',
' static-safe: client/src/assets': ' ${client_path}/src/assets',
' virtualenv: .venv': ' #venv: .venv # not used when running installed',
' pythonpath: lib': ' #pythonpath: lib # not used when running installed',
' #config_dir: false': ' config_dir: ${config_dir}',
' #data_dir: false': ' data_dir: ${data_dir}',
' #database_connection: sqlite:///./database/universe.sqlite?isolation_level=IMMEDIATE': ' database_connection: ${database_connection}',
}
[docs]def main(argv=None):
dependencies = []
arg_parser = ArgumentParser(description=DESCRIPTION)
arg_parser.add_argument("--config-dir", default=".", help=HELP_CONFIG_DIR)
arg_parser.add_argument("--data-dir", default="./data", help=HELP_DATA_DIR)
arg_parser.add_argument("--wsgi-server", choices=["uwsgi-http", "uwsgi-native"], default="uwsgi-http",
help=HELP_WSGI_SERVER)
arg_parser.add_argument("--host", default=DEFAULT_HOST, help=HELP_HOST)
arg_parser.add_argument("--port", default="8080", help=HELP_PORT)
arg_parser.add_argument("--db-conn", default=DEFAULT_DB_CONN, help=HELP_DB_CONN)
arg_parser.add_argument("--install", action="store_true", help=HELP_INSTALL)
arg_parser.add_argument("--force", action="store_true", default=False, help=HELP_FORCE)
args = arg_parser.parse_args(argv)
config_dir = args.config_dir
relative_config_dir = config_dir
config_dir = os.path.abspath(config_dir)
data_dir = args.data_dir
data_dir = os.path.abspath(data_dir)
mode = _determine_mode(args)
if args.db_conn.startswith("postgresql://"):
dependencies.append("psycopg2-binary")
for directory in (config_dir, data_dir):
if not os.path.exists(directory):
os.makedirs(directory)
print(f"Bootstrapping Galaxy configuration into directory {relative_config_dir}")
_handle_galaxy_yml(args, config_dir, data_dir)
_handle_install(args, dependencies)
_print_config_summary(args, mode, relative_config_dir)
def _print_config_summary(args, mode, relative_config_dir):
_print_galaxy_yml_info(args, mode)
print(MSG_CONFIG_SUMMARY.format(CONFIGURE_URL, SAMPLES_PATH, relative_config_dir))
_print_galaxy_run(mode)
def _print_galaxy_yml_info(args, mode):
print(" - galaxy.yml created, update to configure Galaxy.")
print(f" * Target web server {mode}")
if args.host == DEFAULT_HOST:
print(" * Binding to host localhost, remote clients will not be able to connect.")
elif _determine_host(args) == "0.0.0.0":
print(" * Binding to all network interfaces.")
else:
print(" * Binding to host [%s].", args.host)
def _print_galaxy_run(mode):
if mode.startswith("uwsgi"):
print(" uwsgi --yaml galaxy.yml")
else:
raise Exception(f"Unknown mode: {mode}")
def _determine_mode(args):
if args.wsgi_server:
mode = args.wsgi_server
else:
mode = "paster"
return mode
def _determine_host(args):
return '0.0.0.0' if args.host == 'all' else args.host
def _determine_yml_file(config_dir):
return os.path.join(config_dir, DEFAULT_YML)
def _handle_galaxy_yml(args, config_dir, data_dir):
force = args.force
yml_file = _determine_yml_file(config_dir)
_check_file(yml_file, force)
uwsgi_transport = 'socket' if args.wsgi_server == 'uwsgi-native' else 'http'
config_dict = dict(
port=args.port,
host=_determine_host(args),
uwsgi_transport=uwsgi_transport,
config_dir=config_dir,
data_dir=data_dir,
client_dir=CLIENT_PATH,
static_path=STATIC_PATH,
database_connection=args.db_conn,
)
galaxy_config_template = []
with open(GALAXY_CONFIG_TEMPLATE_FILE) as fh:
for line in fh:
line = line.rstrip('\n')
for k, v in GALAXY_CONFIG_SUBSTITUTIONS.items():
if line == k:
line = v
galaxy_config_template.append(line)
galaxy_config_template = string.Template('\n'.join(galaxy_config_template))
galaxy_config = galaxy_config_template.safe_substitute(
**config_dict
)
open(yml_file, "w").write(galaxy_config)
def _handle_install(args, dependencies):
if args.install and dependencies:
if pip is None:
raise ImportError("Bootstrapping Galaxy dependencies requires pip.")
pip.main(["install"] + dependencies)
def _check_file(path, force):
if os.path.exists(path) and not force:
print(f"File {path} exists, exiting. Run with --force to replace configuration.", file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
main()