mirror of
https://github.com/aaPanel/aaPanel.git
synced 2026-08-17 21:25:47 +02:00
1. Added Mail Marketing Automation trigger tasks 2. Added Mail Marketing Groups Import, Export, Merge 3. Added Mail Marketing Subscribers to support paste import 4. Added Mail Marketing Template Import Export Duplicate 5. Added Mail server add timed automatic reply 6. Added HTTPS Protection function for Website (disables automatic HTTP to HTTPS redirection when enabled) 7. Optimize Website Interface Button Integration 8. Optimize the response speed of WP Toolkit interface
195 lines
7.7 KiB
Python
195 lines
7.7 KiB
Python
from sslModel.base import sslBase
|
||
import requests
|
||
from urllib.parse import urlparse
|
||
from urllib.parse import urljoin
|
||
import public
|
||
|
||
|
||
class main(sslBase):
|
||
dns_provider_name = "cloudflare"
|
||
_type = 0 # 0:lest 1:锐成
|
||
|
||
def __init__(self):
|
||
super().__init__()
|
||
|
||
def __init_data(self, data):
|
||
self.CLOUDFLARE_EMAIL = data['E-Mail']
|
||
self.CLOUDFLARE_API_KEY = data['API Key']
|
||
self.CLOUDFLARE_API_BASE_URL = 'https://api.cloudflare.com/client/v4/'
|
||
self.HTTP_TIMEOUT = 65 # seconds
|
||
|
||
self.headers = {
|
||
"X-Auth-Email": self.CLOUDFLARE_EMAIL,
|
||
"X-Auth-Key": self.CLOUDFLARE_API_KEY
|
||
}
|
||
|
||
def get_dns_record(self, get):
|
||
domain_name = get.domain_name
|
||
dns_id = get.dns_id
|
||
self.__init_data(self.get_dns_data(None)[dns_id])
|
||
|
||
root_domain, _, sub_domain = self.extract_zone(domain_name)
|
||
data = {}
|
||
try:
|
||
zone_dic = self.get_zoneid_dic(get)
|
||
zone_id = zone_dic[root_domain]
|
||
url = urljoin(self.CLOUDFLARE_API_BASE_URL, "zones/{}/dns_records".format(zone_id))
|
||
response = requests.get(url, headers=self.headers, timeout=self.HTTP_TIMEOUT).json()
|
||
data = {
|
||
"info": {
|
||
'record_total': response['result_info']['total_count']
|
||
},
|
||
"list": [
|
||
{
|
||
"RecordId": i["id"],
|
||
"name": i["name"],
|
||
"domain_name": i["name"],
|
||
"value": i["content"],
|
||
"line": "默认",
|
||
"ttl": i["ttl"],
|
||
"type": i["type"],
|
||
"status": "启用",
|
||
"mx": i.get("priority") or 0,
|
||
"updated_on": i["modified_on"],
|
||
"remark": i.get("comment") or "",
|
||
}
|
||
for i in response["result"]
|
||
]
|
||
}
|
||
|
||
except Exception as e:
|
||
pass
|
||
self.set_record_data({domain_name: data})
|
||
return data
|
||
|
||
def create_dns_record(self, get):
|
||
domain_name = get.domain_name
|
||
dns_id = get.dns_id
|
||
record_type = get.record_type
|
||
domain_dns_value = get.domain_dns_value
|
||
|
||
self.__init_data(self.get_dns_data(None)[dns_id])
|
||
|
||
root_domain, sub_domain, _ = self.extract_zone(domain_name)
|
||
body = {
|
||
"content": get.domain_dns_value,
|
||
"name": sub_domain or '@',
|
||
"type": get.record_type if 'record_type' in get else 'TXT'
|
||
}
|
||
# CAA记录特殊处理
|
||
if record_type == 'CAA':
|
||
values = domain_dns_value.split(' ')
|
||
if len(values) != 3 or values[1] not in ("issue", "issuewild", "iodef"):
|
||
return public.returnMsg(False, '解析记录格式错误,请检查后重试')
|
||
body["data"] = {
|
||
"flags": values[0],
|
||
"tag": values[1],
|
||
"value": values[2].replace('"', ''),
|
||
}
|
||
|
||
try:
|
||
zone_dic = self.get_zoneid_dic(get)
|
||
zone_id = zone_dic.get(root_domain)
|
||
if not zone_id:
|
||
return public.returnMsg(False, '此域名配置的dns账号不正确')
|
||
url = urljoin(self.CLOUDFLARE_API_BASE_URL, "zones/{}/dns_records".format(zone_id))
|
||
response = requests.post(url, headers=self.headers, json=body, timeout=self.HTTP_TIMEOUT)
|
||
if response.status_code == 200:
|
||
return public.returnMsg(True, '添加成功')
|
||
else:
|
||
return public.returnMsg(False, '添加失败,{}'.format(self.get_error(response.text)))
|
||
except Exception as e:
|
||
return public.returnMsg(False, '添加失败,msg:{}'.format(e))
|
||
|
||
def delete_dns_record(self, get):
|
||
domain_name = get.domain_name
|
||
dns_id = get.dns_id
|
||
RecordId = get.RecordId
|
||
|
||
self.__init_data(self.get_dns_data(None)[dns_id])
|
||
|
||
root_domain, sub_domain, _ = self.extract_zone(domain_name)
|
||
|
||
try:
|
||
zone_dic = self.get_zoneid_dic(get)
|
||
zone_id = zone_dic.get(root_domain)
|
||
if not zone_id:
|
||
return public.returnMsg(False, '此域名配置的dns账号不正确')
|
||
url = urljoin(self.CLOUDFLARE_API_BASE_URL, "zones/{}/dns_records/{}".format(zone_id, RecordId))
|
||
response = requests.delete(url, headers=self.headers, timeout=self.HTTP_TIMEOUT)
|
||
if response.status_code == 200:
|
||
return public.returnMsg(True, '删除成功')
|
||
else:
|
||
return public.returnMsg(False, self.get_error(response.text))
|
||
except Exception as e:
|
||
return public.returnMsg(False, '删除失败,msg:{}'.format(e))
|
||
|
||
def get_zoneid_dic(self, get):
|
||
dns_id = get.dns_id
|
||
self.__init_data(self.get_dns_data(None)[dns_id])
|
||
|
||
url = urljoin(self.CLOUDFLARE_API_BASE_URL, "zones?status=active&per_page=1000")
|
||
try:
|
||
response = requests.get(url, headers=self.headers, timeout=self.HTTP_TIMEOUT)
|
||
data = response.json()
|
||
return {i["name"]: i["id"] for i in data["result"]}
|
||
except:
|
||
return {}
|
||
|
||
def update_dns_record(self, get):
|
||
domain_name = get.domain_name
|
||
RecordId = get.RecordId
|
||
domain_dns_value = get.domain_dns_value
|
||
record_type = get.record_type
|
||
dns_id = get.dns_id
|
||
|
||
self.__init_data(self.get_dns_data(None)[dns_id])
|
||
|
||
root_domain, sub_domain, _ = self.extract_zone(domain_name)
|
||
|
||
body = {
|
||
"content": get.domain_dns_value,
|
||
"name": sub_domain or '@',
|
||
"type": get.record_type,
|
||
}
|
||
|
||
# CAA记录特殊处理
|
||
if record_type == 'CAA':
|
||
values = domain_dns_value.split(' ')
|
||
if len(values) != 3:
|
||
return public.returnMsg(False, '解析记录格式错误,请检查后重试')
|
||
body["data"] = {
|
||
"flags": values[0],
|
||
"tag": values[1],
|
||
"value": values[2].replace('"', ''),
|
||
}
|
||
try:
|
||
zone_dic = self.get_zoneid_dic(get)
|
||
zone_id = zone_dic.get(root_domain)
|
||
if not zone_id:
|
||
return public.returnMsg(False, '此域名配置的dns账号不正确')
|
||
url = urljoin(self.CLOUDFLARE_API_BASE_URL, "zones/{}/dns_records/{}".format(zone_id, RecordId))
|
||
response = requests.patch(url, headers=self.headers, json=body, timeout=self.HTTP_TIMEOUT)
|
||
if response.status_code == 200:
|
||
return public.returnMsg(True, '修改成功')
|
||
else:
|
||
return public.returnMsg(False, '修改失败,{}'.format(self.get_error(response.text)))
|
||
except Exception as e:
|
||
return public.returnMsg(False, '修改失败,msg:{}'.format(e))
|
||
|
||
def get_error(self, error):
|
||
if "Record does not exist" in error:
|
||
return "解析记录不存在"
|
||
elif "Content for A record must be a valid IPv4 address" in error:
|
||
return "【A】记录的解析值必须为IPv4地址"
|
||
elif "Content for CNAME record is invalid" in error:
|
||
return "请正确填写【CNAME】类型的解析值"
|
||
elif "DNS record type is invalid" in error:
|
||
return "解析记录类型无效"
|
||
elif "A record with the same settings already exists" in error:
|
||
return "已存在相同的解析记录"
|
||
elif "Error unable to get DNS zone for domain_name" in error:
|
||
return "这个cloudflare账户下面不存在这个域名,请检查dns接口配置后重试"
|
||
else:
|
||
return error
|