feat: add first version of the script
This commit is contained in:
416
porkbun-linux-cli
Executable file
416
porkbun-linux-cli
Executable file
@@ -0,0 +1,416 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Porkbun API docs
|
||||||
|
# https://porkbun.com/api/json/v3/documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||||
|
|
||||||
|
# Environment file with API_KEY and SECRET_KEY
|
||||||
|
ENV_FILE="$SCRIPT_DIR/.env"
|
||||||
|
VERSION="0.1.0"
|
||||||
|
|
||||||
|
# Porkbun API base url
|
||||||
|
BASE_URL=https://porkbun.com/api/json/v3
|
||||||
|
# Porkbun ipv4 API base url
|
||||||
|
BASE_URL_IPV4=https://api-ipv4.porkbun.com/api/json/v3
|
||||||
|
|
||||||
|
# Parameter values
|
||||||
|
PARAM_DOMAIN="--domain"
|
||||||
|
PARAM_DOMAIN_SHORT="-d"
|
||||||
|
|
||||||
|
PARAM_NAME="--name"
|
||||||
|
PARAM_NAME_SHORT="-n"
|
||||||
|
|
||||||
|
PARAM_TYPE="--type"
|
||||||
|
PARAM_TYPE_SHORT="-t"
|
||||||
|
|
||||||
|
PARAM_CONTENT="--content"
|
||||||
|
PARAM_CONTENT_SHORT="-c"
|
||||||
|
|
||||||
|
PARAM_TTL="--ttl"
|
||||||
|
PARAM_TTL_SHORT="-l"
|
||||||
|
|
||||||
|
PARAM_PRIORITY="--priority"
|
||||||
|
PARAM_PRIORITY_SHORT="-p"
|
||||||
|
|
||||||
|
PARAM_ID="--id"
|
||||||
|
PARAM_ID_SHORT="-i"
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# #
|
||||||
|
# HELPERS #
|
||||||
|
# #
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
# region: helpers
|
||||||
|
|
||||||
|
function load_env {
|
||||||
|
if [[ ! -f "$ENV_FILE" ]]; then
|
||||||
|
echo "Missing configuration file, starting configuration phase"
|
||||||
|
echo
|
||||||
|
|
||||||
|
read -p "Porkbun API key: " API_KEY
|
||||||
|
read -sp "Porkbun Secret key: " SECRET_KEY
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
echo "Checking valid keys"
|
||||||
|
|
||||||
|
PING_STATUS=$(ping | jq -r .status)
|
||||||
|
echo
|
||||||
|
echo $PING_STATUS
|
||||||
|
|
||||||
|
if [[ "$PING_STATUS" != "SUCCESS" ]]; then
|
||||||
|
echo "API keys are not valid"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Keys are valid, saving credentials in $ENV_FILE"
|
||||||
|
|
||||||
|
create_env_file $API_KEY $SECRET_KEY
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Credentials saved!"
|
||||||
|
echo
|
||||||
|
echo "The script is ready for use"
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
source "$ENV_FILE"
|
||||||
|
|
||||||
|
check_env
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_env_file {
|
||||||
|
cat > "$ENV_FILE" << EOL
|
||||||
|
# Porkbun API key
|
||||||
|
API_KEY=$1
|
||||||
|
# Porkbun SECRET API key
|
||||||
|
SECRET_KEY=$2
|
||||||
|
EOL
|
||||||
|
|
||||||
|
chmod 600 $ENV_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_env {
|
||||||
|
if [[ -z $API_KEY ]]; then
|
||||||
|
echo "Missing API_KEY"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z $SECRET_KEY ]]; then
|
||||||
|
echo "Missing SECRET_KEY"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function base_json_payload {
|
||||||
|
echo "
|
||||||
|
\"secretapikey\": \"$SECRET_KEY\",
|
||||||
|
\"apikey\": \"$API_KEY\"
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
function request {
|
||||||
|
URL=$1
|
||||||
|
PAYLOAD=$2
|
||||||
|
|
||||||
|
DATA="{$(base_json_payload)"
|
||||||
|
|
||||||
|
if [[ ! -z $PAYLOAD ]]; then
|
||||||
|
DATA="$DATA, $PAYLOAD"
|
||||||
|
fi
|
||||||
|
|
||||||
|
DATA="$DATA}"
|
||||||
|
|
||||||
|
echo $(
|
||||||
|
curl -s \
|
||||||
|
--request POST \
|
||||||
|
--url "$URL" \
|
||||||
|
--header 'Content-Type: application/json' \
|
||||||
|
--data "$DATA"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle_show_help_on_error {
|
||||||
|
COMMAND=$1
|
||||||
|
COMMAND_HELP="${COMMAND}_help"
|
||||||
|
|
||||||
|
shift
|
||||||
|
|
||||||
|
OUTPUT=$($COMMAND $@)
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
if [[ ! -z $OUTPUT ]]; then
|
||||||
|
echo $OUTPUT
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval $COMMAND_HELP
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $OUTPUT | jq .
|
||||||
|
}
|
||||||
|
|
||||||
|
# endregion
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# #
|
||||||
|
# GENERAL #
|
||||||
|
# #
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
# region: general
|
||||||
|
|
||||||
|
HANDLE_PING="ping"
|
||||||
|
|
||||||
|
function ping {
|
||||||
|
echo $(request "$BASE_URL/ping")
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE_PING_IPV4="ping-ipv4"
|
||||||
|
|
||||||
|
function ping_ipv4 {
|
||||||
|
echo $(request "$BASE_URL_IPV4/ping")
|
||||||
|
}
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# #
|
||||||
|
# DNS #
|
||||||
|
# #
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
HANDLE_DNS="dns"
|
||||||
|
|
||||||
|
function handle_dns {
|
||||||
|
case $1 in
|
||||||
|
$DNS_CREATE_RECORD)
|
||||||
|
shift
|
||||||
|
|
||||||
|
handle_show_help_on_error dns_create_record $@
|
||||||
|
;;
|
||||||
|
$DNS_DELETE_RECORD)
|
||||||
|
shift
|
||||||
|
|
||||||
|
handle_show_help_on_error dns_delete_record $@
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
handle_dns_help
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function handle_dns_help {
|
||||||
|
echo "Usage: $0 $HANDLE_DNS <command>"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " $DNS_CREATE_RECORD Create a DNS record"
|
||||||
|
echo " $DNS_DELETE_RECORD Delete a DNS record"
|
||||||
|
}
|
||||||
|
|
||||||
|
DNS_CREATE_RECORD="create"
|
||||||
|
|
||||||
|
function dns_create_record {
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
$PARAM_DOMAIN_SHORT|$PARAM_DOMAIN)
|
||||||
|
DOMAIN="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$PARAM_NAME_SHORT|$PARAM_NAME)
|
||||||
|
NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$PARAM_TYPE_SHORT|$PARAM_TYPE)
|
||||||
|
TYPE="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$PARAM_CONTENT_SHORT|$PARAM_CONTENT)
|
||||||
|
CONTENT="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$PARAM_TTL_SHORT|$PARAM_TTL)
|
||||||
|
TTL="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$PARAM_PRIORITY_SHORT|$PARAM_PRIORITY)
|
||||||
|
PRIORITY="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-*|--*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z $DOMAIN || -z $TYPE || -z $CONTENT ]]; then
|
||||||
|
echo "Missing domain, type, or content parameters"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
PAYLOAD="
|
||||||
|
\"type\": \"$TYPE\",
|
||||||
|
\"content\": \"$CONTENT\"
|
||||||
|
"
|
||||||
|
|
||||||
|
if [[ ! -z $NAME ]]; then
|
||||||
|
PAYLOAD="
|
||||||
|
$PAYLOAD,
|
||||||
|
\"name\": \"$NAME\"
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z $TTL ]]; then
|
||||||
|
PAYLOAD="
|
||||||
|
$PAYLOAD,
|
||||||
|
\"ttl\": \"$TTL\"
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z $PRIORITY ]]; then
|
||||||
|
PAYLOAD="
|
||||||
|
$PAYLOAD,
|
||||||
|
\"prio\": \"$PRIORITY\"
|
||||||
|
"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $(request "$BASE_URL/dns/create/$DOMAIN" "$PAYLOAD")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function dns_create_record_help {
|
||||||
|
echo "Usage: $0 $HANDLE_DNS $DNS_CREATE_RECORD [OPTIONS]"
|
||||||
|
echo
|
||||||
|
echo "Options:"
|
||||||
|
echo " $PARAM_DOMAIN_SHORT, $PARAM_DOMAIN"
|
||||||
|
echo " The domain for the record being created."
|
||||||
|
echo " $PARAM_NAME_SHORT, $PARAM_NAME (optional)"
|
||||||
|
echo " The subdomain for the record being created, not including the domain itself. Leave blank to create a record on the root domain. Use * to create a wildcard record."
|
||||||
|
echo " $PARAM_TYPE_SHORT, $PARAM_TYPE"
|
||||||
|
echo " The type of record being created. Valid types are: A, MX, CNAME, ALIAS, TXT, NS, AAAA, SRV, TLSA, CAA"
|
||||||
|
echo " $PARAM_CONTENT_SHORT, $PARAM_CONTENT"
|
||||||
|
echo " The answer content for the record. Please see the DNS management popup from the domain management console for proper formatting of each record type."
|
||||||
|
echo " $PARAM_TTL_SHORT, $PARAM_TTL (optional)"
|
||||||
|
echo " The time to live in seconds for the record. The minimum and the default is 600 seconds."
|
||||||
|
echo " $PARAM_PRIORITY_SHORT, $PARAM_PRIORITY (optional)"
|
||||||
|
echo " The priority of the record for those that support it."
|
||||||
|
}
|
||||||
|
|
||||||
|
DNS_DELETE_RECORD="delete"
|
||||||
|
|
||||||
|
function dns_delete_record {
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
$PARAM_DOMAIN_SHORT|$PARAM_DOMAIN)
|
||||||
|
DOMAIN="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$PARAM_ID_SHORT|$PARAM_ID)
|
||||||
|
ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-*|--*)
|
||||||
|
echo "Unknown option $1"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z $DOMAIN || -z $ID ]]; then
|
||||||
|
echo "Missing domain or record id"
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $(request "$BASE_URL/dns/delete/$DOMAIN/$ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
function dns_delete_record_help {
|
||||||
|
echo "Usage: $0 $HANDLE_DNS $DNS_DELETE_RECORD [OPTIONS]"
|
||||||
|
echo
|
||||||
|
echo "Options:"
|
||||||
|
echo " $PARAM_DOMAIN_SHORT, $PARAM_DOMAIN"
|
||||||
|
echo " The domain of the record being deleted."
|
||||||
|
echo " $PARAM_ID_SHORT, $PARAM_ID"
|
||||||
|
echo " The record id being deleted."
|
||||||
|
}
|
||||||
|
|
||||||
|
# endregion
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# #
|
||||||
|
# MAIN #
|
||||||
|
# #
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
# region: main
|
||||||
|
|
||||||
|
function handle {
|
||||||
|
case $1 in
|
||||||
|
$HANDLE_PING)
|
||||||
|
handle_show_help_on_error ping
|
||||||
|
;;
|
||||||
|
$HANDLE_PING_IPV4)
|
||||||
|
handle_show_help_on_error ping_ipv4
|
||||||
|
;;
|
||||||
|
$HANDLE_DNS)
|
||||||
|
shift
|
||||||
|
handle_dns $@
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
handle_help
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle_help {
|
||||||
|
echo "Usage: $0 <command>"
|
||||||
|
echo
|
||||||
|
echo "Commands:"
|
||||||
|
echo " $HANDLE_PING Test communication with the API, also returns the IP address."
|
||||||
|
echo " $HANDLE_PING_IPV4 Test communication with the API, also returns the IP address in IPv4 format."
|
||||||
|
echo " $HANDLE_DNS Manage DNS records"
|
||||||
|
echo
|
||||||
|
echo "Version: v$VERSION"
|
||||||
|
}
|
||||||
|
|
||||||
|
load_env
|
||||||
|
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
handle $@
|
||||||
|
|
||||||
|
# endregion
|
Reference in New Issue
Block a user