Files
docker-stack-template/install_cron.sh
T
bruno 0d32a9ae47 feat: script install_cron.sh pour déployer les crons Gitea
- Installation interactive avec --force
- Désinstallation avec --uninstall
- Vérification état avec --status
- Paramètres configurables via variables d'environnement
- Bloc marqué dans la crontab pour gestion propre
2026-06-26 11:38:03 -04:00

304 lines
12 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# install_cron.sh — Installe les scripts Gitea dans la crontab
# =============================================================================
# Usage :
# bash install_cron.sh → Installation interactive
# bash install_cron.sh --force → Installation sans confirmation
# bash install_cron.sh --uninstall → Retire les entrées du cron
# bash install_cron.sh --status → Vérifie si les crons sont actifs
#
# Paramètres configurables (modifier ci-dessous ou passer en variables d'env)
# =============================================================================
set -euo pipefail
# ─── Configuration ──────────────────────────────────────────────────────────
SCRIPTS_DIR="${SCRIPTS_DIR:-$HOME/scripts}"
CRON_BACKUP_SCHEDULE="${CRON_BACKUP_SCHEDULE:-0 2 * * *}"
CRON_UPDATE_SCHEDULE="${CRON_UPDATE_SCHEDULE:-0 4 * * *}"
BACKUP_SCRIPT="${BACKUP_SCRIPT:-gitea-backup.sh}"
UPDATE_SCRIPT="${UPDATE_SCRIPT:-gitea-auto-update.sh}"
LOG_DIR="${LOG_DIR:-/var/log}"
BACKUP_LOG="${BACKUP_LOG:-$LOG_DIR/gitea-backup-cron.log}"
UPDATE_LOG="${UPDATE_LOG:-$LOG_DIR/gitea-update-cron.log}"
CRON_MARKER="${CRON_MARKER:-# >>> GITEA SCRIPTS (managed by install_cron.sh) <<<}"
# Détection de l'utilisateur
CRON_USER="${CRON_USER:-$USER}"
# ─── Couleurs ───────────────────────────────────────────────────────────────
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
ok() { echo -e " ${GREEN}✅${NC} $1"; }
warn() { echo -e " ${YELLOW}⚠️${NC} $1"; }
err() { echo -e " ${RED}❌${NC} $1"; }
info() { echo -e " ${CYAN}📋${NC} $1"; }
# ─── Usage ──────────────────────────────────────────────────────────────────
usage() {
cat << EOF
Usage: $0 [OPTION]
Options :
--force Installation sans confirmation
--uninstall Retire les scripts du cron
--status Vérifie l'état des crons Gitea
--help Ce message
Configuration (variables d'environnement) :
SCRIPTS_DIR Dossier des scripts (défaut: \$HOME/scripts)
CRON_BACKUP_SCHEDULE Horaire backup (défaut: 0 2 * * *)
CRON_UPDATE_SCHEDULE Horaire update (défaut: 0 4 * * *)
EOF
exit 0
}
# ─── Vérification des prérequis ─────────────────────────────────────────────
check_prerequisites() {
local missing=0
if ! command -v crontab &>/dev/null; then
err "crontab n'est pas installé"
missing=1
fi
if [[ ! -f "$SCRIPTS_DIR/$BACKUP_SCRIPT" ]]; then
err "Script backup introuvable : $SCRIPTS_DIR/$BACKUP_SCRIPT"
missing=1
fi
if [[ ! -f "$SCRIPTS_DIR/$UPDATE_SCRIPT" ]]; then
err "Script update introuvable : $SCRIPTS_DIR/$UPDATE_SCRIPT"
missing=1
fi
return $missing
}
# ─── Status ─────────────────────────────────────────────────────────────────
show_status() {
echo ""
echo "════════════════════════════════════════════════════════"
echo "📊 ÉTAT DES CRONS GITEA"
echo "════════════════════════════════════════════════════════"
echo ""
local current_cron
current_cron=$(crontab -l 2>/dev/null || echo "")
# Vérifier présence du marqueur
if echo "$current_cron" | grep -qF "$CRON_MARKER"; then
ok "Bloc Gitea trouvé dans la crontab de $CRON_USER"
echo ""
echo "Entrées actives :"
echo "$current_cron" | grep -A1 "$CRON_MARKER" | grep -v "$CRON_MARKER" | grep -v '^$' | while read -r line; do
local schedule cmd rest
schedule=$(echo "$line" | awk '{print $1" "$2" "$3" "$4" "$5}')
cmd=$(echo "$line" | awk '{print $6}')
echo " 🕐 $schedule → $cmd"
done
else
warn "Aucun cron Gitea installé"
fi
echo ""
# Vérifier l'existence des scripts
if [[ -x "$SCRIPTS_DIR/$BACKUP_SCRIPT" ]]; then
ok "Script backup : $SCRIPTS_DIR/$BACKUP_SCRIPT"
else
err "Script backup : $SCRIPTS_DIR/$BACKUP_SCRIPT (manquant ou non exécutable)"
fi
if [[ -x "$SCRIPTS_DIR/$UPDATE_SCRIPT" ]]; then
ok "Script update : $SCRIPTS_DIR/$UPDATE_SCRIPT"
else
err "Script update : $SCRIPTS_DIR/$UPDATE_SCRIPT (manquant ou non exécutable)"
fi
echo ""
# Vérifier les logs
if [[ -f "$BACKUP_LOG" ]]; then
local log_size log_lines log_date
log_size=$(du -h "$BACKUP_LOG" | cut -f1)
log_lines=$(wc -l < "$BACKUP_LOG")
log_date=$(tail -1 "$BACKUP_LOG" 2>/dev/null | cut -c1-19)
ok "Log backup : $BACKUP_LOG ($log_size, $log_lines lignes, dernier: $log_date)"
else
warn "Log backup : $BACKUP_LOG (pas encore créé)"
fi
if [[ -f "$UPDATE_LOG" ]]; then
local log_size2 log_lines2 log_date2
log_size2=$(du -h "$UPDATE_LOG" | cut -f1)
log_lines2=$(wc -l < "$UPDATE_LOG")
log_date2=$(tail -1 "$UPDATE_LOG" 2>/dev/null | cut -c1-19)
ok "Log update : $UPDATE_LOG ($log_size2, $log_lines2 lignes, dernier: $log_date2)"
else
warn "Log update : $UPDATE_LOG (pas encore créé)"
fi
echo ""
echo "════════════════════════════════════════════════════════"
}
# ─── Installation ───────────────────────────────────────────────────────────
do_install() {
echo ""
echo "════════════════════════════════════════════════════════"
echo "🔧 INSTALLATION DES CRONS GITEA"
echo "════════════════════════════════════════════════════════"
echo ""
info "Utilisateur : $CRON_USER"
info "Dossier scripts : $SCRIPTS_DIR"
info "Horaire backup : $CRON_BACKUP_SCHEDULE"
info "Horaire update : $CRON_UPDATE_SCHEDULE"
echo ""
# Vérifier prérequis
check_prerequisites || {
echo ""
err "Prérequis manquants. Placez les scripts dans $SCRIPTS_DIR/"
echo ""
echo " git clone https://git.dracodev.net/Outils/gitea-scripts.git $SCRIPTS_DIR"
echo ""
exit 1
}
# Rendre les scripts exécutables
chmod +x "$SCRIPTS_DIR/$BACKUP_SCRIPT" "$SCRIPTS_DIR/$UPDATE_SCRIPT"
ok "Scripts rendus exécutables"
# Créer les dossiers de logs si nécessaire
if [[ "$LOG_DIR" != "$HOME"* ]] && [[ ! -w "$LOG_DIR" ]]; then
warn "Pas de droit d'écriture sur $LOG_DIR — les logs iront dans \$HOME"
BACKUP_LOG="$HOME/gitea-backup-cron.log"
UPDATE_LOG="$HOME/gitea-update-cron.log"
fi
# Lire la crontab actuelle
local current_cron
current_cron=$(crontab -l 2>/dev/null || echo "")
# Vérifier si déjà installé
if echo "$current_cron" | grep -qF "$CRON_MARKER"; then
warn "Les crons Gitea sont déjà installés"
info "Utilisez --uninstall pour les retirer d'abord, ou --force pour réinstaller"
show_status
exit 0
fi
# Construire le bloc cron
local cron_block
cron_block=$(cat << CRON_BLOCK
$CRON_MARKER
# Backup quotidien Gitea (DB + volumes)
$CRON_BACKUP_SCHEDULE $SCRIPTS_DIR/$BACKUP_SCRIPT >> $BACKUP_LOG 2>&1
# Vérification mise à jour Gitea Docker
$CRON_UPDATE_SCHEDULE $SCRIPTS_DIR/$UPDATE_SCRIPT >> $UPDATE_LOG 2>&1
# >>> END GITEA SCRIPTS <<<
CRON_BLOCK
)
# Appliquer
printf "%s\n" "$current_cron" "$cron_block" | crontab -
ok "Crons installés dans la crontab de $CRON_USER"
echo ""
echo "────────────────────────────────────────────────────────"
echo "📋 RÉSUMÉ"
echo "────────────────────────────────────────────────────────"
echo ""
echo " 🕐 $CRON_BACKUP_SCHEDULE → Backup Gitea"
echo " 🕐 $CRON_UPDATE_SCHEDULE → Vérification màj Gitea"
echo ""
echo " 📊 Logs :"
echo " Backup : $BACKUP_LOG"
echo " Update : $UPDATE_LOG"
echo ""
echo " 🔍 Vérifier : $0 --status"
echo " 🗑️ Retirer : $0 --uninstall"
echo ""
echo "════════════════════════════════════════════════════════"
}
# ─── Désinstallation ────────────────────────────────────────────────────────
do_uninstall() {
echo ""
echo "════════════════════════════════════════════════════════"
echo "🗑️ DÉSINSTALLATION DES CRONS GITEA"
echo "════════════════════════════════════════════════════════"
echo ""
local current_cron
current_cron=$(crontab -l 2>/dev/null || echo "")
if ! echo "$current_cron" | grep -qF "$CRON_MARKER"; then
warn "Aucun cron Gitea trouvé — rien à désinstaller"
exit 0
fi
# Retirer le bloc entre les marqueurs
local new_cron
new_cron=$(echo "$current_cron" | sed "/$CRON_MARKER/,/>>> END GITEA SCRIPTS <<</d")
if [[ -z "$new_cron" || "$new_cron" == "$current_cron" ]]; then
echo "$new_cron" | crontab - 2>/dev/null || crontab -r 2>/dev/null || true
else
echo "$new_cron" | crontab -
fi
ok "Crons Gitea retirés de la crontab de $CRON_USER"
echo ""
echo " Les scripts eux-mêmes n'ont PAS été supprimés."
echo " Ils restent dans $SCRIPTS_DIR/"
echo ""
echo "════════════════════════════════════════════════════════"
}
# ─── Main ───────────────────────────────────────────────────────────────────
FORCE=false
UNINSTALL=false
STATUS=false
for arg in "$@"; do
case "$arg" in
--force) FORCE=true ;;
--uninstall) UNINSTALL=true ;;
--status) STATUS=true ;;
--help|-h) usage ;;
*) echo "Option inconnue : $arg"; usage ;;
esac
done
if [[ "$STATUS" == "true" ]]; then
show_status
exit 0
fi
if [[ "$UNINSTALL" == "true" ]]; then
do_uninstall
exit 0
fi
# Installation
if [[ "$FORCE" != "true" ]]; then
echo ""
echo "Ce script va ajouter les entrées suivantes à la crontab de $CRON_USER :"
echo ""
echo " $CRON_BACKUP_SCHEDULE → Backup Gitea"
echo " $CRON_UPDATE_SCHEDULE → Vérification màj Gitea"
echo ""
read -p "Continuer ? [O/n] " -r REPLY
if [[ ! "$REPLY" =~ ^[OoYy]?$ ]]; then
echo "Annulé."
exit 0
fi
fi
do_install