Starmate Posts

10 février 2026 /

Si par erreur vous avez verrouillé un compte centreon, voici comment le déverrouiller (ici pour le compte admin) dans mariadb/mysql:

USE centreon;
UPDATE contact SET login_attempts = NULL, blocking_time = NULL WHERE contact_alias = 'admin';

Et si vous voulez changer le mot de passe, dans cet exemple le hash correspond a « centreon »:

USE centreon;
INSERT INTO contact_password (password, contact_id, creation_date) SELECT '$2y$10$ubq1hJ9z3YPXBhejjae.Ie9u3AcMrwFNImPhOnnkLmEoNtwRGwNrC', contact_id, UNIX_TIMESTAMP(NOW()) FROM contact WHERE contact_alias = 'admin';
1 février 2026 /
🎯 Ce que vous aurez à la fin de ce guide

  • ✅ Un agent CMA qui pousse ses métriques en TLS vers votre poller
  • ✅ Une authentification par token (obligatoire en 25.10 dès que le chiffrement est actif)
  • ✅ La création automatique des hôtes supervisés
  • ✅ Et surtout : une supervision qui alerte vraiment quand une machine tombe (le piège n°1 des débutants CMA)

🚀 1. Pourquoi passer de NRPE à CMA ?

CMA est l’agent de supervision nouvelle génération de Centreon. Contrairement à NRPE, il fonctionne en mode passif : l’agent exécute ses sondes localement et pousse les résultats vers le collecteur (poller) via le protocole OTLP (OpenTelemetry) sur gRPC. Résultat : une communication moderne, chiffrée et authentifiée.

NRPE (ancien) CMA (nouveau)
Transport TCP 5666, protocole maison OTLP / gRPC sur le port 4317
Sens de connexion Le poller interroge l’agent (pull) L’agent pousse ses données au poller (push)
Chiffrement SSL anonyme, pas d’authentification réelle TLS + token JWT
Création des hôtes Manuelle Automatique (create_host_auto)
🔥 Le détail qui change tout : les checks CMA sont passifs. Le poller n’interroge plus rien, il attend les données. Gardez ça en tête — on verra à l’étape 7 que ça a une conséquence sournoise sur la détection des pannes.

Deux modes de connexion

  • Mode standard (celui de ce guide) : l’agent initie la connexion vers le poller (agent → poller:4317). Idéal quand les agents peuvent joindre le central.
  • Mode inversé (reversed) : c’est le poller qui va vers l’agent. Utile derrière un pare-feu qu’on ne veut pas ouvrir en entrée (reversed_grpc_streaming: true).

✅ 2. Prérequis & pare-feu

Avant de commencer, assurez-vous d’avoir :

  • Un central Centreon 25.10 (ou 24.10+), sur RHEL 9 ou Debian 12. Chez moi : 192.168.1.46, Debian 12 (Bookworm).
  • Une licence Centreon IT Edition (offre gratuite, souvent appelée « IT-100 » car limitée à 100 hôtes) — indispensable pour les fonctions agent/OpenTelemetry. Voir l’encadré ci-dessous pour l’obtenir.
  • La connectivité réseau agent → poller sur le port 4317/tcp.
  • Le dépôt Centreon configuré (RPM ou APT) et un accès root/sudo partout.
ℹ️ Comment obtenir la licence IT Edition (gratuite)

  1. Rendez-vous sur centreon.com/free-trial et remplissez le formulaire pour demander la licence gratuite Centreon IT Edition : elle permet de superviser jusqu’à 100 hôtes, pour une durée illimitée.
  2. Vous recevez par email un token personnel qui sert de clé de licence.
  3. Activez-le en ligne sur votre plateforme avec ce token (procédure d’activation Centreon). ⚠️ Votre serveur Centreon doit garder un accès Internet permanent pour valider le token.
  4. Vérifiez que la licence est bien active avant d’installer le pack de plugins CMA — sans elle, les modèles d’agent n’apparaissent pas dans le catalogue.

Astuce : la page propose aussi des images toutes prêtes (AlmaLinux 9 ou Debian 12) si vous montez une plateforme neuve.

⚠️ Chiffrement = token obligatoire. Depuis la 25.10, dès que vous activez encryption: full, un token d’authentification devient indispensable. Sans lui, l’agent est rejeté. C’est voulu : pas de TLS sans identité.

2.1 Ouvrir le pare-feu sur le poller

Le poller doit accepter le port 4317/tcp en entrée.

🎩 RHEL / Alma / Rocky (firewalld)

firewall-cmd --permanent --add-port=4317/tcp
firewall-cmd --reload
firewall-cmd --list-ports

🌀 Debian / Ubuntu — généralement pas de pare-feu hôte actif. Si ufw est activé :

sudo ufw allow 4317/tcp
sudo ufw status

🗺️ 3. L’architecture en un coup d’œil

Avant de plonger dans les commandes, visualisons qui parle à qui :

   Machines supervisees (Linux/Windows)            Central Centreon 25.10 (192.168.1.46)
   +------------------------------+                +-----------------------------------+
   |  centreon-monitoring-agent   |   OTLP / gRPC  |  Serveur OTLP  (0.0.0.0:4317)      |
   |  centagent.json              | --TLS full---> |  otl_server.json                  |
   |  - endpoint 192.168.1.46:4317|   + token JWT  |  - public_cert / private_key       |
   |  - encryption: true          |                |  - trusted_tokens: [ JWT ]         |
   |  - execute les sondes         |                |  - create_host_auto: true          |
   +------------------------------+                |  Centreon Engine + Broker          |
                                                   +-----------------------------------+
  • Le poller écoute sur *:4317 (vérif : ss -ltn | grep 4317).
  • Le poller présente son certificat serveur ; l’agent s’authentifie par token.
  • Certificats auto-signés générés à la main sur le central (Let’s Encrypt inutile sur un LAN — voir l’encadré en étape 2).

📦 Étape 1 — Installer l’agent sur la machine à superviser

On commence par le plus simple : poser le paquet sur la machine à surveiller.

🎩 RHEL / Alma / Rocky

# Prerequis
dnf install -y dnf-plugins-core ca-certificates curl gpg wget

# Depot Centreon 25.10 (el9)
dnf config-manager --add-repo https://packages.centreon.com/rpm-standard/25.10/el9/centreon-25.10.repo

# Cle GPG Centreon
rpm --import https://packages.centreon.com/centreon.gpg

# Installation de l'agent
dnf clean all
dnf install -y centreon-monitoring-agent

🌀 Debian / Ubuntu

# Ajout du depot Centreon (si pas deja present)
echo "deb https://packages.centreon.com/apt-standard/ bookworm-25.10-stable main" \
  | sudo tee /etc/apt/sources.list.d/centreon.list

wget -O- https://packages.centreon.com/api/security/keypair/APT-GPG-KEY/public \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/centreon.gpg > /dev/null

sudo apt update
sudo apt install -y centreon-monitoring-agent

Vérifier la version installée :

# RHEL / Alma / Rocky
rpm -q centreon-monitoring-agent

# Debian / Ubuntu
dpkg -l | grep centreon-monitoring-agent
# ii  centreon-monitoring-agent   25.10.7-1+deb12u1   amd64   ...
🪟 Sous Windows : récupérez le MSI depuis Configuration > Collecteurs > Agents et lancez-le (GUI ou msiexec /i centreon-monitoring-agent.msi /quiet). La conf atterrit dans C:\Program Files\Centreon\CentreonMonitoringAgent\.

🔐 Étape 2 — Générer les certificats TLS (auto-signés)

C’est le cœur du sujet. Sur un réseau interne, on génère nos propres certificats auto-signés (openssl est identique sur RHEL et Debian). Tout se passe sur le central, en root.

ℹ️ Et Let’s Encrypt ? Si votre poller est sur un FQDN public, vous pouvez générer un certificat Let’s Encrypt avec certbot, copier fullchain.pem / privkey.pem vers les chemins de l’étape 2.3, et pointer le trust store système côté agent (/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem sur RHEL, /etc/ssl/certs/ca-certificates.crt sur Debian). Sur un LAN, l’auto-signé ci-dessous est plus simple et tout aussi sûr.

