#!/usr/bin/env bash # bms-locations.sh — List servicedesk locations for an account set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BMS_API_BASE="${BMS_API_BASE:-https://api.bms.kaseya.com}" die() { echo "ERROR: $*" >&2; exit 1; } usage() { cat >&2 <<'EOF' Usage: bms-locations.sh list --account Fetch servicedesk locations for a given account. Options: --account Account ID (required) -h, --help Show this help EOF exit 1 } get_token() { bash "${SCRIPT_DIR}/bms-auth.sh" get-token } bms_curl() { local path="$1"; shift local token token=$(get_token) curl -sf -X GET \ "${BMS_API_BASE}${path}" \ -H "Authorization: Bearer ${token}" \ -H "Accept: application/json" \ "$@" } cmd_locations_list() { local account_id="" # Simple arg parsing while [[ $# -gt 0 ]]; do case "$1" in --account) account_id="$2" shift 2 ;; --account=*) account_id="${1#*=}" shift ;; -h|--help) usage ;; *) die "Unknown option: $1" ;; esac done [[ -n "$account_id" ]] || die "Missing required --account " local response response=$(bms_curl "/v2/servicedesk/locations?accountId=${account_id}") || die "Failed to fetch locations" # Extract the array - response is {"result": [...]} local items items=$(echo "$response" | jq -r '.result // .Data // .Items // .' 2>/dev/null) || \ die "Failed to parse locations response" # Check if it's an array if ! echo "$items" | jq -e 'type == "array"' >/dev/null 2>&1; then die "Expected an array of locations, got: $(echo "$items" | jq -c . 2>/dev/null || echo "non-JSON")" fi echo "=== Servicedesk Locations (Account: $account_id) ===" >&2 echo "$items" | jq -r '.[] | "\(.Id // .id)\t\(.Name // .name)"' | awk '{printf "%-10s %-40s\n", $1, $2}' } # Main cmd="${1:-}" [[ -n "$cmd" ]] || usage shift case "$cmd" in list) cmd_locations_list "$@" ;; *) die "Unknown command: $cmd. Available: list" ;; esac