🔨 Revisión de scripts para base de datos de Drust

This commit is contained in:
Manuel Cillero 2024-12-07 20:06:52 +01:00
parent ffe287f5a7
commit 1b413a2aaf
3 changed files with 274 additions and 191 deletions

View file

@ -1,63 +1,133 @@
#!/bin/bash
# Ask the user which database system to use
read -p "Which database system are you using? (mysql/postgresql/sqlite): " DB_SYSTEM
create_mysql_database() {
echo "Setting up MySQL database \"$DB_NAME\"..."
# Check if selected database system is installed
if [ "$DB_SYSTEM" == "mysql" ]; then
if ! command -v mysql &> /dev/null; then
echo "mysql is not installed or not found in PATH. Please install mysql and try again."
exit 1
fi
elif [ "$DB_SYSTEM" == "postgresql" ]; then
if ! command -v psql &> /dev/null; then
echo "postgresql is not installed or not found in PATH. Please install postgresql and try again."
exit 1
fi
elif [ "$DB_SYSTEM" == "sqlite" ]; then
if ! command -v sqlite3 &> /dev/null; then
echo "sqlite3 is not installed or not found in PATH. Please install sqlite3 and try again."
exit 1
fi
# Verifica si la base de datos ya existe
DB_EXISTS=$(MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -sse \
"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$DB_NAME';")
if [ "$DB_EXISTS" == "$DB_NAME" ]; then
echo "Database \"$DB_NAME\" already exists."
else
echo "Invalid database system selected. Please choose either 'mysql', 'postgresql', or 'sqlite'."
exit 1
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \
"CREATE DATABASE $DB_NAME;"
[ $? -ne 0 ] && { echo "Error creating database \"$DB_NAME\"."; return 1; }
fi
EXIT_CODE=0
# Verifica si el usuario ya existe
USER_EXISTS=$(MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -sse \
"SELECT User FROM mysql.user WHERE User = '$DB_USER';")
if [ "$USER_EXISTS" == "$DB_USER" ]; then
echo "User \"$DB_USER\" already exists."
else
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \
"CREATE USER '$DB_USER'@'$DB_HOST' IDENTIFIED BY '$DB_PASS';"
[ $? -ne 0 ] && { echo "Error creating user \"$DB_USER\"."; return 1; }
fi
echo
echo "You will be prompted to provide details for creating the Drust database."
echo "Press ENTER to accept the default values."
echo
# Asigna privilegios al usuario para la base de datos
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \
"GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'$DB_HOST'; FLUSH PRIVILEGES;"
[ $? -ne 0 ] && { echo "Error granting privileges to user \"$DB_USER\" for database \"$DB_NAME\"."; return 1; }
if [ "$DB_SYSTEM" == "sqlite" ]; then
DEFAULT_DB_NAME="drust.db"
return 0
}
# Only prompt for database name, as user and password are not used by SQLite
read -p "Enter database name [$DEFAULT_DB_NAME]: " DB_NAME
DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME}
create_psql_database() {
echo "Setting up PostgreSQL database \"$DB_NAME\"..."
# Verifica si la base de datos ya existe
DB_EXISTS=$(PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -tAc \
"SELECT 1 FROM pg_database WHERE datname='$DB_NAME'")
if [ "$DB_EXISTS" == "1" ]; then
echo "Database \"$DB_NAME\" already exists."
else
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c "CREATE DATABASE $DB_NAME;"
[ $? -ne 0 ] && { echo "Error creating database \"$DB_NAME\"."; return 1; }
fi
# Verifica si el usuario ya existe
USER_EXISTS=$(PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -tAc \
"SELECT 1 FROM pg_catalog.pg_user WHERE usename='$DB_USER'")
if [ "$USER_EXISTS" == "1" ]; then
echo "User \"$DB_USER\" already exists."
else
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c "CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';"
[ $? -ne 0 ] && { echo "Error creating user \"$DB_USER\"."; return 1; }
fi
# Asigna privilegios al usuario para la base de datos
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" <<EOF
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
GRANT pg_read_server_files TO $DB_USER;
EOF
[ $? -ne 0 ] && { echo "Error granting privileges to user \"$DB_USER\" for database \"$DB_NAME\"."; return 1; }
return 0
}
create_sqlite_database() {
echo "Setting up SQLite database \"$DB_NAME\"..."
# For SQLite, just check if the database file exists and create it if it doesn't
if [ ! -f "$DB_NAME" ]; then
echo "Creating SQLite database file: $DB_NAME"
sqlite3 "$DB_NAME" ".quit"
EXIT_CODE=$?
return $?
else
echo "SQLite database file $DB_NAME already exists."
return 1
fi
}
setup_database() {
case "$DB_SYSTEM" in
mysql) create_mysql_database ;;
psql) create_psql_database ;;
sqlite) create_sqlite_database ;;
*) echo "Invalid system selected."; exit 1 ;;
esac
}
# Configuración inicial
read -p "Which database system are you using? (mysql/psql/sqlite): " DB_SYSTEM
# Verifica si el sistema de base de datos está instalado
ERROR_DB_NOT_INSTALLED="is not installed or not found in PATH. Please install it."
if [ "$DB_SYSTEM" == "mysql" ]; then
command -v mysql &>/dev/null || { echo "MySQL $ERROR_DB_NOT_INSTALLED"; exit 1; }
elif [ "$DB_SYSTEM" == "psql" ]; then
command -v psql &>/dev/null || { echo "PostgreSQL $ERROR_DB_NOT_INSTALLED"; exit 1; }
elif [ "$DB_SYSTEM" == "sqlite" ]; then
command -v sqlite3 &>/dev/null || { echo "SQLite $ERROR_DB_NOT_INSTALLED"; exit 1; }
else
echo "Invalid database system. Please choose either 'mysql', 'psql', or 'sqlite'."
exit 1
fi
else
# Parámetros básicos
DEFAULT_DB_NAME="drust"
DEFAULT_DB_USER="drust"
DEFAULT_DB_PASS="demo"
DEFAULT_DB_HOST="localhost"
DEFAULT_DB_PORT=""
DEFAULT_DB_ADMIN="root"
# Prompt for database details, allow defaults
echo
echo "You will be prompted to provide details for creating database."
echo "Press ENTER to accept the default values."
echo
read -p "Enter database name [$DEFAULT_DB_NAME]: " DB_NAME
DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME}
if [[ -z "$DB_NAME" || ! "$DB_NAME" =~ ^[a-zA-Z0-9_\-]+$ ]]; then
echo "Invalid database name. Use only alphanumeric characters, dashes, or underscores."
exit 1
fi
if [ "$DB_SYSTEM" == "sqlite" ]; then
# Verifica si el archivo tiene una extensión válida para SQLite
[[ "$DB_NAME" != *".sqlite" && "$DB_NAME" != *".db" ]] && DB_NAME="$DB_NAME.sqlite"
else
read -p "Enter database user [$DEFAULT_DB_USER]: " DB_USER
DB_USER=${DB_USER:-$DEFAULT_DB_USER}
@ -67,53 +137,34 @@ else
read -p "Enter database host [$DEFAULT_DB_HOST]: " DB_HOST
DB_HOST=${DB_HOST:-$DEFAULT_DB_HOST}
# Prompt for database system root or another privileged user's credentials
echo
# Puerto por defecto para MySQL
[ "$DB_SYSTEM" == "mysql" ] && DEFAULT_DB_PORT="3306"
# Puerto por defecto para PostgreSQL
[ "$DB_SYSTEM" == "psql" ] && DEFAULT_DB_PORT="5432"
read -p "Enter database port [$DEFAULT_DB_PORT]: " DB_PORT
DB_PORT=${DB_PORT:-$DEFAULT_DB_PORT}
read -p "Enter $DB_SYSTEM admin user [$DEFAULT_DB_ADMIN]: " DB_ADMIN
DB_ADMIN=${DB_ADMIN:-$DEFAULT_DB_ADMIN}
read -sp "Enter $DB_SYSTEM admin password: " DB_ADMIN_PASS
echo
fi
# Confirm before proceeding
# Confirmar antes de proceder
echo
echo "You are about to create the database \"$DB_NAME\" and assign privileges to user \"$DB_USER\"."
echo "You are about to create the database \"$DB_NAME\"."
read -p "Are you sure you want to proceed? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "Operation cancelled."
exit 1
fi
# Execute commands for MySQL or PostgreSQL
if [ "$DB_SYSTEM" == "mysql" ]; then
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" <<EOF
CREATE DATABASE IF NOT EXISTS $DB_NAME;
CREATE USER IF NOT EXISTS '$DB_USER'@'$DB_HOST' IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'$DB_HOST';
FLUSH PRIVILEGES;
EOF
elif [ "$DB_SYSTEM" == "postgresql" ]; then
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" <<EOF
CREATE DATABASE IF NOT EXISTS $DB_NAME;
DO \$\$
BEGIN
IF NOT EXISTS (
SELECT FROM pg_catalog.pg_user
WHERE usename = '$DB_USER') THEN
CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';
END IF;
END
\$\$;
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
EOF
fi
EXIT_CODE=$?
fi
setup_database
if [ $EXIT_CODE -eq 0 ]; then
echo "Operation completed."
if [ $? -eq 0 ]; then
echo "Database setup completed successfully."
exit 0
else
echo "An error occurred. Exit code: $EXIT_CODE"
echo "An error occurred during database setup."
exit 1
fi
# Exit the script with the mysql command's exit code
exit $EXIT_CODE

