144 lines
3.2 KiB
Bash
Executable File
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"
|