qortal/tools/qdata
CalDescent 1ddd468c1f Added API key support to qdata script
As with the qort script, it currently needs to be run from either the qortal directory or the tools directory in order to pick up the API key
2022-01-14 11:46:26 +00:00

138 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Qortal defaults
host="localhost"
port=12393
if [ -z "$*" ]; then
echo "Usage:"
echo
echo "Host/update data:"
echo "qdata POST [service] [name] PATH [dirpath] <identifier>"
echo "qdata POST [service] [name] STRING [data-string] <identifier>"
echo
echo "Fetch data:"
echo "qdata GET [service] [name] <identifier-or-default> <filepath-or-default> <rebuild>"
echo
echo "Notes:"
echo "- When requesting a resource, please use 'default' to indicate a file with no identifier."
echo "- The same applies when specifying the relative path to a file within the data structure; use 'default'"
echo " to indicate a single file resource."
echo
exit
fi
script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
if [ -f "apikey.txt" ]; then
apikey=$(cat "apikey.txt")
elif [ -f "${script_dir}/../apikey.txt" ]; then
apikey=$(cat "${script_dir}/../apikey.txt")
fi
method=$1
service=$2
name=$3
if [ -z "${method}" ]; then
echo "Error: missing method"; exit
fi
if [ -z "${service}" ]; then
echo "Error: missing service"; exit
fi
if [ -z "${name}" ]; then
echo "Error: missing name"; exit
fi
if [[ "${method}" == "POST" ]]; then
type=$4
data=$5
identifier=$6
if [ -z "${data}" ]; then
if [[ "${type}" == "PATH" ]]; then
echo "Error: missing directory"; exit
elif [[ "${type}" == "STRING" ]]; then
echo "Error: missing data string"; exit
else
echo "Error: unrecognized type"; exit
fi
fi
if [ -z "${QORTAL_PRIVKEY}" ]; then
echo "Error: missing private key. Set it by running: export QORTAL_PRIVKEY=privkeyhere"; exit
fi
if [ -z "${identifier}" ]; then
identifier="default"
fi
# Create type component in URL
if [[ "${type}" == "PATH" ]]; then
type_component=""
elif [[ "${type}" == "STRING" ]]; then
type_component="/string"
fi
echo "Creating transaction - this can take a while..."
tx_data=$(curl --silent --insecure -X ${method} "http://${host}:${port}/arbitrary/${service}/${name}/${identifier}${type_component}" -H "X-API-KEY: ${apikey}" -d "${data}")
if [[ "${tx_data}" == *"error"* || "${tx_data}" == *"ERROR"* ]]; then
echo "${tx_data}"; exit
elif [ -z "${tx_data}" ]; then
echo "Error: no transaction data returned"; exit
fi
echo "Computing nonce..."
computed_tx_data=$(curl --silent --insecure -X POST "http://${host}:${port}/arbitrary/compute" -H "Content-Type: application/json" -H "X-API-KEY: ${apikey}" -d "${tx_data}")
if [[ "${computed_tx_data}" == *"error"* || "${computed_tx_data}" == *"ERROR"* ]]; then
echo "${computed_tx_data}"; exit
fi
echo "Signing..."
signed_tx_data=$(curl --silent --insecure -X POST "http://${host}:${port}/transactions/sign" -H "Content-Type: application/json" -d "{\"privateKey\":\"${QORTAL_PRIVKEY}\",\"transactionBytes\":\"${computed_tx_data}\"}")
if [[ "${signed_tx_data}" == *"error"* || "${signed_tx_data}" == *"ERROR"* ]]; then
echo "${signed_tx_data}"; exit
fi
echo "Broadcasting..."
success=$(curl --silent --insecure -X POST "http://${host}:${port}/transactions/process" -H "Content-Type: text/plain" -d "${signed_tx_data}")
if [[ "${success}" == "true" ]]; then
echo "Transaction broadcast successfully"
else
echo "Error when broadcasting transaction. Please try again."
echo "Response: ${success}"
fi
elif [[ "${method}" == "GET" ]]; then
identifier=$4
filepath=$5
rebuild=$6
if [ -z "${rebuild}" ]; then
rebuild="false"
fi
# Handle default
if [[ "${filepath}" == "default" ]]; then
filepath=""
fi
# We use a different API depending on whether or not an identifier is supplied
if [ -n "${identifier}" ]; then
response=$(curl --silent --insecure -X GET "http://${host}:${port}/arbitrary/${service}/${name}/${identifier}?rebuild=${rebuild}&filepath=${filepath}" -H "X-API-KEY: ${apikey}")
else
response=$(curl --silent --insecure -X GET "http://${host}:${port}/arbitrary/${service}/${name}?rebuild=${rebuild}&filepath=${filepath}" -H "X-API-KEY: ${apikey}")
fi
if [ -z "${response}" ]; then
echo "Empty response from ${host}:${port}"
fi
if [[ "${response}" == *"error"* || "${response}" == *"ERROR"* ]]; then
echo "${response}"; exit
fi
echo "${response}"
fi