diff --git a/README.md b/README.md index ad3d4a2..e5410e3 100644 --- a/README.md +++ b/README.md @@ -74,3 +74,44 @@ To create a Consumer key for different account or usage (profile is created if m ./ovh-api-bash-client.sh --profile demo1 --init ./ovh-api-bash-client.sh --profile demo2 --init ``` + + +Embedded lib for external scripts +---------- + +### ovh-api-lib.sh + +#### OvhRequestApi + +- OvhRequestApi() : wrapper to ovh-api-bash-client.sh + +``` + OvhRequestApi url [method] [post_data] +``` + +return values in OVHAPI_HTTP_STATUS and OVHAPI_HTTP_RESPONSE + + +#### JSon stuff +- getJSONString() : unquote string value +- getJSONValue() : get JSON value as is +- getJSONValues() : get all JSON values at once +- getJSONArrayLength() : count array elements + +### sample usage + +Once you've an available OVH API authentication, you can use the library : + +To set a profile, define value OVHAPI_BASHCLIENT_PROFILE (can be used inside or outside your script) + +**sample-script.sh** + +``` + source path/to/ovh-api-bash-client/ovh-api-lib.sh || exit 1 + OvhRequestApi /me +``` + +**sample** + + +OVHAPI_BASHCLIENT_PROFILE=demo samples/list-domains.sh diff --git a/ovh-api-lib.sh b/ovh-api-lib.sh new file mode 100644 index 0000000..3ec1ab4 --- /dev/null +++ b/ovh-api-lib.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash + + +readonly OVHAPI_BASHCLIENT_DIR=$(dirname "${BASH_SOURCE[0]}") +readonly OVHAPI_BASHCLIENT_BIN="${OVHAPI_BASHCLIENT_DIR}/ovh-api-bash-client.sh" +readonly OVHAPI_BASHCLIENT_LIB="${OVHAPI_BASHCLIENT_DIR}/libs" + +OVHAPI_HTTP_STATUS= +OVHAPI_HTTP_RESPONSE= + +# ensure the client is available +if [ ! -f "${OVHAPI_BASHCLIENT_BIN}" ]; then + echo "${OVHAPI_BASHCLIENT_BIN} not found" + exit 1 +fi + +# to set a profile, define value in the variable OVHAPI_BASHCLIENT_PROFILE +# OvhRequestApi url [method] [post_data] +# +# default method: get +# return response code in OVHAPI_HTTP_STATUS and content in OVHAPI_HTTP_RESPONSE +OvhRequestApi() +{ + local url=$1 + local method=$2 + local data=$3 + + + local client_response= + local quote= + + local cmd=(${OVHAPI_BASHCLIENT_BIN}) + + if [ -n "${OVHAPI_BASHCLIENT_PROFILE}" ]; then + cmd+=(--profile ${OVHAPI_BASHCLIENT_PROFILE}) + fi + if [ -n "${url}" ]; then + cmd+=(--url ${url}) + fi + if [ -n "${method}" ]; then + cmd+=(--method ${method}) + fi + + if [ "${method}" == "POST" ]; then + local cmdfile=$(mktemp "/tmp/OvhRequestApi.postcmd.sh.XXXXXX") + # best way found to correctly pass quoted argument to a command called via a function + + # if json content has single or double quotes inside, to use the opposite + if echo ${data} | grep -q '"'; then + quote=\' + elif echo ${data} | grep -q "'"; then + quote=\" + fi + + cmd+=(--data ${quote}${data}${quote}) + # inject all command to a temp file, execute and drop the file + echo ${cmd[@]} > ${cmdfile} + client_response=$(bash ${cmdfile}) + rm ${cmdfile} + else + client_response=$(${cmd[@]}) + fi + + OVHAPI_HTTP_STATUS=$(echo ${client_response} | cut -d ' ' -f1) + OVHAPI_HTTP_RESPONSE="$(echo ${client_response} | cut -d ' ' -f2-)" + + # debug information, go to stderr + echo http_status=${OVHAPI_HTTP_STATUS} >&2 + +} + +## vendors's JSON parsing + +# usage : getJSONString "json" field +# remove quotes (first and last character) from wanted field +getJSONString() +{ + local json="$1" + local field="$2" + local result=$(getJSONValue "${json}" "${field}") + echo ${result:1:-1} +} + +# usage : getJSONValue "json" field +getJSONValue() +{ + local json="$1" + local field="$2" + echo ${json} | ${OVHAPI_BASHCLIENT_LIB}/JSON.sh -l | grep "\[${field}\]" | sed -r "s/\[${field}\]\s+(.*)/\1/" +} + +# usage : getJSONValues "json" +# return one value per line +getJSONValues() +{ + local json="$1" + local i=0 + local length=$(getJSONArrayLength "${json}") + + while [ $i -lt ${length} ]; + do + getJSONValue "$json" $i + let i+=1 + done + +} + +# usage : getJSONArrayLength "json" +# return the size of json array +getJSONArrayLength() +{ + local json="$1" + echo ${json} | ${OVHAPI_BASHCLIENT_LIB}/JSON.sh -l | wc -l +} diff --git a/samples/list-domains.sh b/samples/list-domains.sh new file mode 100755 index 0000000..00d6f98 --- /dev/null +++ b/samples/list-domains.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +HERE=$(dirname "${BASH_SOURCE[0]}") +source ${HERE}/../ovh-api-lib.sh || exit 1 + +OvhRequestApi "/me" +if [ "${OVHAPI_HTTP_STATUS}" != "200" ]; then + echo "profile error:" + echo ${OVHAPI_HTTP_RESPONSE} + exit +fi + +OvhRequestApi "/domain" + +if [ ${OVHAPI_HTTP_STATUS} -eq 200 ]; then + domains=$(getJSONValues "${OVHAPI_HTTP_RESPONSE}") + for domain in ${domains} + do + echo "- ${domain}" + done +fi