ported double tracking from TC
This commit is contained in:
3
apps/db_assembler/.gitignore
vendored
Normal file
3
apps/db_assembler/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
/output/
|
||||
/backup/
|
||||
config.sh
|
||||
22
apps/db_assembler/README.md
Normal file
22
apps/db_assembler/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
## Description
|
||||
|
||||
This script allows you to assemble all sql files into one so you can easily import it to your databases (or use the main script to import directly). By default, it creates the merged files in `/env/dist`.
|
||||
|
||||
## How to use:
|
||||
|
||||
First of all, if you need some custom configuration, you have to copy `/conf/dist/config.sh` to `/conf/config.sh` and configure it. The file is here: https://github.com/azerothcore/azerothcore-wotlk/tree/master/conf
|
||||
|
||||
_Read it because there are several options to configure._
|
||||
|
||||
`db_assembler.sh` script contains an interactive menu to assemble and import sql files.
|
||||
Just run it to display the options.
|
||||
|
||||
|
||||
Note: You can even use actions directly by command lines specifying the option.
|
||||
Ex:
|
||||
|
||||
./db_assembler.sh 1
|
||||
|
||||
It will merge all sql files without an interactive menu.
|
||||
|
||||
|
||||
77
apps/db_assembler/db_assembler.sh
Normal file
77
apps/db_assembler/db_assembler.sh
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_PATH/includes/includes.sh"
|
||||
|
||||
cmdopt=$1
|
||||
|
||||
PS3='[Please enter your choice]: '
|
||||
options=(
|
||||
"all: Assemble all" # 1
|
||||
"bases: Assemble only bases" # 2
|
||||
"updates: Assemble only updates" # 3
|
||||
"customs: Assemble only customs" # 4
|
||||
"import-all: Assemble & Import all" # 5
|
||||
"import-bases: Assemble & Import only bases" # 6
|
||||
"import-updates: Assemble & Import only updates" # 7
|
||||
"import-customs: Assemble & Import only customs" # 8
|
||||
"quit: Exit from this menu" # 9
|
||||
)
|
||||
|
||||
function _switch() {
|
||||
_reply="$1"
|
||||
_opt="$2"
|
||||
|
||||
case $_reply in
|
||||
""|"all"|"1")
|
||||
dbasm_run true true true
|
||||
;;
|
||||
""|"bases"|"2")
|
||||
dbasm_run true false false
|
||||
;;
|
||||
""|"updates"|"3")
|
||||
dbasm_run false true false
|
||||
;;
|
||||
""|"customs"|"4")
|
||||
dbasm_run false false true
|
||||
;;
|
||||
""|"import-all"|"5")
|
||||
dbasm_import true true true
|
||||
;;
|
||||
""|"import-bases"|"6")
|
||||
dbasm_import true false false
|
||||
;;
|
||||
""|"import-updates"|"7")
|
||||
dbasm_import false true false
|
||||
;;
|
||||
""|"import-customs"|"8")
|
||||
dbasm_import false false true
|
||||
;;
|
||||
""|"quit"|"9")
|
||||
echo "Goodbye!"
|
||||
exit
|
||||
;;
|
||||
""|"--help")
|
||||
echo "Available commands:"
|
||||
printf '%s\n' "${options[@]}"
|
||||
;;
|
||||
*) echo "invalid option, use --help option for the commands list";;
|
||||
esac
|
||||
}
|
||||
|
||||
while true
|
||||
do
|
||||
# run option directly if specified in argument
|
||||
[ ! -z $1 ] && _switch $@
|
||||
[ ! -z $1 ] && exit 0
|
||||
|
||||
select opt in "${options[@]}"
|
||||
do
|
||||
echo "===== DB ASSEMBLER MENU ====="
|
||||
_switch $REPLY
|
||||
break
|
||||
done
|
||||
done
|
||||
381
apps/db_assembler/includes/functions.sh
Normal file
381
apps/db_assembler/includes/functions.sh
Normal file
@@ -0,0 +1,381 @@
|
||||
# globals
|
||||
PROMPT_USER=""
|
||||
PROMPT_PASS=""
|
||||
|
||||
# use in a subshell
|
||||
function dbasm_resetExitCode() {
|
||||
exit 0
|
||||
}
|
||||
|
||||
function dbasm_mysqlExec() {
|
||||
confs=$1
|
||||
command=$2
|
||||
options=$3
|
||||
|
||||
eval $confs
|
||||
|
||||
if [[ ! -z "${PROMPT_USER// }" ]]; then
|
||||
MYSQL_USER=$PROMPT_USER
|
||||
MYSQL_PASS=$PROMPT_PASS
|
||||
fi
|
||||
|
||||
export MYSQL_PWD=$MYSQL_PASS
|
||||
|
||||
retval=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" $options -e "$command")
|
||||
if [[ $? -ne 0 ]]; then
|
||||
err=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" $options -e "$command" 2>&1 )
|
||||
if [[ "$err" == *"Access denied"* ]]; then
|
||||
read -p "Insert mysql user:" PROMPT_USER
|
||||
read -p "Insert mysql pass:" -s PROMPT_PASS
|
||||
export MYSQL_PWD=$PROMPT_PASS
|
||||
|
||||
retval=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -e "$command")
|
||||
if [[ $? -ne 0 ]]; then
|
||||
err=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -e "$command" 2>&1 )
|
||||
# it happens on new mysql 5.7 installations
|
||||
# since mysql_native_password is explicit now
|
||||
if [[ "$err" == *"Access denied"* ]]; then
|
||||
echo "Setting mysql_native_password and for $PROMPT_USER ..."
|
||||
sudo -h "$MYSQL_HOST" "$DB_MYSQL_EXEC" -e "UPDATE mysql.user SET authentication_string=PASSWORD('${PROMPT_PASS}'), plugin='mysql_native_password' WHERE User='${PROMPT_USER}'; FLUSH PRIVILEGES;"
|
||||
fi
|
||||
fi
|
||||
|
||||
# create configured account if not exists
|
||||
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -e "CREATE USER '${MYSQL_USER}'@'${MYSQL_HOST}' IDENTIFIED BY '${MYSQL_PASS}' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;"
|
||||
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -e "GRANT CREATE ON *.* TO '${MYSQL_USER}'@'${MYSQL_HOST}' WITH GRANT OPTION;"
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
local _uc=${db^^}
|
||||
local _name="DB_"$_uc"_CONF"
|
||||
local _confs=${!_name}
|
||||
|
||||
local _name="DB_"$_uc"_NAME"
|
||||
local _dbname=${!_name}
|
||||
|
||||
eval $_confs
|
||||
echo "Grant permissions for ${MYSQL_USER}'@'${MYSQL_HOST} to ${_dbname}"
|
||||
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -e "GRANT ALL PRIVILEGES ON ${_dbname}.* TO '${MYSQL_USER}'@'${MYSQL_HOST}' WITH GRANT OPTION;"
|
||||
done
|
||||
else
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_isNotEmpty() {
|
||||
dbname=$1
|
||||
conf=$2
|
||||
|
||||
dbasm_mysqlExec "$conf" "SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_schema = '${dbname}'" "--skip-column-names"
|
||||
if (( $retval > 0 )); then
|
||||
true
|
||||
else
|
||||
false
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_dbExists() {
|
||||
dbname=$1
|
||||
conf=$2
|
||||
|
||||
dbasm_mysqlExec "$conf" "SHOW DATABASES LIKE '${dbname}'" "--skip-column-names"
|
||||
if [ "$retval" == "${dbname}" ]; then
|
||||
true
|
||||
else
|
||||
false
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_createDB() {
|
||||
database=${1,,}
|
||||
|
||||
uc=${database^^}
|
||||
|
||||
name="DB_"$uc"_CONF"
|
||||
confs=${!name}
|
||||
|
||||
name="DB_"$uc"_NAME"
|
||||
dbname=${!name}
|
||||
|
||||
eval $confs
|
||||
|
||||
CONF_USER=$MYSQL_USER
|
||||
CONF_PASS=$MYSQL_PASS
|
||||
|
||||
if dbasm_dbExists $dbname "$confs"; then
|
||||
echo "$dbname database exists"
|
||||
else
|
||||
echo "Creating DB ${dbname} ..."
|
||||
dbasm_mysqlExec "$confs" "CREATE DATABASE \`${dbname}\`" ""
|
||||
dbasm_mysqlExec "$confs" "CREATE USER IF NOT EXISTS '${CONF_USER}'@'${MYSQL_HOST}' IDENTIFIED BY '${CONF_PASS}';"
|
||||
dbasm_mysqlExec "$confs" "GRANT ALL PRIVILEGES ON \`${dbname}\`.* TO '${CONF_USER}'@'${MYSQL_HOST}' WITH GRANT OPTION;"
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_assemble() {
|
||||
# to lowercase
|
||||
database=${1,,}
|
||||
start_sql=$2
|
||||
with_base=$3
|
||||
with_updates=$4
|
||||
with_custom=$5
|
||||
|
||||
uc=${database^^}
|
||||
|
||||
name="DB_"$uc"_PATHS"
|
||||
v="$name[@]"
|
||||
base=("${!v}")
|
||||
|
||||
name="DB_"$uc"_UPDATES_PATHS"
|
||||
v="$name[@]"
|
||||
updates=("${!v}")
|
||||
|
||||
name='DB_'$uc'_CUSTOM_PATHS'
|
||||
v="$name[@]"
|
||||
custom=("${!v}")
|
||||
|
||||
|
||||
suffix_base="_base"
|
||||
suffix_upd="_updates"
|
||||
suffix_custom="_custom"
|
||||
|
||||
curTime=`date +%Y_%m_%d_%H_%M_%S`
|
||||
|
||||
# ALLOW FOR RECURSION WITH "**"
|
||||
shopt -s globstar
|
||||
|
||||
if [ $with_base = true ]; then
|
||||
echo "" > $OUTPUT_FOLDER$database$suffix_base".sql"
|
||||
|
||||
|
||||
if [ ! ${#base[@]} -eq 0 ]; then
|
||||
echo "Generating $OUTPUT_FOLDER$database$suffix_base ..."
|
||||
|
||||
for d in "${base[@]}"
|
||||
do
|
||||
echo "Searching on $d ..."
|
||||
if [ ! -z $d ]; then
|
||||
for entry in "$d"/**/*.sql
|
||||
do
|
||||
if [[ -e $entry ]]; then
|
||||
cat "$entry" >> $OUTPUT_FOLDER$database$suffix_base".sql"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $with_updates = true ]; then
|
||||
updFile=$OUTPUT_FOLDER$database$suffix_upd".sql"
|
||||
|
||||
echo "" > $updFile
|
||||
|
||||
if [ ! ${#updates[@]} -eq 0 ]; then
|
||||
echo "Generating $OUTPUT_FOLDER$database$suffix_upd ..."
|
||||
|
||||
for d in "${updates[@]}"
|
||||
do
|
||||
echo "Searching on $d ..."
|
||||
if [ ! -z $d ]; then
|
||||
for entry in "$d"/**/*.sql
|
||||
do
|
||||
if [[ ! -e $entry ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "-- $file" >> $updFile
|
||||
cat "$entry" >> $updFile
|
||||
done
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $with_custom = true ]; then
|
||||
custFile=$OUTPUT_FOLDER$database$suffix_custom".sql"
|
||||
|
||||
echo "" > $custFile
|
||||
|
||||
if [ ! ${#custom[@]} -eq 0 ]; then
|
||||
echo "Generating $OUTPUT_FOLDER$database$suffix_custom ..."
|
||||
|
||||
for d in "${custom[@]}"
|
||||
do
|
||||
echo "Searching on $d ..."
|
||||
if [ ! -z $d ]; then
|
||||
for entry in "$d"/**/*.sql
|
||||
do
|
||||
if [[ ! -e $entry ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "-- $file" >> $custFile
|
||||
cat "$entry" >> $custFile
|
||||
done
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_run() {
|
||||
echo "===== STARTING ASSEMBLY PROCESS ====="
|
||||
|
||||
mkdir -p "$OUTPUT_FOLDER"
|
||||
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
dbasm_assemble "$db" $version".sql" $1 $2 $3
|
||||
done
|
||||
|
||||
echo "===== DONE ====="
|
||||
}
|
||||
|
||||
function dbasm_db_backup() {
|
||||
echo "backing up $1"
|
||||
|
||||
database=${1,,}
|
||||
|
||||
uc=${database^^}
|
||||
|
||||
name="DB_"$uc"_CONF"
|
||||
confs=${!name}
|
||||
|
||||
name="DB_"$uc"_NAME"
|
||||
dbname=${!name}
|
||||
|
||||
eval $confs;
|
||||
|
||||
if [[ ! -z "${PROMPT_USER// }" ]]; then
|
||||
MYSQL_USER=$PROMPT_USER
|
||||
MYSQL_PASS=$PROMPT_PASS
|
||||
fi
|
||||
|
||||
export MYSQL_PWD=$MYSQL_PASS
|
||||
|
||||
now=`date +%s`
|
||||
|
||||
"$DB_MYSQL_DUMP_EXEC" --opt --user="$MYSQL_USER" --host="$MYSQL_HOST" "$dbname" > "${BACKUP_FOLDER}${database}_backup_${now}.sql" && echo "done"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
err=$("$DB_MYSQL_DUMP_EXEC" --opt --user="$MYSQL_USER" --host="$MYSQL_HOST" "$dbname" 2>&1 )
|
||||
if [[ "$err" == *"Access denied"* ]]; then
|
||||
read -p "Insert mysql user:" PROMPT_USER
|
||||
read -p "Insert mysql pass:" -s PROMPT_PASS
|
||||
export MYSQL_PWD=$PROMPT_PASS
|
||||
|
||||
"$DB_MYSQL_DUMP_EXEC" --opt --user="$PROMPT_USER" --host="$MYSQL_HOST" "$dbname" > "${BACKUP_FOLDER}${database}_backup_${now}.sql" && echo "done"
|
||||
else
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_db_import() {
|
||||
database=${1,,}
|
||||
type=$2
|
||||
|
||||
uc=${database^^}
|
||||
|
||||
name="DB_"$uc"_CONF"
|
||||
confs=${!name}
|
||||
|
||||
name="DB_"$uc"_NAME"
|
||||
dbname=${!name}
|
||||
|
||||
if [[ $type = "base" && $DB_SKIP_BASE_IMPORT_IF_EXISTS = true ]]; then
|
||||
if dbasm_isNotEmpty $dbname "$confs"; then
|
||||
echo "$dbname is not empty, base importing skipped"
|
||||
return
|
||||
else
|
||||
echo "$dbname seems empty"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "importing $1 - $2 ..."
|
||||
|
||||
eval $confs;
|
||||
|
||||
if [[ ! -z "${PROMPT_USER// }" ]]; then
|
||||
MYSQL_USER=$PROMPT_USER
|
||||
MYSQL_PASS=$PROMPT_PASS
|
||||
fi
|
||||
|
||||
export MYSQL_PWD=$MYSQL_PASS
|
||||
|
||||
|
||||
# TODO: remove this line after we squash our DB updates
|
||||
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" -e "SET GLOBAL max_allowed_packet=128*1024*1024;"
|
||||
|
||||
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" --default-character-set=utf8 "$dbname" < "${OUTPUT_FOLDER}${database}_${type}.sql"
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
err=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" "$dbname" 2>&1 )
|
||||
if [[ "$err" == *"Access denied"* ]]; then
|
||||
read -p "Insert mysql user:" PROMPT_USER
|
||||
read -p "Insert mysql pass:" -s PROMPT_PASS
|
||||
export MYSQL_PWD=$PROMPT_PASS
|
||||
|
||||
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" "$dbname" < "${OUTPUT_FOLDER}${database}_${type}.sql"
|
||||
else
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function dbasm_import() {
|
||||
dbasm_run $1 $2 $3
|
||||
|
||||
with_base=$1
|
||||
with_updates=$2
|
||||
with_custom=$3
|
||||
|
||||
echo "===== CHECKING DBs ====="
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
dbasm_createDB "$db"
|
||||
done
|
||||
echo "===== DONE ====="
|
||||
|
||||
#
|
||||
# BACKUP
|
||||
#
|
||||
|
||||
if [ $BACKUP_ENABLE = true ]; then
|
||||
echo "===== STARTING BACKUP PROCESS ====="
|
||||
mkdir -p "$BACKUP_FOLDER"
|
||||
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
dbasm_db_backup "$db"
|
||||
done
|
||||
echo "===== DONE ====="
|
||||
fi
|
||||
|
||||
echo "===== STARTING IMPORTING PROCESS ====="
|
||||
#
|
||||
# IMPORT
|
||||
#
|
||||
if [ $with_base = true ]; then
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
dbasm_db_import "$db" "base"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $with_updates = true ]; then
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
dbasm_db_import "$db" "updates"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $with_custom = true ]; then
|
||||
for db in ${DATABASES[@]}
|
||||
do
|
||||
dbasm_db_import "$db" "custom"
|
||||
done
|
||||
fi
|
||||
|
||||
echo "===== DONE ====="
|
||||
}
|
||||
11
apps/db_assembler/includes/includes.sh
Normal file
11
apps/db_assembler/includes/includes.sh
Normal file
@@ -0,0 +1,11 @@
|
||||
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
source "$CURRENT_PATH/../../bash_shared/includes.sh"
|
||||
|
||||
AC_PATH_DBASSEMBLER="$AC_PATH_APPS/db_assembler"
|
||||
|
||||
if [ -f "$AC_PATH_DBASSEMBLER/config.sh" ]; then
|
||||
source "$AC_PATH_DBASSEMBLER/config.sh" # should overwrite previous
|
||||
fi
|
||||
|
||||
source "$AC_PATH_DBASSEMBLER/includes/functions.sh"
|
||||
Reference in New Issue
Block a user