1756bbff84
Currently only supports primary domains. My use case does not involve secondary domains so I'm not sure how it behaves, and cannot test it. Might be as simple as turning all "primary"-references into a variable that's either "primary" or "secondary", and make an extra check for this in _get_domain... Cookie handling heavily inspired by freedns plugin, including caching the cookie in the config file, so we can rm without re-authenticating
169 lines
4.6 KiB
Bash
Executable File
169 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
#Author: Herman Sletteng
|
|
#Report Bugs here: https://github.com/loial/acme.sh
|
|
#
|
|
#
|
|
# Note, gratisdns requires a login first, so the script needs to handle
|
|
# temporary cookies. Since acme.sh _get/_post currently don't directly support
|
|
# cookies, I've defined wrapper functions _myget/_mypost to set the headers
|
|
|
|
GDNSDK_API="https://admin.gratisdns.com"
|
|
######## Public functions #####################
|
|
#Usage: dns_gdnsdk_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
|
dns_gdnsdk_add() {
|
|
fulldomain=$1
|
|
txtvalue=$2
|
|
_info "Using gratisdns.dk"
|
|
_debug fulldomain "$fulldomain"
|
|
_debug txtvalue "$txtvalue"
|
|
if ! _gratisdns_login; then
|
|
_err "Login failed!"
|
|
return 1
|
|
fi
|
|
#finding domain zone
|
|
if ! _get_domain; then
|
|
_err "No matching root domain for $fulldomain found"
|
|
return 1
|
|
fi
|
|
# adding entry
|
|
_info "Adding the entry"
|
|
_mypost "action=dns_primary_record_added_txt&user_domain=$_domain&name=$fulldomain&txtdata=$txtvalue&ttl=1"
|
|
if _successful_update; then return 0; fi
|
|
_err "Couldn't create entry!"
|
|
return 1
|
|
}
|
|
|
|
#Usage: fulldomain txtvalue
|
|
#Remove the txt record after validation.
|
|
dns_gdnsdk_rm() {
|
|
fulldomain=$1
|
|
txtvalue=$2
|
|
_info "Using gratisdns.dk"
|
|
_debug fulldomain "$fulldomain"
|
|
_debug txtvalue "$txtvalue"
|
|
if ! _gratisdns_login; then
|
|
_err "Login failed!"
|
|
return 1
|
|
fi
|
|
if ! _get_domain; then
|
|
_err "No matching root domain for $fulldomain found"
|
|
return 1
|
|
fi
|
|
_findentry "$fulldomain" "$txtvalue"
|
|
if [ -z "$_id" ]; then
|
|
_info "Entry doesn't exist, nothing to delete"
|
|
return 0
|
|
fi
|
|
_debug "Deleting record..."
|
|
_mypost "action=dns_primary_delete_txt&user_domain=$_domain&id=$_id"
|
|
# removing entry
|
|
|
|
if _successful_update; then return 0; fi
|
|
_err "Couldn't delete entry!"
|
|
return 1
|
|
}
|
|
|
|
#################### Private functions below ##################################
|
|
|
|
_checkcredentials() {
|
|
GDNSDK_Username="${GDNSDK_Username:-$(_readaccountconf_mutable GDNSDK_Username)}"
|
|
GDNSDK_Password="${GDNSDK_Password:-$(_readaccountconf_mutable GDNSDK_Password)}"
|
|
|
|
if [ -z "$GDNSDK_Username" ] || [ -z "$GDNSDK_Password" ]; then
|
|
GDNSDK_Username=""
|
|
GDNSDK_Password=""
|
|
_err "You haven't specified gratisdns.dk username and password yet."
|
|
_err "Please add credentials and try again."
|
|
return 1
|
|
fi
|
|
#save the credentials to the account conf file.
|
|
_saveaccountconf_mutable GDNSDK_Username "$GDNSDK_Username"
|
|
_saveaccountconf_mutable GDNSDK_Password "$GDNSDK_Password"
|
|
return 0
|
|
}
|
|
|
|
_checkcookie() {
|
|
GDNSDK_Cookie="${GDNSDK_Cookie:-$(_readaccountconf_mutable GDNSDK_Cookie)}"
|
|
if [ -z "$GDNSDK_Cookie" ]; then
|
|
_debug "No cached cookie found"
|
|
return 1
|
|
fi
|
|
_myget "action="
|
|
if (echo "$_result" | grep -q "logmeout"); then
|
|
_debug "Cached cookie still valid"
|
|
return 0
|
|
fi
|
|
_debug "Cached cookie no longer valid"
|
|
GDNSDK_Cookie=""
|
|
_saveaccountconf_mutable GDNSDK_Cookie "$GDNSDK_Cookie"
|
|
return 1
|
|
}
|
|
|
|
_gratisdns_login() {
|
|
if ! _checkcredentials; then return 1; fi
|
|
|
|
if _checkcookie; then
|
|
_debug "Already logged in"
|
|
return 0
|
|
fi
|
|
_debug "Logging into GratisDNS with user $GDNSDK_Username"
|
|
|
|
if ! _mypost "login=$GDNSDK_Username&password=$GDNSDK_Password&action=logmein"; then
|
|
_err "GratisDNS login failed for user $GDNSDK_Username bad RC from _post"
|
|
return 1
|
|
fi
|
|
|
|
GDNSDK_Cookie="$(grep -A 15 '302 Found' "$HTTP_HEADER" | _egrep_o 'Cookie: [^;]*' | _head_n 1 | cut -d ' ' -f2)"
|
|
|
|
if [ -z "$GDNSDK_Cookie" ]; then
|
|
_err "GratisDNS login failed for user $GDNSDK_Username. Check $HTTP_HEADER file"
|
|
return 1
|
|
fi
|
|
export GDNSDK_Cookie
|
|
_saveaccountconf_mutable GDNSDK_Cookie "$GDNSDK_Cookie"
|
|
return 0
|
|
}
|
|
|
|
_myget() {
|
|
#Adds cookie to request
|
|
export _H1="Cookie: $GDNSDK_Cookie"
|
|
_result=$(_get "$GDNSDK_API?$1")
|
|
}
|
|
_mypost() {
|
|
#Adds cookie to request
|
|
export _H1="Cookie: $GDNSDK_Cookie"
|
|
_result=$(_post "$1" "$GDNSDK_API")
|
|
}
|
|
|
|
_get_domain() {
|
|
_myget 'action=dns_primarydns'
|
|
_domains=$(echo "$_result" | grep -o -P ' domain="\K([[:alnum:].-_]+)')
|
|
if [ -z "$_domains" ]; then
|
|
_err "Primary domain list not found!"
|
|
return 1
|
|
fi
|
|
for _domain in $_domains; do
|
|
if (_endswith "$fulldomain" "$_domain"); then
|
|
_debug "Root domain: $_domain"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
_successful_update() {
|
|
if (echo "$_result" | grep -q 'table-success'); then return 0; fi
|
|
return 1
|
|
}
|
|
|
|
_findentry() {
|
|
#returns id of dns entry, if it exists
|
|
_myget "action=dns_primary_changeDNSsetup&user_domain=$_domain"
|
|
_id=$(echo "$_result" | grep -o -P "$1</td>\s*<td>$2.*?id=\K(\d*)")
|
|
if [ -n "$_id" ]; then
|
|
_debug "Entry found with _id=$_id"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|