- Connexion SSH via abonnelc (sudo NOPASSWD:ALL) - --rsync-path="sudo rsync" pour accéder à web17/web/logo/ (owner web17) - STATIC_PATH pointe sur web17/web/logo/ (pas la racine ISPConfig) - .env.example neutre : STATIC_USER reste un placeholder Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
107 lines
4 KiB
Bash
Executable file
107 lines
4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# push-assets.sh — synchronise les assets locaux vers static.alpinux.org
|
|
#
|
|
# Usage :
|
|
# ./push-assets.sh # aperçu des changements + confirmation
|
|
# ./push-assets.sh -y # pousse sans confirmation
|
|
# ./push-assets.sh -n # dry-run seulement (aucune modification)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ENV_FILE="$SCRIPT_DIR/../.env"
|
|
|
|
# ── Couleurs ────────────────────────────────────────────────────────
|
|
RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m'
|
|
CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m'
|
|
|
|
# ── Config ──────────────────────────────────────────────────────────
|
|
if [ ! -f "$ENV_FILE" ]; then
|
|
echo -e "${RED}Erreur : fichier .env introuvable.${RESET}"
|
|
echo "Copier scripts/../.env.example en .env et remplir les valeurs."
|
|
exit 1
|
|
fi
|
|
# shellcheck source=/dev/null
|
|
source "$ENV_FILE"
|
|
|
|
LOCAL_DIR="${LOCAL_ASSETS_DIR:-/tmp/alpinux-static-assets}"
|
|
REMOTE_USER="${STATIC_USER:?Variable STATIC_USER manquante dans .env}"
|
|
REMOTE_HOST="${STATIC_HOST:?Variable STATIC_HOST manquante dans .env}"
|
|
REMOTE_PATH="${STATIC_PATH:?Variable STATIC_PATH manquante dans .env}"
|
|
REMOTE="${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/"
|
|
|
|
# ── Arguments ───────────────────────────────────────────────────────
|
|
DRY_RUN=false
|
|
AUTO_YES=false
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
-n|--dry-run) DRY_RUN=true ;;
|
|
-y|--yes) AUTO_YES=true ;;
|
|
-h|--help)
|
|
sed -n '2,6p' "$0" | sed 's/^# //'
|
|
exit 0 ;;
|
|
esac
|
|
done
|
|
|
|
if [ ! -d "$LOCAL_DIR" ]; then
|
|
echo -e "${RED}Erreur : répertoire local introuvable : $LOCAL_DIR${RESET}"
|
|
echo "Lancer d'abord : python3 wiki/scripts/build-assets.py"
|
|
exit 1
|
|
fi
|
|
|
|
# ── Analyse des changements ─────────────────────────────────────────
|
|
echo -e "${BOLD}Analyse des changements…${RESET}"
|
|
echo -e " Source : ${CYAN}$LOCAL_DIR/${RESET}"
|
|
echo -e " Cible : ${CYAN}$REMOTE${RESET}"
|
|
echo ""
|
|
|
|
DIFF=$(rsync -rlcz --dry-run --itemize-changes --delete \
|
|
--rsync-path="sudo rsync" \
|
|
"$LOCAL_DIR/" "$REMOTE" 2>&1)
|
|
|
|
NEW=0; CHANGED=0; DELETED=0
|
|
|
|
while IFS= read -r line; do
|
|
item="${line:0:11}"
|
|
file="${line:12}"
|
|
[ -z "$file" ] && continue
|
|
if [[ "$item" == *"deleting"* ]]; then
|
|
echo -e " ${RED}supprimé ${RESET} $file"
|
|
((DELETED++))
|
|
elif [[ "$item" =~ ^\>f\+{6,} ]]; then
|
|
echo -e " ${GREEN}nouveau ${RESET} $file"
|
|
((NEW++))
|
|
elif [[ "$item" =~ ^\>f ]]; then
|
|
echo -e " ${YELLOW}modifié ${RESET} $file"
|
|
((CHANGED++))
|
|
fi
|
|
done <<< "$DIFF"
|
|
|
|
TOTAL=$((NEW + CHANGED + DELETED))
|
|
|
|
if [ "$TOTAL" -eq 0 ]; then
|
|
echo -e "${GREEN}Tout est à jour — aucun changement à pousser.${RESET}"
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
echo -e " ${GREEN}+$NEW nouveau(x)${RESET} ${YELLOW}~$CHANGED modifié(s)${RESET} ${RED}-$DELETED supprimé(s)${RESET}"
|
|
echo ""
|
|
|
|
$DRY_RUN && { echo -e "${CYAN}Mode dry-run — aucune modification effectuée.${RESET}"; exit 0; }
|
|
|
|
# ── Confirmation ────────────────────────────────────────────────────
|
|
if ! $AUTO_YES; then
|
|
read -rp "Pousser ces changements vers $REMOTE_HOST ? [o/N] " confirm
|
|
[[ "$confirm" =~ ^[oOyY]$ ]] || { echo "Annulé."; exit 0; }
|
|
fi
|
|
|
|
# ── Synchronisation ─────────────────────────────────────────────────
|
|
echo ""
|
|
echo -e "${BOLD}Synchronisation en cours…${RESET}"
|
|
rsync -rlcz --human-readable --progress --delete \
|
|
--rsync-path="sudo rsync" \
|
|
"$LOCAL_DIR/" "$REMOTE"
|
|
|
|
echo ""
|
|
echo -e "${GREEN}✓ Synchronisation terminée.${RESET}"
|