Correction et enrichissement complet des scripts Gitea
- Corrections de bugs (14): grep portable, df robuste, rollback reel, retention intelligente, nettoyage cible, lock anti-concurrence, etc. - Nouveaux fichiers: setup.sh (installateur tout-en-un), restore.sh (restauration standalone), gitea-scripts.conf (config unifiee) - Features: backup distant (rsync/SCP), lock files, logrotate, dry-run, healthchecks Docker, notifications Telegram/ntfy.sh - Documentation enrichie avec diagrammes d'architecture mermaid
This commit is contained in:
+114
-29
@@ -7,13 +7,23 @@
|
||||
# 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
|
||||
# bash install_cron.sh --dry-run → Affiche ce qui serait installé
|
||||
#
|
||||
# Paramètres configurables (modifier ci-dessous ou passer en variables d'env)
|
||||
# Paramètres configurables : voir gitea-scripts.conf
|
||||
# =============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ─── Configuration ──────────────────────────────────────────────────────────
|
||||
# ─── Charger la configuration commune ─────────────────────────────────────────
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
CONFIG_FILE="${CONFIG_FILE:-$SCRIPT_DIR/gitea-scripts.conf}"
|
||||
|
||||
if [[ -f "$CONFIG_FILE" ]]; then
|
||||
# shellcheck source=/dev/null
|
||||
source "$CONFIG_FILE"
|
||||
fi
|
||||
|
||||
# ─── Configuration locale ────────────────────────────────────────────────────
|
||||
SCRIPTS_DIR="${SCRIPTS_DIR:-$HOME/scripts}"
|
||||
CRON_BACKUP_SCHEDULE="${CRON_BACKUP_SCHEDULE:-0 2 * * *}"
|
||||
CRON_UPDATE_SCHEDULE="${CRON_UPDATE_SCHEDULE:-0 4 * * *}"
|
||||
@@ -42,6 +52,7 @@ Usage: $0 [OPTION]
|
||||
|
||||
Options :
|
||||
--force Installation sans confirmation
|
||||
--dry-run Affiche ce qui serait installé sans rien faire
|
||||
--uninstall Retire les scripts du cron
|
||||
--status Vérifie l'état des crons Gitea
|
||||
--help Ce message
|
||||
@@ -73,9 +84,28 @@ check_prerequisites() {
|
||||
missing=1
|
||||
fi
|
||||
|
||||
# Vérifier aussi la présence du fichier de config (optionnel mais recommandé)
|
||||
if [[ ! -f "$SCRIPTS_DIR/gitea-scripts.conf" ]]; then
|
||||
warn "Fichier de configuration introuvable : $SCRIPTS_DIR/gitea-scripts.conf"
|
||||
info "Les scripts utiliseront leurs valeurs par défaut"
|
||||
fi
|
||||
|
||||
return $missing
|
||||
}
|
||||
|
||||
# ─── Construire le bloc cron ────────────────────────────────────────────────
|
||||
build_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
|
||||
}
|
||||
|
||||
# ─── Status ─────────────────────────────────────────────────────────────────
|
||||
show_status() {
|
||||
echo ""
|
||||
@@ -93,10 +123,15 @@ show_status() {
|
||||
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
|
||||
# Extraire toutes les lignes entre les marqueurs
|
||||
echo "$current_cron" | sed -n "/$CRON_MARKER/,/>>> END GITEA SCRIPTS <<</p" | while read -r line; do
|
||||
# Ignorer les marqueurs et les commentaires
|
||||
[[ "$line" =~ ^[[:space:]]*# ]] && continue
|
||||
[[ -z "$line" ]] && continue
|
||||
# Afficher la ligne de cron
|
||||
local schedule cmd
|
||||
schedule=$(echo "$line" | awk '{print $1" "$2" "$3" "$4" "$5}')
|
||||
cmd=$(echo "$line" | awk '{print $6}')
|
||||
cmd=$(echo "$line" | awk '{for(i=6;i<=NF;i++) printf "%s ", $i; print ""}' | sed 's/ *$//')
|
||||
echo " 🕐 $schedule → $cmd"
|
||||
done
|
||||
else
|
||||
@@ -108,14 +143,25 @@ show_status() {
|
||||
# Vérifier l'existence des scripts
|
||||
if [[ -x "$SCRIPTS_DIR/$BACKUP_SCRIPT" ]]; then
|
||||
ok "Script backup : $SCRIPTS_DIR/$BACKUP_SCRIPT"
|
||||
elif [[ -f "$SCRIPTS_DIR/$BACKUP_SCRIPT" ]]; then
|
||||
warn "Script backup : $SCRIPTS_DIR/$BACKUP_SCRIPT (non exécutable)"
|
||||
else
|
||||
err "Script backup : $SCRIPTS_DIR/$BACKUP_SCRIPT (manquant ou non exécutable)"
|
||||
err "Script backup : $SCRIPTS_DIR/$BACKUP_SCRIPT (manquant)"
|
||||
fi
|
||||
|
||||
if [[ -x "$SCRIPTS_DIR/$UPDATE_SCRIPT" ]]; then
|
||||
ok "Script update : $SCRIPTS_DIR/$UPDATE_SCRIPT"
|
||||
elif [[ -f "$SCRIPTS_DIR/$UPDATE_SCRIPT" ]]; then
|
||||
warn "Script update : $SCRIPTS_DIR/$UPDATE_SCRIPT (non exécutable)"
|
||||
else
|
||||
err "Script update : $SCRIPTS_DIR/$UPDATE_SCRIPT (manquant ou non exécutable)"
|
||||
err "Script update : $SCRIPTS_DIR/$UPDATE_SCRIPT (manquant)"
|
||||
fi
|
||||
|
||||
# Vérifier le fichier de config
|
||||
if [[ -f "$SCRIPTS_DIR/gitea-scripts.conf" ]]; then
|
||||
ok "Config : $SCRIPTS_DIR/gitea-scripts.conf"
|
||||
else
|
||||
warn "Config : $SCRIPTS_DIR/gitea-scripts.conf (absent)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
@@ -123,9 +169,9 @@ show_status() {
|
||||
# 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)
|
||||
log_size=$(du -h "$BACKUP_LOG" 2>/dev/null | cut -f1)
|
||||
log_lines=$(wc -l < "$BACKUP_LOG" 2>/dev/null || echo "0")
|
||||
log_date=$(tail -1 "$BACKUP_LOG" 2>/dev/null | cut -c1-19 || echo "N/A")
|
||||
ok "Log backup : $BACKUP_LOG ($log_size, $log_lines lignes, dernier: $log_date)"
|
||||
else
|
||||
warn "Log backup : $BACKUP_LOG (pas encore créé)"
|
||||
@@ -133,9 +179,9 @@ show_status() {
|
||||
|
||||
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)
|
||||
log_size2=$(du -h "$UPDATE_LOG" 2>/dev/null | cut -f1)
|
||||
log_lines2=$(wc -l < "$UPDATE_LOG" 2>/dev/null || echo "0")
|
||||
log_date2=$(tail -1 "$UPDATE_LOG" 2>/dev/null | cut -c1-19 || echo "N/A")
|
||||
ok "Log update : $UPDATE_LOG ($log_size2, $log_lines2 lignes, dernier: $log_date2)"
|
||||
else
|
||||
warn "Log update : $UPDATE_LOG (pas encore créé)"
|
||||
@@ -173,7 +219,13 @@ do_install() {
|
||||
ok "Scripts rendus exécutables"
|
||||
|
||||
# Créer les dossiers de logs si nécessaire
|
||||
if [[ "$LOG_DIR" != "$HOME"* ]] && [[ ! -w "$LOG_DIR" ]]; then
|
||||
if [[ ! -d "$LOG_DIR" ]]; then
|
||||
mkdir -p "$LOG_DIR" 2>/dev/null || {
|
||||
warn "Impossible de créer $LOG_DIR — les logs iront dans \$HOME"
|
||||
BACKUP_LOG="$HOME/gitea-backup-cron.log"
|
||||
UPDATE_LOG="$HOME/gitea-update-cron.log"
|
||||
}
|
||||
elif [[ ! -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"
|
||||
@@ -193,19 +245,14 @@ do_install() {
|
||||
|
||||
# Construire le bloc cron
|
||||
local cron_block
|
||||
cron_block=$(cat << CRON_BLOCK
|
||||
cron_block=$(build_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 -
|
||||
# Appliquer : gérer le cas où la crontab est vide
|
||||
if [[ -z "$current_cron" ]]; then
|
||||
echo "$cron_block" | crontab -
|
||||
else
|
||||
printf "%s\n%s\n" "$current_cron" "$cron_block" | crontab -
|
||||
fi
|
||||
ok "Crons installés dans la crontab de $CRON_USER"
|
||||
|
||||
echo ""
|
||||
@@ -226,6 +273,32 @@ CRON_BLOCK
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
}
|
||||
|
||||
# ─── Dry run ────────────────────────────────────────────────────────────────
|
||||
do_dry_run() {
|
||||
echo ""
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo "🔍 DRY RUN — APERÇU DE L'INSTALLATION"
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
info "Utilisateur : $CRON_USER"
|
||||
info "Dossier scripts : $SCRIPTS_DIR"
|
||||
info "Horaire backup : $CRON_BACKUP_SCHEDULE"
|
||||
info "Horaire update : $CRON_UPDATE_SCHEDULE"
|
||||
echo ""
|
||||
|
||||
check_prerequisites || true
|
||||
|
||||
echo ""
|
||||
echo "Bloc qui serait ajouté à la crontab :"
|
||||
echo "────────────────────────────────────────"
|
||||
build_cron_block
|
||||
echo "────────────────────────────────────────"
|
||||
echo ""
|
||||
echo "⚠️ Aucune modification n'a été effectuée."
|
||||
echo " Utilisez --force pour installer sans confirmation."
|
||||
echo ""
|
||||
}
|
||||
|
||||
# ─── Désinstallation ────────────────────────────────────────────────────────
|
||||
do_uninstall() {
|
||||
echo ""
|
||||
@@ -246,13 +319,18 @@ do_uninstall() {
|
||||
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
|
||||
# Supprimer les lignes vides en trop
|
||||
new_cron=$(echo "$new_cron" | sed '/^$/N;/^\n$/d')
|
||||
|
||||
if [[ -z "${new_cron// }" ]]; then
|
||||
# Crontab complètement vide après suppression
|
||||
crontab -r 2>/dev/null || true
|
||||
ok "Crontab vidée et crons Gitea retirés"
|
||||
else
|
||||
echo "$new_cron" | crontab -
|
||||
ok "Crons Gitea retirés de la crontab de $CRON_USER"
|
||||
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/"
|
||||
@@ -264,12 +342,14 @@ do_uninstall() {
|
||||
FORCE=false
|
||||
UNINSTALL=false
|
||||
STATUS=false
|
||||
DRY_RUN=false
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--force) FORCE=true ;;
|
||||
--uninstall) UNINSTALL=true ;;
|
||||
--status) STATUS=true ;;
|
||||
--dry-run) DRY_RUN=true ;;
|
||||
--help|-h) usage ;;
|
||||
*) echo "Option inconnue : $arg"; usage ;;
|
||||
esac
|
||||
@@ -285,6 +365,11 @@ if [[ "$UNINSTALL" == "true" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
do_dry_run
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Installation
|
||||
if [[ "$FORCE" != "true" ]]; then
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user