|
|
|
#!/usr/bin/env bash
|
|
|
|
# vim:ts=4:sts=4:sw=4:et
|
|
|
|
#
|
|
|
|
# Author: Hari Sekhon
|
|
|
|
# Date: 2020-11-28 22:33:44 +0000 (Sat, 28 Nov 2020)
|
|
|
|
#
|
|
|
|
# https://github.com/HariSekhon/bash-tools
|
|
|
|
#
|
|
|
|
# License: see accompanying Hari Sekhon LICENSE file
|
|
|
|
#
|
|
|
|
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
|
|
|
|
#
|
|
|
|
# https://www.linkedin.com/in/HariSekhon
|
|
|
|
#
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
[ -n "${DEBUG:-}" ] && set -x
|
|
|
|
srcdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
|
|
|
|
# shellcheck disable=SC1090
|
|
|
|
. "$srcdir/lib/utils.sh"
|
|
|
|
|
|
|
|
# shellcheck disable=SC2034,SC2154
|
|
|
|
usage_description="
|
|
|
|
Queries the GoCD API v6
|
|
|
|
|
|
|
|
\$GOCD_URL or \$GOCD_HOST must be set to point to the gocd server
|
|
|
|
|
|
|
|
If \$GOCD_HOST is used, then the following may also be set:
|
|
|
|
|
|
|
|
\$GOCD_PORT - defaults to 8111 and is only used if \$GOCD_URL is not used
|
|
|
|
\$GOCD_SSL - defaults to http, any value enables https
|
|
|
|
\$GOCD_API_VERSION - defaults to v6
|
|
|
|
|
|
|
|
Sets Accept and Content-Type headers to application/json unless specified on the command line arguments.
|
|
|
|
Beware that Accept header also sets the \$GOCD_API_VERSION, so you'd have to do that yourself if overriding via command line args.
|
|
|
|
|
|
|
|
Important: Some API endpoints require older endpoints, such as /admin/config_repos which requires:
|
|
|
|
|
|
|
|
-H 'Accept:application/vnd.go.cd.v3+json'
|
|
|
|
|
|
|
|
|
|
|
|
API Reference:
|
|
|
|
|
|
|
|
https://api.gocd.org/current/
|
|
|
|
|
|
|
|
|
|
|
|
See Also:
|
|
|
|
|
|
|
|
gocd.sh - boots a GoCD cluster in Docker and makes heavy use of this script against many API endpoints to configure it
|
|
|
|
convenient way of getting a GoCD API to test this script against, outputs the GOCD_URL and GOCD_TOKEN for you
|
|
|
|
"
|
|
|
|
|
|
|
|
# used by usage() in lib/utils.sh
|
|
|
|
# shellcheck disable=SC2034
|
|
|
|
usage_args="/path [<curl_options>]"
|
|
|
|
|
|
|
|
|
|
|
|
help_usage "$@"
|
|
|
|
|
|
|
|
min_args 1 "$@"
|
|
|
|
|
|
|
|
url_path="$1"
|
|
|
|
shift || :
|
|
|
|
|
|
|
|
url_path="${url_path##/}"
|
|
|
|
|
|
|
|
# don't enforce as hard requirements here, instead try alternation further down and construct from what's available
|
|
|
|
#check_env_defined "GOCD_URL"
|
|
|
|
#check_env_defined "GOCD_HOST"
|
|
|
|
#check_env_defined "GOCD_TOKEN"
|
|
|
|
|
|
|
|
# not using curl_api_opts because need more control over the accept headers which control API version
|
|
|
|
CURL_OPTS=(-sS --fail --connect-timeout 3 "${CURL_OPTS[@]}")
|
|
|
|
|
|
|
|
if ! [[ "$*" =~ Accept: ]]; then
|
|
|
|
if [ -n "${GOCD_API_VERSION:-}" ]; then
|
|
|
|
GOCD_API_VERSION="${GOCD_API_VERSION#v}"
|
|
|
|
if ! [[ "$GOCD_API_VERSION" =~ ^[[:digit:]]+$ ]]; then
|
|
|
|
usage "invalid GOCD_API_VERSION defined in environment - must be an integer"
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
GOCD_API_VERSION=6
|
|
|
|
fi
|
|
|
|
CURL_OPTS+=(-H "Accept: application/vnd.go.cd.v${GOCD_API_VERSION}+json")
|
|
|
|
fi
|
|
|
|
if ! [[ "$*" =~ Content-Type: ]]; then
|
|
|
|
CURL_OPTS+=(-H "Content-Type: application/json")
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "${GOCD_URL:-}" ]; then
|
|
|
|
url_base="${GOCD_URL%%/}"
|
|
|
|
else
|
|
|
|
protocol="http"
|
|
|
|
if [ -n "${GOCD_SSL:-}" ]; then
|
|
|
|
protocol="https"
|
|
|
|
fi
|
|
|
|
[ -n "${GOCD_HOST:-}" ] || usage "neither \$GOCD_URL nor \$GOCD_HOST defined in environment"
|
|
|
|
host="$GOCD_HOST"
|
|
|
|
port="${GOCD_PORT:-8153}"
|
|
|
|
url_base="$protocol://$host:$port"
|
|
|
|
fi
|
|
|
|
|
|
|
|
url_base+="/go/api"
|
|
|
|
|
|
|
|
if [ -n "${GOCD_TOKEN:-}" ]; then
|
|
|
|
export TOKEN="$GOCD_TOKEN"
|
|
|
|
"$srcdir/curl_auth.sh" "$url_base/$url_path" "${CURL_OPTS[@]}" "$@"
|
|
|
|
else
|
|
|
|
curl "$url_base/$url_path" "${CURL_OPTS[@]}" "$@"
|
|
|
|
fi
|