Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 141 additions & 0 deletions dnsapi/dns_restena.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
#!/usr/bin/env bash

# Restena DNS API for acme.sh
# This script needs to live where the other dnsapi shell scripts are located for acme.sh
# Proxmox: /usr/share/proxmox-acme/dnsapi
# Acme: ~/.acme.sh/dnsapi
#
# Restena DNS API
# Author: @SteveClement
# Date: 31.07.2025
# AI: True
# HumMod: True
#
# Environment variables used:
# RESTENA_TOKEN - Your Restena API token
# RESTENA_ZONE - Your Restena DNS zone (e.g., example.com)
#
# Usage:
# export RESTENA_TOKEN="your_api_token"
# export RESTENA_ZONE="your_zone.com"
# acme.sh --issue -d example.com --dns dns_restena

# Called by acme.sh to add a DNS TXT record
dns_restena_add() {
fulldomain="${1}"
txtvalue="${2}"

_debug fulldomain "$fulldomain"
_debug txtvalue "$txtvalue"

_restena_api="https://dnsgui.restena.lu/json.php"

# Load credentials from environment or saved config
RESTENA_TOKEN="${RESTENA_TOKEN:-$(_readaccountconf_mutable RESTENA_TOKEN)}"
RESTENA_ZONE="${RESTENA_ZONE:-$(_readaccountconf_mutable RESTENA_ZONE)}"

if [ -z "$RESTENA_TOKEN" ] || [ -z "$RESTENA_ZONE" ]; then
RESTENA_TOKEN=""
RESTENA_ZONE=""
_err "RESTENA_TOKEN or RESTENA_ZONE not set"
_err "Please set your Restena API token and zone and try again."
_err "export RESTENA_TOKEN=\"your_api_token\""
_err "export RESTENA_ZONE=\"your_zone.com\""
return 1
fi

# Save credentials for future automatic renewals
_saveaccountconf_mutable RESTENA_TOKEN "$RESTENA_TOKEN"
_saveaccountconf_mutable RESTENA_ZONE "$RESTENA_ZONE"

# Extract the label part by removing the zone suffix
label="${fulldomain%."$RESTENA_ZONE"}"

# This is needed to wrap the request in double quotes
data="\\\"$txtvalue\\\""

_info "Adding TXT record via Restena API..."
_debug "Zone: $RESTENA_ZONE"
_debug "Label: $label"
_debug "TXT value: $data"

# Construct the JSON body for the API request
body="{\"token\":\"$RESTENA_TOKEN\",\"zone\":\"$RESTENA_ZONE\",\"label\":\"${label}\",\"type\":\"TXT\",\"data\":\"$data\"}"
_debug "Request body: $body"

# Set Content-Type header
export _H1="Content-Type: application/json"

# Make the API call to add the TXT record
response="$(_post "$body" "$_restena_api" "" "PUT")"
_debug "API response: $response"

# Check if the request was successful
if [ -z "$response" ]; then
_err "No response from Restena API"
return 1
fi

# Basic success check - you may need to adjust this based on actual API responses
if _contains "$response" "error" || _contains "$response" "Error"; then
_err "Failed to add TXT record: $response"
return 1
fi

_info "TXT record added successfully"
return 0
}

# Called by acme.sh to remove a DNS TXT record
dns_restena_rm() {
fulldomain="${1}"

_debug fulldomain "$fulldomain"

_restena_api="https://dnsgui.restena.lu/json.php"

# Load credentials (same as in add function since they run in separate subshells)
RESTENA_TOKEN="${RESTENA_TOKEN:-$(_readaccountconf_mutable RESTENA_TOKEN)}"
RESTENA_ZONE="${RESTENA_ZONE:-$(_readaccountconf_mutable RESTENA_ZONE)}"

if [ -z "$RESTENA_TOKEN" ] || [ -z "$RESTENA_ZONE" ]; then
RESTENA_TOKEN=""
RESTENA_ZONE=""
_err "RESTENA_TOKEN or RESTENA_ZONE not set"
_err "Please set your Restena API token and zone and try again."
return 1
fi

# Extract the label part by removing the zone suffix
label="${fulldomain%."$RESTENA_ZONE"}"

_info "Removing TXT record via Restena API..."
_debug "Zone: $RESTENA_ZONE"
_debug "Label: $label"

# Construct the JSON body for the API request
body="{\"token\":\"$RESTENA_TOKEN\",\"zone\":\"$RESTENA_ZONE\",\"label\":\"${label}\",\"type\":\"TXT\"}"
_debug "Request body: $body"

# Set Content-Type header
export _H1="Content-Type: application/json"

# Make the API call to remove the TXT record
response="$(_post "$body" "$_restena_api" "" "DELETE")"
_debug "API response: $response"

# Check if the request was successful
if [ -z "$response" ]; then
_err "No response from Restena API"
return 1
fi

# Basic success check - you may need to adjust this based on actual API responses
if _contains "$response" "error" || _contains "$response" "Error"; then
_err "Failed to remove TXT record: $response"
return 1
fi

_info "TXT record removed successfully"
return 0
}
Loading