#!/usr/bin/env bash set -Eeuo pipefail umask 022 # STEP022 - SERVER ATTESO: 215.6 / ax-accessi # # Target esclusivo: # /var/www/html/presenze.distribuite # # Mantiene: # libs/stimulsoft_legacy # # Elimina esclusivamente: # libs/stimulsoft # libs/stimulsoft_php # libs/stimulsoft_new # libs/stimulsoft_data # stimulsoftext # components/templates/custom_templates/ax_attendance/ax_stampe_no/stimulsoft # # Non tocca alcun altro portale custom. # Nessun backup: ambiente presenze.distribuite sacrificabile. START_DIR="$PWD" STAMP="$(date '+%Y%m%d_%H%M%S')" BASE="STEP022_2156_DISTRIBUITE_REMOVE_NON_LEGACY_STIMULSOFT_PATCH_TEST_COMMIT_ZIP_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}" LEGACY_DIR="${TARGET_DIR}/libs/stimulsoft_legacy" REMOVE_RELATIVE=( "libs/stimulsoft" "libs/stimulsoft_php" "libs/stimulsoft_new" "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 "MANTIENE: $LEGACY_DIR" log "ALTRI PORTALI CUSTOM: NON TOCCATI" log "MODALITA': PATCH + TEST + COMMIT" 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 "Mantiene: $LEGACY_DIR" echo "Altri portali custom: NON TOCCATI" echo "Modalita': PATCH + TEST + COMMIT" 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 stat readlink rm; 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" [[ -d "$LEGACY_DIR" ]] || fail "stimulsoft_legacy assente: $LEGACY_DIR" [[ ! -L "$LEGACY_DIR" ]] || fail "stimulsoft_legacy non deve essere un symlink in questo step" [[ -f "${LEGACY_DIR}/viewer.php" ]] || fail "viewer.php legacy assente" [[ -f "${LEGACY_DIR}/designer.php" ]] || fail "designer.php legacy assente" [[ "$FAILURES" -eq 0 ]] || exit 22 PHP_BIN="${STEP_PHP_BIN:-}" if [[ -z "$PHP_BIN" ]]; then if command -v php >/dev/null 2>&1; then PHP_BIN="$(command -v php)" else fail "php CLI non disponibile" exit 23 fi fi log "[1/6] Verifica sintassi Stimulsoft legacy" if ! "$PHP_BIN" -l "${LEGACY_DIR}/viewer.php" >>"$LOGFILE" 2>&1; then fail "php -l fallito su viewer.php legacy" fi if ! "$PHP_BIN" -l "${LEGACY_DIR}/designer.php" >>"$LOGFILE" 2>&1; then fail "php -l fallito su designer.php legacy" fi [[ "$FAILURES" -eq 0 ]] || exit 24 log "[2/6] Precheck percorsi da eliminare" printf 'percorso\ttipo\tbyte\tspazio\tesito_precheck\n' \ >"${WORKDIR}/01_PRECHECKS.tsv" TOTAL_BYTES=0 EXISTING_COUNT=0 for rel in "${REMOVE_RELATIVE[@]}"; do path="${TARGET_DIR}/${rel}" case "$path" in "${TARGET_DIR}/libs/stimulsoft" \ | "${TARGET_DIR}/libs/stimulsoft_php" \ | "${TARGET_DIR}/libs/stimulsoft_new" \ | "${TARGET_DIR}/libs/stimulsoft_data" \ | "${TARGET_DIR}/stimulsoftext" \ | "${TARGET_DIR}/components/templates/custom_templates/ax_attendance/ax_stampe_no/stimulsoft") ;; *) fail "percorso fuori whitelist: $path" continue ;; esac [[ "$path" != "$LEGACY_DIR" ]] || { fail "tentativo di includere stimulsoft_legacy nella rimozione" continue } if [[ -L "$path" ]]; then type="symlink" bytes=0 human="0B" status="PRESENTE_SYMLINK" EXISTING_COUNT=$((EXISTING_COUNT + 1)) elif [[ -d "$path" ]]; then 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")" status="PRESENTE_DIRECTORY" EXISTING_COUNT=$((EXISTING_COUNT + 1)) TOTAL_BYTES=$((TOTAL_BYTES + bytes)) elif [[ -e "$path" ]]; then type="tipo_inatteso" bytes=0 human="0B" status="ERRORE_TIPO_INATTESO" fail "percorso esistente con tipo inatteso: $path" else type="assente" bytes=0 human="0B" status="GIA_ASSENTE" fi printf '%s\t%s\t%s\t%s\t%s\n' \ "$path" "$type" "$bytes" "$human" "$status" \ >>"${WORKDIR}/01_PRECHECKS.tsv" done TOTAL_HUMAN="$(numfmt --to=iec-i --suffix=B "$TOTAL_BYTES" 2>/dev/null || printf '%sB' "$TOTAL_BYTES")" [[ "$FAILURES" -eq 0 ]] || exit 25 log "[3/6] Snapshot struttura legacy prima della rimozione" LEGACY_FILES_BEFORE="$(find "$LEGACY_DIR" -xdev -type f | wc -l | tr -d ' ')" LEGACY_DIRS_BEFORE="$(find "$LEGACY_DIR" -xdev -type d | wc -l | tr -d ' ')" LEGACY_BYTES_BEFORE="$(du -sbx -- "$LEGACY_DIR" | awk '{print $1}')" find "$LEGACY_DIR" \ -xdev \ -mindepth 1 \ -maxdepth 2 \ -printf '%y\t%p\t%l\n' \ | sort >"${WORKDIR}/02_LEGACY_STRUCTURE_BEFORE.tsv" log "[4/6] Rimozione esclusiva copie non legacy" REMOVED_COUNT=0 for rel in "${REMOVE_RELATIVE[@]}"; do path="${TARGET_DIR}/${rel}" if [[ -L "$path" ]]; then rm -f -- "$path" REMOVED_COUNT=$((REMOVED_COUNT + 1)) log "RIMOSSO SYMLINK: $path" elif [[ -d "$path" ]]; then rm -rf --one-file-system -- "$path" REMOVED_COUNT=$((REMOVED_COUNT + 1)) log "RIMOSSA DIRECTORY: $path" else log "GIA' ASSENTE: $path" fi done log "[5/6] Postcheck completo" printf 'percorso\tatteso\trilevato\tesito\n' \ >"${WORKDIR}/03_POSTCHECKS.tsv" REMAINING_COUNT=0 for rel in "${REMOVE_RELATIVE[@]}"; do path="${TARGET_DIR}/${rel}" if [[ -e "$path" || -L "$path" ]]; then state="PRESENTE" status="ERRORE" REMAINING_COUNT=$((REMAINING_COUNT + 1)) fail "percorso non eliminato: $path" else state="ASSENTE" status="OK" fi printf '%s\tASSENTE\t%s\t%s\n' \ "$path" "$state" "$status" \ >>"${WORKDIR}/03_POSTCHECKS.tsv" done [[ -d "$LEGACY_DIR" ]] || fail "stimulsoft_legacy eliminato o assente dopo la patch" [[ -f "${LEGACY_DIR}/viewer.php" ]] || fail "viewer.php legacy assente dopo la patch" [[ -f "${LEGACY_DIR}/designer.php" ]] || fail "designer.php legacy assente dopo la patch" LEGACY_FILES_AFTER="$(find "$LEGACY_DIR" -xdev -type f | wc -l | tr -d ' ')" LEGACY_DIRS_AFTER="$(find "$LEGACY_DIR" -xdev -type d | wc -l | tr -d ' ')" LEGACY_BYTES_AFTER="$(du -sbx -- "$LEGACY_DIR" | awk '{print $1}')" [[ "$LEGACY_FILES_AFTER" == "$LEGACY_FILES_BEFORE" ]] \ || fail "numero file legacy variato: prima=${LEGACY_FILES_BEFORE}, dopo=${LEGACY_FILES_AFTER}" [[ "$LEGACY_DIRS_AFTER" == "$LEGACY_DIRS_BEFORE" ]] \ || fail "numero directory legacy variato: prima=${LEGACY_DIRS_BEFORE}, dopo=${LEGACY_DIRS_AFTER}" [[ "$LEGACY_BYTES_AFTER" == "$LEGACY_BYTES_BEFORE" ]] \ || fail "dimensione legacy variata: prima=${LEGACY_BYTES_BEFORE}, dopo=${LEGACY_BYTES_AFTER}" if ! "$PHP_BIN" -l "${LEGACY_DIR}/viewer.php" >>"$LOGFILE" 2>&1; then fail "php -l fallito su viewer.php legacy dopo la patch" fi if ! "$PHP_BIN" -l "${LEGACY_DIR}/designer.php" >>"$LOGFILE" 2>&1; then fail "php -l fallito su designer.php legacy dopo la patch" fi { printf 'controllo\tatteso\trilevato\n' printf 'copie_non_legacy_presenti_prima\t-\t%s\n' "$EXISTING_COUNT" printf 'copie_non_legacy_rimosse\t%s\t%s\n' "$EXISTING_COUNT" "$REMOVED_COUNT" printf 'copie_non_legacy_residue\t0\t%s\n' "$REMAINING_COUNT" printf 'spazio_rimosso_byte\t%s\t%s\n' "$TOTAL_BYTES" "$TOTAL_BYTES" printf 'spazio_rimosso\t%s\t%s\n' "$TOTAL_HUMAN" "$TOTAL_HUMAN" printf 'legacy_file_prima\t%s\t%s\n' "$LEGACY_FILES_BEFORE" "$LEGACY_FILES_AFTER" printf 'legacy_directory_prima\t%s\t%s\n' "$LEGACY_DIRS_BEFORE" "$LEGACY_DIRS_AFTER" printf 'legacy_byte_prima\t%s\t%s\n' "$LEGACY_BYTES_BEFORE" "$LEGACY_BYTES_AFTER" } >"${WORKDIR}/04_RESULT_SUMMARY.tsv" [[ "$FAILURES" -eq 0 ]] || exit 26 log "[6/6] Esito" { echo "PATCH COMPLETATA" echo "Server: 215.6 / ax-accessi" echo "Target esclusivo: $TARGET_DIR" echo "Stimulsoft mantenuto: libs/stimulsoft_legacy" echo "Copie non legacy presenti prima: $EXISTING_COUNT" echo "Copie non legacy rimosse: $REMOVED_COUNT" echo "Copie non legacy residue: $REMAINING_COUNT" echo "Spazio rimosso: $TOTAL_HUMAN" echo "File legacy: $LEGACY_FILES_AFTER" echo "Directory legacy: $LEGACY_DIRS_AFTER" echo "PHP lint viewer/designer legacy: OK" echo "Altri portali custom toccati: NO" } >"${WORKDIR}/99_SUMMARY.txt" report "Mantenuto esclusivamente: $LEGACY_DIR." report "Rimosse ${REMOVED_COUNT} copie non legacy per ${TOTAL_HUMAN}." report "Altri portali custom non toccati." log "PATCH COMPLETATA E VERIFICATA"