xpeditis2.0/infra/prod/scripts/ssh-deploy-wrapper.sh
2026-09-07 21:40:50 +02:00

57 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# Enveloppe de la cle SSH de deploiement
# =============================================================================
# Reference depuis ~deploy/.ssh/authorized_keys sur app-01 :
#
# restrict,pty,command="/opt/xpeditis/infra-prod/scripts/ssh-deploy-wrapper.sh" ssh-ed25519 AAAA... github-actions-prod
#
# Le `command=` d'OpenSSH ignore ce que le client demande et execute ce script,
# en placant la commande d'origine dans SSH_ORIGINAL_COMMAND. Une cle volee ne
# donne donc pas un shell : elle ne peut lancer que ce qui est autorise ici.
set -euo pipefail
CMD="${SSH_ORIGINAL_COMMAND:-}"
LOG_TAG=xpeditis-ssh-deploy
deny() {
logger -t "$LOG_TAG" -- "REFUS: ${CMD}"
echo "Commande non autorisee pour cette cle." >&2
exit 126
}
logger -t "$LOG_TAG" -- "DEMANDE: ${CMD}"
case "$CMD" in
# rsync doit pouvoir se lancer en mode serveur pour recevoir infra/prod.
# --server et --sender uniquement, chemin de destination contraint.
"rsync --server "*"/opt/xpeditis/infra-prod/"*)
exec $CMD
;;
# Deploiement d'une version. Le tag est valide par une expression stricte :
# sans cela, `deploy.sh "; rm -rf /"` serait accepte.
"deploy "*)
TAG="${CMD#deploy }"
[[ "$TAG" =~ ^prod-[a-f0-9]{7,40}$ ]] || deny
exec /opt/xpeditis/infra-prod/scripts/deploy.sh "$TAG"
;;
# Retour arriere d'urgence.
"rollback")
kubectl -n xpeditis-prod rollout undo deploy/xpeditis-backend
kubectl -n xpeditis-prod rollout undo deploy/xpeditis-frontend
exec kubectl -n xpeditis-prod rollout status deploy/xpeditis-backend --timeout=180s
;;
# Diagnostic en lecture seule.
"status")
kubectl -n xpeditis-prod get pods,deploy -o wide
exec kubectl -n xpeditis-prod get events --sort-by=.lastTimestamp | tail -20
;;
*)
deny
;;
esac