netgescon-master/sync-docs-rsync.sh
Pikappa2 480e7eafbd 🎯 NETGESCON - Setup iniziale repository completo
📋 Commit iniziale con:
-  Documentazione unificata in docs/
-  Codice Laravel in netgescon-laravel/
-  Script automazione in scripts/
-  Configurazione sync rsync
-  Struttura organizzata e pulita

🔄 Versione: 2025.07.19-1644
🎯 Sistema pronto per Git distribuito
2025-07-19 16:44:47 +02:00

359 lines
12 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# NETGESCON - SCRIPT SINCRONIZZAZIONE DOCUMENTAZIONE
# =============================================================================
# Script per sincronizzare la documentazione unificata tra:
# - Server locale (sorgente)
# - NAS/Storage remoto
# - Google Drive
# - Altri server di backup
#
# Creato: 18/07/2025
# Autore: Michele + GitHub Copilot
# =============================================================================
# Configurazione colori
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configurazione base
DOCS_SOURCE="$HOME/netgescon/docs/"
LOG_FILE="$HOME/netgescon/log/sync-docs-$(date +%Y%m%d-%H%M%S).log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
CONFIG_FILE="$HOME/netgescon/sync-docs-config.env"
# Crea directory log se non esiste
mkdir -p "$HOME/netgescon/log"
# Funzione di logging
log() {
local level=$1
shift
local message="$*"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" | tee -a "$LOG_FILE"
}
# Funzione di stampa colorata
print_status() {
local color=$1
local message=$2
echo -e "${color}$message${NC}"
log "INFO" "$message"
}
# Funzione di controllo prerequisiti
check_prerequisites() {
print_status "$BLUE" "🔍 Controllo prerequisiti..."
# Verifica rsync
if ! command -v rsync &> /dev/null; then
print_status "$RED" "❌ ERRORE: rsync non installato"
log "ERROR" "rsync non trovato nel sistema"
exit 1
fi
# Verifica directory sorgente
if [ ! -d "$DOCS_SOURCE" ]; then
print_status "$RED" "❌ ERRORE: Directory docs/ non trovata: $DOCS_SOURCE"
log "ERROR" "Directory sorgente non trovata: $DOCS_SOURCE"
exit 1
fi
# Verifica file chiave
local key_files=(
"00-INDICE-DOCS-UNIFICATA.md"
"00-COPILOT-MASTER-GUIDE.md"
"00-transizione-linux/README-TRANSITION-COMPLETE.md"
"00-transizione-linux/FEATURES-INVENTORY-COMPLETE.md"
)
for file in "${key_files[@]}"; do
if [ ! -f "$DOCS_SOURCE$file" ]; then
print_status "$RED" "❌ ERRORE: File chiave mancante: $file"
log "ERROR" "File chiave mancante: $DOCS_SOURCE$file"
exit 1
fi
done
print_status "$GREEN" "✅ Tutti i prerequisiti soddisfatti"
}
# Funzione di statistiche pre-sync
show_stats() {
print_status "$BLUE" "📊 Statistiche documentazione da sincronizzare:"
local total_files=$(find "$DOCS_SOURCE" -type f | wc -l)
local md_files=$(find "$DOCS_SOURCE" -name "*.md" | wc -l)
local img_files=$(find "$DOCS_SOURCE" -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.gif" | wc -l)
local sh_files=$(find "$DOCS_SOURCE" -name "*.sh" | wc -l)
local total_size=$(du -sh "$DOCS_SOURCE" | cut -f1)
echo " 📄 File totali: $total_files"
echo " 📝 File Markdown: $md_files"
echo " 🖼️ Immagini: $img_files"
echo " ⚙️ Script: $sh_files"
echo " 💾 Dimensione totale: $total_size"
echo ""
log "STATS" "File totali: $total_files, MD: $md_files, IMG: $img_files, SH: $sh_files, Size: $total_size"
}
# Funzione di sincronizzazione generica
sync_to_destination() {
local dest_name=$1
local dest_path=$2
local options=$3
print_status "$YELLOW" "🔄 Sincronizzazione verso $dest_name..."
print_status "$BLUE" " Destinazione: $dest_path"
# Prepara opzioni rsync
local rsync_opts="-avz --progress --delete --exclude='.git' --exclude='*.tmp' --exclude='*~'"
if [ -n "$options" ]; then
rsync_opts="$rsync_opts $options"
fi
# Crea directory destinazione se necessario (per percorsi locali)
if [[ "$dest_path" != *":"* ]]; then
mkdir -p "$dest_path"
fi
# Esegui sincronizzazione
local sync_start=$(date +%s)
if eval rsync $rsync_opts "$DOCS_SOURCE" "$dest_path" 2>&1 | tee -a "$LOG_FILE"; then
local sync_end=$(date +%s)
local sync_duration=$((sync_end - sync_start))
print_status "$GREEN" "✅ Sincronizzazione completata verso $dest_name (${sync_duration}s)"
log "SUCCESS" "Sync completata verso $dest_name in ${sync_duration}s"
return 0
else
print_status "$RED" "❌ ERRORE durante sincronizzazione verso $dest_name"
log "ERROR" "Sync fallita verso $dest_name"
return 1
fi
}
# Configurazione destinazioni
setup_destinations() {
print_status "$BLUE" "📋 Configurazione destinazioni di sincronizzazione..."
# Carica configurazioni dal file
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
log "INFO" "Configurazione caricata da: $CONFIG_FILE"
else
print_status "$YELLOW" "⚠️ File configurazione non trovato: $CONFIG_FILE"
print_status "$BLUE" " Uso configurazione di default (solo backup locale)"
fi
# Array associativo per destinazioni attive
declare -A destinations
# Carica destinazioni dal file di configurazione
# Solo le variabili definite e non vuote vengono aggiunte
# Backup locali
[ -n "${BACKUP_LOCAL:-}" ] && destinations["BACKUP_LOCAL"]="$BACKUP_LOCAL"
[ -n "${BACKUP_EXTERNAL:-}" ] && destinations["BACKUP_EXTERNAL"]="$BACKUP_EXTERNAL"
# Server remoti
[ -n "${SERVER_PRODUCTION:-}" ] && destinations["SERVER_PRODUCTION"]="$SERVER_PRODUCTION"
[ -n "${SERVER_DEV:-}" ] && destinations["SERVER_DEV"]="$SERVER_DEV"
[ -n "${SERVER_BACKUP:-}" ] && destinations["SERVER_BACKUP"]="$SERVER_BACKUP"
# Cloud storage
[ -n "${GOOGLE_DRIVE:-}" ] && destinations["GOOGLE_DRIVE"]="$GOOGLE_DRIVE"
[ -n "${DROPBOX:-}" ] && destinations["DROPBOX"]="$DROPBOX"
[ -n "${ONEDRIVE:-}" ] && destinations["ONEDRIVE"]="$ONEDRIVE"
# NAS e storage di rete
[ -n "${NAS_SSH:-}" ] && destinations["NAS_SSH"]="$NAS_SSH"
[ -n "${NAS_SMB:-}" ] && destinations["NAS_SMB"]="$NAS_SMB"
[ -n "${FTP_SERVER:-}" ] && destinations["FTP_SERVER"]="$FTP_SERVER"
# Se nessuna destinazione configurata, aggiungi backup locale di default
if [ ${#destinations[@]} -eq 0 ]; then
destinations["BACKUP_LOCAL"]="$HOME/netgescon-backup/docs/"
print_status "$YELLOW" " Nessuna destinazione configurata, uso backup locale di default"
fi
# Mostra destinazioni configurate
print_status "$BLUE" " Destinazioni configurate:"
for dest in "${!destinations[@]}"; do
echo " - $dest: ${destinations[$dest]}"
done
echo ""
# Ritorna le destinazioni configurate con opzioni personalizzate
for dest in "${!destinations[@]}"; do
local dest_path="${destinations[$dest]}"
local dest_opts_var="${dest}_OPTS"
local dest_opts="${!dest_opts_var:-}"
echo "$dest:$dest_path:$dest_opts"
done
}
# Funzione principale di sincronizzazione
perform_sync() {
print_status "$BLUE" "🚀 Avvio sincronizzazione documentazione NetGescon"
echo ""
local destinations_list=$(setup_destinations)
local sync_success=0
local sync_total=0
# Per ogni destinazione configurata
while IFS=':' read -r dest_name dest_path dest_options; do
if [ -n "$dest_name" ] && [ -n "$dest_path" ]; then
sync_total=$((sync_total + 1))
# Conferma prima della sincronizzazione (per destinazioni critiche)
if [[ "$dest_path" == *"@"* ]] || [[ "$dest_path" == *":"* ]]; then
print_status "$YELLOW" "⚠️ Sincronizzazione remota verso $dest_name"
read -p "Continuare? (y/N): " confirm
if [[ "$confirm" != [yY] ]]; then
print_status "$YELLOW" "⏭️ Saltata sincronizzazione verso $dest_name"
continue
fi
fi
if sync_to_destination "$dest_name" "$dest_path" "$dest_options"; then
sync_success=$((sync_success + 1))
fi
echo ""
fi
done <<< "$destinations_list"
# Riepilogo finale
print_status "$BLUE" "📋 RIEPILOGO SINCRONIZZAZIONE:"
echo " ✅ Successi: $sync_success/$sync_total"
echo " 📝 Log completo: $LOG_FILE"
echo " 🕒 Completato: $TIMESTAMP"
if [ $sync_success -eq $sync_total ]; then
print_status "$GREEN" "🎉 Tutte le sincronizzazioni completate con successo!"
log "SUCCESS" "Tutte le sincronizzazioni completate"
return 0
else
print_status "$YELLOW" "⚠️ Alcune sincronizzazioni sono fallite. Controllare il log."
log "WARNING" "Sincronizzazioni parziali: $sync_success/$sync_total"
return 1
fi
}
# Funzione di verifica post-sync
verify_sync() {
local dest_path=$1
if [[ "$dest_path" == *":"* ]]; then
# Destinazione remota - verifica limitata
return 0
fi
if [ -d "$dest_path" ]; then
local dest_files=$(find "$dest_path" -type f | wc -l)
local source_files=$(find "$DOCS_SOURCE" -type f | wc -l)
if [ "$dest_files" -eq "$source_files" ]; then
print_status "$GREEN" "✅ Verifica OK: $dest_files file sincronizzati"
return 0
else
print_status "$YELLOW" "⚠️ Possibile problema: source=$source_files, dest=$dest_files"
return 1
fi
else
print_status "$RED" "❌ Directory destinazione non trovata"
return 1
fi
}
# Funzione di aiuto
show_help() {
cat << EOF
NETGESCON - Script Sincronizzazione Documentazione
UTILIZZO:
$0 [opzione]
OPZIONI:
--help, -h Mostra questo aiuto
--stats Mostra solo statistiche senza sincronizzare
--check Controlla solo prerequisiti
--dry-run Simula sincronizzazione senza modificare file
--force Sincronizza senza conferme interattive
ESEMPI:
$0 # Sincronizzazione normale con conferme
$0 --stats # Solo statistiche
$0 --dry-run # Test senza modifiche
$0 --force # Sincronizzazione automatica
CONFIGURAZIONE:
Modifica la funzione setup_destinations() per aggiungere/rimuovere destinazioni.
Le destinazioni remote richiedono configurazione SSH/rclone appropriata.
LOG:
I log vengono salvati in: $HOME/netgescon/log/
EOF
}
# Main - Parsing argomenti e esecuzione
main() {
case "${1:-}" in
--help|-h)
show_help
exit 0
;;
--stats)
check_prerequisites
show_stats
exit 0
;;
--check)
check_prerequisites
print_status "$GREEN" "✅ Sistema pronto per la sincronizzazione"
exit 0
;;
--dry-run)
print_status "$YELLOW" "🔍 MODALITÀ DRY-RUN (nessuna modifica effettiva)"
# TODO: Implementare dry-run con --dry-run in rsync
check_prerequisites
show_stats
print_status "$BLUE" "In modalità dry-run, usare rsync con --dry-run"
exit 0
;;
--force)
print_status "$YELLOW" "⚡ MODALITÀ FORCE (senza conferme)"
export SYNC_FORCE_MODE=1
;;
"")
# Modalità normale
;;
*)
echo "Opzione non riconosciuta: $1"
echo "Usare --help per vedere le opzioni disponibili"
exit 1
;;
esac
# Esecuzione normale
print_status "$BLUE" "🏁 AVVIO SINCRONIZZAZIONE NETGESCON DOCS"
echo "=================================================="
check_prerequisites
show_stats
perform_sync
print_status "$BLUE" "🏁 Sincronizzazione terminata"
}
# Esegui se chiamato direttamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi