import click import os from zope import component from ceo_common.interfaces import IConfig from ..utils import http_post, http_get, http_delete from .utils import handle_sync_response, check_file_path, check_if_in_development def mysql_cli_response(file, username, password): cfg_srv = component.getUtility(IConfig) mysql_host = cfg_srv.get('mysql_host') info = f"""MySQL Database Information for {username} Your new MySQL database was created. To connect, use the following options: Database: {username} Username: {username} Password: {password} Host: {mysql_host} On {mysql_host} to connect using the MySQL command-line client use mysql {username} -u {username} -p From other CSC machines you can connect using mysql {username} -h {mysql_host} -u {username} -p """ with click.open_file(file, "w") as f: f.write(info) os.chown(file, username, username) os.chmod(file, 0o640) click.echo(f"""MySQL database created Connection Information: Database: {username} Username: {username} Password: {password} Host: {mysql_host} Settings and more info has been written to {file}""") @click.group(short_help='Perform operations on MySQL') def mysql(): pass @mysql.command(short_help='Create a MySQL database for a user') @click.argument('username') def create(username): resp = http_get(f'/api/members/{username}') result = handle_sync_response(resp) info_file_path = os.path.join(result['home_directory'], "ceo-mysql-info") check_file_path(info_file_path) resp = http_post(f'/api/db/mysql/{username}') result = handle_sync_response(resp) password = result['password'] mysql_cli_response(info_file_path, username, password) @mysql.command(short_help='Reset the password of a MySQL user') @click.argument('username') def pwreset(username): resp = http_get(f'/api/members/{username}') result = handle_sync_response(resp) info_file_path = os.path.join(result['home_directory'], "ceo-mysql-info") check_file_path(info_file_path) resp = http_post(f'/api/db/mysql/{username}/pwreset') result = handle_sync_response(resp) password = result['password'] mysql_cli_response(info_file_path, username, password) @mysql.command(short_help="Delete the database of a MySQL user") @click.argument('username') def delete(username): check_if_in_development() click.confirm("Are you sure?", abort=True) resp = http_delete(f'/api/db/mysql/{username}') handle_sync_response(resp)