AS400_API_DOTNET/scripts/test-databases.sh
2025-10-17 16:01:56 +07:00

116 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
BASE_URL=${BASE_URL:-http://localhost:8080}
USERNAME=${USERNAME:-admin}
PASSWORD=${PASSWORD:-Pass@123}
LOG_FILE=${LOG_FILE:-}
pretty_json_or_raw() {
local input="$1"
if jq -e . >/dev/null 2>&1 <<<"$input"; then
jq . <<<"$input"
else
printf '%s\n' "$input"
fi
}
timestamp() {
date '+%Y-%m-%dT%H:%M:%S%z'
}
log() {
local message="$1"
echo "$message" >&2
if [[ -n "$LOG_FILE" ]]; then
printf '[%s] %s\n' "$(timestamp)" "$message" >>"$LOG_FILE"
fi
}
log_block() {
local heading="$1"
local body="$2"
if [[ -n "$LOG_FILE" ]]; then
{
printf '[%s] %s\n' "$(timestamp)" "$heading"
pretty_json_or_raw "$body"
} >>"$LOG_FILE"
fi
}
usage() {
cat <<USAGE
Usage: $(basename "$0") [--url <baseUrl>] [--user <username>] [--pass <password>] [--log <file>]
You can also set environment variables: BASE_URL, USERNAME, PASSWORD, LOG_FILE.
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
--url)
BASE_URL=$2
shift 2
;;
--user)
USERNAME=$2
shift 2
;;
--pass)
PASSWORD=$2
shift 2
;;
--log)
LOG_FILE=$2
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage
exit 1
;;
esac
done
if [[ -n "$LOG_FILE" ]]; then
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"
log "Logging enabled: $LOG_FILE"
fi
for tool in curl jq; do
if ! command -v "$tool" >/dev/null 2>&1; then
log "Error: $tool is required but not installed."
exit 1
fi
done
log "Logging in as $USERNAME against $BASE_URL..."
LOGIN_RESPONSE=$(curl -sS -X POST "$BASE_URL/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}")
if ! ACCESS_TOKEN=$(printf '%s' "$LOGIN_RESPONSE" | jq -er '.accessToken'); then
log "Login failed. Response: $LOGIN_RESPONSE"
exit 1
fi
EXPIRES_IN=$(printf '%s' "$LOGIN_RESPONSE" | jq -r '.expiresIn // "unknown"')
ROLES=$(printf '%s' "$LOGIN_RESPONSE" | jq -r '.roles | join(", ")')
log "Token acquired (expires in ${EXPIRES_IN}s) with roles: ${ROLES}"
SANITIZED_LOGIN_RESPONSE=$(printf '%s' "$LOGIN_RESPONSE" | jq '.accessToken="***redacted***"')
log_block "Login response" "$SANITIZED_LOGIN_RESPONSE"
log "Calling /api/as400/databases..."
DB_RESPONSE=$(curl -sS "$BASE_URL/api/v1/as400/databases" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Accept: application/json")
log_block "Databases response" "$DB_RESPONSE"
pretty_json_or_raw "$DB_RESPONSE"