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[assignment]
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_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 = {
" #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("--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))
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 _determine_mode(args):
return "gunicorn"
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)
config_dict = dict(
port=args.port,
host=_determine_host(args),
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()