🔨 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 e2f09b3127
commit fedaaebce9
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