2.1 La CA (autorité de certification maison)

Centreon pose déjà une CA à l’installation (/etc/pki/centreon-engine/default_cma_ca.crt, valable 10 ans). Pour en créer une propre :

sudo mkdir -p /etc/pki/centreon-engine

# Cle privee de la CA
sudo openssl genrsa -out /etc/pki/centreon-engine/default_cma_ca.key 4096

# Certificat auto-signe de la CA (10 ans)
sudo openssl req -x509 -new -nodes \
  -key /etc/pki/centreon-engine/default_cma_ca.key \
  -sha256 -days 3650 \
  -subj "/CN=centreon/description=cma centreon auto signed certificate" \
  -out /etc/pki/centreon-engine/default_cma_ca.crt

2.2 Le certificat serveur (celui que le poller présente)

⚠️ Le piège classique : le certificat DOIT contenir un subjectAltName (SAN) avec le nom DNS et l’IP du poller. Sans SAN correct, l’agent refuse tout net la connexion TLS.

La commande ci-dessous produit exactement le certificat en place chez moi (CN=centreon, SAN = DNS:centreon, IP:192.168.1.46, valable 1 an) :

# Cle privee du serveur
sudo openssl genrsa -out /etc/pki/centreon-agent.key 4096

# Demande + signature en une passe, avec SAN
sudo openssl req -new -x509 -nodes -sha256 -days 365 \
  -key /etc/pki/centreon-agent.key \
  -subj "/CN=centreon" \
  -addext "subjectAltName=DNS:centreon,IP:192.168.1.46" \
  -out /etc/pki/centreon-agent.crt

2.3 Droits sur les fichiers

Le moteur tourne sous l’utilisateur centreon-engine, qui doit pouvoir lire la clé et le certificat :

sudo chown centreon-engine:centreon-engine \
  /etc/pki/centreon-agent.crt /etc/pki/centreon-agent.key
sudo chmod 640 /etc/pki/centreon-agent.key
sudo chmod 644 /etc/pki/centreon-agent.crt

# Verification
openssl x509 -in /etc/pki/centreon-agent.crt -noout -subject -dates -ext subjectAltName
🎩 Sur RHEL uniquement : si SELinux est actif, il faut en plus poser le bon contexte sur ces certificats — voir l’étape 6. Sous Debian, rien à faire.

2.4 Variante recommandée pour un parc : signer le certificat par la CA

L’auto-signé (2.2) est parfait pour démarrer. Mais sur un parc de plusieurs machines, il y a mieux : signer le certificat serveur par votre CA maison (celle du 2.1, valable 10 ans). Les agents feront alors confiance à la CA et non au certificat serveur — vous pourrez donc renouveler ce dernier chaque année sans jamais retoucher les agents.

# 1. Cle privee + demande de signature (CSR) du serveur
sudo openssl genrsa -out /etc/pki/centreon-agent.key 4096
sudo openssl req -new -key /etc/pki/centreon-agent.key \
  -subj "/CN=centreon" -out /tmp/centreon-agent.csr

# 2. Fichier d'extension portant le SAN (indispensable)
printf "subjectAltName=DNS:centreon,IP:192.168.1.46\n" | sudo tee /tmp/centreon-agent.ext

# 3. Signature du certificat serveur par la CA maison (valable 365 jours)
sudo openssl x509 -req -in /tmp/centreon-agent.csr \
  -CA /etc/pki/centreon-engine/default_cma_ca.crt \
  -CAkey /etc/pki/centreon-engine/default_cma_ca.key \
  -CAcreateserial -days 365 -sha256 \
  -extfile /tmp/centreon-agent.ext \
  -out /etc/pki/centreon-agent.crt

# 4. Nettoyage des fichiers temporaires
sudo rm -f /tmp/centreon-agent.csr /tmp/centreon-agent.ext

Réappliquez ensuite les droits (comme en 2.3). Côté agent, on ne pointe plus ca vers le certificat serveur mais vers la CA — que l’on copie une fois pour toutes sur chaque machine :

"ca": "/etc/pki/centreon-engine/default_cma_ca.crt",
"ca_common_name": "centreon",

Ici le CN de la CA vaut aussi centreon, donc ca_common_name ne change pas. C’est cette variante que je recommande dès que vous avez plus de deux ou trois agents.

🎫 Étape 3 — Créer le token d’authentification

Le token est un JWT (JSON Web Token : un jeton signé cryptographiquement qui encode quelques informations — son nom, sa date d’émission, son éventuelle expiration — et que le serveur peut vérifier à la volée grâce à sa signature, sans base de données) que le poller garde dans sa liste de confiance (trusted_tokens) et que l’agent présente à chaque connexion. On le crée dans Administration > Jetons d’authentification (ou depuis la page de config de l’agent). Choisissez sans expiration pour un usage permanent — le mien est un JWT permanent (exp: null) :

{ "name": "Central-xxxxxxxx", "iat": 1778186138, "exp": null }
🔒 Sécurité : la valeur du token n’est affichée qu’une seule fois à la création. Copiez-la immédiatement, ne la commitez jamais, ne la publiez jamais. Dans ce guide, tous les secrets sont remplacés par des placeholders.

🛰️ Étape 4 — Configurer le serveur OTLP côté central

⚠️ Prérequis interface à ne pas sauter : avant tout, installez le connecteur de supervision « Centreon Monitoring Agent » via Configuration > Gestionnaire de connecteurs de supervision (cherchez « Monitoring Agent » → Installer). C’est lui qui fournit les commandes agent et le modèle d’hôte OS-Linux-Centreon-Monitoring-Agent-custom référencé plus loin. Sans ce pack, la création automatique d’hôtes et les templates ne fonctionnent pas.

Ensuite, direction Configuration > Collecteurs > Agents. On y déclare le poller, le chiffrement (Encryption level : full), les chemins du certificat/clé de l’étape 2, et le token de l’étape 3. À l’export du collecteur, Centreon génère /etc/centreon-engine/otl_server.json. Voici le mien (secrets caviardés) :

{
    "otel_server": {
        "host": "0.0.0.0",
        "port": 4317,
        "encryption": "full",
        "public_cert": "/etc/pki/centreon-agent.crt",
        "private_key": "/etc/pki/centreon-agent.key",
        "ca_certificate": "",
        "trusted_tokens": [
            "eyJ0eXAiOiJKV1Qi....<VOTRE_TOKEN_JWT>....nEu8"
        ]
    },
    "centreon_agent": {
        "check_interval": 60,
        "export_period": 60,
        "create_host_auto": true
    }
}
📌 Ce fichier est régénéré à chaque export du collecteur : ne l’éditez pas à la main (vos modifications seraient écrasées), tout se règle depuis la Configuration d’agent dans l’UI. Je le montre uniquement pour comprendre ce que Centreon produit.

Les clés à retenir :

  • encryption: "full" → TLS activé, le poller présente son public_cert.
  • ca_certificate: "" → vide chez moi = pas de mTLS (pas de vérif du cert client). C’est le token qui authentifie l’agent. Plus simple à exploiter sur un parc.
  • create_host_auto: true → les hôtes inconnus sont créés automatiquement (rattachés à un modèle, étape 5).
  • check_interval / export_period → cadence des checks et des envois (60 s).

Puis on recharge le moteur :

systemctl reload centengine
ss -ltn | grep 4317        # doit etre en ecoute : *:4317

⚙️ Étape 5 — Configurer l’agent côté machine supervisée

Retour sur la machine à superviser : le fichier /etc/centreon-monitoring-agent/centagent.json. Gabarit à adapter :

