🔨 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
# 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
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
# 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
# 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; }
return 0
}
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\"..."
if [ ! -f "$DB_NAME" ]; then
sqlite3 "$DB_NAME" ".quit"
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
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
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
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
command -v sqlite3 &>/dev/null || { echo "SQLite $ERROR_DB_NOT_INSTALLED"; exit 1; }
else
echo "Invalid database system selected. Please choose either 'mysql', 'postgresql', or 'sqlite'."
echo "Invalid database system. Please choose either 'mysql', 'psql', or 'sqlite'."
exit 1
fi
EXIT_CODE=0
# 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"
echo
echo "You will be prompted to provide details for creating the Drust database."
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
DEFAULT_DB_NAME="drust.db"
# 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}
# 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=$?
else
echo "SQLite database file $DB_NAME already exists."
exit 1
fi
# Verifica si el archivo tiene una extensión válida para SQLite
[[ "$DB_NAME" != *".sqlite" && "$DB_NAME" != *".db" ]] && DB_NAME="$DB_NAME.sqlite"
else
DEFAULT_DB_NAME="drust"
DEFAULT_DB_USER="drust"
DEFAULT_DB_PASS="demo"
DEFAULT_DB_HOST="localhost"
DEFAULT_DB_ADMIN="root"
# Prompt for database details, allow defaults
read -p "Enter database name [$DEFAULT_DB_NAME]: " DB_NAME
DB_NAME=${DB_NAME:-$DEFAULT_DB_NAME}
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
# Confirm before proceeding
echo
echo "You are about to create the database \"$DB_NAME\" and assign privileges to 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
# 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
if [ $EXIT_CODE -eq 0 ]; then
echo "Operation completed."
# Confirmar antes de proceder
echo
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
setup_database
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