Un backup remoto —
Al di la degli obblighi di legge per un’azienda avere un backup da qualche parte lontano dalla sede è decisamente un ottima idea, queste soluzioni mi piace definirle come le assicurazioni, si pagano e si spera di non doverle mai usare, ma nel momento in cui servissero non averle potrebbe essere una tragedia.
Quindi abbiamo affittato uno spazio altrove, ci abbiamo configurato una VM basilare e abbiamo messo in cron questo script che provvede ai backup.
#!/bin/bash
set -Eeuo pipefail
########################################################################
# CONFIGURAZIONE
########################################################################
# 1 = simulazione (dry-run), 0 = esecuzione reale
DRY_RUN=0
# utente locale (esegue script)
LOCAL_USER=”Myfirm”
# utente remoto SSH (server sorgente dati)
REMOTE_USER=”root”
REMOTE_HOST=”192.168.2.2″
LOCAL_BASE=”/home/Myfirm/backup”
# mount NFS destinazione
NFS_BASE=”/home/Myfirm/backup”
RECYCLE_DIR=”${NFS_BASE}/#recycle”
TRIESTE_DIR=”${LOCAL_BASE}/trieste”
ALGHERO_DIR=”${LOCAL_BASE}/alghero”
REMOTE_TRIESTE=”/homec/mensile/mesi/last/”
REMOTE_ALGHERO=”/homec/giornaliero2/mesi/last/”
LOGDIR=”/home/Myfirm/backup/log”
LOCKFILE=”/var/lock/backup_rsync.lock”
MAIL_TO=”edp@Myfirm.com service@dynamica.it”
HOSTNAME_FQDN=”$(hostname -f)”
########################################################################
# LOGGING
########################################################################
mkdir -p “$LOGDIR”
LOGFILE=”${LOGDIR}/backup_rsync_$(date +%Y%m%d_%H%M%S).log”
exec > >(tee -a “$LOGFILE”)
exec 2>&1
echo “========================================================”
echo “Backup avviato: $(date)”
echo “Host locale: $HOSTNAME_FQDN”
echo “Utente locale: $LOCAL_USER”
echo “Utente remoto: $REMOTE_USER@$REMOTE_HOST”
echo “Dry-run: $DRY_RUN”
echo “========================================================”
########################################################################
# MAIL
########################################################################
send_mail() {
local SUBJECT=”$1″
local BODY=”$2″
mail -s “$SUBJECT” “$MAIL_TO” <<EOF
$BODY
Host: $HOSTNAME_FQDN
Data: $(date)
Log: $LOGFILE
EOF
}
########################################################################
# ERROR HANDLER
########################################################################
error_handler() {
local RC=$?
send_mail \
“[ERRORE] Backup rsync su ${HOSTNAME_FQDN}” \
“Backup terminato con errore (exit code ${RC}).”
exit “$RC”
}
trap error_handler ERR
########################################################################
# LOCK (NO CONCORRENZA)
########################################################################
exec 200>”$LOCKFILE”
flock -n 200 || {
echo “Backup già in esecuzione”
exit 1
}
########################################################################
# ROTAZIONE LOG (>30 giorni)
########################################################################
find “$LOGDIR” \
-type f \
-name “backup_rsync_*.log” \
-mtime +30 \
-delete
########################################################################
# FUNZIONI
########################################################################
fail() {
echo “[ERRORE] $1”
exit 1
}
check_dir() {
[ -d “$1” ] || fail “Directory mancante: $1”
}
########################################################################
# CHECK DIRECTORY LOCALE
########################################################################
cd “$LOCAL_BASE” || fail “Impossibile accedere a $LOCAL_BASE”
[ “$(pwd)” = “$LOCAL_BASE” ] || fail “Directory corrente errata”
########################################################################
# CHECK MOUNT NFS
########################################################################
echo “[INFO] Verifica NFS”
if ! mountpoint -q “$NFS_BASE”; then
send_mail \
“[CRITICO] NFS non montato” \
“Filesystem ${NFS_BASE} non montato”
fail “NFS non montato”
fi
FSTYPE=$(findmnt -n -o FSTYPE “$NFS_BASE”)
if [[ “$FSTYPE” != “nfs” && “$FSTYPE” != “nfs4” ]]; then
send_mail \
“[CRITICO] Filesystem errato” \
“${NFS_BASE} montato come ${FSTYPE}”
fail “Filesystem non NFS”
fi
echo “[OK] NFS OK ($FSTYPE)”
########################################################################
# TEST SCRITTURA NFS
########################################################################
TESTFILE=”${NFS_BASE}/.write_test.$$”
touch “$TESTFILE” || fail “NFS non scrivibile”
rm -f “$TESTFILE”
########################################################################
# CHECK DIRECTORY
########################################################################
check_dir “$RECYCLE_DIR”
check_dir “$TRIESTE_DIR”
check_dir “$ALGHERO_DIR”
########################################################################
# CHECK SSH REMOTO (ROOT)
########################################################################
echo “[INFO] Check SSH root@${REMOTE_HOST}”
timeout 10 ssh \
-o BatchMode=yes \
-o ConnectTimeout=5 \
“${REMOTE_USER}@${REMOTE_HOST}” \
“echo OK” >/dev/null || fail “SSH non disponibile”
echo “[OK] SSH OK”
########################################################################
# RSYNC OPTIONS
########################################################################
RSYNC_OPTS=(
-avh
–delete
–delete-delay
–stats
–human-readable
–itemize-changes
–partial
–partial-dir=.rsync-partial
–protect-args
–timeout=600
–no-perms
–no-owner
–no-group
–no-acls
–no-xattrs
)
if [ “$DRY_RUN” -eq 1 ]; then
echo “[INFO] MODALITA’ DRY-RUN ATTIVA”
RSYNC_OPTS+=(–dry-run)
else
echo “[INFO] MODALITA’ REALE ATTIVA”
fi
########################################################################
# BACKUP TRIeSTE
########################################################################
echo “[INFO] Sync TRIESTE”
rsync “${RSYNC_OPTS[@]}” \
-e ssh \
“${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_TRIESTE}” \
“${TRIESTE_DIR}/”
echo “[OK] TRIeSTE completato”
########################################################################
# BACKUP ALGHERO
########################################################################
echo “[INFO] Sync ALGHERO”
rsync “${RSYNC_OPTS[@]}” \
-e ssh \
“${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_ALGHERO}” \
“${ALGHERO_DIR}/”
echo “[OK] ALGHERO completato”
########################################################################
# FINE
########################################################################
echo “========================================================”
echo “Backup terminato: $(date)”
echo “========================================================”
send_mail \
“[OK] Backup completato” \
“Backup completato correttamente su ${HOSTNAME_FQDN}”
exit 0
Categorised as: Linux | Script | Work
Comments are disabled on this post