{
    "log_file": "/var/log/centreon-monitoring-agent/centagent.log",
    "log_level": "info",
    "log_type": "file",
    "log_max_file_size": 10,
    "log_max_files": 3,
    "endpoint": "192.168.1.46:4317",
    "encryption": true,
    "public_cert": "",
    "private_key": "",
    "ca": "/etc/pki/centreon-agent.crt",
    "ca_common_name": "centreon",
    "token": "eyJ0eXAiOiJKV1Qi....<VOTRE_TOKEN_JWT>....nEu8",
    "host": "nom-de-la-machine",
    "reversed_grpc_streaming": false,
    "host_template": "OS-Linux-Centreon-Monitoring-Agent-custom"
}

Ce fichier est lu par le service centagent (utilisateur centreon-monitoring-agent). Comme il peut contenir le token, on restreint ses droits — par défaut il est en 664, lisible par tout le monde, ce qui est trop permissif :

# Proprietaire = le compte de service, lecture limitee au groupe
sudo chown centreon-monitoring-agent:centreon-monitoring-agent /etc/centreon-monitoring-agent/centagent.json
sudo chmod 640 /etc/centreon-monitoring-agent/centagent.json

# Le certificat de CA copie doit rester lisible par l'agent
sudo chmod 644 /etc/pki/centreon-agent.crt

Les points qui font échouer une install sur deux :

  • token → LE champ qu’on oublie tout le temps. C’est le même JWT que celui déclaré dans trusted_tokens côté serveur (étape 4). Sans lui, le chiffrement s’établit mais le poller rejette l’agent (« empty jwt token » dans les logs). Obligatoire dès que encryption est actif.
  • encryption: true → doit correspondre au full du serveur (en 25.10+, la chaîne "full" est aussi acceptée).
  • ca → le certificat de confiance. Mon cert serveur étant auto-signé, je pousse centreon-agent.crt sur l’agent : scp centreon@192.168.1.46:/etc/pki/centreon-agent.crt /etc/pki/centreon-agent.crt
  • ca_common_name: "centreon"doit être égal au CN du certificat serveur. C’est LA cause d’échec TLS la plus fréquente.
  • host → le nom sous lequel l’hôte apparaîtra dans Centreon.
  • host_template → le modèle appliqué à la création automatique.

On démarre et on surveille :

sudo systemctl enable --now centagent
sudo systemctl status centagent
sudo tail -f /var/log/centreon-monitoring-agent/centagent.log

🛡️ Étape 6 — SELinux (RHEL / Alma / Rocky uniquement)

🌀 Debian / Ubuntu : pas de SELinux, sautez cette étape et passez directement à l’étape 7.

Sur RHEL 9, SELinux est actif par défaut (getenforceEnforcing). Trois réglages sur le poller :

# 1. Autoriser le moteur a lire les certificats
dnf install -y policycoreutils-python-utils
semanage fcontext -a -t cert_t "/etc/pki/centreon-agent\.(crt|key)"
restorecon -v /etc/pki/centreon-agent.crt /etc/pki/centreon-agent.key

# 2. Autoriser l'ecoute sur le port 4317
semanage port -a -t centreon_engine_port_t -p tcp 4317

# 3. En cas de blocage : diagnostiquer et generer la politique
ausearch -m avc -ts recent
ausearch -m avc -ts recent | audit2allow -M centreon_cma
semodule -i centreon_cma.pp
⚠️ Évitez le setenforce 0 réflexe : posez plutôt les bons contextes ci-dessus. Le mode permissif ne doit rester qu’un dépannage temporaire.

🔥 Étape 7 — Le piège de la fraîcheur (mon retour d’expérience n°1)

⭐ En bref — Une machine CMA éteinte reste au VERT dans Centreon si vous ne faites rien. Le correctif tient en 4 points : (1) check_freshness=1 sur chaque service, (2) freshness_threshold=600, (3) check_service_freshness=1 au niveau moteur, (4) un host-alive ICMP réel. Détails ci-dessous.

Voici la partie que je n’aurais jamais pu écrire dans mon premier article : il faut s’être fait avoir pour la comprendre.

Le symptôme : j’éteins une machine supervisée en CMA… et ses services restent au vert. Aucune alerte. C’est logique une fois qu’on a compris que les checks CMA sont passifs : l’agent est muet → plus aucune donnée n’arrive → le moteur conserve le dernier état OK. Rien ne bascule.

La parade : la vérification de fraîcheur. Le principe : « si aucune donnée fraîche n’arrive à temps, le service passe UNKNOWN » (données périmées — volontairement pas CRITICAL). Il m’a fallu réunir trois conditions côté service :

  1. check_freshness=1 sur chaque service. ⚠️ Piège dans le piège : cette directive n’est PAS héritée depuis les modèles de service. Centreon ne l’exporte jamais depuis un template — il faut la poser sur le service lui-même. Vérifié empiriquement.
  2. freshness_threshold=600 (10 min) sur chaque service.
  3. check_service_freshness=1 au niveau moteur (objet ENGINECFG) — l’interrupteur maître. S’il est à 0, les deux points précédents ne servent à rien. À vérifier en premier.

Et côté hôte, un second piège : le host-alive livré par les modèles CMA (OS-Linux-Centreon-Monitoring-Agent-Host-Alive) est un factice :

/usr/bin/echo Host alive     ->   renvoie TOUJOURS OK

Donc l’hôte ne passe jamais DOWN, même éteint. La correction : un vrai check ICMP sur le modèle d’hôte custom.

check_command = base_host_alive     (un vrai check_icmp)
💡 Bonne nouvelle : contrairement au check_freshness des services, le check_command d’un hôte s’hérite bien depuis le template. En le posant sur OS-Linux-Centreon-Monitoring-Agent-custom, toutes vos futures machines CMA sont couvertes automatiquement.

Comment mettre ces 4 points en place, concrètement

Tout se pilote en CLAPI (ligne de commande Centreon) ou depuis l’interface. Les commandes ci-dessous utilisent le binaire /usr/share/centreon/bin/centreon — remplacez USER/PASS par vos identifiants. ⚠️ Rien ne prend effet tant que vous n’avez pas fait l’export du collecteur (APPLYCFG) à la toute fin.

① L’interrupteur maître, au niveau moteur — une seule fois pour toute la plateforme :

centreon -u USER -p PASS -o ENGINECFG -a setparam \
  -v 'Centreon Engine Central;check_service_freshness;1'

Interface : Configuration > Collecteurs > Configuration du moteur → cochez « Check service freshness ».

② et ③ La fraîcheur sur chaque service — non héritable, donc à poser service par service :

centreon -u USER -p PASS -o SERVICE -a setparam \
  -v 'mon-hote;mon-service;check_freshness;1'
centreon -u USER -p PASS -o SERVICE -a setparam \
  -v 'mon-hote;mon-service;freshness_threshold;600'

Interface : sur chaque service, onglet « Traitement des données »Check freshness = Oui et Freshness threshold = 600.

💡 Comme il faut le répéter sur tous les services d’un hôte, j’ai écrit un petit script qui liste les services d’un hôte via CLAPI et leur applique la fraîcheur en boucle (activer_freshness_hote_cma.sh <hote>) — infiniment plus rapide que de cliquer service par service.

④ Le vrai host-alive ICMP — posé sur le modèle d’hôte custom, il s’hérite donc tout seul par les futures machines :

centreon -u USER -p PASS -o HTPL -a setparam \
  -v 'OS-Linux-Centreon-Monitoring-Agent-custom;check_command;base_host_alive'

Interface : Configuration > Modèles > Hôtes → modèle OS-Linux-Centreon-Monitoring-Agent-customCheck Command = base_host_alive.

Enfin, on déploie la configuration du poller pour tout activer :

centreon -u USER -p PASS -a APPLYCFG -v 'Central'

À retenir : le vrai signal de panne = hôte DOWN (ping ICMP réel). Les services UNKNOWN ne font que refléter l’absence de données.

🧩 Étape 8 — Sondes personnalisées & whitelist

CMA exécute les sondes sur l’agent. Par sécurité, le poller n’exécute que des commandes explicitement autorisées : la whitelist, dans /etc/centreon-engine-whitelist/. Exemple pour autoriser vos sondes maison :

