#!/bin/bash #========================================= # Author : Colben # Create : 2025-11-06 15:43 #========================================= set -euo pipefail export LANG=en_US.UTF-8 trap Quit EXIT REGION=cn-beijing ACCESS_KEY_ID='aliyun access key id' ACCESS_KEY_SECRET='aliyun access key secret' DOMAIN=$CERTBOT_DOMAIN SUB_DOMAIN=_acme-challenge RECORD_ID= RECORD_VA=$CERTBOT_VALIDATION RECORD="txt record: $SUB_DOMAIN.$DOMAIN" if [ -t 0 ]; then function Print { echo -e "\033[32;1m$(date +'[%F %T]') $*\033[0m"; } function Warn { echo -e "\033[33;1m$(date +'[%F %T]') $*\033[0m"; } function Error { echo -e "\033[31;1m$(date +'[%F %T]') $*\033[0m"; exit 1; } else #exec &> ${0%.sh}.out function Print { echo -e "$(date +'[%F %T] INFO') $*"; } function Warn { echo -e "$(date +'[%F %T] WARN') $*"; } function Error { echo -e "$(date +'[%F %T] ERROR') $*"; exit 1; } fi function Quit { local exitCode=$? [ 0 -ne $exitCode ] && Error Failed to request aliyun api! [ -z "${END:-}" ] && echo && Error Interrupted manually! Print Succeeded to request aliyun api and wait 30 seconds. sleep 30 } function SetAK { Warn Setting AK with regin: $REGION ... aliyun configure set \ --mode AK \ --access-key-id $ACCESS_KEY_ID \ --access-key-secret $ACCESS_KEY_SECRET \ --region $REGION } function GetTxtRecord { local resp= Warn Getting $RECORD ... if resp=$(aliyun alidns DescribeSubDomainRecords \ --SubDomain $SUB_DOMAIN.$DOMAIN \ --Type TXT); then [ '1' != "$(jq -rM .TotalCount)" ] && warn Not found $RECORD! && return 0 RECORD_ID=$(echo $resp | jq -rM .DomainRecords.Record[0].RecordId) else echo "$resp" Error Failed to get $RECORD! fi } function CreateTxtRecord { Warn Creating $RECORD ... aliyun alidns AddDomainRecord \ --DomainName $DOMAIN \ --RR $SUB_DOMAIN \ --Type TXT \ --Value $RECORD_VA \ && Print Succeeded to create $RECORD. \ && return 0 Error Failed to create $RECORD! } function ModifyRecord { Warn Modifying $RECORD ... aliyun alidns UpdateDomainRecord \ --RecordId $RECORD_ID \ --RR $SUB_DOMAIN \ --Type TXT \ --Value $RECORD_VA \ && Print Succeeded to modify $RECORD. \ && return 0 Error Failed to modify $RECORD! } function DeleteRecord { Warn Deleting $RECORD ... aliyun alidns DeleteDomainRecord \ --RecordId $RECORD_ID \ && Print Succeeded to delete $RECORD. \ && return 0 Error Failed to delete $RECORD! } function Main { trap Quit EXIT SetAK GetTxtRecord [ -z "$RECORD_ID" ] && CreateTxtRecord [ -z "$RECORD_ID" ] || ModifyTxtRecord END=1 } # Start here Main