122 lines
4.7 KiB
Python
122 lines
4.7 KiB
Python
|
|
try:
|
||
|
|
import urllib.parse as urlparse
|
||
|
|
except:
|
||
|
|
import urlparse
|
||
|
|
|
||
|
|
import requests
|
||
|
|
|
||
|
|
from . import common
|
||
|
|
|
||
|
|
|
||
|
|
class DNSPodDns(common.BaseDns):
|
||
|
|
"""
|
||
|
|
"""
|
||
|
|
|
||
|
|
dns_provider_name = "dnspod"
|
||
|
|
|
||
|
|
def __init__(self, DNSPOD_ID, DNSPOD_API_KEY, DNSPOD_API_BASE_URL="https://dnsapi.cn/"):
|
||
|
|
self.DNSPOD_ID = DNSPOD_ID
|
||
|
|
self.DNSPOD_API_KEY = DNSPOD_API_KEY
|
||
|
|
self.DNSPOD_API_BASE_URL = DNSPOD_API_BASE_URL
|
||
|
|
self.HTTP_TIMEOUT = 65 # seconds
|
||
|
|
self.DNSPOD_LOGIN = "{0},{1}".format(self.DNSPOD_ID, self.DNSPOD_API_KEY)
|
||
|
|
|
||
|
|
if DNSPOD_API_BASE_URL[-1] != "/":
|
||
|
|
self.DNSPOD_API_BASE_URL = DNSPOD_API_BASE_URL + "/"
|
||
|
|
else:
|
||
|
|
self.DNSPOD_API_BASE_URL = DNSPOD_API_BASE_URL
|
||
|
|
super(DNSPodDns, self).__init__()
|
||
|
|
|
||
|
|
def create_dns_record(self, domain_name, domain_dns_value):
|
||
|
|
self.logger.info("create_dns_record")
|
||
|
|
# if we have been given a wildcard name, strip wildcard
|
||
|
|
domain_name = domain_name.lstrip("*.")
|
||
|
|
subd = ""
|
||
|
|
if domain_name.count(".") != 1: # not top level domain
|
||
|
|
pos = domain_name.rfind(".", 0, domain_name.rfind("."))
|
||
|
|
subd = domain_name[:pos]
|
||
|
|
domain_name = domain_name[pos + 1 :]
|
||
|
|
if subd != "":
|
||
|
|
subd = "." + subd
|
||
|
|
|
||
|
|
url = urlparse.urljoin(self.DNSPOD_API_BASE_URL, "Record.Create")
|
||
|
|
body = {
|
||
|
|
"record_type": "TXT",
|
||
|
|
"domain": domain_name,
|
||
|
|
"sub_domain": "_acme-challenge" + subd,
|
||
|
|
"value": domain_dns_value,
|
||
|
|
"record_line_id": "0",
|
||
|
|
"format": "json",
|
||
|
|
"login_token": self.DNSPOD_LOGIN,
|
||
|
|
}
|
||
|
|
create_dnspod_dns_record_response = requests.post(
|
||
|
|
url, data=body, timeout=self.HTTP_TIMEOUT
|
||
|
|
).json()
|
||
|
|
self.logger.debug(
|
||
|
|
"create_dnspod_dns_record_response. status_code={0}. response={1}".format(
|
||
|
|
create_dnspod_dns_record_response["status"]["code"],
|
||
|
|
create_dnspod_dns_record_response["status"]["message"],
|
||
|
|
)
|
||
|
|
)
|
||
|
|
if create_dnspod_dns_record_response["status"]["code"] != "1":
|
||
|
|
# raise error so that we do not continue to make calls to ACME
|
||
|
|
# server
|
||
|
|
raise ValueError(
|
||
|
|
"Error creating dnspod model record: status_code={status_code} response={response}".format(
|
||
|
|
status_code=create_dnspod_dns_record_response["status"]["code"],
|
||
|
|
response=create_dnspod_dns_record_response["status"]["message"],
|
||
|
|
)
|
||
|
|
)
|
||
|
|
self.logger.info("create_dns_record_end")
|
||
|
|
|
||
|
|
def delete_dns_record(self, domain_name, domain_dns_value):
|
||
|
|
self.logger.info("delete_dns_record")
|
||
|
|
domain_name = domain_name.lstrip("*.")
|
||
|
|
subd = ""
|
||
|
|
if domain_name.count(".") != 1: # not top level domain
|
||
|
|
pos = domain_name.rfind(".", 0, domain_name.rfind("."))
|
||
|
|
subd = domain_name[:pos]
|
||
|
|
domain_name = domain_name[pos + 1 :]
|
||
|
|
if subd != "":
|
||
|
|
subd = "." + subd
|
||
|
|
|
||
|
|
url = urllib.parse.urljoin(self.DNSPOD_API_BASE_URL, "Record.List")
|
||
|
|
# pos = domain_name.rfind(".",0, domain_name.rfind("."))
|
||
|
|
subdomain = "_acme-challenge." + subd
|
||
|
|
rootdomain = domain_name
|
||
|
|
body = {
|
||
|
|
"login_token": self.DNSPOD_LOGIN,
|
||
|
|
"format": "json",
|
||
|
|
"domain": rootdomain,
|
||
|
|
"subdomain": subdomain,
|
||
|
|
"record_type": "TXT",
|
||
|
|
}
|
||
|
|
list_dns_response = requests.post(url, data=body, timeout=self.HTTP_TIMEOUT).json()
|
||
|
|
if list_dns_response["status"]["code"] != "1":
|
||
|
|
self.logger.error(
|
||
|
|
"list_dns_record_response. status_code={0}. message={1}".format(
|
||
|
|
list_dns_response["status"]["code"], list_dns_response["status"]["message"]
|
||
|
|
)
|
||
|
|
)
|
||
|
|
for i in range(0, len(list_dns_response["records"])):
|
||
|
|
rid = list_dns_response["records"][i]["id"]
|
||
|
|
urlr = urllib.parse.urljoin(self.DNSPOD_API_BASE_URL, "Record.Remove")
|
||
|
|
bodyr = {
|
||
|
|
"login_token": self.DNSPOD_LOGIN,
|
||
|
|
"format": "json",
|
||
|
|
"domain": rootdomain,
|
||
|
|
"record_id": rid,
|
||
|
|
}
|
||
|
|
delete_dns_record_response = requests.post(
|
||
|
|
urlr, data=bodyr, timeout=self.HTTP_TIMEOUT
|
||
|
|
).json()
|
||
|
|
if delete_dns_record_response["status"]["code"] != "1":
|
||
|
|
self.logger.error(
|
||
|
|
"delete_dns_record_response. status_code={0}. message={1}".format(
|
||
|
|
delete_dns_record_response["status"]["code"],
|
||
|
|
delete_dns_record_response["status"]["message"],
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
self.logger.info("delete_dns_record_success")
|