# /etc/centreon-engine-whitelist/custom.yaml
whitelist:
  wildcard:
    - "/usr/lib/nagios/plugins/check_*"

Rechargez le moteur (systemctl reload centengine). Sans entrée en whitelist, la commande est refusée et le service reste en UNKNOWN avec un message explicite.

🎩 Sur RHEL : pour des sondes hors chemins standards, pensez au contexte SELinux : semanage fcontext -a -t bin_t "/chemin/sondes(/.*)?" puis restorecon -Rv /chemin/sondes.

♻️ Étape 9 — Renouveler les certificats

Mon certificat serveur est valable 1 an. Pour éviter la coupure, renouvellement annuel : on régénère le certificat (étape 2.2), on le repropage vers les agents qui le référencent, puis on recharge.

# Sur le central : regenerer (voir 2.2), puis
systemctl reload centengine

# Sur chaque agent qui reference le certificat comme CA :
scp centreon@192.168.1.46:/etc/pki/centreon-agent.crt /etc/pki/centreon-agent.crt
systemctl restart centagent
💡 Astuce parc : signez le certificat serveur par la CA maison (valable 10 ans) au lieu de l’auto-signer — la marche à suivre exacte (openssl) est en étape 2.4. Les agents font alors confiance à la CA, pas au certificat serveur : vous renouvelez ce dernier sans rien toucher sur les agents. (Avec Let’s Encrypt, le hook /etc/letsencrypt/renewal-hooks/post/ automatise copie + reload tous les 90 jours.)

🩺 Dépannage express

Symptôme Cause probable Correctif
Connexion TLS échoue CN du certificat ≠ ca_common_name Aligner ca_common_name sur le CN du certificat serveur
« hostname mismatch » SAN absent ou mauvaise IP/DNS Régénérer le certificat avec le bon subjectAltName (2.2)
Refus malgré TLS OK Token absent ou non déclaré Vérifier trusted_tokens + le token présenté par l’agent
Permission denied sur la clé Droits fichiers ou (RHEL) contexte SELinux chown/chmod (2.3) ; sur RHEL, restorecon (étape 6)
Port 4317 pas en écoute Config non appliquée / moteur non rechargé Export du collecteur puis systemctl reload centengine
4317 injoignable depuis l’agent Pare-feu du poller Ouvrir 4317/tcp (firewalld ou ufw — étape 2.1)
Machine éteinte mais services verts Fraîcheur non activée Les 3 verrous + host-alive réel (étape 7)
Sonde UNKNOWN « not allowed » Commande absente de la whitelist Ajouter l’entrée whitelist (étape 8)

Les logs qui sauvent la vie :

tail -f /var/log/centreon-monitoring-agent/centagent.log   # cote agent
tail -f /var/log/centreon-engine/centengine.log            # cote poller
ausearch -m avc -ts recent                                 # blocages SELinux (RHEL)

🏁 Conclusion

CMA a complètement remplacé NRPE chez moi, et pour de bonnes raisons : transport moderne (gRPC), chiffrement TLS réel adossé à un token, et création automatique des hôtes. La procédure est identique sur RHEL et Debian, à trois détails près : le dépôt (RPM/APT), le pare-feu (firewalld/ufw) et SELinux (RHEL). Les vrais pièges ne sont pas dans l’installation — simple — mais dans deux détails d’exploitation : le SAN du certificat (sans quoi rien ne se connecte) et la fraîcheur passive (sans quoi une machine morte reste au vert). Une fois ces deux points maîtrisés, c’est un agent solide et confortable.

🧠 À garder en tête

  • Procédure identique RHEL/Debian ; seuls dépôt, pare-feu et SELinux diffèrent.
  • Sur un LAN, un certificat auto-signé suffit — Let’s Encrypt pour un FQDN public.
  • Le SAN (DNS + IP) est obligatoire, et son CN doit matcher ca_common_name.
  • Avec le chiffrement, le token est indispensable (obligatoire en 25.10+).
  • CMA est passif : pensez fraîcheur + host-alive ICMP réel, sinon les pannes passent inaperçues.

Une question, un cas tordu, une amélioration ? Dites-le en commentaire 👇

Bon monitoring avec Centreon CMA !

26 décembre 2025 /

Fonctionnalités du script

Système de base:

  • ✅ LVM /home (UUID, backup, montage auto)
  • ✅ DNS Google (8.8.8.8, 8.8.4.4)
  • ✅ GRUB dual-boot (10s timeout)
  • ✅ Vim éditeur par défaut

Stockage et partages:

  • ✅ 14 partages NAS (fstab + automount)
  • ✅ Credentials sécurisés (chmod 600)
  • ✅ Signets Nautilus avec emojis
  • ✅ Redirection XDG intelligente

Environnement développement:

  • ✅ Docker Engine (dépôt officiel)
  • ✅ Docker Compose V2
  • ✅ KVM/libvirt/virt-manager
  • ✅ Ansible
  • ✅ scanmem, default-jdk

Applications:

  • ✅ Google Chrome (dépôt auto)
  • ✅ Steam (dépôt officiel)
  • ✅ VirtualBox + Guest Additions ISO
  • ✅ Discord, VLC (Flatpak)
  • ✅ Suite bureautique complète

Optimisations:

  • ✅ Historique Bash 500K lignes
  • ✅ Sudo sans mot de passe
  • ✅ Veille désactivée
  • ✅ UFW désactivé
  • ✅ Journal systemd limité (500M)

Automatisations:

  • ✅ Nettoyage hebdomadaire (dimanche 3h)
  • ✅ MAJ quotidiennes (APT + Snap + Flatpak)
  • ✅ Docker cleanup (sans volumes)
  • ✅ Logs détaillés

Interface:

  • ✅ GSConnect (KDE Connect Android)
  • ✅ Nautilus optimisé
  • ✅ Extensions GNOME détectées
  • ✅ Signets personnalisés

Commande d’exécution :

sudo bash post-install.sh 2>&1 | tee post-install.log

#!/bin/bash
################################################################################
# Script de post-installation Ubuntu 24.04 LTS
#
# Description : Configure automatiquement un système Ubuntu fraîchement installé
# avec montage /home sur LVM (via UUID), montage NAS via fstab,
# optimisations système, et automatisations
#
# Auteur : Romain J.
# Version : 5.9
# Date : 2025
#
# Utilisation : sudo bash post-install.sh 2>&1 | tee post-install.log
################################################################################

set -e # Arrêter le script en cas d’erreur critique

################################################################################
# VARIABLES DE CONFIGURATION
################################################################################

UTILISATEUR= »starmate »
BASHRC_USER= »/home/$UTILISATEUR/.bashrc »

# Configuration NAS
NAS_IP= »IP_DU_NAS » # ⚠️ À REMPLACER AVANT EXÉCUTION
NAS_PASSWORD= »VOTRE_MOT_DE_PASSE_ICI » # ⚠️ À REMPLACER AVANT EXÉCUTION
NAS_PARTAGES=(animation documents downloads films Imprimante jeux livres musique perso photographie sauvegarde seriestv surveillance Technique)
NAS_CREDENTIALS= »/root/.smbcredentials »

# Montage /home sur LVM
LVM_HOME_DEVICE= »/dev/home-vg/home_lv »

################################################################################
# VÉRIFICATIONS PRÉALABLES
################################################################################

echo « ========================================== »
echo  » POST-INSTALLATION UBUNTU 24.04 LTS »
echo « ========================================== »
echo «  »
echo « Vérifications préalables… »

if [ « $EUID » -ne 0 ]; then
echo « ❌ Erreur : Ce script doit être exécuté en root (sudo) »
exit 1
fi

if ! id « $UTILISATEUR » &>/dev/null; then
echo « ❌ Erreur : L’utilisateur $UTILISATEUR n’existe pas »
exit 1
fi

USER_UID=$(id -u « $UTILISATEUR »)
USER_GID=$(id -g « $UTILISATEUR »)
echo « ✓ Utilisateur détecté : $UTILISATEUR (UID: $USER_UID, GID: $USER_GID) »

