添加服务器时使用dnspod自动创建dns记录
This commit is contained in:
parent
2196c19ac7
commit
f422b2c1af
@ -221,6 +221,159 @@ class BaseServer(Document, TagHelpers):
|
|||||||
self.update_virtual_machine_name()
|
self.update_virtual_machine_name()
|
||||||
|
|
||||||
def create_dns_record(self):
|
def create_dns_record(self):
|
||||||
|
try:
|
||||||
|
domain = jingrow.get_pg("Root Domain", self.domain)
|
||||||
|
|
||||||
|
if domain.dns_provider == "DNSPod":
|
||||||
|
self.create_dns_record_dnspod(domain)
|
||||||
|
else:
|
||||||
|
self.create_dns_record_route53()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
log_error("DNS记录创建异常", domain=self.domain, server=self.name, error=str(e))
|
||||||
|
|
||||||
|
def create_dns_record_dnspod(self, domain):
|
||||||
|
"""
|
||||||
|
使用腾讯云API创建或更新DNS记录
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 获取凭证
|
||||||
|
secret_id = domain.dnspod_app_id or ""
|
||||||
|
secret_key = domain.get_password("dnspod_app_token") or ""
|
||||||
|
|
||||||
|
if not secret_id or not secret_key:
|
||||||
|
log_error("未配置DNSPod凭证", domain=domain.name)
|
||||||
|
return
|
||||||
|
|
||||||
|
# 分离子域名
|
||||||
|
if self.name.endswith("." + domain.name):
|
||||||
|
sub_domain = self.name[:-len(domain.name)-1]
|
||||||
|
else:
|
||||||
|
log_error("域名配置错误", domain=domain.name, server=self.name)
|
||||||
|
return
|
||||||
|
|
||||||
|
# 使用腾讯云SDK
|
||||||
|
try:
|
||||||
|
from tencentcloud.common import credential
|
||||||
|
from tencentcloud.common.profile.client_profile import ClientProfile
|
||||||
|
from tencentcloud.common.profile.http_profile import HttpProfile
|
||||||
|
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
|
||||||
|
from tencentcloud.dnspod.v20210323 import dnspod_client, models
|
||||||
|
except ImportError:
|
||||||
|
log_error("腾讯云SDK未安装,请运行: pip install --user tencentcloud-sdk-python")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 初始化认证
|
||||||
|
cred = credential.Credential(secret_id, secret_key)
|
||||||
|
httpProfile = HttpProfile()
|
||||||
|
httpProfile.endpoint = "dnspod.tencentcloudapi.com"
|
||||||
|
|
||||||
|
clientProfile = ClientProfile()
|
||||||
|
clientProfile.httpProfile = httpProfile
|
||||||
|
client = dnspod_client.DnspodClient(cred, "", clientProfile)
|
||||||
|
|
||||||
|
# 查询记录是否存在
|
||||||
|
record_id = None
|
||||||
|
try:
|
||||||
|
req = models.DescribeRecordListRequest()
|
||||||
|
params = {
|
||||||
|
"Domain": domain.name,
|
||||||
|
"Subdomain": sub_domain,
|
||||||
|
"RecordType": "A"
|
||||||
|
}
|
||||||
|
req.from_json_string(json.dumps(params))
|
||||||
|
resp = client.DescribeRecordList(req)
|
||||||
|
resp_dict = json.loads(resp.to_json_string())
|
||||||
|
|
||||||
|
records = resp_dict.get("RecordList", [])
|
||||||
|
for record in records:
|
||||||
|
if record.get("Name") == sub_domain and record.get("Type") == "A":
|
||||||
|
record_id = record.get("RecordId")
|
||||||
|
break
|
||||||
|
except TencentCloudSDKException as err:
|
||||||
|
# 如果是"记录列表为空"错误,这是正常的,表示记录不存在
|
||||||
|
if err.code == "ResourceNotFound.NoDataOfRecord":
|
||||||
|
record_id = None
|
||||||
|
else:
|
||||||
|
# 其他错误需要记录并抛出
|
||||||
|
log_error("腾讯云SDK查询记录错误", code=err.code, message=err.message)
|
||||||
|
return
|
||||||
|
|
||||||
|
# 腾讯云DNSPod的TTL值
|
||||||
|
# 免费版最低TTL可能是600秒
|
||||||
|
ttl_value = 3600 if self.pagetype == "Proxy Server" else 600
|
||||||
|
|
||||||
|
# 根据是否存在记录决定创建或修改
|
||||||
|
try:
|
||||||
|
if record_id:
|
||||||
|
# 修改记录
|
||||||
|
req = models.ModifyRecordRequest()
|
||||||
|
params = {
|
||||||
|
"Domain": domain.name,
|
||||||
|
"RecordId": record_id,
|
||||||
|
"RecordType": "A",
|
||||||
|
"RecordLine": "默认",
|
||||||
|
"Value": self.ip,
|
||||||
|
"TTL": ttl_value
|
||||||
|
}
|
||||||
|
req.from_json_string(json.dumps(params))
|
||||||
|
response = client.ModifyRecord(req)
|
||||||
|
else:
|
||||||
|
# 创建记录
|
||||||
|
req = models.CreateRecordRequest()
|
||||||
|
params = {
|
||||||
|
"Domain": domain.name,
|
||||||
|
"SubDomain": sub_domain,
|
||||||
|
"RecordType": "A",
|
||||||
|
"RecordLine": "默认",
|
||||||
|
"Value": self.ip,
|
||||||
|
"TTL": ttl_value
|
||||||
|
}
|
||||||
|
req.from_json_string(json.dumps(params))
|
||||||
|
response = client.CreateRecord(req)
|
||||||
|
except TencentCloudSDKException as err:
|
||||||
|
# 如果是TTL限制错误,尝试更高的值
|
||||||
|
if err.code == "LimitExceeded.RecordTtlLimit":
|
||||||
|
log_error("TTL值超限,尝试更高的TTL值", current_ttl=ttl_value)
|
||||||
|
|
||||||
|
# 尝试更高的TTL值 (1800秒 = 30分钟)
|
||||||
|
ttl_value = 1800
|
||||||
|
try:
|
||||||
|
if record_id:
|
||||||
|
# 修改记录
|
||||||
|
req = models.ModifyRecordRequest()
|
||||||
|
params = {
|
||||||
|
"Domain": domain.name,
|
||||||
|
"RecordId": record_id,
|
||||||
|
"RecordType": "A",
|
||||||
|
"RecordLine": "默认",
|
||||||
|
"Value": self.ip,
|
||||||
|
"TTL": ttl_value
|
||||||
|
}
|
||||||
|
req.from_json_string(json.dumps(params))
|
||||||
|
response = client.ModifyRecord(req)
|
||||||
|
else:
|
||||||
|
# 创建记录
|
||||||
|
req = models.CreateRecordRequest()
|
||||||
|
params = {
|
||||||
|
"Domain": domain.name,
|
||||||
|
"SubDomain": sub_domain,
|
||||||
|
"RecordType": "A",
|
||||||
|
"RecordLine": "默认",
|
||||||
|
"Value": self.ip,
|
||||||
|
"TTL": ttl_value
|
||||||
|
}
|
||||||
|
req.from_json_string(json.dumps(params))
|
||||||
|
response = client.CreateRecord(req)
|
||||||
|
except TencentCloudSDKException as inner_err:
|
||||||
|
log_error("即使提高TTL后仍然失败", code=inner_err.code, message=inner_err.message, ttl=ttl_value)
|
||||||
|
else:
|
||||||
|
log_error("DNS操作失败", code=err.code, message=err.message, action="创建或修改记录")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
log_error("DNS记录创建异常", domain=domain.name, server=self.name, error=str(e))
|
||||||
|
|
||||||
|
def create_dns_record_route53(self):
|
||||||
try:
|
try:
|
||||||
domain = jingrow.get_pg("Root Domain", self.domain)
|
domain = jingrow.get_pg("Root Domain", self.domain)
|
||||||
client = boto3.client(
|
client = boto3.client(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user