diff --git a/install_cron.sh b/install_cron.sh new file mode 100755 index 0000000..5a7a4b1 --- /dev/null +++ b/install_cron.sh @@ -0,0 +1,303 @@ +#!/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 <</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