if [ « $NAS_PASSWORD » = « VOTRE_MOT_DE_PASSE_ICI » ]; then
echo « ❌ Erreur : Veuillez modifier le mot de passe NAS dans le script avant de l’exécuter »
exit 1
fi

CONNEXION_NET=$(nmcli -t -f NAME,DEVICE connection show –active | grep -E ‘enp|eth’ | cut -d: -f1 | head -n1)
if [ -z « $CONNEXION_NET » ]; then
echo « ❌ Erreur : Aucune connexion réseau filaire active détectée »
exit 1
fi
echo « ✓ Connexion réseau active : $CONNEXION_NET »
echo «  »

################################################################################
# 1. CONFIGURATION DU MONTAGE DE /HOME SUR LVM VIA UUID (EN PREMIER !)
################################################################################

echo « [1/23] Configuration du montage de /home sur LVM (via UUID)… »
echo « ——————————————————- »

# Récupération de l’UUID du volume LVM
HOME_UUID=$(blkid -s UUID -o value « $LVM_HOME_DEVICE » 2>/dev/null || true)

if [ -z « $HOME_UUID » ]; then
echo « ⚠ Impossible de récupérer l’UUID de $LVM_HOME_DEVICE »
echo  » Utilisation du nom de device (moins fiable) : $LVM_HOME_DEVICE »
LVM_ENTRY= »$LVM_HOME_DEVICE /home ext4 defaults 0 2″
else
echo « ✓ UUID trouvé pour /home : $HOME_UUID »
LVM_ENTRY= »UUID=$HOME_UUID /home ext4 defaults 0 2″
fi

