#!/bin/bash set -Eeuo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PLUGIN_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" COMMON_FILE="$PLUGIN_DIR/scripts/setup/mysql_common.sh" SETTINGS_FILE="${DA_ALT_MYSQL_SETTINGS_FILE:-$PLUGIN_DIR/plugin-settings.conf}" LOG_FILE="${DA_ALT_MYSQL_RESTORE_LOG:-$PLUGIN_DIR/data/logs/da-restore.log}" mkdir -p "$(dirname "$LOG_FILE")" log() { printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "$LOG_FILE" } die() { log "ERROR: $*" printf 'alt-mysql native backup restore: %s\n' "$*" >&2 exit 1 } url_decode() { local encoded="${1//+/ }" printf '%b' "${encoded//%/\\x}" } native_conf_field() { local qs="$1" field="$2" pair local -a pairs IFS='&' read -ra pairs <<< "$qs" for pair in "${pairs[@]}"; do if [ "${pair%%=*}" = "$field" ]; then printf '%s' "${pair#*=}" return 0 fi done return 0 } NATIVE_PRIV_FLAG_MAP=( "select_priv:SELECT" "insert_priv:INSERT" "update_priv:UPDATE" "delete_priv:DELETE" "create_priv:CREATE" "drop_priv:DROP" "index_priv:INDEX" "alter_priv:ALTER" "create_tmp_table_priv:CREATE TEMPORARY TABLES" "lock_tables_priv:LOCK TABLES" "create_view_priv:CREATE VIEW" "show_view_priv:SHOW VIEW" "create_routine_priv:CREATE ROUTINE" "alter_routine_priv:ALTER ROUTINE" "execute_priv:EXECUTE" "event_priv:EVENT" "trigger_priv:TRIGGER" "references_priv:REFERENCES" ) native_conf_privilege_list() { local qs="$1" local entry flag name value local -a privs=() for entry in "${NATIVE_PRIV_FLAG_MAP[@]}"; do flag="${entry%%:*}" name="${entry#*:}" value="$(native_conf_field "$qs" "$flag")" [ "$value" = "Y" ] && privs+=("$name") done if [ "${#privs[@]}" -eq 0 ]; then printf 'ALL' else local IFS=, printf '%s' "${privs[*]}" fi } parse_native_db_conf() { local conf_file="$1" local line key value NATIVE_DB_CHARSET="" NATIVE_DB_COLLATION="" NATIVE_DB_USER_NAMES=() NATIVE_DB_USER_HOST=() NATIVE_DB_USER_HASH=() NATIVE_DB_USER_PLUGIN=() NATIVE_DB_USER_PRIVS=() [ -r "$conf_file" ] || { log "cannot read conf file: $conf_file"; return 1; } while IFS= read -r line || [ -n "$line" ]; do [ -n "$line" ] || continue [[ "$line" == *=* ]] || continue key="${line%%=*}" value="${line#*=}" case "$key" in db_collation) NATIVE_DB_CHARSET="$(native_conf_field "$value" DEFAULT_CHARACTER_SET_NAME)" NATIVE_DB_COLLATION="$(native_conf_field "$value" DEFAULT_COLLATION_NAME)" ;; accesshosts) ;; *) NATIVE_DB_USER_NAMES+=("$key") NATIVE_DB_USER_HOST+=("$(native_conf_field "$value" accesshosts)") NATIVE_DB_USER_HASH+=("$(url_decode "$(native_conf_field "$value" passwd)")") NATIVE_DB_USER_PLUGIN+=("$(native_conf_field "$value" plugin)") NATIVE_DB_USER_PRIVS+=("$(native_conf_privilege_list "$value")") ;; esac done < "$conf_file" if [ -z "$NATIVE_DB_CHARSET" ]; then log "missing db_collation charset in $conf_file" return 1 fi if [ "${#NATIVE_DB_USER_NAMES[@]}" -eq 0 ]; then log "no MySQL users found in $conf_file" return 1 fi return 0 } if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then [ -r "$COMMON_FILE" ] || die "missing helper: $COMMON_FILE" # shellcheck source=../setup/mysql_common.sh source "$COMMON_FILE" mysql_load_plugin_settings_file "$SETTINGS_FILE" # main() is added in Task 3. fi