Files
EVCS/deploy/historisation/creer-role-lecture.sh
Tallagrand Thierry a189ad958c Pont pour le jeton InfluxDB, et sudo dans la commande de controle
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
2026-09-04 01:58:42 +02:00

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)"