137
tools/delete-drust-db.sh Executable file
View file

@ -0,0 +1,137 @@
#!/bin/bash
delete_mysql_database() {
echo "Deleting MySQL database \"$DB_NAME\" and user \"$DB_USER\"..."
# Elimina la base de datos si existe
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \
"DROP DATABASE IF EXISTS $DB_NAME;"
[ $? -ne 0 ] && { echo "Error deleting database \"$DB_NAME\"."; return 1; }
# Elimina el usuario si existe
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" -P "$DB_PORT" -e \
"DROP USER IF EXISTS '$DB_USER'@'$DB_HOST'; FLUSH PRIVILEGES;"
[ $? -ne 0 ] && { echo "Error deleting user \"$DB_USER\"."; return 1; }
return 0
}
delete_psql_database() {
echo "Deleting PostgreSQL database \"$DB_NAME\" and user \"$DB_USER\"..."
# Elimina la base de datos si existe
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c \
"DROP DATABASE IF EXISTS $DB_NAME;"
[ $? -ne 0 ] && { echo "Error deleting database \"$DB_NAME\"."; return 1; }
# Elimina el usuario si existe
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" -p "$DB_PORT" -c \
"DROP ROLE IF EXISTS $DB_USER;"
[ $? -ne 0 ] && { echo "Error deleting user \"$DB_USER\"."; return 1; }
return 0
}
delete_sqlite_database() {
echo "Deleting SQLite database \"$DB_NAME\"..."
if [ -f "$DB_NAME" ]; then
rm "$DB_NAME"
if [ $? -ne 0 ]; then
echo "Error deleting SQLite database \"$DB_NAME\"."
return 1
fi
else
echo "SQLite database \"$DB_NAME\" does not exist."
return 1
fi
return 0
}
setup_database_deletion() {
case "$DB_SYSTEM" in
mysql) delete_mysql_database ;;
psql) delete_psql_database ;;
sqlite) delete_sqlite_database ;;
*) echo "Invalid system selected."; exit 1 ;;
esac
}
# Configuración inicial
read -p "Which database system are you using? (mysql/psql/sqlite): " DB_SYSTEM
# Verifica si el sistema de base de datos está instalado
ERROR_DB_NOT_INSTALLED="is not installed or not found in PATH. Please install it."
if [ "$DB_SYSTEM" == "mysql" ]; then
command -v mysql &>/dev/null || { echo "MySQL $ERROR_DB_NOT_INSTALLED"; exit 1; }
elif [ "$DB_SYSTEM" == "psql" ]; then
command -v psql &>/dev/null || { echo "PostgreSQL $ERROR_DB_NOT_INSTALLED"; exit 1; }
elif [ "$DB_SYSTEM" == "sqlite" ]; then
command -v sqlite3 &>/dev/null || { echo "SQLite $ERROR_DB_NOT_INSTALLED"; exit 1; }
else
echo "Invalid database system. Please choose either 'mysql', 'psql', or 'sqlite'."
exit 1
fi
# Parámetros básicos
DEFAULT_DB_NAME="drust"
DEFAULT_DB_USER="drust"
DEFAULT_DB_HOST="localhost"
DEFAULT_DB_PORT=""
DEFAULT_DB_ADMIN="root"
echo
echo "You will be prompted to provide details for deleting database."
echo "Press ENTER to accept the default values."
echo
read -p "Enter database name to delete [$DEFAULT_DB_NAME]: " DB_NAME
DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME}
if [[ -z "$DB_NAME" || ! "$DB_NAME" =~ ^[a-zA-Z0-9_\-]+$ ]]; then
echo "Invalid database name. Use only alphanumeric characters, dashes, or underscores."
exit 1
fi
if [ "$DB_SYSTEM" == "sqlite" ]; then
# Verifica si el archivo tiene una extensión válida para SQLite
[[ "$DB_NAME" != *".sqlite" && "$DB_NAME" != *".db" ]] && DB_NAME="$DB_NAME.sqlite"
else
read -p "Enter database user to delete [$DEFAULT_DB_USER]: " DB_USER
DB_USER=${DB_USER:-$DEFAULT_DB_USER}
read -p "Enter database host [$DEFAULT_DB_HOST]: " DB_HOST
DB_HOST=${DB_HOST:-$DEFAULT_DB_HOST}
# Puerto por defecto para MySQL
[ "$DB_SYSTEM" == "mysql" ] && DEFAULT_DB_PORT="3306"
# Puerto por defecto para PostgreSQL
[ "$DB_SYSTEM" == "psql" ] && DEFAULT_DB_PORT="5432"
read -p "Enter database port [$DEFAULT_DB_PORT]: " DB_PORT
DB_PORT=${DB_PORT:-$DEFAULT_DB_PORT}
read -p "Enter $DB_SYSTEM admin user [$DEFAULT_DB_ADMIN]: " DB_ADMIN
DB_ADMIN=${DB_ADMIN:-$DEFAULT_DB_ADMIN}
read -sp "Enter $DB_SYSTEM admin password: " DB_ADMIN_PASS
echo
fi
# Confirmar antes de proceder
echo
echo "You are about to delete the database \"$DB_NAME\" and user \"$DB_USER\"."
read -p "Are you sure you want to proceed? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "Operation cancelled."
exit 1
fi
setup_database_deletion
if [ $? -eq 0 ]; then
echo "Database and user deleted successfully."
exit 0
else
echo "An error occurred during database deletion."
exit 1
fi