if grep -q « /home[[:space:]] » /etc/fstab | grep -q -v « ^# » && ! grep -q « ^$LVM_ENTRY » /etc/fstab; then
echo « ⚠ Une entrée /home existe déjà dans fstab, mais pas avec le bon UUID/device LVM »
echo  » Sauvegarde et remplacement… »
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
sed -i « \|^[^#].*/home[[:space:]]|d » /etc/fstab # Supprime l’ancienne entrée /home
fi

if grep -q « ^$LVM_ENTRY » /etc/fstab; then
echo « ✓ L’entrée LVM (UUID) pour /home est déjà présente dans /etc/fstab »
else
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de /etc/fstab créée »

echo «  » >> /etc/fstab
echo « # Partition /home sur LVM (via UUID) » >> /etc/fstab
echo « $LVM_ENTRY » >> /etc/fstab
echo « ✓ Entrée LVM pour /home ajoutée à /etc/fstab »

echo  » Tentative de montage immédiat de /home… »
if mount -a 2>/dev/null; then
echo « ✓ /home (LVM) monté avec succès ! Vos données sont maintenant accessibles. »
else
echo « ⚠ Montage immédiat échoué. Redémarrage nécessaire pour activer le vrai /home (LVM). »
fi
fi
echo «  »

################################################################################
# 2. MISE À JOUR, REPO DOCKER, PAQUETS ET GOOGLE CHROME
################################################################################

echo « [2/23] Mise à jour système, repo Docker, paquets et Google Chrome… »
echo « ——————————————————- »

apt update
apt upgrade -y

# Repo Docker officiel
apt install -y ca-certificates curl gnupg lsb-release

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg –dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
« deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable » | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update

# Ajout du dépôt officiel Steam pour installation complète
echo  » Ajout du dépôt officiel Steam… »
curl -s http://repo.steampowered.com/steam/archive/stable/steam.gpg | gpg –dearmor -o /usr/share/keyrings/steam.gpg
echo « deb [arch=amd64 signed-by=/usr/share/keyrings/steam.gpg] http://repo.steampowered.com/steam/ stable steam » | tee /etc/apt/sources.list.d/steam.list > /dev/null
apt update

apt install -y steam
echo « ✓ Steam installé depuis le dépôt officiel (prêt à lancer) »

# Installation des paquets
apt install -y \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
torbrowser-launcher filezilla transmission \
software-properties-common wget gnupg \
virtualbox virtualbox-guest-additions-iso \
gnome-software gnome-software-plugin-flatpak \
audacity calibre cdrdao dia musescore3 gimp gnome-tweaks \
gparted hplip imagemagick inkscape keepassxc manpages-fr \
nautilus-image-converter net-tools okular p7zip-full p7zip-rar rar \
pdfsam printer-driver-cups-pdf sharutils synaptic thunderbird \
timidity tintii ubuntu-restricted-extras unace unrar uudeview \
vlc whois xsane gnome-shell-extensions cifs-utils vim htop \
glances iotop unattended-upgrades flatpak rsync gdebi libfuse2 \
ansible qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager \
gnome-shell-extension-gsconnect default-jdk scanmem git python3 python3-venv python3-pip

# Installation de Google Chrome
echo  » Téléchargement et installation de Google Chrome… »
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O /tmp/google-chrome.deb
apt install -y /tmp/google-chrome.deb
rm -f /tmp/google-chrome.deb
echo « ✓ Google Chrome installé (son dépôt a été ajouté automatiquement pour les MAJ) »

echo « ✓ Tous les paquets installés avec succès »
echo «  »

################################################################################
# 3. CONFIGURATION DOCKER, KVM ET GROUPES UTILISATEUR
################################################################################

echo « [3/23] Configuration Docker, KVM et groupes utilisateur… »
echo « ——————————————————- »

usermod -aG docker $UTILISATEUR
usermod -aG libvirt $UTILISATEUR
usermod -aG kvm $UTILISATEUR
echo « ✓ Utilisateur $UTILISATEUR ajouté aux groupes : docker, libvirt, kvm »

systemctl enable docker
systemctl start docker
echo « ✓ Service Docker activé et démarré »

systemctl enable libvirtd
systemctl start libvirtd
echo « ✓ Service libvirtd activé et démarré »

set +e
virsh net-autostart default && echo « ✓ Réseau libvirt ‘default’ en autostart » || echo  » ⚠ Réseau ‘default’ déjà en autostart ou indisponible »
virsh net-start default && echo « ✓ Réseau libvirt ‘default’ démarré » || echo  » ⚠ Réseau ‘default’ déjà démarré ou indisponible »
set -e

echo «  »

################################################################################
# 4. CONFIGURATION DNS
################################################################################

echo « [4/23] Configuration des serveurs DNS… »
echo « ——————————————————- »

nmcli connection modify « $CONNEXION_NET » ipv4.dns « 8.8.8.8 8.8.4.4 »
nmcli connection modify « $CONNEXION_NET » ipv4.ignore-auto-dns yes
echo « ✓ DNS configurés : 8.8.8.8, 8.8.4.4 »

set +e
nmcli connection down « $CONNEXION_NET » && echo  » Connexion arrêtée » || echo  » ⚠ Impossible d’arrêter (déjà down ?) »
nmcli connection up « $CONNEXION_NET » && echo « ✓ Connexion redémarrée » || echo  » ⚠ Échec redémarrage (réseau temporairement indisponible ?) »
set -e

echo «  »

################################################################################
# 5. MONTAGE NAS VIA FSTAB
################################################################################

echo « [5/23] Configuration des montages NAS via /etc/fstab… »
echo « ——————————————————- »

# Création du fichier credentials
cat <<EOF > « $NAS_CREDENTIALS »
username=$UTILISATEUR
password=$NAS_PASSWORD
EOF
chmod 600 « $NAS_CREDENTIALS »
echo « ✓ Fichier credentials créé et sécurisé »

# Désactivation temporaire de set -e pour la boucle NAS (évite les crashes sur echo ou mkdir)
set +e

added_count=0
for dossier in « ${NAS_PARTAGES[@]} »; do
MOUNT_LINE= »//${NAS_IP}/${dossier} /mnt/nas/${dossier} cifs credentials=${NAS_CREDENTIALS},iocharset=utf8,vers=3.1.1,uid=${USER_UID},gid=${USER_GID},_netdev,nofail,x-systemd.automount,x-systemd.mount-timeout=5 0 0″

if ! grep -q « ^//${NAS_IP}/${dossier}[[:space:]] » /etc/fstab; then
#mkdir -p « /mnt/nas/${dossier} »
echo « $MOUNT_LINE » >> /etc/fstab
echo  » ✓ Ligne ajoutée pour $dossier »
added_count=$((added_count + 1)) # CORRECTION ICI
else
echo  » ⚠ Ligne déjà présente pour $dossier »
fi
done

# Réactivation de set -e
set -e

if [ $added_count -gt 0 ]; then
echo « ✓ $added_count lignes NAS ajoutées à /etc/fstab »
echo  » Tentative de montage immédiat… »
mount -a 2>/dev/null && echo « ✓ Montages NAS effectués immédiatement » || echo « ⚠ Certains montages ont échoué (réseau/NAS indisponible ? → automount actif) »
else
echo « ✓ Toutes les lignes NAS déjà présentes dans /etc/fstab »
fi
echo «  »

################################################################################
# 6. CONFIGURATION GRUB POUR DUAL-BOOT
################################################################################

echo « [6/23] Configuration GRUB pour dual-boot… »
echo « ——————————————————- »

cp /etc/default/grub /etc/default/grub.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de /etc/default/grub créée »

sed -i ‘s/^GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_TIMEOUT_STYLE=menu’ >> /etc/default/grub
sed -i ‘s/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=10/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_TIMEOUT=10’ >> /etc/default/grub
sed -i ‘s/^GRUB_DISABLE_OS_PROBER=.*/GRUB_DISABLE_OS_PROBER=false/’ /etc/default/grub 2>/dev/null || echo ‘GRUB_DISABLE_OS_PROBER=false’ >> /etc/default/grub

update-grub
echo « ✓ GRUB configuré pour dual-boot (timeout: 10s) »
echo «  »

################################################################################
# 7. CONFIGURATION DE L’ÉDITEUR PAR DÉFAUT
################################################################################

echo « [7/23] Configuration de l’éditeur par défaut… »
echo « ——————————————————- »

update-alternatives –set editor /usr/bin/vim.basic
echo « ✓ Éditeur par défaut : Vim »
echo «  »

################################################################################
# 8. OPTIMISATION DE L’HISTORIQUE BASH
################################################################################

echo « [8/23] Optimisation de l’historique Bash… »
echo « ——————————————————- »

cp $BASHRC_USER ${BASHRC_USER}.backup.$(date +%Y%m%d_%H%M%S)
echo « ✓ Sauvegarde de .bashrc créée »

sed -i ‘/^HISTSIZE=/d’ $BASHRC_USER
sed -i ‘/^HISTFILESIZE=/d’ $BASHRC_USER
sed -i ‘/^shopt -s histappend/d’ $BASHRC_USER
sed -i ‘/^HISTTIMEFORMAT=/d’ $BASHRC_USER
sed -i ‘/^HISTCONTROL=/d’ $BASHRC_USER
sed -i ‘/^HISTIGNORE=/d’ $BASHRC_USER
sed -i ‘/^PROMPT_COMMAND=/d’ $BASHRC_USER
sed -i ‘/^alias update=/d’ $BASHRC_USER
sed -i ‘/^# ==== HISTORIQUE BASH OPTIMISÉ ====/d’ $BASHRC_USER

cat <<‘EOF’ >> $BASHRC_USER

# ==== HISTORIQUE BASH OPTIMISÉ ====
HISTSIZE=500000
HISTFILESIZE=1000000
shopt -s histappend
export HISTTIMEFORMAT= »%F %T  »
export HISTCONTROL=ignoreboth:erasedups
export HISTIGNORE= »ls:ll:la:pwd:cd:cd -:exit:clear »
PROMPT_COMMAND= »history -a; history -c; history -r »

# Alias mise à jour complète
alias update=’sudo apt update && sudo apt upgrade -y && sudo snap refresh 2>/dev/null || true && flatpak update -y 2>/dev/null || true’
EOF

chown $UTILISATEUR:$UTILISATEUR $BASHRC_USER
echo « ✓ Historique Bash optimisé »
echo «  »

################################################################################
# 9. CONFIGURATION SUDO SANS MOT DE PASSE
################################################################################

echo « [9/23] Configuration sudo sans mot de passe… »
echo « ——————————————————- »

echo « $UTILISATEUR ALL=(ALL) NOPASSWD:ALL » > /etc/sudoers.d/90-$UTILISATEUR
chmod 440 /etc/sudoers.d/90-$UTILISATEUR
echo « ✓ Sudo sans mot de passe activé pour $UTILISATEUR (assumé pour PC perso) »
echo «  »

################################################################################
# 10. INSTALLATION FLATPAK ET APPLICATIONS
################################################################################

echo « [10/23] Installation Flatpak et applications… »
echo « ——————————————————- »

flatpak remote-add –if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y flathub com.discordapp.Discord org.videolan.VLC
echo « ✓ Flatpak configuré avec Discord et VLC »
echo «  »

################################################################################
# 11. CONFIGURATION DES MISES À JOUR AUTOMATIQUES
################################################################################

echo « [11/23] Configuration des mises à jour automatiques… »
echo « ——————————————————- »

dpkg-reconfigure -plow unattended-upgrades
echo « ✓ Mises à jour automatiques de sécurité activées »
echo «  »

################################################################################
# 12. NETTOYAGE DES PAQUETS OBSOLÈTES
################################################################################

echo « [12/23] Nettoyage des paquets obsolètes… »
echo « ——————————————————- »

apt autoremove -y
apt autoclean -y
echo « ✓ Paquets obsolètes supprimés »
echo «  »

################################################################################
# 13. LIMITATION DU JOURNAL SYSTEMD
################################################################################

echo « [13/23] Limitation du journal systemd… »
echo « ——————————————————- »

grep -qxF ‘SystemMaxUse=500M’ /etc/systemd/journald.conf || echo ‘SystemMaxUse=500M’ >> /etc/systemd/journald.conf
systemctl restart systemd-journald
echo « ✓ Journal systemd limité à 500 Mo »
echo «  »

################################################################################
# 14. CONFIGURATION NAUTILUS ET GNOME (avec activation GSConnect)
################################################################################

echo « [14/23] Configuration Nautilus et GNOME… »
echo « ——————————————————- »

if command -v gsettings &> /dev/null; then
DBUS_PATH= »unix:path=/run/user/${USER_UID}/bus »

sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences show-hidden-files true
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences default-folder-viewer ‘list-view’
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.default-applications.terminal exec ‘gnome-terminal’
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.thumbnailers disable-all false
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.nautilus.preferences show-image-thumbnails ‘always’

echo « ✓ Nautilus configuré (fichiers cachés, vue liste, miniatures) »

EXTENSIONS_DISPONIBLES=$(sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions list 2>/dev/null || echo «  »)

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « dash-to-dock@micxgx.gmail.com »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable dash-to-dock@micxgx.gmail.com
echo  » ✓ dash-to-dock activé »
else
echo  » ✗ dash-to-dock non installé »
fi

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « gsconnect@andyholmes.github.io »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable gsconnect@andyholmes.github.io
echo  » ✓ GSConnect activé (prêt pour KDE Connect sur Android) »
else
echo  » ✗ GSConnect non installé »
fi

if echo « $EXTENSIONS_DISPONIBLES » | grep -q « clipboard-indicator@tudmotu.com »; then
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gnome-extensions enable clipboard-indicator@tudmotu.com
echo  » ✓ clipboard-indicator activé »
else
echo  » ✗ clipboard-indicator non installé »
fi
else
echo « ⚠ gsettings non disponible, configuration GNOME ignorée »
fi
echo «  »

################################################################################
# 15. DÉSactivation DE LA VEILLE AUTOMATIQUE
################################################################################

echo « [15/23] Désactivation de la veille automatique et extinction écran… »
echo « ——————————————————- »

if command -v gsettings &> /dev/null; then
DBUS_PATH= »unix:path=/run/user/${USER_UID}/bus »

sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.desktop.session idle-delay 0
sudo -u $UTILISATEUR DBUS_SESSION_BUS_ADDRESS= »$DBUS_PATH » gsettings set org.gnome.settings-daemon.plugins.power idle-dim false

echo « ✓ Veille automatique, extinction écran et assombrissement désactivés »
else
echo « ⚠ gsettings non disponible, désactivation de la veille ignorée »
fi
echo «  »

################################################################################
# 16. DÉSactivation DU FIREWALL UFW
################################################################################

echo « [16/23] Désactivation du firewall UFW… »
echo « ——————————————————- »

ufw disable
echo « ✓ UFW désactivé (comme demandé) »
echo «  »

################################################################################
# 17. CRÉATION DU SCRIPT DE NETTOYAGE AUTOMATIQUE
################################################################################

echo « [17/23] Création du script de nettoyage automatique… »
echo « ——————————————————- »

cat <<EOF > /usr/local/bin/cleanup.sh
#!/bin/bash
echo « Début nettoyage système : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log

echo « === Nettoyage APT === » >> /var/log/cleanup.log
apt autoremove -y >> /var/log/cleanup.log 2>&1
apt autoclean -y >> /var/log/cleanup.log 2>&1

echo « === Nettoyage Snap === » >> /var/log/cleanup.log
snap set system refresh.retain=2
snap list –all | awk ‘/disabled/{print \$1″ –revision « \$3}’ | xargs -r snap remove >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage Flatpak === » >> /var/log/cleanup.log
flatpak uninstall –unused -y >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage Docker === » >> /var/log/cleanup.log
docker system prune -f >> /var/log/cleanup.log 2>&1 || true # Sans –volumes pour préserver les données Docker
docker builder prune -f –keep-storage 10GB >> /var/log/cleanup.log 2>&1 || true

echo « === Nettoyage fichiers temporaires === » >> /var/log/cleanup.log
find /tmp -type f -atime +7 -delete 2>/dev/null || true
find /var/tmp -type f -atime +7 -delete 2>/dev/null || true

echo « === Nettoyage cache miniatures === » >> /var/log/cleanup.log
find /home/$UTILISATEUR/.cache/thumbnails -type f -atime +30 -delete 2>/dev/null || true

echo « === Nettoyage logs anciens === » >> /var/log/cleanup.log
find /var/log -type f -name « *.log.* » -mtime +30 -delete 2>/dev/null || true

echo « Nettoyage terminé : \$(date) » >> /var/log/cleanup.log
echo « —————————————- » >> /var/log/cleanup.log
EOF

chmod +x /usr/local/bin/cleanup.sh

cat <<‘EOF’ > /etc/systemd/system/cleanup-system.service
[Unit]
Description=Nettoyage automatique du système

[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
EOF

cat <<‘EOF’ > /etc/systemd/system/cleanup-system.timer
[Unit]
Description=Timer hebdomadaire pour nettoyage automatique

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable –now cleanup-system.timer
echo « ✓ Nettoyage automatique planifié (dimanche 3h, incl. Docker) »
echo «  »

################################################################################
# 18. CRÉATION DU SCRIPT DE MISE À JOUR AUTOMATIQUE
################################################################################

echo « [18/23] Création du script de mise à jour automatique… »
echo « ——————————————————- »

cat <<‘EOF’ > /usr/local/bin/update-system.sh
#!/bin/bash
echo « ======================================== » >> /var/log/update-system.log
echo « Début mise à jour système : $(date) » >> /var/log/update-system.log

echo « === Mise à jour APT === » >> /var/log/update-system.log
apt update >> /var/log/update-system.log 2>&1
apt upgrade -y >> /var/log/update-system.log 2>&1

echo « === Mise à jour Snap === » >> /var/log/update-system.log
snap refresh >> /var/log/update-system.log 2>&1 || true

echo « === Mise à jour Flatpak === » >> /var/log/update-system.log
flatpak update -y >> /var/log/update-system.log 2>&1 || true

echo « Fin mise à jour système : $(date) » >> /var/log/update-system.log
echo « ======================================== » >> /var/log/update-system.log
echo «  » >> /var/log/update-system.log
EOF

chmod +x /usr/local/bin/update-system.sh

cat <<‘EOF’ > /etc/systemd/system/update-system.service
[Unit]
Description=Mise à jour automatique APT + Snap + Flatpak

[Service]
Type=oneshot
ExecStart=/usr/local/bin/update-system.sh
EOF

cat <<‘EOF’ > /etc/systemd/system/update-system.timer
[Unit]
Description=Timer quotidien pour mise à jour automatique

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable –now update-system.timer
echo « ✓ Mises à jour automatiques planifiées (quotidien) »
echo «  »

################################################################################
# 19. REDIRECTION DES DOSSIERS STANDARDS VERS LE NAS + SIGNETS PERSONNALISÉS
################################################################################

echo « [19/23] Redirection des dossiers standards vers le NAS et signets personnalisés… »
echo « ——————————————————- »

USER_DIRS_FILE= »/home/$UTILISATEUR/.config/user-dirs.dirs »
USER_DIRS_CONF= »/home/$UTILISATEUR/.config/user-dirs.conf » # ← AJOUT CRITIQUE

# Sauvegarde du fichier actuel
if [ -f « $USER_DIRS_FILE » ]; then
cp « $USER_DIRS_FILE » « ${USER_DIRS_FILE}.backup.$(date +%Y%m%d_%H%M%S) »
echo « + Sauvegarde de user-dirs.dirs créée »
fi

# Suppression définitive des dossiers locaux concernés (Documents, Musique, Images)
# Cela empêche xdg-user-dirs-update de les recréer au login
echo « + Suppression définitive des dossiers locaux redirigés… »
sudo -u $UTILISATEUR rmdir « $HOME/Documents » « $HOME/Musique » « $HOME/Images » 2>/dev/null || true

# Réécriture du fichier user-dirs.dirs
cat <<EOF > « $USER_DIRS_FILE »
XDG_DESKTOP_DIR= »\$HOME/Bureau »
XDG_DOWNLOAD_DIR= »\$HOME/Téléchargements »
XDG_TEMPLATES_DIR= »\$HOME/Modèles »
XDG_PUBLICSHARE_DIR= »\$HOME/Public »
XDG_DOCUMENTS_DIR= »/mnt/nas/documents »
XDG_MUSIC_DIR= »/mnt/nas/musique »
XDG_PICTURES_DIR= »/mnt/nas/photographie »
XDG_VIDEOS_DIR= »\$HOME/ » # Désactivé visuellement (pas de sous-dossier = pas affiché dans Nautilus)
EOF

# CRITIQUE : Désactiver xdg-user-dirs-update pour empêcher l’écrasement
cat <<EOF > « $USER_DIRS_CONF »
enabled=False
EOF

chown $UTILISATEUR:$UTILISATEUR « $USER_DIRS_FILE »
chown $UTILISATEUR:$UTILISATEUR « $USER_DIRS_CONF »
chmod 644 « $USER_DIRS_CONF »

# Redémarrage Nautilus pour prise en compte immédiate
sudo -u $UTILISATEUR nautilus -q 2>/dev/null || true

echo « + Dossiers redirigés : »
echo  » – Documents → /mnt/nas/documents »
echo  » – Musique → /mnt/nas/musique »
echo  » – Images → /mnt/nas/photographie »
echo  » – Téléchargements reste local (comme souhaité) »
echo  » – Vidéos retiré du menu »
echo «  »

# Configuration des signets Nautilus
BOOKMARKS_FILE= »/home/$UTILISATEUR/.config/gtk-3.0/bookmarks »
mkdir -p « $(dirname « $BOOKMARKS_FILE ») »
touch « $BOOKMARKS_FILE »

# Sauvegarde APRÈS création du fichier (s’il contient des données)
if [ -s « $BOOKMARKS_FILE » ]; then
cp « $BOOKMARKS_FILE » « ${BOOKMARKS_FILE}.backup.$(date +%Y%m%d_%H%M%S) »
echo  » ✓ Sauvegarde de bookmarks créée »
fi

declare -A NOM_SIGNET
NOM_SIGNET[animation]= »🎬 Animation »
NOM_SIGNET[documents]= »📄 Documents »
NOM_SIGNET[downloads]= »⬇️ Téléchargements »
NOM_SIGNET[films]= »🎥 Films »
NOM_SIGNET[Imprimante]= »🖨️ Imprimante »
NOM_SIGNET[jeux]= »🎮 Jeux »
NOM_SIGNET[livres]= »📚 Livres »
NOM_SIGNET[musique]= »🎵 Musique »
NOM_SIGNET[perso]= »👤 Perso »
NOM_SIGNET[photographie]= »📸 Photographie »
NOM_SIGNET[sauvegarde]= »💾 Sauvegarde »
NOM_SIGNET[seriestv]= »📺 Séries TV »
NOM_SIGNET[surveillance]= »📹 Surveillance »
NOM_SIGNET[Technique]= »🔧 Technique »

for dossier in « ${NAS_PARTAGES[@]} »; do
CHEMIN= »file:///mnt/nas/$dossier »
NOM= »${NOM_SIGNET[$dossier]:-$dossier} »
if ! grep -q « ^${CHEMIN} » « $BOOKMARKS_FILE » 2>/dev/null; then
echo « $CHEMIN $NOM » >> « $BOOKMARKS_FILE »
echo  » ✓ Signet ajouté : $NOM »
else
echo  » ⚠ Signet déjà présent : $NOM »
fi
done

chown $UTILISATEUR:$UTILISATEUR « $BOOKMARKS_FILE »
chmod 644 « $BOOKMARKS_FILE »
echo « ✓ ${#NAS_PARTAGES[@]} signets NAS ajoutés dans Nautilus »
echo «  »

################################################################################
# 20. VÉRIFICATIONS FINALES DES SERVICES
################################################################################

echo « [20/23] Vérification des services Docker et KVM… »
echo « ——————————————————- »

set +e

if systemctl is-active –quiet docker; then
DOCKER_VERSION=$(docker –version 2>/dev/null | awk ‘{print $3}’ | tr -d ‘,’)
COMPOSE_VERSION=$(docker compose version 2>/dev/null | awk ‘{print $4}’)
echo  » ✓ Docker actif : version $DOCKER_VERSION | Compose : $COMPOSE_VERSION »
else
echo  » ✗ Docker inactif ou non installé »
fi

if systemctl is-active –quiet libvirtd; then
LIBVIRT_VERSION=$(virsh –version 2>/dev/null)
echo  » ✓ libvirtd actif (version $LIBVIRT_VERSION) »
else
echo  » ✗ libvirtd inactif »
fi

if command -v ansible &> /dev/null; then
ANSIBLE_VERSION=$(ansible –version 2>/dev/null | head -n1 | awk ‘{print $2}’)
echo  » ✓ Ansible installé (version $ANSIBLE_VERSION) »
else
echo  » ✗ Ansible non installé »
fi

set -e
echo «  »

################################################################################
# 21. NETTOYAGE FINAL
################################################################################

echo « [21/23] Nettoyage final… »
echo « ——————————————————- »

apt autoremove -y
apt autoclean -y
echo « ✓ Nettoyage final effectué »
echo «  »

################################################################################
# 22. RÉSUMÉ FINAL
################################################################################

echo « [22/23] RÉSUMÉ FINAL »
echo « ========================================== »
echo  » POST-INSTALLATION TERMINÉE AVEC SUCCÈS ! »
echo « ========================================== »
echo «  »
echo « 📋 RÉSUMÉ DES ACTIONS : »
echo  » ✓ /home configuré sur LVM (via UUID) »
echo  » ✓ virtualbox-guest-additions-iso installé (Guest Additions prêtes pour VMs) »
echo  » ✓ GSConnect installé et activé (KDE Connect Android prêt) »
echo  » ✓ UFW désactivé »
echo  » ✓ Google Chrome installé (son dépôt a été ajouté automatiquement pour les MAJ) »
echo  » ✓ Docker officiel + Compose V2 + KVM configurés »
echo  » ✓ Steam installé depuis le dépôt officiel »
echo  » ✓ Veille automatique et extinction écran désactivées »
echo  » ✓ Système mis à jour et paquets installés »
echo  » ✓ DNS Google configurés »
echo  » ✓ ${#NAS_PARTAGES[@]} partages NAS montés via fstab + signets Nautilus »
echo  » ✓ GRUB dual-boot, Bash optimisé, sudo NOPASSWD »
echo  » ✓ Flatpak, nettoyage (incl. Docker) et MAJ automatiques »
echo  » ✓ Nautilus/GNOME configuré »
echo «  »
echo « 🔧 COMMANDES UTILES APRÈS REBOOT : »
echo  » • Dans une VM VirtualBox → Périphériques > Insérer l’image des Additions Invité… »
echo  » • GSConnect : icône téléphone dans la barre supérieure »
echo  » • Installer KDE Connect sur Android et appairer »
echo  » • google-chrome, docker compose up, virt-manager… »
echo  » ✓ Dossiers Documents/Musique/Images redirigés vers NAS »
echo «  »
echo « Le système va redémarrer dans 30 secondes pour appliquer toutes les modifications. »
echo « Appuyez sur Ctrl+C pour annuler. »
echo «  »

################################################################################
# 23. REDÉMARRAGE AUTOMATIQUE
################################################################################

echo « [23/23] Redémarrage du système… »
echo « ——————————————————- »

for i in {30..1}; do
printf « Redémarrage dans %2d secondes… (Ctrl+C pour annuler) \r » « $i »
sleep 1
done

echo «  »
echo « Redémarrage en cours… »
sync
reboot

24 décembre 2025 /

A mettre dans son ~/.bashrc :

# ==== HISTORIQUE BASH OPTIMISÉ ====

# Date et heure
export HISTTIMEFORMAT= »%F %T  »

# Taille (très large)
export HISTSIZE=500000
export HISTFILESIZE=1000000

# Pas de doublons ni lignes vides
export HISTCONTROL=ignoreboth:erasedups

# Commandes inutiles ignorées
export HISTIGNORE= »ls:ll:la:pwd:cd:cd -:exit:clear »

# Historique partagé entre terminaux
shopt -s histappend
PROMPT_COMMAND= »history -a; history -c; history -r »

Pour une prise en compte immediate:

source ~/.bashrc

 

 

16 décembre 2025 /

Script de sauvegarde postgres:

#!/bin/bash
set -o pipefail

LOG= »/var/log/backup_postgres.log »
DATE=$(date ‘+%Y-%m-%d’)
DATE_LOG=$(date ‘+%Y-%m-%d %H:%M:%S’)
FICHIER= »/home/projet/dump/postgres_${DATE}.sql.gz »

# Purge des sauvegardes de plus de 4 jours
find /home/projet/dump -type f -name ‘postgres_*.sql.gz’ -mtime +4 -delete

# Sauvegarde complète compressée
pg_dumpall | gzip > « $FICHIER »
RESULT=$?

# Vérification et écriture dans le log
if [ « $RESULT » -eq 0 ]; then
echo « [$DATE_LOG] Sauvegarde OK » >> « $LOG »
else
echo « [$DATE_LOG] Sauvegarde ÉCHEC (code=$RESULT) » >> « $LOG »
rm -f « $FICHIER »
fi

Sonde Centreon qui vérifie qu’une sauvegarde a bien eu lieu la veille:

#!/bin/bash

LOG= »/var/log/backup_postgres.log »
HIER=$(date -d « yesterday » ‘+%F’)

if grep -q « \[$HIER » « $LOG » && grep « \[$HIER » « $LOG » | grep -q « Sauvegarde OK »; then
echo « OK – Sauvegarde PostgreSQL du $HIER trouvée dans le log »
exit 0
else
echo « CRITICAL – Aucune sauvegarde PostgreSQL OK trouvée pour le $HIER »
exit 2
fi