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

119 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Pack local folders into tar archives on NAS, then optionally remove local source.
# Default mode is DRY-RUN.
#
# Example:
# scripts/ops/netgescon-pack-to-nas.sh \
# --nas-dir /mnt/nas_netgescon/migrazioni-locali/tar-exports \
# --source /home/michele/backup-completo \
# --source /var/www/netgescon_OLD
#
# scripts/ops/netgescon-pack-to-nas.sh \
# --nas-dir /mnt/nas_netgescon/migrazioni-locali/tar-exports \
# --source /home/michele/backup-completo \
# --apply --purge-source
NAS_DIR="/mnt/nas_netgescon/migrazioni-locali/tar-exports"
APPLY="no"
PURGE_SOURCE="no"
TS="$(date +%Y%m%d-%H%M%S)"
declare -a SOURCES=()
die() {
echo "Error: $*" >&2
exit 1
}
usage() {
cat <<'EOF'
Usage:
netgescon-pack-to-nas.sh --source <path> [--source <path> ...] [options]
Options:
--source <path> Source directory to archive (repeatable)
--nas-dir <path> Destination folder on NAS for tar files
--apply Create archives (default is dry-run)
--purge-source Delete local source directory after successful archive
-h, --help Show help
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--source)
SOURCES+=("$2")
shift 2
;;
--nas-dir)
NAS_DIR="$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_DIR" ]] || mkdir -p "$NAS_DIR"
if [[ "$PURGE_SOURCE" == "yes" && "$APPLY" != "yes" ]]; then
die "--purge-source requires --apply"
fi
echo "== NetGescon Pack to NAS =="
echo "Mode: $( [[ "$APPLY" == "yes" ]] && echo "APPLY" || echo "DRY-RUN" )"
echo "Purge source: $PURGE_SOURCE"
echo "NAS dir: $NAS_DIR"
echo
for src in "${SOURCES[@]}"; do
if [[ ! -d "$src" ]]; then
echo "Skip missing source: $src"
continue
fi
src_abs="$(readlink -f "$src")"
parent_abs="$(dirname "$src_abs")"
src_name="$(basename "$src_abs")"
parent_name="$(basename "$parent_abs")"
safe_name="${parent_name}__${src_name}__${TS}.tar"
tar_path="$NAS_DIR/$safe_name"
echo "------------------------------------------------------------"
echo "Source: $src_abs"
echo "Archive: $tar_path"
du -sh "$src_abs" || true
if [[ "$APPLY" == "yes" ]]; then
tar -cpf "$tar_path" -C "$parent_abs" "$src_name"
sync
ls -lh "$tar_path"
if [[ "$PURGE_SOURCE" == "yes" ]]; then
echo "[PURGE] Removing source: $src_abs"
rm -rf "$src_abs"
fi
fi
done
echo "Done."