Files
notes-techniques/scripts/server-mariadb/create_db.sh
2025-03-23 17:27:49 +01:00

158 lines
4.8 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
# Importer les fonctions communes
source "$(dirname "$0")/../common/common_utils.sh"
# Vérifier si le script est exécuté en root
check_root
echo "=== Gestion du mot de passe administrateur ==="
# Vérifier la présence de la commande mysql
if ! command -v mysql >/dev/null 2>&1; then
echo "❌ La commande 'mysql' est introuvable. Veuillez l'installer."
exit 1
fi
# Fonction de recherche dans un fichier cnf ou conf
get_password_from_cnf() {
local file=$1
if [[ -f "$file" ]]; then
PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g')
if [[ -n "$PASSWORD" ]]; then
echo "$PASSWORD"
return 0
fi
fi
return 1
}
# Tentative de récupération depuis /etc/mysql/debian.cnf
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
echo "✅ Mot de passe root récupéré depuis /etc/mysql/debian.cnf"
else
# Recherche dans d'autres fichiers .cnf ou .conf
for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do
DB_ROOT_PASSWORD=$(get_password_from_cnf "$file")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
echo "✅ Mot de passe root trouvé dans $file"
break
fi
done
fi
# Si toujours rien, demande à l'utilisateur
if [[ -z "$DB_ROOT_PASSWORD" ]]; then
echo -n "🔐 Entrez le mot de passe root pour MariaDB : "
read -r -s USER_PASSWORD
echo
DB_ROOT_PASSWORD="$USER_PASSWORD"
fi
# Création d'un fichier temporaire sécurisé pour la connexion MySQL
TEMP_CNF=$(mktemp)
chmod 600 "$TEMP_CNF"
cat > "$TEMP_CNF" <<EOF
[client]
user=root
password=$DB_ROOT_PASSWORD
EOF
# TEST du mot de passe root
echo "🔎 Test de connexion avec le mot de passe root..."
if ! mysql --defaults-extra-file="$TEMP_CNF" -e "SELECT 1;" 2>/dev/null; then
echo "❌ Échec de la connexion avec le mot de passe root. Arrêt du script."
rm -f "$TEMP_CNF"
exit 1
fi
echo "✅ Connexion root réussie."
# Définir la variable MYSQL_CMD pour le reste du script
MYSQL_CMD="mysql --defaults-extra-file=$TEMP_CNF"
# N'oublie pas de prévoir un nettoyage à la fin :
trap 'rm -f "$TEMP_CNF"' EXIT
echo "=== Création d'une nouvelle base de données MariaDB ==="
# Lecture du nom de la base de données
read -rp "Nom de la base de données : " DB_NAME
if [[ -z "$DB_NAME" ]]; then
echo "❌ Nom de base de données requis."
rm -f "$TEMP_CNF"
exit 1
fi
# Vérification de l'existence de la base de données
DB_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'")
if [[ "$DB_EXISTS" == "$DB_NAME" ]]; then
echo "❌ La base de données '$DB_NAME' existe déjà."
rm -f "$TEMP_CNF"
exit 1
fi
# Lecture du nom de l'utilisateur
read -rp "Nom de l'utilisateur : " DB_USER
if [[ -z "$DB_USER" ]]; then
echo "❌ Nom d'utilisateur requis."
rm -f "$TEMP_CNF"
exit 1
fi
# Vérification de l'existence de l'utilisateur
USER_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT COUNT(*) FROM mysql.user WHERE user='$DB_USER'")
if [[ "$USER_EXISTS" -gt 0 ]]; then
echo " L'utilisateur '$DB_USER' existe déjà. Il ne sera pas recréé."
CREATE_USER_SQL=""
USER_PASS_TO_SAVE=""
else
echo "✅ L'utilisateur '$DB_USER' sera créé."
# Demande du mot de passe utilisateur ou génération
read -rsp "Mot de passe de l'utilisateur (laisser vide pour générer) : " DB_PASS
echo
if [[ -z "$DB_PASS" ]]; then
DB_PASS=$(generate_token 64)
echo "🔑 Mot de passe généré : $DB_PASS"
fi
CREATE_USER_SQL="CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
USER_PASS_TO_SAVE="$DB_PASS"
fi
# Création de la base et attribution des droits
SQL=$(cat <<EOF
CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
$CREATE_USER_SQL
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
EOF
)
echo "✅ Exécution de la création..."
if mysql --defaults-extra-file="$TEMP_CNF" -e "$SQL"; then
echo "🎉 Base de données '$DB_NAME' créée et droits attribués à '$DB_USER'."
else
echo "❌ Erreur lors de la création."
rm -f "$TEMP_CNF"
exit 1
fi
# Sauvegarde des identifiants
if [[ -n "$USER_PASS_TO_SAVE" ]]; then
TIMESTAMP=$(date +%Y%m%d%H%M%S)
CRED_FILE="db_${DB_NAME}_${TIMESTAMP}.credentials"
umask 077 # Restriction immédiate des droits sur le fichier
{
printf "Base: %s\n" "$DB_NAME"
printf "User: %s\n" "$DB_USER"
printf "Password: %s\n" "$USER_PASS_TO_SAVE"
} > "$CRED_FILE"
echo "🔒 Identifiants sauvegardés dans $CRED_FILE"
fi
# Nettoyage du fichier temporaire de connexion
rm -f "$TEMP_CNF"