Files
BE_IBL/scripts/agent_upload_file.sh
2026-04-15 15:12:37 +07:00

145 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SOURCE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
PRIVATE_KEY_PATH="${PRIVATE_KEY_PATH:-/Users/fajrihardhitamurti/id_rsa}"
REMOTE_USER="${REMOTE_USER:-one}"
DEFAULT_REMOTE_PATH="${DEFAULT_REMOTE_PATH:-/home/one/project/one/one-api-lab/}"
DRY_RUN=0
TARGETS_RAW="all"
PATHS_RAW=""
declare -A REMOTE_PATHS=(
["devone.aplikasi.web.id"]="$DEFAULT_REMOTE_PATH"
["10.9.20.31"]="$DEFAULT_REMOTE_PATH"
["ibl_tentarapelajar"]="$DEFAULT_REMOTE_PATH"
)
usage() {
cat <<'EOF'
Usage: agent_upload_file.sh [--target HOST[,HOST...]] [--source DIR|FILE] [--paths PATH[,PATH...]] [--remote-path PATH] [--user USER] [--key PATH] [--dry-run]
Defaults:
--target all
--source repo root (parent directory of this script)
--paths empty (upload source root)
--remote-path /home/one/project/one/one-api-lab/
--user one
--key /Users/fajrihardhitamurti/id_rsa
Targets:
devone.aplikasi.web.id
10.9.20.31
ibl_tentarapelajar
EOF
}
log() {
printf '[agent_upload_file] %s\n' "$*"
}
fail() {
printf '[agent_upload_file] %s\n' "$*" >&2
exit 1
}
while [[ $# -gt 0 ]]; do
case "$1" in
-t|--target)
[[ $# -ge 2 ]] || fail "--target needs a value"
TARGETS_RAW="$2"
shift 2
;;
--source)
[[ $# -ge 2 ]] || fail "--source needs a value"
SOURCE_DIR="$2"
shift 2
;;
--paths)
[[ $# -ge 2 ]] || fail "--paths needs a value"
PATHS_RAW="$2"
shift 2
;;
--remote-path)
[[ $# -ge 2 ]] || fail "--remote-path needs a value"
DEFAULT_REMOTE_PATH="$2"
shift 2
;;
--user)
[[ $# -ge 2 ]] || fail "--user needs a value"
REMOTE_USER="$2"
shift 2
;;
--key)
[[ $# -ge 2 ]] || fail "--key needs a value"
PRIVATE_KEY_PATH="$2"
shift 2
;;
--dry-run)
DRY_RUN=1
shift
;;
-h|--help)
usage
exit 0
;;
*)
fail "Unknown argument: $1"
;;
esac
done
[[ -e "$SOURCE_DIR" ]] || fail "Source path not found: $SOURCE_DIR"
[[ -f "$PRIVATE_KEY_PATH" ]] || fail "Private key not found: $PRIVATE_KEY_PATH"
REMOTE_PATHS["devone.aplikasi.web.id"]="$DEFAULT_REMOTE_PATH"
REMOTE_PATHS["10.9.20.31"]="$DEFAULT_REMOTE_PATH"
REMOTE_PATHS["ibl_tentarapelajar"]="$DEFAULT_REMOTE_PATH"
SSH_CMD="ssh -i $PRIVATE_KEY_PATH -o BatchMode=yes -o StrictHostKeyChecking=accept-new"
RSYNC_OPTS=(-az --info=progress2 --human-readable --exclude='.git/' --exclude='.DS_Store')
if [[ "$DRY_RUN" -eq 1 ]]; then
RSYNC_OPTS+=(--dry-run)
fi
SOURCE_DIR="${SOURCE_DIR%/}/"
if [[ "$TARGETS_RAW" == "all" ]]; then
TARGET_LIST=("devone.aplikasi.web.id" "10.9.20.31" "ibl_tentarapelajar")
else
IFS=',' read -r -a TARGET_LIST <<< "$TARGETS_RAW"
fi
failed=0
for host in "${TARGET_LIST[@]}"; do
remote_path="${REMOTE_PATHS[$host]:-${DEFAULT_REMOTE_PATH}}"
remote_path="${remote_path%/}/"
destination="${REMOTE_USER}@${host}:${remote_path}"
if [[ -n "$PATHS_RAW" ]]; then
[[ -d "$SOURCE_DIR" ]] || fail "--paths requires --source to be a directory root"
IFS=',' read -r -a RELATIVE_PATHS <<< "$PATHS_RAW"
log "Uploading selected paths -> $destination"
pushd "$SOURCE_DIR" >/dev/null
if rsync "${RSYNC_OPTS[@]}" --relative -e "$SSH_CMD" "${RELATIVE_PATHS[@]}" "$destination"; then
log "Done: $host"
else
log "Failed: $host"
failed=1
fi
popd >/dev/null
else
log "Uploading $SOURCE_DIR -> $destination"
if rsync "${RSYNC_OPTS[@]}" -e "$SSH_CMD" "$SOURCE_DIR" "$destination"; then
log "Done: $host"
else
log "Failed: $host"
failed=1
fi
fi
done
exit "$failed"