📋 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
359 lines
12 KiB
Bash
Executable File
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
|