#!/bin/bash # pihole-alpine-install.sh # Script d'installation et correction Pi-hole pour Alpine Linux set -e echo "==========================================" echo " Installation Pi-hole sur Alpine Linux" echo "==========================================" # Vérifier que c'est Alpine if [ ! -f /etc/alpine-release ]; then echo "❌ Ce script est conçu pour Alpine Linux uniquement" exit 1 fi # Vérifier root if [ "$EUID" -ne 0 ]; then echo "❌ Veuillez exécuter en root: sudo bash $0" exit 1 fi # Couleurs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # Fonction de log log() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" } # Étape 1: Installation des dépendances log "Étape 1: Installation des dépendances système..." apk update apk add sudo bash nano wget curl # Étape 2: Téléchargement de l'installateur Pi-hole log "Étape 2: Téléchargement de l'installateur Pi-hole..." wget -O basic-install.sh https://install.pi-hole.net if [ ! -f basic-install.sh ]; then error "Échec du téléchargement de l'installateur" exit 1 fi chmod +x basic-install.sh # Étape 3: Installation de Pi-hole log "Étape 3: Installation de Pi-hole..." log "⚠️ L'installation peut prendre plusieurs minutes..." bash basic-install.sh # Vérifier si l'installation a réussi if [ $? -ne 0 ]; then warn "L'installation a rencontré des erreurs, continuation des corrections..." fi # Étape 4: Correction du service FTL log "Étape 4: Correction du service Pi-hole FTL..." # Vérifier si le service existe if [ ! -f /etc/init.d/pihole-FTL ]; then error "Service pihole-FTL non trouvé, l'installation a peut-être échoué" exit 1 fi # Sauvegarder le service original cp /etc/init.d/pihole-FTL /etc/init.d/pihole-FTL.backup log "Sauvegarde créée: /etc/init.d/pihole-FTL.backup" # Créer le service corrigé cat > /tmp/pihole-FTL-fixed << 'EOF' #!/sbin/openrc-run # shellcheck shell=sh disable=SC2034 : "${PI_HOLE_SCRIPT_DIR:=/opt/pihole}" command="/usr/bin/pihole-FTL" command_user="pihole:pihole" supervisor=supervise-daemon command_args_foreground="-f" command_background=true pidfile="/run/${RC_SVCNAME}_openrc.pid" extra_started_commands="reload" respawn_max=5 respawn_period=60 # NOTE: Capabilities commentées - gérées manuellement #capabilities="^CAP_NET_BIND_SERVICE,^CAP_NET_RAW,^CAP_NET_ADMIN,^CAP_SYS_NICE,^CAP_IPC_LOCK,^CAP_CHOWN,^CAP_SYS_TIME" depend() { want net provide dns } checkconfig() { $command -f test } start_pre() { # Appliquer manuellement la capacité NET_BIND_SERVICE setcap 'cap_net_bind_service,cap_net_raw,cap_net_admin,cap_sys_nice,cap_ipc_lock,cap_chown,cap_sys_time=+ep' /usr/bin/pihole-FTL 2>/dev/null || true sh "${PI_HOLE_SCRIPT_DIR}/pihole-FTL-prestart.sh" } stop_post() { sh "${PI_HOLE_SCRIPT_DIR}/pihole-FTL-poststop.sh" } reload() { checkconfig || return $? ebegin "Reloading ${RC_SVCNAME}" start-stop-daemon --signal HUP --pidfile "${pidfile}" eend $? } EOF # Appliquer le correctif mv /tmp/pihole-FTL-fixed /etc/init.d/pihole-FTL chmod +x /etc/init.d/pihole-FTL # Appliquer la capacité manuellement # log "Application des capacités réseau..." # setcap cap_net_bind_service=+ep /usr/bin/pihole-FTL 2>/dev/null || true # Vérifier la capacité #if getcap /usr/bin/pihole-FTL | grep -q "cap_net_bind_service"; then # log "✅ Capacité NET_BIND_SERVICE appliquée avec succès" #else # warn "⚠️ Impossible d'appliquer la capacité, vérification manuelle nécessaire" #fi # Étape 5: Démarrer le service log "Étape 5: Démarrage du service Pi-hole FTL..." rc-update add pihole-FTL default service pihole-FTL restart # Attendre que le service se stabilise sleep 5 # Étape 6: Vérifications finales log "Étape 6: Vérifications finales..." echo "--- Statut du service ---" service pihole-FTL status echo "--- Processus Pi-hole ---" ps aux | grep pihole | grep -v grep || warn "Aucun processus Pi-hole trouvé" echo "--- Port DNS (53) ---" netstat -tulpn | grep ':53' || ss -tulpn | grep ':53' || warn "Aucun service sur le port 53" echo "--- Test DNS local ---" if nslookup google.com 127.0.0.1 >/dev/null 2>&1; then log "✅ Test DNS réussi" else warn "⚠️ Test DNS échoué" fi # # Étape 7: Ajout des listes externe log "Ajout des listes externe..." pihole-FTL sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled, comment) VALUES ('https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts', 1, 'Ajoutée via script le $(date)');" pihole-FTL sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled, comment) VALUES ('https://big.oisd.nl/', 1, 'Ajoutée via script le $(date)');" pihole-FTL sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled, comment) VALUES ('https://cdn.jsdelivr.net/gh/hagezi/dns-blocklists@latest/adblock/pro.txt', 1, 'Ajoutée via script le $(date)');" # 4. Mettre à jour Gravity pour télécharger les listes log "Mise à jour de la base de données Gravity (peut être long)..." pihole -g log "Configuration des listes terminée !" # Étape 7: Définir un mot de passe admin log "Étape 8: Configuration du mot de passe admin..." # Générer un mot de passe aléatoire PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 12) # Définir le mot de passe if pihole setpassword "$PASSWORD" >/dev/null 2>&1; then log "✅ Mot de passe admin défini avec succès" echo "" echo "🔐 MOT DE PASSE ADMIN: $PASSWORD" echo "📝 Vous pouvez le changer avec: pihole setpassword" echo "" else warn "⚠️ Impossible de définir le mot de passe automatiquement" echo "📝 Définissez-le manuellement avec: pihole setpassword" fi # Étape 8: Instructions finales log "Installation terminée!" echo "" echo "📋 PROCHAINES ÉTAPES:" echo "1. Configurer vos appareils pour utiliser cette machine comme DNS" echo "2. Accéder à l'interface web: http://$(hostname -s | awk '{print $1}')/admin/" echo "" echo "🔄 Redémarrage recommandé pour s'assurer que tout fonctionne correctement:" echo " reboot" echo "" echo "🐛 En cas de problème:" echo " sudo tail -f /var/log/pihole/FTL.log" echo " sudo service pihole-FTL status" # Nettoyage rm -f basic-install.sh echo "" log "Script d'installation terminé avec succès! 🎉"