La commande de controle affichee par creer-role-lecture.sh manquait sudo : elle echouait sur la socket Docker au lieu de tester le role, donc elle ne controlait rien. exporter-jeton-influx.sh recopie le jeton d ecriture InfluxDB du .env local (droits 600, lisible du seul compte DSM) vers le .env a la racine du depot, lisible depuis le poste de travail. Sans ce pont il faudrait afficher le jeton pour le recopier a la main dans le secrets.yaml de Home Assistant, qui vit sur une autre machine — exactement ce qu on cherche a ne plus faire. Rien n est affiche. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
74 lines
3.0 KiB
Bash
Executable File
74 lines
3.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# Crée le rôle PostgreSQL en LECTURE SEULE dont Claude se sert pour analyser la
|
|
# mémoire de mesures, et dépose son mot de passe dans le .env à la racine du
|
|
# dépôt — celui que ce compte-là sait lire.
|
|
#
|
|
# Pourquoi un rôle séparé plutôt que le compte `evcs` : une mémoire dont tout
|
|
# l'intérêt est de ne pas être réécrite ne se consulte pas avec un compte qui
|
|
# peut écrire. Et un mot de passe d'analyse qui traîne dans un fichier lisible
|
|
# ne doit pas être celui qui gouverne la base.
|
|
#
|
|
# Le mot de passe est GÉNÉRÉ, jamais choisi, et n'est PAS affiché : il va
|
|
# directement du générateur au fichier. Rien à recopier, donc rien à exposer
|
|
# dans une capture d'écran.
|
|
#
|
|
# Usage, depuis 10.10.10.22 :
|
|
# cd /volume2/projects/EVCS/EVCS/deploy/historisation
|
|
# sudo bash creer-role-lecture.sh
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")"
|
|
ENV_DEPOT="../../.env"
|
|
|
|
if [ ! -f "$ENV_DEPOT" ]; then
|
|
echo "REFUS : $ENV_DEPOT introuvable. Lancer ce script depuis le dépôt."
|
|
exit 1
|
|
fi
|
|
|
|
EXISTE=$(docker compose exec -T postgres psql -U evcs -d evcs -tAc \
|
|
"SELECT 1 FROM pg_roles WHERE rolname='evcs_lecture'" 2>/dev/null || true)
|
|
|
|
if [ "$EXISTE" = "1" ]; then
|
|
echo "Le rôle evcs_lecture existe déjà."
|
|
if grep -q '^PG_LECTURE_PASSWORD=' "$ENV_DEPOT"; then
|
|
echo "Et son mot de passe est déjà dans $ENV_DEPOT. Rien à faire."
|
|
exit 0
|
|
fi
|
|
echo "Mais son mot de passe est absent de $ENV_DEPOT — il va être RÉINITIALISÉ."
|
|
fi
|
|
|
|
MDP="$(openssl rand -hex 24)"
|
|
|
|
docker compose exec -T postgres psql -U evcs -d evcs -v ON_ERROR_STOP=1 <<EOF
|
|
DO \$\$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'evcs_lecture') THEN
|
|
ALTER ROLE evcs_lecture LOGIN PASSWORD '$MDP';
|
|
ELSE
|
|
CREATE ROLE evcs_lecture LOGIN PASSWORD '$MDP';
|
|
END IF;
|
|
END
|
|
\$\$;
|
|
|
|
GRANT CONNECT ON DATABASE evcs TO evcs_lecture;
|
|
GRANT USAGE ON SCHEMA public TO evcs_lecture;
|
|
GRANT SELECT ON ALL TABLES IN SCHEMA public TO evcs_lecture;
|
|
-- Pour que les tables créées plus tard soient lisibles sans repasser ici.
|
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO evcs_lecture;
|
|
-- Ceinture : aucune écriture, même par héritage d'un privilège public.
|
|
REVOKE INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA public FROM evcs_lecture;
|
|
EOF
|
|
|
|
# Dépose (ou remplace) la ligne dans le .env du dépôt, sans jamais l'afficher.
|
|
if grep -q '^PG_LECTURE_PASSWORD=' "$ENV_DEPOT"; then
|
|
sed -i "s|^PG_LECTURE_PASSWORD=.*|PG_LECTURE_PASSWORD=$MDP|" "$ENV_DEPOT"
|
|
else
|
|
printf '\n# Role PostgreSQL en lecture seule sur la memoire de mesures\n# (10.10.10.22:5433, base evcs, utilisateur evcs_lecture)\nPG_LECTURE_PASSWORD=%s\n' "$MDP" >> "$ENV_DEPOT"
|
|
fi
|
|
|
|
echo "✓ Rôle evcs_lecture créé, lecture seule."
|
|
echo "✓ Mot de passe déposé dans $ENV_DEPOT — non affiché, rien à recopier."
|
|
echo
|
|
echo "Contrôle (doit renvoyer une erreur de permission) :"
|
|
echo " sudo docker compose exec -T postgres psql -U evcs_lecture -d evcs -c \"DELETE FROM mesure\""
|
|
echo " (attendu : ERROR: permission denied for table mesure)"
|