netgescon-day0/scripts/ops/netgescon-move-to-nas.sh

144 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Move large legacy folders from local disk to NAS with verification-friendly flow.
# Default mode is DRY-RUN.
#
# Examples:
# scripts/ops/netgescon-move-to-nas.sh \
# --nas-root /mnt/nas_netgescon/migrazioni-locali \
# --source /home/michele/backup-completo \
# --source /var/www/netgescon_OLD
#
# scripts/ops/netgescon-move-to-nas.sh \
# --nas-root /mnt/nas_netgescon/migrazioni-locali \
# --source /home/michele/backup-completo \
# --apply --purge-source
NAS_ROOT="/mnt/nas_netgescon/migrazioni-locali"
APPLY="no"
PURGE_SOURCE="no"
TS="$(date +%Y%m%d-%H%M%S)"
LOG_DIR="/tmp/netgescon-nas-move-${TS}"
declare -a SOURCES=()
die() {
echo "Error: $*" >&2
exit 1
}
usage() {
cat <<'EOF'
Usage:
netgescon-move-to-nas.sh --source <path> [--source <path> ...] [options]
Options:
--source <path> Source directory to move/copy (can be used multiple times)
--nas-root <path> NAS base destination (default: /mnt/nas_netgescon/migrazioni-locali)
--apply Execute real copy (default: dry-run)
--purge-source Remove source after successful copy (only with --apply)
-h, --help Show this help
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--source)
SOURCES+=("$2")
shift 2
;;
--nas-root)
NAS_ROOT="$2"
shift 2
;;
--apply)
APPLY="yes"
shift
;;
--purge-source)
PURGE_SOURCE="yes"
shift
;;
-h|--help)
usage
exit 0
;;
*)
usage
die "Unknown option: $1"
;;
esac
done
[[ ${#SOURCES[@]} -gt 0 ]] || { usage; die "At least one --source is required"; }
[[ -d "$NAS_ROOT" ]] || die "NAS root not found/mounted: $NAS_ROOT"
if [[ "$PURGE_SOURCE" == "yes" && "$APPLY" != "yes" ]]; then
die "--purge-source requires --apply"
fi
mkdir -p "$LOG_DIR"
echo "== NetGescon NAS Move =="
echo "Mode: $( [[ "$APPLY" == "yes" ]] && echo "APPLY" || echo "DRY-RUN" )"
echo "Purge source after copy: $PURGE_SOURCE"
echo "NAS root: $NAS_ROOT"
echo "Log dir: $LOG_DIR"
echo
run_rsync() {
local src="$1"
local dst="$2"
local -a args=(
-a
--human-readable
--info=stats2,name0
--no-owner
--no-group
)
if [[ "$APPLY" != "yes" ]]; then
args+=(--dry-run)
fi
rsync "${args[@]}" "$src/" "$dst/"
}
for src in "${SOURCES[@]}"; do
[[ -d "$src" ]] || { echo "Skip missing source: $src"; continue; }
src_abs="$(readlink -f "$src")"
src_name="$(basename "$src_abs")"
src_parent_name="$(basename "$(dirname "$src_abs")")"
dst="$NAS_ROOT/${src_parent_name}/${src_name}"
mkdir -p "$dst"
echo "------------------------------------------------------------"
echo "Source: $src_abs"
echo "Dest: $dst"
echo "[1/3] Size source"
du -sh "$src_abs" || true
echo "[2/3] Rsync"
run_rsync "$src_abs" "$dst" | tee "$LOG_DIR/${src_name}.log"
if [[ "$APPLY" == "yes" ]]; then
echo "[3/3] Verify destination size"
du -sh "$dst" || true
if [[ "$PURGE_SOURCE" == "yes" ]]; then
echo "[PURGE] Removing source: $src_abs"
rm -rf "$src_abs"
fi
fi
echo "Done: $src_abs"
echo
done
echo "All tasks completed."
echo "Logs: $LOG_DIR"