View file

@ -1,105 +0,0 @@
#!/bin/bash
# Ask the user which database system to use
read -p "Which database system are you using? (mysql/postgresql/sqlite): " DB_SYSTEM
# Check if selected database system is installed
if [ "$DB_SYSTEM" == "mysql" ]; then
if ! command -v mysql &> /dev/null; then
echo "mysql is not installed or not found in PATH. Please install mysql and try again."
exit 1
fi
elif [ "$DB_SYSTEM" == "postgresql" ]; then
if ! command -v psql &> /dev/null; then
echo "postgresql is not installed or not found in PATH. Please install postgresql and try again."
exit 1
fi
elif [ "$DB_SYSTEM" == "sqlite" ]; then
if ! command -v sqlite3 &> /dev/null; then
echo "sqlite3 is not installed or not found in PATH. Please install sqlite3 and try again."
exit 1
fi
else
echo "Invalid database system selected. Please choose either 'mysql', 'postgresql', or 'sqlite'."
exit 1
fi
EXIT_CODE=0
echo
echo "You will be prompted to provide details to delete the Drust database."
echo "Press ENTER to accept the default values."
echo
if [ "$DB_SYSTEM" == "sqlite" ]; then
DEFAULT_DB_NAME="drust.db"
# Only prompt for database name
read -p "Enter database name to delete [$DEFAULT_DB_NAME]: " DB_NAME
DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME}
# For SQLite, check if the database file exists and delete it
if [ -f "$DB_NAME" ]; then
echo "Deleting SQLite database file: $DB_NAME"
rm "$DB_NAME"
EXIT_CODE=$?
else
echo "SQLite database file $DB_NAME does not exist."
exit 1
fi
else
DEFAULT_DB_NAME="drust"
DEFAULT_DB_USER="drust"
DEFAULT_DB_HOST="localhost"
DEFAULT_DB_ADMIN="root"
# Prompt for database details, allow defaults
read -p "Enter database name to delete [$DEFAULT_DB_NAME]: " DB_NAME
DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME}
read -p "Enter database user to delete [$DEFAULT_DB_USER]: " DB_USER
DB_USER=${DB_USER:-$DEFAULT_DB_USER}
read -p "Enter database host [$DEFAULT_DB_HOST]: " DB_HOST
DB_HOST=${DB_HOST:-$DEFAULT_DB_HOST}
# Prompt for database system root or another privileged user's credentials
echo
read -p "Enter $DB_SYSTEM admin user [$DEFAULT_DB_ADMIN]: " DB_ADMIN
DB_ADMIN=${DB_ADMIN:-$DEFAULT_DB_ADMIN}
read -sp "Enter $DB_SYSTEM admin password: " DB_ADMIN_PASS
echo
# Confirm before proceeding
echo
echo "You are about to delete the database \"$DB_NAME\"."
read -p "Are you sure you want to proceed? (y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
echo "Operation cancelled."
exit 1
fi
# Execute commands for MySQL or PostgreSQL
if [ "$DB_SYSTEM" == "mysql" ]; then
MYSQL_PWD="$DB_ADMIN_PASS" mysql -u "$DB_ADMIN" -h "$DB_HOST" <<EOF
DROP DATABASE $DB_NAME;
DROP USER '$DB_USER'@'$DB_HOST';
FLUSH PRIVILEGES;
EOF
elif [ "$DB_SYSTEM" == "postgresql" ]; then
PGPASSWORD="$DB_ADMIN_PASS" psql -U "$DB_ADMIN" -h "$DB_HOST" <<EOF
DROP DATABASE $DB_NAME;
DROP ROLE IF EXISTS $DB_USER;
EOF
fi
EXIT_CODE=$?
fi
if [ $EXIT_CODE -eq 0 ]; then
echo "Database deletion completed successfully."
else
echo "An error occurred during database deletion. Exit code: $EXIT_CODE"
fi
# Exit the script with the mysql command's exit code
exit $EXIT_CODE