158 lines
4.8 KiB
Bash
Executable File
158 lines
4.8 KiB
Bash
Executable File
#!/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"
|