feat: parse DirectAdmin native backup/<dbname>.conf format
This commit is contained in:
+122
@@ -0,0 +1,122 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user