145 lines
3.6 KiB
Bash
Executable File
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"
|