#!/usr/bin/env bash set -Eeuo pipefail umask 022 # STEP020 - SERVER ATTESO: 215.6 / ax-accessi # # Audit esclusivo di /var/www/html/presenze.distribuite. # Individua tutte le copie Stimulsoft, ne misura lo spazio e cerca i riferimenti # reali nel codice applicativo esterno alle copie stesse. # # Non elimina nulla. # Non tocca altri portali custom. START_DIR="$PWD" STAMP="$(date '+%Y%m%d_%H%M%S')" BASE="STEP020_2156_DISTRIBUITE_STIMULSOFT_COPIES_REFERENCES_AUDIT_ONLY_${STAMP}" WORKDIR="${START_DIR}/.${BASE}_work_$$" OUTZIP="${START_DIR}/${BASE}.zip" LOGFILE="${WORKDIR}/run.log" REPORT="${WORKDIR}/report.txt" PACKAGED=0 FAILURES=0 WARNINGS=0 EXPECTED_HOST="${STEP_EXPECTED_HOST:-ax-accessi}" EXPECTED_IP="${STEP_EXPECTED_IP:-192.168.215.6}" SKIP_SERVER_CHECK="${STEP_SKIP_SERVER_CHECK:-0}" TARGET_DIR="${STEP_TARGET_DIR:-/var/www/html/presenze.distribuite}" CANDIDATES=( "libs/stimulsoft" "libs/stimulsoft_php" "libs/stimulsoft_new" "libs/stimulsoft_legacy" "libs/stimulsoft_data" "stimulsoftext" "components/templates/custom_templates/ax_attendance/ax_stampe_no/stimulsoft" ) mkdir -p "$WORKDIR" : >"$LOGFILE" : >"$REPORT" log() { printf '%s\n' "$*" | tee -a "$LOGFILE"; } report() { printf '%s\n' "$*" >>"$REPORT"; } fail() { FAILURES=$((FAILURES + 1)); log "ERRORE: $*"; report "ERRORE: $*"; } warn() { WARNINGS=$((WARNINGS + 1)); log "ATTENZIONE: $*"; report "ATTENZIONE: $*"; } package_results() { local rc="${1:-0}" local zip_rc=0 [[ "$PACKAGED" -eq 1 ]] && return 0 PACKAGED=1 report "" report "Esito finale: errori=${FAILURES}, avvisi=${WARNINGS}, exit_code=${rc}" rm -f -- "$OUTZIP" if ! command -v zip >/dev/null 2>&1; then rm -rf -- "$WORKDIR" printf '%s\n' "ERRORE: comando zip non disponibile" >&2 return 127 fi (cd "$WORKDIR" && zip -qr "$OUTZIP" .) || zip_rc=$? if [[ "$zip_rc" -eq 0 ]]; then zip -T "$OUTZIP" >>"$LOGFILE" 2>&1 || zip_rc=$? fi rm -rf -- "$WORKDIR" if [[ "$zip_rc" -ne 0 ]]; then rm -f -- "$OUTZIP" printf '%s\n' "ERRORE: creazione/verifica ZIP fallita (rc=${zip_rc})" >&2 return "$zip_rc" fi printf '%s\n' "ZIP CREATO E VERIFICATO: $OUTZIP" } on_exit() { local rc=$? trap - EXIT INT TERM HUP package_results "$rc" || rc=$? exit "$rc" } trap on_exit EXIT trap 'exit 130' INT trap 'exit 143' TERM HUP log "$BASE" log "SERVER ATTESO: 215.6 / ax-accessi" log "TARGET ESCLUSIVO: $TARGET_DIR" log "ALTRI PORTALI CUSTOM: NON TOCCATI" log "MODALITA': AUDIT ONLY - NESSUNA MODIFICA" log "Avvio: $(date --iso-8601=seconds)" ACTUAL_HOST="$(hostname -s 2>/dev/null || hostname)" ACTUAL_IPS="$(hostname -I 2>/dev/null | xargs || true)" { echo "STEP: $BASE" echo "Server atteso: 215.6 / ax-accessi" echo "Target esclusivo: $TARGET_DIR" echo "Altri portali custom: NON TOCCATI" echo "Modalita': AUDIT ONLY" echo "Data: $(date --iso-8601=seconds)" echo "Hostname: $ACTUAL_HOST" echo "IP: $ACTUAL_IPS" echo } >>"$REPORT" for cmd in grep awk wc sort zip hostname xargs tr find du numfmt basename sha256sum sed cut; do command -v "$cmd" >/dev/null 2>&1 || fail "comando richiesto non disponibile: $cmd" done [[ "$FAILURES" -eq 0 ]] || exit 20 if [[ "$SKIP_SERVER_CHECK" != "1" ]]; then [[ "$ACTUAL_HOST" == "$EXPECTED_HOST" ]] \ || fail "hostname ${ACTUAL_HOST}; previsto ${EXPECTED_HOST}" if [[ -n "$EXPECTED_IP" ]] && ! grep -qw -- "$EXPECTED_IP" <<<"$ACTUAL_IPS"; then fail "IP ${EXPECTED_IP} non presente tra: ${ACTUAL_IPS}" fi fi [[ "$FAILURES" -eq 0 ]] || exit 21 [[ "$TARGET_DIR" == "/var/www/html/presenze.distribuite" ]] \ || fail "target inatteso: $TARGET_DIR" [[ -d "$TARGET_DIR" ]] || fail "cartella target assente: $TARGET_DIR" [[ "$FAILURES" -eq 0 ]] || exit 22 log "[1/6] Dimensioni e struttura delle copie Stimulsoft" printf 'candidato\tesiste\ttipo\tbyte\tspazio\tfile\tviewer_php\tdesigner_php\n' \ >"${WORKDIR}/01_CANDIDATES.tsv" TOTAL_CANDIDATE_BYTES=0 EXISTING_CANDIDATES=0 for rel in "${CANDIDATES[@]}"; do path="${TARGET_DIR}/${rel}" exists="NO" type="assente" bytes=0 human="0B" files=0 viewer=0 designer=0 if [[ -L "$path" ]]; then exists="SI" type="symlink" files="$(find -L "$path" -xdev -type f 2>/dev/null | wc -l | tr -d ' ')" viewer="$(find -L "$path" -xdev -type f -name 'viewer.php' 2>/dev/null | wc -l | tr -d ' ')" designer="$(find -L "$path" -xdev -type f -name 'designer.php' 2>/dev/null | wc -l | tr -d ' ')" EXISTING_CANDIDATES=$((EXISTING_CANDIDATES + 1)) elif [[ -d "$path" ]]; then exists="SI" type="directory_reale" bytes="$(du -sbx -- "$path" 2>/dev/null | awk '{print $1}' || printf '0')" human="$(numfmt --to=iec-i --suffix=B "$bytes" 2>/dev/null || printf '%sB' "$bytes")" files="$(find "$path" -xdev -type f 2>/dev/null | wc -l | tr -d ' ')" viewer="$(find "$path" -xdev -type f -name 'viewer.php' 2>/dev/null | wc -l | tr -d ' ')" designer="$(find "$path" -xdev -type f -name 'designer.php' 2>/dev/null | wc -l | tr -d ' ')" TOTAL_CANDIDATE_BYTES=$((TOTAL_CANDIDATE_BYTES + bytes)) EXISTING_CANDIDATES=$((EXISTING_CANDIDATES + 1)) fi printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ "$rel" "$exists" "$type" "$bytes" "$human" "$files" "$viewer" "$designer" \ >>"${WORKDIR}/01_CANDIDATES.tsv" done TOTAL_CANDIDATE_HUMAN="$(numfmt --to=iec-i --suffix=B "$TOTAL_CANDIDATE_BYTES" 2>/dev/null || printf '%sB' "$TOTAL_CANDIDATE_BYTES")" log "[2/6] Preparazione elenco file applicativi da analizzare" CODE_FILES="${WORKDIR}/02_CODE_FILES.list" : >"$CODE_FILES" find "$TARGET_DIR" \ -xdev \ \( \ -path "${TARGET_DIR}/libs/stimulsoft" \ -o -path "${TARGET_DIR}/libs/stimulsoft_php" \ -o -path "${TARGET_DIR}/libs/stimulsoft_new" \ -o -path "${TARGET_DIR}/libs/stimulsoft_legacy" \ -o -path "${TARGET_DIR}/libs/stimulsoft_data" \ -o -path "${TARGET_DIR}/stimulsoftext" \ -o -path "${TARGET_DIR}/components/templates/custom_templates/ax_attendance/ax_stampe_no/stimulsoft" \ -o -path "${TARGET_DIR}/bower_components" \ -o -path "${TARGET_DIR}/node_modules" \ \) -prune \ -o -type f \ \( \ -name '*.php' \ -o -name '*.js' \ -o -name '*.json' \ -o -name '*.html' \ -o -name '*.htm' \ -o -name '*.css' \ -o -name '*.scss' \ -o -name '*.less' \ -o -name '*.xml' \ -o -name '*.ini' \ -o -name '*.conf' \ -o -name '*.mrt' \ -o -name '*.txt' \ \) \ -print0 >"$CODE_FILES" CODE_FILE_COUNT="$(tr -cd '\0' <"$CODE_FILES" | wc -c | tr -d ' ')" log "[3/6] Ricerca riferimenti espliciti alle singole copie" REFERENCES_RAW="${WORKDIR}/03_REFERENCES_RAW.tsv" printf 'categoria\tfile\triga\ttesto\n' >"$REFERENCES_RAW" search_pattern() { local category="$1" local pattern="$2" local file local line local lineno local content while IFS= read -r -d '' file; do while IFS= read -r line; do [[ -n "$line" ]] || continue lineno="${line%%:*}" content="${line#*:}" content="$(printf '%s' "$content" | tr '\t\r\n' ' ' | cut -c1-500)" printf '%s\t%s\t%s\t%s\n' \ "$category" "$file" "$lineno" "$content" \ >>"$REFERENCES_RAW" done < <(grep -nI -E "$pattern" "$file" 2>/dev/null || true) done <"$CODE_FILES" } search_pattern "libs/stimulsoft_legacy" 'libs/stimulsoft_legacy|/stimulsoft_legacy/' search_pattern "libs/stimulsoft_new" 'libs/stimulsoft_new|/stimulsoft_new/' search_pattern "libs/stimulsoft_php" 'libs/stimulsoft_php|/stimulsoft_php/' search_pattern "libs/stimulsoft" 'libs/stimulsoft/|libs/stimulsoft["'\'']' search_pattern "stimulsoftext" 'stimulsoftext' search_pattern "ax_stampe_no/stimulsoft" 'ax_stampe_no/stimulsoft' search_pattern "generic_stimulsoft" 'stimulsoft' REFERENCE_ROWS=$(( $(wc -l <"$REFERENCES_RAW") - 1 )) log "[4/6] Riepilogo riferimenti per categoria" printf 'categoria\triferimenti\tfile_distinti\n' >"${WORKDIR}/04_REFERENCE_SUMMARY.tsv" for category in \ "libs/stimulsoft_legacy" \ "libs/stimulsoft_new" \ "libs/stimulsoft_php" \ "libs/stimulsoft" \ "stimulsoftext" \ "ax_stampe_no/stimulsoft" \ "generic_stimulsoft" do refs="$(awk -F '\t' -v c="$category" 'NR>1 && $1==c {n++} END {print n+0}' "$REFERENCES_RAW")" files="$(awk -F '\t' -v c="$category" 'NR>1 && $1==c {print $2}' "$REFERENCES_RAW" | sort -u | wc -l | tr -d ' ')" printf '%s\t%s\t%s\n' "$category" "$refs" "$files" \ >>"${WORKDIR}/04_REFERENCE_SUMMARY.tsv" done log "[5/6] File di ingresso e impronte dei componenti principali" printf 'candidato\tfile_relativo\tesiste\tbyte\tsha256\n' \ >"${WORKDIR}/05_ENTRY_FILES_HASHES.tsv" ENTRY_FILES=( "viewer.php" "designer.php" "scripts/stimulsoft.reports.js" "scripts/stimulsoft.designer.js" "scripts/ES5/stimulsoft.reports.js" "scripts/ES5/stimulsoft.designer.js" ) for rel in "${CANDIDATES[@]}"; do base="${TARGET_DIR}/${rel}" [[ -d "$base" ]] || continue for entry in "${ENTRY_FILES[@]}"; do path="${base}/${entry}" if [[ -f "$path" ]]; then bytes="$(stat -c '%s' "$path" 2>/dev/null || printf '0')" hash="$(sha256sum "$path" | awk '{print $1}')" printf '%s\t%s\tSI\t%s\t%s\n' "$rel" "$entry" "$bytes" "$hash" \ >>"${WORKDIR}/05_ENTRY_FILES_HASHES.tsv" else printf '%s\t%s\tNO\t0\t-\n' "$rel" "$entry" \ >>"${WORKDIR}/05_ENTRY_FILES_HASHES.tsv" fi done done log "[6/6] Esito" LEGACY_REFS="$(awk -F '\t' '$1=="libs/stimulsoft_legacy" {print $2}' "${WORKDIR}/04_REFERENCE_SUMMARY.tsv")" NEW_REFS="$(awk -F '\t' '$1=="libs/stimulsoft_new" {print $2}' "${WORKDIR}/04_REFERENCE_SUMMARY.tsv")" PHP_REFS="$(awk -F '\t' '$1=="libs/stimulsoft_php" {print $2}' "${WORKDIR}/04_REFERENCE_SUMMARY.tsv")" MAIN_REFS="$(awk -F '\t' '$1=="libs/stimulsoft" {print $2}' "${WORKDIR}/04_REFERENCE_SUMMARY.tsv")" EXT_REFS="$(awk -F '\t' '$1=="stimulsoftext" {print $2}' "${WORKDIR}/04_REFERENCE_SUMMARY.tsv")" TEMPLATE_REFS="$(awk -F '\t' '$1=="ax_stampe_no/stimulsoft" {print $2}' "${WORKDIR}/04_REFERENCE_SUMMARY.tsv")" { printf 'voce\tvalore\n' printf 'file_codice_analizzati\t%s\n' "$CODE_FILE_COUNT" printf 'copie_stimulsoft_esistenti\t%s\n' "$EXISTING_CANDIDATES" printf 'spazio_totale_copie_byte\t%s\n' "$TOTAL_CANDIDATE_BYTES" printf 'spazio_totale_copie\t%s\n' "$TOTAL_CANDIDATE_HUMAN" printf 'riferimenti_totali\t%s\n' "$REFERENCE_ROWS" printf 'riferimenti_legacy\t%s\n' "$LEGACY_REFS" printf 'riferimenti_new\t%s\n' "$NEW_REFS" printf 'riferimenti_php\t%s\n' "$PHP_REFS" printf 'riferimenti_main\t%s\n' "$MAIN_REFS" printf 'riferimenti_stimulsoftext\t%s\n' "$EXT_REFS" printf 'riferimenti_template_stimulsoft\t%s\n' "$TEMPLATE_REFS" } >"${WORKDIR}/06_SUMMARY.tsv" { echo "AUDIT COMPLETATO" echo "Errori: $FAILURES" echo "Avvisi: $WARNINGS" echo "Target esclusivo: $TARGET_DIR" echo "File applicativi analizzati: $CODE_FILE_COUNT" echo "Copie Stimulsoft esistenti: $EXISTING_CANDIDATES" echo "Spazio totale copie Stimulsoft: $TOTAL_CANDIDATE_HUMAN" echo "Riferimenti libs/stimulsoft_legacy: $LEGACY_REFS" echo "Riferimenti libs/stimulsoft_new: $NEW_REFS" echo "Riferimenti libs/stimulsoft_php: $PHP_REFS" echo "Riferimenti libs/stimulsoft: $MAIN_REFS" echo "Riferimenti stimulsoftext: $EXT_REFS" echo "Riferimenti template ax_stampe_no/stimulsoft: $TEMPLATE_REFS" echo "Altri portali custom toccati: NO" echo "Nessuna modifica eseguita." } >"${WORKDIR}/99_SUMMARY.txt" report "Analizzate ${EXISTING_CANDIDATES} copie Stimulsoft per ${TOTAL_CANDIDATE_HUMAN}." report "Riferimenti legacy=${LEGACY_REFS}, new=${NEW_REFS}, php=${PHP_REFS}, main=${MAIN_REFS}, stimulsoftext=${EXT_REFS}, template=${TEMPLATE_REFS}." report "Altri portali custom non toccati." log "AUDIT COMPLETATO: errori=${FAILURES}, avvisi=${WARNINGS}"