119 lines
2.7 KiB
Bash
Executable File
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."
|