view tf_apikey_mutate/tf_apikey_mutate.xml @ 1:0183cad9d13b draft

planemo upload
author fubar
date Thu, 22 Feb 2024 10:48:01 +0000
parents
children
line wrap: on
line source

<tool name="tf_apikey_mutate" id="tf_apikey_mutate" version="0.001">
  <!--Source in git at: https://github.com/fubar2/galaxy-->
  <!--Created by toolfactory@galaxy.org at 21/05/2023 10:01:12 using the Galaxy Tool Factory.-->
  <description>Rotates all API keys in a ToolFactory instance </description>
  <requirements>
    <requirement version="1.1.1" type="package">bioblend</requirement>
   <requirement version="3.10.12" type="package">python</requirement>
   <requirement type="package">six</requirement>
  </requirements>
  <stdio>
    <exit_code range="1:" level="fatal"/>
  </stdio>
  <version_command><![CDATA[echo "0.001"]]></version_command>
  <command><![CDATA[python
$runme --galaxy_root "$__root_dir__" --galaxy_venv "$__root_dir__/.venv"
>
$APIK_mutate_log]]></command>
  <configfiles>
    <configfile name="runme"><![CDATA[#raw

#!/usr/bin/env python
import argparse
import hashlib
import os
import random
import subprocess
import sys
from time import sleep
from urllib import request
from urllib.error import URLError

from bioblend import galaxy

def add_user(sa_session, security_agent, email, password, key=None, username="admin"):
    """
    Add Galaxy User.
    From John https://gist.github.com/jmchilton/4475646
    """
    query = sa_session.query(User).filter_by(email=email)
    user = None
    uexists = False
    User.use_pbkdf2 = False
    if query.count() > 0:
        user = query.first()
        user.username = username
        user.set_password_cleartext(password)
        sa_session.add(user)
        sa_session.flush()
        uexists = True
    else:
        user = User(email)
        user.username = username
        user.set_password_cleartext(password)
        sa_session.add(user)
        sa_session.flush()

        security_agent.create_private_user_role(user)
        if not user.default_permissions:
            security_agent.user_set_default_permissions(user, history=True, dataset=True)

    if key is not None:
        query = sa_session.query(APIKeys).filter_by(user_id=user.id).delete()
        sa_session.flush()

        api_key = APIKeys()
        api_key.user_id = user.id
        api_key.key = key
        sa_session.add(api_key)
        sa_session.flush()
    return user, uexists

def run_sed(options):
    """
    eg replacement = 'APIK="%s"' % options.key
    line_start = 'APIK='
    """
    fixme = []
    tool_config_file: "tool_conf.xml,../local_tools/local_tool_conf.xml"
    # database_connection: "sqlite:///<data_dir>/universe.sqlite?isolation_level=IMMEDIATE"
    tfc = 'tool_conf.xml,%s/local_tools/local_tool_conf.xml' % options.galaxy_root
    fixfile = "%s/config/galaxy.yml" % options.galaxy_root
    fixme.append(('  virtualenv: ', '  virtualenv: "%s"' % options.galaxy_venv, fixfile))
    fixme.append(('  galaxy_root: ', '  galaxyroot: "%s"' % options.galaxy_root, fixfile))
    fixme.append(('  tool_config_file: ', '  tool_config_file: "%s"' % tfc, fixfile))
    fixfile = "%s/local_tools/toolfactory/toolfactory.py" % options.galaxy_root
    fixme.append(('        self.GALAXY_ADMIN_KEY =', '        self.GALAXY_ADMIN_KEY = "%s"' % options.key, fixfile ))
    fixme.append(('        self.GALAXY_URL = ' , '        self.GALAXY_URL = "%s"' % options.galaxy_url, fixfile ))
    fixfile = "%s/local_tools/toolfactory/install_tf_deps.sh" % options.galaxy_root
    fixme.append(('APIK=', 'APIK="%s"' % options.key, fixfile ))
    fixme.append(('LOCALTOOLDIR=', 'LOCALTOOLDIR="%s"' % os.path.join(os.path.abspath(options.galaxy_root), "local_tools"),  fixfile ))
    fixfile = "%s/local_tools/toolfactory/localplanemotest.sh" % options.galaxy_root
    fixme.append(('GALAXY_URL=', 'GALAXY_URL=%s' % options.galaxy_url, fixfile))
    fixme.append(('API_KEY=', 'API_KEY=%s' % options.key, fixfile))
    fixfile = "%s/local_tools/toolfactory/toolfactory_fast_test.sh" % options.galaxy_root
    fixme.append(('GALAXY_URL=', 'GALAXY_URL=%s' % options.galaxy_url, fixfile))
    fixme.append(('API_KEY=', 'API_KEY=%s' % options.key, fixfile))
    fixme.append(('GALAXY_VENV=', 'GALAXY_VENV=%s' % options.galaxy_venv, fixfile))
    fixme.append(('API_KEY_USER=', 'API_KEY_USER=%s' % options.botkey, fixfile))
    for line_start, line_replacement, file_to_edit in fixme:
        cmd = ["sed", "-i", "s#.*%s.*#%s#g" % (line_start, line_replacement), file_to_edit]
        print("## executing", ' '.join(cmd))
        res = subprocess.run(cmd)
        if not res.returncode == 0:
            print('### Non zero %d return code from %s ' % (res.returncode, ''.join(cmd)))


if __name__ == "__main__":
    print('starting!', file=sys.stderr)
    apikey = "%s" % hash(random.random())
    apikey2 = "%s" % hash(random.random())
    parser = argparse.ArgumentParser(description="Create Galaxy Admin User.")
    parser.add_argument("--galaxy_url", help="Galaxy server URL", default="http://localhost:8080")
    parser.add_argument("--galaxy_root",  help="Galaxy root directory path", default="/work/galaxytf")
    parser.add_argument("--galaxy_venv", help="Galaxy venv path", default="/work/galaxytf/.venv")
    parser.add_argument("--user", help="Username - an email address.", default="toolfactory@galaxy.org")
    parser.add_argument("--password", help="Password", default="ChangeMe!")
    parser.add_argument("--password2", help="Password", default=apikey2)
    parser.add_argument("--key", help="API-Key.", default=apikey)
    parser.add_argument("--botkey", help="bot API-Key.", default=apikey2)
    parser.add_argument("--username", default="tfadmin")
    parser.add_argument("args", nargs=argparse.REMAINDER)
    options = parser.parse_args()
    sys.path.insert(1, options.galaxy_root)
    sys.path.insert(1, os.path.join(options.galaxy_root, "lib"))
    sys.path.insert(1, os.path.join(options.galaxy_venv, "lib", "python3.10", "site-packages"))
    from galaxy.model import User, APIKeys
    from galaxy.model.mapping import init
    from galaxy.model.orm.scripts import get_config
    cnf = get_config(argv=['-c','galaxy', ],cwd=options.galaxy_root)
    print('cnf=%s' % cnf, file=sys.stderr)
    cdb_url = cnf["db_url"]
    # or perhaps "postgresql:///ubuntu?host=/var/run/postgresql"
    # this is harder to please get_config(sys.argv, use_argparse=False)["db_url"]
    print('### Using cdb_url', cdb_url, file=sys.stderr)
    mapping = init("/tmp/", cdb_url)
    sa_session = mapping.context
    security_agent = mapping.security_agent
    usr, uexists = add_user(
        sa_session, security_agent, options.user, options.password, key=options.key, username=options.username
    )
    print("added user", options.user, "apikey", options.key, file=sys.stderr)

    usr, uexists = add_user(
        sa_session, security_agent, 'test@bx.psu.edu',   options.password2, key=options.botkey, username='bot'
    )
    run_sed(options)
    print('Evil deeds done', file=sys.stderr)


#end raw]]></configfile>
  </configfiles>
  <inputs/>
  <outputs>
    <data name="APIK_mutate_log" format="txt" label="APIK_mutate_log" hidden="false"/>
  </outputs>
  <tests>
    <test>
      <output name="APIK_mutate_log" value="APIK_mutate_log_sample" compare="sim_size" delta="100"/>
    </test>
  </tests>
  <help><![CDATA[

**What it Does**

Regenerates fresh API keys for the ToolFactory administrative user and rewrites them into all the relevant utility code.

The Docker image is constructed with a new set of keys but they are identical in every image, so running this tool
in that image makes sure that while it is running, it is not using the distributed keys. It will do the same thing for a
local disk installation but has already been run once at first boot. No real harm running it again to recycle all your keys
if you like.

Will break the ToolFactory if it breaks.
Safe in Docker since it's not persistent :)
Use at your own peril.
This is a crazy tool to run.

This script consistently fails tool test, but actually works fine on a ToolFactory docker or local installation.
It reuses code from the initial configuration to create new, random API keys for the admin logins.


]]></help>
  <citations>
    <citation type="doi">10.1093/bioinformatics/bts573</citation>
  </citations>
</tool>