#!/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"