#!/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 set -e # Demande interactive si le rôle n’est pas passé en paramètre if [[ -n "$1" ]]; then ROLE_NAME="$1" else read -p "👤 Entrez le nom du rôle PostgreSQL à créer : " ROLE_NAME fi if [[ -z "$ROLE_NAME" ]]; then echo "❌ Le nom du rôle est obligatoire." exit 1 fi # Demander le mot de passe de l'utilisateur 'postgres' read -s -p "🔑 Entrez le mot de passe de l'utilisateur 'postgres' : " POSTGRES_PASSWORD echo "" # Générer le mot de passe du rôle echo "🔐 Génération d'un mot de passe fort pour le rôle '$ROLE_NAME'..." ROLE_PASSWORD=$(generate_token 20) # Générer un fichier SQL temporaire pour la vérification + création SQL_FILE=$(mktemp) cat < "$SQL_FILE" DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${ROLE_NAME}') THEN RAISE NOTICE '🛠 Création du rôle "${ROLE_NAME}"...'; CREATE ROLE ${ROLE_NAME} WITH LOGIN PASSWORD '${ROLE_PASSWORD}'; ELSE RAISE NOTICE '⚠️ Le rôle "${ROLE_NAME}" existe déjà.'; END IF; END \$\$; EOF # Une seule exécution de psql via sudo avec mot de passe PostgreSQL exporté echo "🔎 Exécution des commandes SQL avec sudo..." sudo -u postgres bash -c "PGPASSWORD='${POSTGRES_PASSWORD}' psql -v ON_ERROR_STOP=1 -f '${SQL_FILE}'" rm -f "$SQL_FILE" # Affichage des identifiants si création echo "" echo "-------------------------------------------" echo " Nom du rôle : ${ROLE_NAME}" echo " Mot de passe : ${ROLE_PASSWORD}" echo "-------------------------------------------" # Proposer d’enregistrer dans ~/.pgpass read -p "💾 Voulez-vous enregistrer ces identifiants dans ~/.pgpass ? (y/n) " SAVE_PASS if [[ "$SAVE_PASS" =~ ^[Yy]$ ]]; then PGPASS_FILE="${HOME}/.pgpass" echo "*:*:*:${ROLE_NAME}:${ROLE_PASSWORD}" >> "$PGPASS_FILE" chmod 600 "$PGPASS_FILE" echo "✅ Identifiants sauvegardés dans $PGPASS_FILE" fi echo "⚠️ Pensez à sauvegarder ces informations si vous ne les enregistrez pas." echo "🎉 Opération terminée."