#!/bin/bash
# Sostituisce il DB di staging con l'ultimo dump di produzione. Gira SOLO su staging.
#
# Lanciato dal cron notturno e dal bottone di /admin/crmp/git-management (via `at now`, fuori da php-fpm).
# Credenziali MySQL in ~/db_imports/.my.cnf (chmod 600): [client] user=… password=…
# Stato dell'ultima esecuzione in ~/db_imports/sync.status, log in ~/db_imports/sync.log: li legge la pagina.

set -euo pipefail

WORKDIR="$HOME/db_imports"
DUMP="$HOME/db_backups_symlinks/crmp/crmp_db_backup.sql.gz"
COPIA="$WORKDIR/crmp_db_backup.sql.gz"
DB="dmstaging_crmprestito"
MYSQL=(mysql --defaults-extra-file="$WORKDIR/.my.cnf")

# Attesa breve e non -n: la pagina prova il lock per un istante a ogni caricamento.
exec 9>"$WORKDIR/sync.lock"
if ! flock -w 30 9; then
	echo "Sync già in corso: esco." >&2
	exit 1
fi

exec >"$WORKDIR/sync.log" 2>&1

stato() {
	echo "$(date '+%F %T') $1" >"$WORKDIR/sync.status"
	echo "[$(date '+%T')] $1"
}
trap 'stato "FALLITO alla riga $LINENO"' ERR
trap 'rm -f "$COPIA"' EXIT

# Il dump è il backup live di prod: lo si copia e si verifica la copia, così una riscrittura
# durante l'import non può troncarlo. La verifica precede il drop: su dump incompleto staging resta intatto.
stato "IN CORSO: copia del dump"
cp -fp "$DUMP" "$COPIA"
stato "IN CORSO: verifica integrità del dump"
if ! pigz -t "$COPIA"; then
	stato "FALLITO: dump di prod incompleto (backup in scrittura?), staging non toccato"
	exit 1
fi

# Drop di tutto lo schema: toglie anche le tabelle che su prod non esistono più.
stato "IN CORSO: drop delle tabelle"
"${MYSQL[@]}" -N -B -e "
	SELECT CONCAT('DROP ', IF(table_type = 'VIEW', 'VIEW', 'TABLE'), ' IF EXISTS \`', table_name, '\`;')
	FROM information_schema.tables WHERE table_schema = '$DB'" >"$WORKDIR/drop.sql"
{ echo "SET FOREIGN_KEY_CHECKS=0;"; cat "$WORKDIR/drop.sql"; } | "${MYSQL[@]}" "$DB"
rm -f "$WORKDIR/drop.sql"

stato "IN CORSO: import del dump (~45 min)"
{ echo "SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET AUTOCOMMIT=0;"; pigz -p 10 -dc "$COPIA"; echo "COMMIT;"; } \
	| "${MYSQL[@]}" "$DB"

tabelle=$("${MYSQL[@]}" -N -B -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '$DB'")
stato "OK: $tabelle tabelle importate dal dump del $(date -r "$COPIA" '+%F %T')"
