#!/bin/bash # Script: 01_estrai_e_hash_debug.sh # Estrae i MDB dalla directory configurata in agent_config.json (ricorsivo!), salva CSV e hash, salta i file già estratti se non modificati. # Debug avanzato con echo/log, progress bar e contatori precisi, errori sempre tracciati mai bloccanti. # Autore: Pikappa2 – 2025-05-28 set -u # --- Funzione log avanzata --- logmsg() { # $1 = livello (INFO, WARN, ERR, REPORT, DEBUG) # $2 = messaggio local LEVEL="$1" local MSG="$2" local TS TS=$(date "+%Y-%m-%d %H:%M:%S") echo "[$TS][$LEVEL] $MSG" | tee -a "$LOG" } # --- Funzione debug condizionale --- debugmsg() { # $1 = messaggio if [[ "$DEBUG" == "true" ]]; then logmsg "DEBUG" "$1" fi } # --- Lettura configurazione --- CONFIG="$HOME/netgescon/agent_config.json" if ! command -v jq &>/dev/null; then echo "[ERRORE] jq non trovato! Installa con: sudo apt-get install jq" exit 1 fi if [[ ! -f "$CONFIG" ]]; then echo "[ERRORE] File di configurazione $CONFIG non trovato!" exit 1 fi IN=$(jq -r '.InputDirectory // empty' "$CONFIG") OUT=$(jq -r '.OutputDirectory // empty' "$CONFIG") DEBUG=$(jq -r '.Debug // "false"' "$CONFIG" | tr '[:upper:]' '[:lower:]') if [[ -z "$IN" || -z "$OUT" ]]; then echo "[ERRORE] InputDirectory o OutputDirectory non valorizzati nel file di configurazione!" exit 1 fi HASH="$OUT/hash" LOG="$HOME/netgescon/log/estrazione.log" mkdir -p "$OUT" "$HASH" "$(dirname "$LOG")" 2>/dev/null || { echo "[ERRORE] Impossibile creare cartelle di output." exit 1 } logmsg "INFO" "==== AVVIO ESTRAZIONE DATI ====" logmsg "INFO" "Input: $IN" logmsg "INFO" "Output: $OUT" logmsg "INFO" "Hash: $HASH" logmsg "INFO" "Log: $LOG" logmsg "INFO" "Debug: $DEBUG" MDB_FOUND=0 MDB_PROCESSED=0 TBL_EXTRACTED=0 TBL_SKIPPED=0 PDF_FOUND=0 PDF_COPIED=0 PDF_SKIPPED=0 ERROR_MDB=0 # --- Funzione estrazione tabelle MDB --- extract_tables() { local MDB="$1" local MDBNAME="$2" local DESTDIR="$3" local TBL_FOUND=0 local TBL_EXTR=0 local TBL_SKIP=0 local CHANGED=0 debugmsg "Entra in extract_tables con MDB=$MDB, MDBNAME=$MDBNAME, DESTDIR=$DESTDIR" mkdir -p "$DESTDIR" 2>/dev/null || { logmsg "ERR" "Impossibile creare cartella $DESTDIR" return 1 } local TBL_LIST TBL_LIST=$(mdb-tables -1 "$MDB" 2>&1) if [[ $? -ne 0 || -z "$TBL_LIST" ]]; then logmsg "ERR" "Impossibile leggere tabelle da $MDB: $TBL_LIST" return 1 fi while read -r TBL; do [[ -z "$TBL" ]] && continue ((TBL_FOUND++)) local CSV="$DESTDIR/$TBL.csv" local HASHFILE="$HASH/$MDBNAME.$TBL.csv.md5" TMP_CSV="$(mktemp)" debugmsg "Estrazione tabella $TBL da $MDB" local EXPORT_OUT EXPORT_OUT=$(mdb-export "$MDB" "$TBL" 2>&1 > "$TMP_CSV") if [[ $? -ne 0 ]]; then logmsg "WARN" "Errore nell'estrazione della tabella $TBL da $MDBNAME: $EXPORT_OUT" rm -f "$TMP_CSV" continue fi HASHVAL=$(md5sum "$TMP_CSV" | cut -d' ' -f1) if [[ -f "$CSV" && -f "$HASHFILE" ]]; then OLDHASH=$(cat "$HASHFILE") if [[ "$OLDHASH" == "$HASHVAL" ]]; then ((TBL_SKIPPED++)) ((TBL_SKIP++)) rm -f "$TMP_CSV" debugmsg "Tabella $TBL ($MDBNAME) invariata, saltata." continue fi fi cp "$TMP_CSV" "$CSV" 2>/dev/null || logmsg "WARN" "Impossibile copiare $TMP_CSV -> $CSV" echo "$HASHVAL" > "$HASHFILE" ((TBL_EXTRACTED++)) ((TBL_EXTR++)) CHANGED=1 logmsg "INFO" "Estratta tabella $TBL da $MDBNAME (hash $HASHVAL)" rm -f "$TMP_CSV" done <<< "$TBL_LIST" if [[ $TBL_EXTR -gt 0 ]]; then logmsg "REPORT" "MDB $MDBNAME: $TBL_EXTR tabelle estratte/aggiornate, $TBL_SKIP skippate." fi return $CHANGED } # --- Funzione PDF --- copy_and_hash_pdf() { local SRC="$1" local REL="$2" local DST="$OUT/$REL" local HASHFILE="$HASH/$(echo "$REL" | sed 's/\//_/g').pdf.md5" mkdir -p "$(dirname "$DST")" 2>/dev/null HASHVAL=$(md5sum "$SRC" | cut -d' ' -f1) if [[ -f "$DST" && -f "$HASHFILE" ]]; then OLDHASH=$(cat "$HASHFILE") if [[ "$OLDHASH" == "$HASHVAL" ]]; then ((PDF_SKIPPED++)) debugmsg "PDF $REL invariato, saltato." return fi fi cp "$SRC" "$DST" 2>/dev/null || logmsg "WARN" "Impossibile copiare $SRC -> $DST" echo "$HASHVAL" > "$HASHFILE" ((PDF_COPIED++)) logmsg "INFO" "PDF copiato/aggiornato: $REL (hash $HASHVAL)" } # --- MDB: ESTRAZIONE RICORSIVA CON PROGRESS BAR --- debugmsg "Inizio ricerca file MDB..." MDB_LIST=() while IFS= read -r line; do MDB_LIST+=("$line"); done < <(find "$IN" -type f -iname '*.mdb') TOTAL_MDB=${#MDB_LIST[@]} CURRENT_MDB=0 for MDB in "${MDB_LIST[@]}"; do ((CURRENT_MDB++)) # Barra di avanzamento testuale BAR_WIDTH=30 PERCENT=$((CURRENT_MDB * 100 / TOTAL_MDB)) BAR_DONE=$((CURRENT_MDB * BAR_WIDTH / TOTAL_MDB)) BAR_LEFT=$((BAR_WIDTH - BAR_DONE)) BAR="[" for ((i=0;i