watchtower_run_once.sh
· 4.8 KiB · Bash
Raw
#!/bin/bash
# ============================================================
# Script : watchtower_run_once.sh
# Description : Watchtower en exécution unique avec logs + SMTP + COULEURS
# Auteur : Erreur32 (optimisé)
# ============================================================
# Force terminal colors
export TERM=xterm-256color
# ========== COULEURS ANSI ==========
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# Helper functions pour logs colorés
log_both() {
local COLOR="$1"
local MSG="$2"
# Terminal avec couleur
echo -e "${COLOR}${MSG}${NC}"
# Fichier sans couleur
echo -e "${MSG}" | sed 's/\x1b\[[0-9;]*m//g' >> "$LOG_FILE"
}
log_divider() {
echo -e "${CYAN}${BOLD}────────────────────────────────────────────${NC}" | tee -a "$LOG_FILE"
}
# --------VARIABLES CONFIG--------
SMTP_USER="myoueb"
SMTP_DOMAIN="echosystem.fr"
SMTP_PASS="vIVC2ouz36SwgWfWSoAO32"
SMTP_SERVER="ssl0.ovh.net"
SMTP_PORT="587"
SMTP_FROM="${SMTP_USER}@${SMTP_DOMAIN}"
SMTP_TO="${SMTP_USER}@${SMTP_DOMAIN}"
SMTP_STARTTLS="yes"
WATCHTOWER_HOSTNAME="watchtower.MYOUEB.local"
LOG_PATH="/home/docker/watchtower/log"
DOCKER_IMAGE="nickfedor/watchtower:latest"
API_VERSION="1.44"
mkdir -p "$LOG_PATH"
# --------FONCTION PRINCIPALE--------
function watchtower_cron() {
# Fichier de log horodaté
LOG_FILE="${LOG_PATH}/cron-$(date '+%Y-%m-%d-%Hh%M').txt"
# Header coloré
log_both "${BOLD}${CYAN}" "╔════════════════════════════════════════════╗"
log_both "${BOLD}${CYAN}" "║ Watchtower Run Once ║"
log_both "${BOLD}${CYAN}" "╚════════════════════════════════════════════╝"
log_both "" "Date : $(date)"
log_both "${CYAN}" "Log : $LOG_FILE"
log_divider
# Mise à jour de l'image
echo "[*] Pulling latest Watchtower image..." | tee -a "$LOG_FILE"
docker pull "$DOCKER_IMAGE" >/dev/null 2>&1
echo "✅ Done" | tee -a "$LOG_FILE"
log_divider
log_both "${BLUE}" "[*] Running Watchtower scan..."
echo " (Using --label-enable to respect labels)" | tee -a "$LOG_FILE"
echo " (Containers with label com.centurylinklabs.watchtower.enable=false will be excluded)" | tee -a "$LOG_FILE"
# Exécution Watchtower avec --label-enable
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
--hostname "${WATCHTOWER_HOSTNAME}" \
"$DOCKER_IMAGE" \
--api-version="$API_VERSION" \
--run-once \
--label-enable \
--notification-url="smtp://${SMTP_USER}%40${SMTP_DOMAIN}:${SMTP_PASS}@${SMTP_SERVER}:${SMTP_PORT}/?from=${SMTP_FROM}&to=${SMTP_TO}&starttls=${SMTP_STARTTLS}" \
--notifications-level=debug \
2>&1 | tee -a "$LOG_FILE"
log_divider
# Analyse des résultats
RESULT=$(grep -Eo "Failed=[0-9]+|Scanned=[0-9]+|Updated=[0-9]+" "$LOG_FILE")
FAILED=$(echo "$RESULT" | grep "Failed=" | cut -d= -f2)
SCANNED=$(echo "$RESULT" | grep "Scanned=" | cut -d= -f2)
UPDATED=$(echo "$RESULT" | grep "Updated=" | cut -d= -f2)
# Sécurisation valeurs vides
FAILED=${FAILED:-0}
SCANNED=${SCANNED:-0}
UPDATED=${UPDATED:-0}
# Affichage résumé coloré
log_both "${BOLD}${CYAN}" "RÉSUMÉ"
log_both "${WHITE}" " Scannés : ${BOLD}$SCANNED${NC}${WHITE}"
if [[ "$UPDATED" -gt 0 ]]; then
log_both "${BOLD}${GREEN}" " ✅ Mis à jour : ${BOLD}$UPDATED${NC}${GREEN}"
STATUS="SUCCESS"
else
log_both "${YELLOW}" " ℹ️ Mis à jour : ${BOLD}$UPDATED${NC}${YELLOW}"
STATUS="NO_UPDATES"
fi
if [[ "$FAILED" -eq 0 ]]; then
log_both "${GREEN}" " ❌ Échoués : ${BOLD}0${NC}${GREEN}"
else
log_both "${RED}" " ❌ Échoués : ${BOLD}$FAILED${NC}${RED}"
STATUS="ERROR"
fi
log_divider
# Nettoyage : uniquement si mise à jour
if [[ "$UPDATED" -gt 0 ]]; then
echo "[*] Cleaning up unused images..." | tee -a "$LOG_FILE"
docker image prune -af >/dev/null 2>&1
docker volume prune -f >/dev/null 2>&1
log_both "${GREEN}" "✅ Cleanup done"
echo "Nettoyage effectué (car mises à jour détectées)." >> "$LOG_FILE"
else
log_both "${YELLOW}" "⊘ No cleanup (no updates)"
echo "Pas de nettoyage (aucune mise à jour)." >> "$LOG_FILE"
fi
log_divider
log_both "${BOLD}${GREEN}" "✨ Status final : $STATUS"
echo "---------------------------" >> "$LOG_FILE"
echo "Status final : $STATUS" >> "$LOG_FILE"
echo "Fin à : $(date)" >> "$LOG_FILE"
log_both "${CYAN}" "Log saved --> $LOG_FILE"
}
watchtower_cron
| 1 | #!/bin/bash |
| 2 | |
| 3 | # ============================================================ |
| 4 | # Script : watchtower_run_once.sh |
| 5 | # Description : Watchtower en exécution unique avec logs + SMTP + COULEURS |
| 6 | # Auteur : Erreur32 (optimisé) |
| 7 | # ============================================================ |
| 8 | |
| 9 | # Force terminal colors |
| 10 | export TERM=xterm-256color |
| 11 | |
| 12 | # ========== COULEURS ANSI ========== |
| 13 | RED='\033[0;31m' |
| 14 | GREEN='\033[0;32m' |
| 15 | YELLOW='\033[1;33m' |
| 16 | BLUE='\033[0;34m' |
| 17 | CYAN='\033[0;36m' |
| 18 | BOLD='\033[1m' |
| 19 | NC='\033[0m' # No Color |
| 20 | |
| 21 | # Helper functions pour logs colorés |
| 22 | log_both() { |
| 23 | local COLOR="$1" |
| 24 | local MSG="$2" |
| 25 | # Terminal avec couleur |
| 26 | echo -e "${COLOR}${MSG}${NC}" |
| 27 | # Fichier sans couleur |
| 28 | echo -e "${MSG}" | sed 's/\x1b\[[0-9;]*m//g' >> "$LOG_FILE" |
| 29 | } |
| 30 | |
| 31 | log_divider() { |
| 32 | echo -e "${CYAN}${BOLD}────────────────────────────────────────────${NC}" | tee -a "$LOG_FILE" |
| 33 | } |
| 34 | |
| 35 | # --------VARIABLES CONFIG-------- |
| 36 | SMTP_USER="myoueb" |
| 37 | SMTP_DOMAIN="echosystem.fr" |
| 38 | SMTP_PASS="vIVC2ouz36SwgWfWSoAO32" |
| 39 | SMTP_SERVER="ssl0.ovh.net" |
| 40 | SMTP_PORT="587" |
| 41 | SMTP_FROM="${SMTP_USER}@${SMTP_DOMAIN}" |
| 42 | SMTP_TO="${SMTP_USER}@${SMTP_DOMAIN}" |
| 43 | SMTP_STARTTLS="yes" |
| 44 | |
| 45 | WATCHTOWER_HOSTNAME="watchtower.MYOUEB.local" |
| 46 | |
| 47 | LOG_PATH="/home/docker/watchtower/log" |
| 48 | DOCKER_IMAGE="nickfedor/watchtower:latest" |
| 49 | API_VERSION="1.44" |
| 50 | |
| 51 | mkdir -p "$LOG_PATH" |
| 52 | |
| 53 | # --------FONCTION PRINCIPALE-------- |
| 54 | function watchtower_cron() { |
| 55 | |
| 56 | # Fichier de log horodaté |
| 57 | LOG_FILE="${LOG_PATH}/cron-$(date '+%Y-%m-%d-%Hh%M').txt" |
| 58 | |
| 59 | # Header coloré |
| 60 | log_both "${BOLD}${CYAN}" "╔════════════════════════════════════════════╗" |
| 61 | log_both "${BOLD}${CYAN}" "║ Watchtower Run Once ║" |
| 62 | log_both "${BOLD}${CYAN}" "╚════════════════════════════════════════════╝" |
| 63 | |
| 64 | log_both "" "Date : $(date)" |
| 65 | log_both "${CYAN}" "Log : $LOG_FILE" |
| 66 | log_divider |
| 67 | |
| 68 | # Mise à jour de l'image |
| 69 | echo "[*] Pulling latest Watchtower image..." | tee -a "$LOG_FILE" |
| 70 | docker pull "$DOCKER_IMAGE" >/dev/null 2>&1 |
| 71 | echo "✅ Done" | tee -a "$LOG_FILE" |
| 72 | log_divider |
| 73 | |
| 74 | log_both "${BLUE}" "[*] Running Watchtower scan..." |
| 75 | echo " (Using --label-enable to respect labels)" | tee -a "$LOG_FILE" |
| 76 | echo " (Containers with label com.centurylinklabs.watchtower.enable=false will be excluded)" | tee -a "$LOG_FILE" |
| 77 | |
| 78 | # Exécution Watchtower avec --label-enable |
| 79 | docker run --rm \ |
| 80 | -v /var/run/docker.sock:/var/run/docker.sock \ |
| 81 | --hostname "${WATCHTOWER_HOSTNAME}" \ |
| 82 | "$DOCKER_IMAGE" \ |
| 83 | --api-version="$API_VERSION" \ |
| 84 | --run-once \ |
| 85 | --label-enable \ |
| 86 | --notification-url="smtp://${SMTP_USER}%40${SMTP_DOMAIN}:${SMTP_PASS}@${SMTP_SERVER}:${SMTP_PORT}/?from=${SMTP_FROM}&to=${SMTP_TO}&starttls=${SMTP_STARTTLS}" \ |
| 87 | --notifications-level=debug \ |
| 88 | 2>&1 | tee -a "$LOG_FILE" |
| 89 | |
| 90 | log_divider |
| 91 | |
| 92 | # Analyse des résultats |
| 93 | RESULT=$(grep -Eo "Failed=[0-9]+|Scanned=[0-9]+|Updated=[0-9]+" "$LOG_FILE") |
| 94 | FAILED=$(echo "$RESULT" | grep "Failed=" | cut -d= -f2) |
| 95 | SCANNED=$(echo "$RESULT" | grep "Scanned=" | cut -d= -f2) |
| 96 | UPDATED=$(echo "$RESULT" | grep "Updated=" | cut -d= -f2) |
| 97 | |
| 98 | # Sécurisation valeurs vides |
| 99 | FAILED=${FAILED:-0} |
| 100 | SCANNED=${SCANNED:-0} |
| 101 | UPDATED=${UPDATED:-0} |
| 102 | |
| 103 | # Affichage résumé coloré |
| 104 | log_both "${BOLD}${CYAN}" "RÉSUMÉ" |
| 105 | log_both "${WHITE}" " Scannés : ${BOLD}$SCANNED${NC}${WHITE}" |
| 106 | |
| 107 | if [[ "$UPDATED" -gt 0 ]]; then |
| 108 | log_both "${BOLD}${GREEN}" " ✅ Mis à jour : ${BOLD}$UPDATED${NC}${GREEN}" |
| 109 | STATUS="SUCCESS" |
| 110 | else |
| 111 | log_both "${YELLOW}" " ℹ️ Mis à jour : ${BOLD}$UPDATED${NC}${YELLOW}" |
| 112 | STATUS="NO_UPDATES" |
| 113 | fi |
| 114 | |
| 115 | if [[ "$FAILED" -eq 0 ]]; then |
| 116 | log_both "${GREEN}" " ❌ Échoués : ${BOLD}0${NC}${GREEN}" |
| 117 | else |
| 118 | log_both "${RED}" " ❌ Échoués : ${BOLD}$FAILED${NC}${RED}" |
| 119 | STATUS="ERROR" |
| 120 | fi |
| 121 | |
| 122 | log_divider |
| 123 | |
| 124 | # Nettoyage : uniquement si mise à jour |
| 125 | if [[ "$UPDATED" -gt 0 ]]; then |
| 126 | echo "[*] Cleaning up unused images..." | tee -a "$LOG_FILE" |
| 127 | docker image prune -af >/dev/null 2>&1 |
| 128 | docker volume prune -f >/dev/null 2>&1 |
| 129 | log_both "${GREEN}" "✅ Cleanup done" |
| 130 | echo "Nettoyage effectué (car mises à jour détectées)." >> "$LOG_FILE" |
| 131 | else |
| 132 | log_both "${YELLOW}" "⊘ No cleanup (no updates)" |
| 133 | echo "Pas de nettoyage (aucune mise à jour)." >> "$LOG_FILE" |
| 134 | fi |
| 135 | |
| 136 | log_divider |
| 137 | log_both "${BOLD}${GREEN}" "✨ Status final : $STATUS" |
| 138 | echo "---------------------------" >> "$LOG_FILE" |
| 139 | echo "Status final : $STATUS" >> "$LOG_FILE" |
| 140 | echo "Fin à : $(date)" >> "$LOG_FILE" |
| 141 | log_both "${CYAN}" "Log saved --> $LOG_FILE" |
| 142 | } |
| 143 | |
| 144 | watchtower_cron |