#!/bin/bash set -euo pipefail trap 'echo "Error on line $LINENO. Exiting."' ERR # -- CONFIGURATION -- source .env OLD_CONTAINER_DISEASE_LIST="disnet-disease_list_available_database-mysql84-container" OLD_CONTAINER_USERS="disnet-users_database-mysql84-container" SOURCE_CONTAINERS=("$OLD_CONTAINER_DISEASE_LIST" "$OLD_CONTAINER_USERS") NEW_CONTAINER="disnet-diseases_database-mysql84-container" ROOT_PASSWORD="${ROOT_PASSWORD}" ROOT_USER="root" ALL_SCHEMAS=("addb" "disnetdb") declare -A SCHEMA_CONTAINER_MAP=( ["addb"]=$OLD_CONTAINER_DISEASE_LIST ["disnetdb"]=$OLD_CONTAINER_USERS ) volume_common_path="/var/local/docker/disnet/volumes/mysql/" declare -A CONTAINER_VOLUME_MAP=( [$OLD_CONTAINER_DISEASE_LIST]="${volume_common_path}disnet-disease_list_available_database-mysql8upgrade" [$OLD_CONTAINER_USERS]="${volume_common_path}disnet-users_database-mysql8upgrade" ) # --- FUNCTIONS --- run_unification() { echo -e "\033[1mStarting database unification process...\033[0m" echo " - Enabling log_bin_trust_function_creators..." docker exec -i $NEW_CONTAINER bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -e \"SET GLOBAL log_bin_trust_function_creators = 1;\"" # For each schema, dump and import for schema in "${SCHEMAS[@]}" do echo "Processing schema: $schema" SRC_CONTAINER="${SCHEMA_CONTAINER_MAP[$schema]}" echo " - Creating $schema in new container..." docker exec -i $NEW_CONTAINER bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -e \"CREATE DATABASE IF NOT EXISTS $schema;\"" echo " - Dumping and importing $schema..." start_dump=$(date +%s) docker exec "$SRC_CONTAINER" bash -c "MYSQL_PWD=$ROOT_PASSWORD mysqldump -u$ROOT_USER --routines --triggers --events $schema" \ | docker exec -i $NEW_CONTAINER bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER $schema" end_dump=$(date +%s) dump_duration=$((end_dump - start_dump)) hours=$((dump_duration / 3600)) minutes=$(((dump_duration % 3600) / 60)) seconds=$((dump_duration % 60)) printf "\033[1m%s imported successfully in %02dh:%02dm:%02ds\033[0m\n" "$schema" $hours $minutes $seconds done echo " - Disabling log_bin_trust_function_creators..." docker exec -i $NEW_CONTAINER bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -e \"SET GLOBAL log_bin_trust_function_creators = 0;\"" echo "Database unification completed!" } create_users_and_grants() { echo -e "\033[1mStarting user creation and grants...\033[0m" for SRC_CONTAINER in "${SOURCE_CONTAINERS[@]}"; do echo "Extracting users from $SRC_CONTAINER" readarray -t user_host_pairs < <(docker exec "$SRC_CONTAINER" bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -N -B -e \" SELECT user, host FROM mysql.user WHERE user NOT IN ('root', 'mysql.sys', 'mysql.session', 'mysql.infoschema'); \"") for entry in "${user_host_pairs[@]}"; do read username host <<< "$entry" env_var_name=$(echo "${username}_PASSWORD" | tr '[:lower:]' '[:upper:]') if [ -z "${!env_var_name:-}" ]; then echo " - No password found for $username (expected ${env_var_name} variable in .env file). Skipping." continue fi password="${!env_var_name}" echo " - Creating user '$username'@'$host'..." docker exec -i "$NEW_CONTAINER" bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -e \" CREATE USER IF NOT EXISTS '$username'@'$host' IDENTIFIED BY '$password';\"" user_host="'$username'@'$host'" grants=$(docker exec "$SRC_CONTAINER" bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -N -B -e \" SHOW GRANTS FOR $user_host;\"") echo " - Applying grants for user $user_host" while IFS= read -r grant; do if [[ "$grant" == "GRANT USAGE ON *.* TO"* ]]; then continue fi escaped_grant=$(printf "%q" "$grant") docker exec "$NEW_CONTAINER" bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -e $escaped_grant" done <<< "$grants" docker exec "$NEW_CONTAINER" bash -c "MYSQL_PWD=$ROOT_PASSWORD mysql -u$ROOT_USER -e \"FLUSH PRIVILEGES;\"" done done } delete_containers() { echo -e "\033[1mStarting deletion of old containers...\033[0m" for SRC_CONTAINER in "${SOURCE_CONTAINERS[@]}"; do echo "Deleting container $SRC_CONTAINER" docker stop $SRC_CONTAINER docker rm -f $SRC_CONTAINER VOLUME_DIR="${CONTAINER_VOLUME_MAP[$SRC_CONTAINER]}" echo "Deleting volume $VOLUME_DIR" sudo rm -r $VOLUME_DIR done } # --- MAIN EXECUTION --- MODE="all" SCHEMAS=() if [[ $# -ge 1 ]]; then case "$1" in users) MODE="users" shift ;; unify) MODE="unify" shift SCHEMAS=("$@") ;; *) echo "Unrecognized command: $1" echo "Usage:" echo " $0 # Unify all schemas, create users with permissions and delete old containers" echo " $0 unify s1 s2 ... # Unify only selected schemas and create users with permissions and delete old containers" echo " $0 users # Only create users with permissions" exit 1 ;; esac fi if [[ "$MODE" == "users" ]]; then create_users_and_grants exit 0 fi # Set default schemas if none specified if [[ "$MODE" == "all" || ${#SCHEMAS[@]} -eq 0 ]]; then SCHEMAS=("${ALL_SCHEMAS[@]}") fi run_unification create_users_and_grants delete_containers