#!/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

# Mise à jour du système
update_system

PASS_FILE=~/mariadb_root_password.txt
DEBIAN_CNF=/etc/mysql/debian.cnf
MARIADB_CNF=/etc/mysql/mariadb.conf.d/50-server.cnf

echo "=== Installation de MariaDB ==="
apt install -y mariadb-server mariadb-client

echo "=== Activation et démarrage de MariaDB ==="
systemctl enable mariadb
systemctl start mariadb

echo "=== Configuration du bind-address pour bloquer les connexions externes ==="
if grep -q "^bind-address" $MARIADB_CNF; then
    sed -i 's/^bind-address.*/bind-address = 127.0.0.1/' $MARIADB_CNF
else
    echo "bind-address = 127.0.0.1" >> $MARIADB_CNF
fi

echo "=== Activation du log binaire et purge automatique des anciens logs ==="
if ! grep -q "^log-bin" "$MARIADB_CNF"; then
    cat >> "$MARIADB_CNF" <<EOL

# Journalisation binaire activée pour la réplication et la sécurité
log-bin = /var/log/mysql/mariadb-bin
expire_logs_days = 7
EOL
fi

echo "=== Vérification et création du répertoire pour les binlogs ==="
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql
chmod 750 /var/log/mysql


systemctl restart mariadb

echo "=== Gestion du mot de passe administrateur ==="

# 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
}

# Générer ou récupérer le mot de passe root MariaDB
if [[ -f "$PASS_FILE" ]]; then
    DB_ROOT_PASSWORD=$(grep 'root password:' "$PASS_FILE" | awk '{print $3}')
    echo "Mot de passe root existant récupéré."
else
    # 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
        # Tentative dans d'autres fichiers .cnf ou .conf connus
        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 pas de mot de passe trouvé, demander ou générer
    if [[ -z "$DB_ROOT_PASSWORD" ]]; then
        echo -n "Entrez un mot de passe root pour MariaDB ou le mot de passe existant (laisser vide pour générer automatiquement) : "
        read -r -s USER_PASSWORD
        echo
        if [[ -n "$USER_PASSWORD" ]]; then
            DB_ROOT_PASSWORD="$USER_PASSWORD"
            echo "Mot de passe root défini par l'utilisateur."
        else
            DB_ROOT_PASSWORD=$(generate_token 64)
            echo "Mot de passe root généré automatiquement."
            echo "root password: $DB_ROOT_PASSWORD" > "$PASS_FILE"
            chmod 600 "$PASS_FILE"
            echo "Mot de passe root sauvegardé dans $PASS_FILE."
        fi
    fi

fi


echo "=== Sécurisation de MariaDB ==="
mysql -u root -p"$DB_ROOT_PASSWORD" <<EOF
-- Définir le mot de passe root correctement
ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_ROOT_PASSWORD';

-- Supprimer les utilisateurs anonymes
DELETE FROM mysql.user WHERE User='';

-- Supprimer tout accès root externe ou d'autres users externes
DELETE FROM mysql.user WHERE Host NOT IN ('localhost', '127.0.0.1', '::1');

-- Supprimer la base de test si elle existe
DROP DATABASE IF EXISTS test;

-- Supprimer les droits sur la base de test
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';

-- Recharger les privilèges
FLUSH PRIVILEGES;
EOF

echo "=== Mise à jour de /etc/mysql/debian.cnf pour les scripts de maintenance ==="
cat > /etc/mysql/debian.cnf <<EOL
[client]
host     = localhost
user     = root
password = $DB_ROOT_PASSWORD
socket   = /run/mysqld/mysqld.sock

[mysql_upgrade]
host     = localhost
user     = root
password = $DB_ROOT_PASSWORD
socket   = /run/mysqld/mysqld.sock
EOL
chmod 600 /etc/mysql/debian.cnf

echo "=== Vérification de la présence de PHP ==="
if command -v php >/dev/null 2>&1; then
    PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
    echo "PHP version détectée : $PHP_VERSION"

    echo "=== Installation de php-mysql pour PHP $PHP_VERSION ==="
    apt install -y php${PHP_VERSION}-mysql

    echo "=== Redémarrage d'Apache si installé ==="
    if systemctl list-units --type=service | grep -q apache2; then
        systemctl restart apache2
        echo "Apache redémarré"
    fi

    echo "=== Redémarrage de PHP-FPM si installé ==="
    if systemctl list-units --type=service | grep -q php${PHP_VERSION}-fpm; then
        systemctl restart php${PHP_VERSION}-fpm
        echo "PHP-FPM redémarré"
    fi
else
    echo "PHP n'est pas installé. Installation de MariaDB terminée sans liaison PHP."
fi

echo "=== Fin de l'installation et sécurisation de MariaDB ==="
