import click import os from zope import component from ceo_common.interfaces import IConfig from ..utils import http_post, http_get from .utils import handle_sync_response, check_file_path def mysql_create_info_file(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.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_create_info_file(info_file_path, username, password) click.echo(f""" MySQL database {username} with password {password} has been created This password and more details have been written to {info_file_path}""") @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_create_info_file(info_file_path, username, password) click.echo(f""" MySQL database {username} now has the password {password} This password and more details have been written to {info_file_path}""")