Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 18.117.121.71
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
www /
server /
panel /
class_v2 /
[ HOME SHELL ]
Name
Size
Permission
Action
__pycache__
[ DIR ]
drwxr-xr-x
btdockerModelV2
[ DIR ]
drwxr-xr-x
crontabModelV2
[ DIR ]
drwxr-xr-x
databaseModelV2
[ DIR ]
drwxr-xr-x
firewallModelV2
[ DIR ]
drwxr-xr-x
logsModelV2
[ DIR ]
drwxr-xr-x
monitorModelV2
[ DIR ]
drwxr-xr-x
panelModelV2
[ DIR ]
drwxr-xr-x
power_mta
[ DIR ]
drwxr-xr-x
projectModelV2
[ DIR ]
drwxr-xr-x
safeModelV2
[ DIR ]
drwxr-xr-x
safe_warning_v2
[ DIR ]
drwxr-xr-x
ssl_domainModelV2
[ DIR ]
drwxr-xr-x
virtualModelV2
[ DIR ]
drwxr-xr-x
wp_toolkit
[ DIR ]
drwxr-xr-x
acme_v3.py
133.98
KB
-rw-r--r--
ajax_v2.py
95.41
KB
-rw-r--r--
apache_v2.py
17.28
KB
-rw-r--r--
backup_bak_v2.py
24.86
KB
-rw-r--r--
breaking_through.py
47.94
KB
-rw-r--r--
cloud_stora_upload_v2.py
19.27
KB
-rw-r--r--
common_v2.py
12.45
KB
-rw-r--r--
config_v2.py
165.36
KB
-rw-r--r--
crontab_ssl_v2.py
1.85
KB
-rw-r--r--
crontab_v2.py
111.93
KB
-rw-r--r--
data_v2.py
36.54
KB
-rw-r--r--
database_v2.py
125.54
KB
-rw-r--r--
datatool_v2.py
5.83
KB
-rw-r--r--
db_mysql_v2.py
11.41
KB
-rw-r--r--
db_v2.py
11.04
KB
-rw-r--r--
dk_db.py
18.34
KB
-rw-r--r--
download_file_v2.py
2.54
KB
-rw-r--r--
fastcgi_client_two_v2.py
12.26
KB
-rw-r--r--
fastcgi_client_v2.py
6.89
KB
-rw-r--r--
file_execute_deny_v2.py
10.34
KB
-rw-r--r--
files_v2.py
149.12
KB
-rw-r--r--
firewall_new_v2.py
22.4
KB
-rw-r--r--
firewalld_v2.py
11.09
KB
-rw-r--r--
firewalls_v2.py
17.44
KB
-rw-r--r--
flask_compress_v2.py
5.12
KB
-rw-r--r--
flask_sockets_v2.py
3.75
KB
-rw-r--r--
ftp_log_v2.py
21.72
KB
-rw-r--r--
ftp_v2.py
16.17
KB
-rw-r--r--
http_requests_v2.py
24.25
KB
-rw-r--r--
jobs_v2.py
36.98
KB
-rw-r--r--
letsencrypt_v2.py
12.85
KB
-rw-r--r--
log_analysis_v2.py
12.23
KB
-rw-r--r--
monitor_v2.py
13.53
KB
-rw-r--r--
one_key_wp_v2.py
75.79
KB
-rw-r--r--
panelControllerV2.py
4.97
KB
-rw-r--r--
panelDatabaseControllerV2.py
5.76
KB
-rw-r--r--
panelDockerControllerV2.py
5.86
KB
-rw-r--r--
panelFireControllerV2.py
4.65
KB
-rw-r--r--
panelModControllerV2.py
5.13
KB
-rw-r--r--
panelProjectControllerV2.py
6.07
KB
-rw-r--r--
panelSafeControllerV2.py
4.65
KB
-rw-r--r--
panel_api_v2.py
10.43
KB
-rw-r--r--
panel_auth_v2.py
33.21
KB
-rw-r--r--
panel_backup_v2.py
102.56
KB
-rw-r--r--
panel_dns_api_v2.py
22.2
KB
-rw-r--r--
panel_http_proxy_v2.py
11.33
KB
-rw-r--r--
panel_lets_v2.py
43.61
KB
-rw-r--r--
panel_mssql_v2.py
4.48
KB
-rw-r--r--
panel_mysql_v2.py
7.55
KB
-rw-r--r--
panel_php_v2.py
24.78
KB
-rw-r--r--
panel_ping_v2.py
2.88
KB
-rw-r--r--
panel_plugin_v2.py
125.11
KB
-rw-r--r--
panel_push_v2.py
23.78
KB
-rw-r--r--
panel_redirect_v2.py
34.02
KB
-rw-r--r--
panel_restore_v2.py
11.04
KB
-rw-r--r--
panel_site_v2.py
343.73
KB
-rw-r--r--
panel_ssl_v2.py
75.34
KB
-rw-r--r--
panel_task_v2.py
28.7
KB
-rw-r--r--
panel_video_V2.py
1.88
KB
-rw-r--r--
panel_warning_v2.py
68.71
KB
-rw-r--r--
password_v2.py
8.09
KB
-rw-r--r--
plugin_auth_v2.py
3.14
KB
-rw-r--r--
plugin_deployment_v2.py
28.85
KB
-rw-r--r--
san_baseline_v2.py
51.13
KB
-rw-r--r--
site_dir_auth_v2.py
17.67
KB
-rw-r--r--
ssh_security_v2.py
45.66
KB
-rw-r--r--
ssh_terminal_v2.py
58.86
KB
-rw-r--r--
system_v2.py
44.77
KB
-rw-r--r--
userRegister_v2.py
6.74
KB
-rw-r--r--
user_login_v2.py
21.2
KB
-rw-r--r--
vilidate_v2.py
4.94
KB
-rw-r--r--
wxapp_v2.py
5.62
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : panel_dns_api_v2.py
#coding: utf-8 # +------------------------------------------------------------------- # | aaPanel # +------------------------------------------------------------------- # | Copyright (c) 2015-2099 aaPanel(www.aapanel.com) All rights reserved. # +------------------------------------------------------------------- # | Author: 沐落 <cjx@aapanel.com> # +------------------------------------------------------------------- import public,os,sys,json,time,random import requests from OpenSSL import crypto import sys, os import time import copy import json import base64 import hashlib import binascii import urllib if sys.version_info[0] == 2: # python2 import urlparse from urlparse import urljoin import urllib2 import cryptography.hazmat import cryptography.hazmat.backends import cryptography.hazmat.primitives.serialization else: # python3 from urllib.parse import urlparse from urllib.parse import urljoin import cryptography import platform import hmac try: import requests except: public.ExecShell('btpip install requests') import requests try: import OpenSSL except: public.ExecShell('btpip install pyOpenSSL') import OpenSSL import random import datetime import logging from hashlib import sha1 os.chdir("/www/server/panel") if not 'class/' in sys.path: sys.path.insert(0,'class/') import public caa_value = '0 issue "letsencrypt.org"' def extract_zone(domain_name): domain_name = domain_name.lstrip("*.") top_domain_list = ['.ac.cn', '.ah.cn', '.bj.cn', '.com.cn', '.cq.cn', '.fj.cn', '.gd.cn', '.gov.cn', '.gs.cn', '.gx.cn', '.gz.cn', '.ha.cn', '.hb.cn', '.he.cn', '.hi.cn', '.hk.cn', '.hl.cn', '.hn.cn', '.jl.cn', '.js.cn', '.jx.cn', '.ln.cn', '.mo.cn', '.net.cn', '.nm.cn', '.nx.cn', '.org.cn','.my.id'] old_domain_name = domain_name top_domain = "."+".".join(domain_name.rsplit('.')[-2:]) new_top_domain = "." + top_domain.replace(".","") is_tow_top = False if top_domain in top_domain_list: is_tow_top = True domain_name = domain_name[:-len(top_domain)] + new_top_domain if domain_name.count(".") > 1: zone, middle, last = domain_name.rsplit(".", 2) acme_txt = "_acme-challenge.%s" % zone if is_tow_top: last = top_domain[1:] root = ".".join([middle, last]) else: zone = "" root = old_domain_name acme_txt = "_acme-challenge" return root, zone, acme_txt class BaseDns(object): def __init__(self): self.dns_provider_name = self.__class__.__name__ def log_response(self, response): try: log_body = response.json() except ValueError: log_body = response.content return log_body def create_dns_record(self, domain_name, domain_dns_value): raise NotImplementedError("create_dns_record method must be implemented.") def delete_dns_record(self, domain_name, domain_dns_value): raise NotImplementedError("delete_dns_record method must be implemented.") class DNSPodDns(BaseDns): dns_provider_name = "dnspod" _type = 0 # 0:lest 1:锐成 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): domain_name,_,subd = extract_zone(domain_name) if self._type == 1: self.add_record(domain_name,subd.replace('_acme-challenge.',''),domain_dns_value,'CNAME') else: self.add_record(domain_name,subd,domain_dns_value,'TXT') def add_record(self,domain_name,subd,domain_dns_value,s_type): url = urljoin(self.DNSPOD_API_BASE_URL, "Record.Create") body = { "record_type": s_type, "domain": domain_name, "sub_domain": 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() if create_dnspod_dns_record_response["status"]["code"] != "1": raise ValueError( "Error creating dnspod dns 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"], ) ) def remove_record(self,domain_name,subd,s_type): url = urljoin(self.DNSPOD_API_BASE_URL, "Record.List") rootdomain = domain_name body = { "login_token": self.DNSPOD_LOGIN, "format": "json", "domain": rootdomain, "subdomain": subd, "record_type": s_type, } list_dns_response = requests.post(url, data=body, timeout=self.HTTP_TIMEOUT).json() for i in range(0, len(list_dns_response["records"])): if list_dns_response["records"][i]['name'] != subd: continue rid = list_dns_response["records"][i]["id"] urlr = urljoin(self.DNSPOD_API_BASE_URL, "Record.Remove") bodyr = { "login_token": self.DNSPOD_LOGIN, "format": "json", "domain": rootdomain, "record_id": rid, } requests.post( urlr, data=bodyr, timeout=self.HTTP_TIMEOUT ).json() def delete_dns_record(self, domain_name, domain_dns_value): try: domain_name,_,subd = extract_zone(domain_name) self.remove_record(domain_name,subd,'TXT') self.remove_record(domain_name,'_acme-challenge','CNAME') except: pass class CloudFlareDns(BaseDns): dns_provider_name = "cloudflare" _type = 0 # 0:lest 1:锐成 def __init__( self, CLOUDFLARE_EMAIL, CLOUDFLARE_API_KEY, CLOUDFLARE_API_BASE_URL="https://api.cloudflare.com/client/v4/", ): self.CLOUDFLARE_DNS_ZONE_ID = None self.CLOUDFLARE_EMAIL = CLOUDFLARE_EMAIL self.CLOUDFLARE_API_KEY = CLOUDFLARE_API_KEY self.CLOUDFLARE_API_BASE_URL = CLOUDFLARE_API_BASE_URL self.HTTP_TIMEOUT = 65 # seconds try: import urllib.parse as urlparse except: import urlparse if CLOUDFLARE_API_BASE_URL[-1] != "/": self.CLOUDFLARE_API_BASE_URL = CLOUDFLARE_API_BASE_URL + "/" else: self.CLOUDFLARE_API_BASE_URL = CLOUDFLARE_API_BASE_URL super(CloudFlareDns, self).__init__() def get_headers(self): if os.path.exists('/www/server/panel/data/cf_limit_api.pl'): headers = {"Authorization": "Bearer "+self.CLOUDFLARE_API_KEY} else: headers = {"X-Auth-Email": self.CLOUDFLARE_EMAIL, "X-Auth-Key": self.CLOUDFLARE_API_KEY} return headers def find_dns_zone(self, domain_name): url = urljoin(self.CLOUDFLARE_API_BASE_URL, "zones?status=active&name={0}".format(domain_name)) headers = self.get_headers() find_dns_zone_response = requests.get(url, headers=headers, timeout=self.HTTP_TIMEOUT) if find_dns_zone_response.status_code != 200: raise ValueError( "Error creating cloudflare dns record: status_code={status_code} response={response}".format( status_code=find_dns_zone_response.status_code, response=self.log_response(find_dns_zone_response), ) ) result = find_dns_zone_response.json()["result"] for i in result: if i["name"] in domain_name: setattr(self, "CLOUDFLARE_DNS_ZONE_ID", i["id"]) if isinstance(self.CLOUDFLARE_DNS_ZONE_ID, type(None)): raise ValueError( "Error unable to get DNS zone for domain_name={domain_name}: status_code={status_code} response={response}".format( domain_name=domain_name, status_code=find_dns_zone_response.status_code, response=self.log_response(find_dns_zone_response), ) ) def add_record(self,domain_name,value,s_type): url = urljoin( self.CLOUDFLARE_API_BASE_URL, "zones/{0}/dns_records".format(self.CLOUDFLARE_DNS_ZONE_ID), ) # if '_' in self.CLOUDFLARE_API_KEY or '-' in self.CLOUDFLARE_API_KEY: # headers = {"Authorization": "Bearer "+self.CLOUDFLARE_API_KEY} # else: # headers = {"X-Auth-Email": self.CLOUDFLARE_EMAIL, "X-Auth-Key": self.CLOUDFLARE_API_KEY} headers = self.get_headers() body = { "type": s_type, "name": domain_name, "content": "{0}".format(value), } create_cloudflare_dns_record_response = requests.post( url, headers=headers, json=body, timeout=self.HTTP_TIMEOUT ) if create_cloudflare_dns_record_response.status_code != 200: raise ValueError( "Error creating cloudflare dns record: status_code={status_code} response={response}".format( status_code=create_cloudflare_dns_record_response.status_code, response=self.log_response(create_cloudflare_dns_record_response), ) ) def create_dns_record(self, domain_name, domain_dns_value): domain_name = domain_name.lstrip("*.") self.find_dns_zone(domain_name) url = urljoin( self.CLOUDFLARE_API_BASE_URL, "zones/{0}/dns_records".format(self.CLOUDFLARE_DNS_ZONE_ID), ) # if '_' in self.CLOUDFLARE_API_KEY or '-' in self.CLOUDFLARE_API_KEY: # headers = {"Authorization": "Bearer "+self.CLOUDFLARE_API_KEY} # else: # headers = {"X-Auth-Email": self.CLOUDFLARE_EMAIL, "X-Auth-Key": self.CLOUDFLARE_API_KEY} headers = self.get_headers() body = { "type": "TXT", "name": "_acme-challenge" + "." + domain_name + ".", "content": "{0}".format(domain_dns_value), } if self._type == 1: body['type'] = 'CNAME' root, _, acme_txt = extract_zone(domain_name) body['name'] = acme_txt.replace('_acme-challenge.','') create_cloudflare_dns_record_response = requests.post( url, headers=headers, json=body, timeout=self.HTTP_TIMEOUT ) if create_cloudflare_dns_record_response.status_code != 200: # raise error so that we do not continue to make calls to ACME # server raise ValueError( "Error creating cloudflare dns record: status_code={status_code} response={response}".format( status_code=create_cloudflare_dns_record_response.status_code, response=self.log_response(create_cloudflare_dns_record_response), ) ) def remove_record(self,domain_name,dns_name,s_type): # if '_' in self.CLOUDFLARE_API_KEY or '-' in self.CLOUDFLARE_API_KEY: # headers = {"Authorization": "Bearer "+self.CLOUDFLARE_API_KEY} # else: # headers = {"X-Auth-Email": self.CLOUDFLARE_EMAIL, "X-Auth-Key": self.CLOUDFLARE_API_KEY} headers = self.get_headers() list_dns_payload = {"type": s_type, "name": dns_name} list_dns_url = urljoin( self.CLOUDFLARE_API_BASE_URL, "zones/{0}/dns_records".format(self.CLOUDFLARE_DNS_ZONE_ID), ) list_dns_response = requests.get( list_dns_url, params=list_dns_payload, headers=headers, timeout=self.HTTP_TIMEOUT ) for i in range(0, len(list_dns_response.json()["result"])): dns_record_id = list_dns_response.json()["result"][i]["id"] url = urljoin( self.CLOUDFLARE_API_BASE_URL, "zones/{0}/dns_records/{1}".format(self.CLOUDFLARE_DNS_ZONE_ID, dns_record_id), ) headers = {"X-Auth-Email": self.CLOUDFLARE_EMAIL, "X-Auth-Key": self.CLOUDFLARE_API_KEY} requests.delete( url, headers=headers, timeout=self.HTTP_TIMEOUT ) def delete_dns_record(self, domain_name, domain_dns_value): domain_name = domain_name.lstrip("*.") dns_name = "_acme-challenge" + "." + domain_name self.remove_record(domain_name,dns_name,'TXT') class AliyunDns(object): _type = 0 # 0:lest 1:锐成 def __init__(self, key, secret, ): self.key = str(key).strip() self.secret = str(secret).strip() self.url = "http://alidns.aliyuncs.com" def sign(self, accessKeySecret, parameters): # '''签名方法 def percent_encode(encodeStr): encodeStr = str(encodeStr) if sys.version_info[0] == 3: import urllib.request res = urllib.request.quote(encodeStr, '') else: res = urllib2.quote(encodeStr, '') res = res.replace('+', '%20') res = res.replace('*', '%2A') res = res.replace('%7E', '~') return res sortedParameters = sorted(parameters.items(), key=lambda parameters: parameters[0]) canonicalizedQueryString = '' for (k, v) in sortedParameters: canonicalizedQueryString += '&' + percent_encode(k) + '=' + percent_encode(v) stringToSign = 'GET&%2F&' + percent_encode(canonicalizedQueryString[1:]) if sys.version_info[0] == 2: h = hmac.new(accessKeySecret + "&", stringToSign, sha1) else: h = hmac.new(bytes(accessKeySecret + "&", encoding="utf8"), stringToSign.encode('utf8'), sha1) signature = base64.encodestring(h.digest()).strip() return signature def create_dns_record(self, domain_name, domain_dns_value): root, _, acme_txt = extract_zone(domain_name) self.delete_dns_record(domain_name, domain_dns_value) if self._type == 1: acme_txt = acme_txt.replace('_acme-challenge.','') self.add_record(root,'CNAME',acme_txt,domain_dns_value) else: try: self.add_record(root,'CAA','@',caa_value) except: pass self.add_record(root,'TXT',acme_txt,domain_dns_value) def add_record(self,domain,s_type,host,value): randomint = random.randint(11111111111111, 99999999999999) now = datetime.datetime.utcnow() otherStyleTime = now.strftime("%Y-%m-%dT%H:%M:%SZ") paramsdata = { "Action": "AddDomainRecord", "Format": "json", "Version": "2015-01-09", "SignatureMethod": "HMAC-SHA1", "Timestamp": otherStyleTime, "SignatureVersion": "1.0", "SignatureNonce": str(randomint), "AccessKeyId": self.key, "DomainName": domain, "RR": host, "Type": s_type, "Value": value, } Signature = self.sign(self.secret, paramsdata) paramsdata['Signature'] = Signature req = requests.get(url=self.url, params=paramsdata) if req.status_code != 200: if req.json()['Code'] == 'IncorrectDomainUser' or req.json()['Code'] == 'InvalidDomainName.NoExist': raise ValueError("This domain name does not exist under this Ali cloud account. Adding parsing failed.") elif req.json()['Code'] == 'InvalidAccessKeyId.NotFound' or req.json()['Code'] == 'SignatureDoesNotMatch': raise ValueError("API key error, add parsing failed") else: raise ValueError(req.json()['Message']) def query_recored_items(self, host, zone=None, tipe=None, page=1, psize=200): randomint = random.randint(11111111111111, 99999999999999) now = datetime.datetime.utcnow() otherStyleTime = now.strftime("%Y-%m-%dT%H:%M:%SZ") paramsdata = { "Action": "DescribeDomainRecords", "Format": "json", "Version": "2015-01-09", "SignatureMethod": "HMAC-SHA1", "Timestamp": otherStyleTime, "SignatureVersion": "1.0", "SignatureNonce": str(randomint), "AccessKeyId": self.key, "DomainName": host, } if zone: paramsdata['RRKeyWord'] = zone if tipe: paramsdata['TypeKeyWord'] = tipe Signature = self.sign(self.secret, paramsdata) paramsdata['Signature'] = Signature req = requests.get(url=self.url, params=paramsdata) return req.json() def query_recored_id(self, root, zone, tipe="TXT"): record_id = None recoreds = self.query_recored_items(root, zone, tipe=tipe) recored_list = recoreds.get("DomainRecords", {}).get("Record", []) recored_item_list = [i for i in recored_list if i["RR"] == zone] if len(recored_item_list): record_id = recored_item_list[0]["RecordId"] return record_id def remove_record(self,domain,host,s_type = 'TXT'): record_id = self.query_recored_id(domain,host,s_type) if not record_id: msg = "Cannot find record_id for domain name: ", domain print(msg) return randomint = random.randint(11111111111111, 99999999999999) now = datetime.datetime.utcnow() otherStyleTime = now.strftime("%Y-%m-%dT%H:%M:%SZ") paramsdata = { "Action": "DeleteDomainRecord", "Format": "json", "Version": "2015-01-09", "SignatureMethod": "HMAC-SHA1", "Timestamp": otherStyleTime, "SignatureVersion": "1.0", "SignatureNonce": str(randomint), "AccessKeyId": self.key, "RecordId": record_id, } Signature = self.sign(self.secret, paramsdata) paramsdata['Signature'] = Signature req = requests.get(url=self.url, params=paramsdata) if req.status_code != 200: raise ValueError("Deleting a parse record failed") def delete_dns_record(self, domain_name, domain_dns_value): root, _, acme_txt = extract_zone(domain_name) self.remove_record(root,acme_txt,'TXT') self.remove_record(root,'@','CAA') self.remove_record(root,'_acme-challenge','CNAME') class CloudxnsDns(object): def __init__(self, key, secret, ): self.key = key self.secret = secret self.APIREQUESTDATE = time.ctime() def get_headers(self, url, parameter=''): APIREQUESTDATE = self.APIREQUESTDATE APIHMAC = public.Md5(self.key + url + parameter + APIREQUESTDATE + self.secret) headers = { "API-KEY": self.key, "API-REQUEST-DATE": APIREQUESTDATE, "API-HMAC": APIHMAC, "API-FORMAT": "json" } return headers def get_domain_list(self): url = "https://www.cloudxns.net/api2/domain" headers = self.get_headers(url) req = requests.get(url=url, headers=headers,verify=False) req = req.json() return req def get_domain_id(self, domain_name): req = self.get_domain_list() for i in req["data"]: if domain_name.strip() == i['domain'][:-1]: return i['id'] return False def create_dns_record(self, domain_name, domain_dns_value): root, _, acme_txt = extract_zone(domain_name) domain = self.get_domain_id(root) if not domain: raise ValueError('The domain name does not exist under this cloudxns user, adding parsing failed.') url = "https://www.cloudxns.net/api2/record" data = { "domain_id": int(domain), "host": acme_txt, "value": domain_dns_value, "type": "TXT", "line_id": 1, } parameter = json.dumps(data) headers = self.get_headers(url, parameter) req = requests.post(url=url, headers=headers, data=parameter,verify=False) req = req.json() return req def delete_dns_record(self, domain_name, domain_dns_value): root, _, acme_txt = extract_zone(domain_name) print("delete_dns_record start: ", acme_txt, domain_dns_value) url = "https://www.cloudxns.net/api2/record/{}/{}".format(self.get_record_id(root,'TXT'), self.get_domain_id(root)) headers = self.get_headers(url, ) req = requests.delete(url=url, headers=headers, verify=False) req = req.json() return req def get_record_id(self, domain_name,s_type = 'TXT'): url = "http://www.cloudxns.net/api2/record/{}?host_id=0&offset=0&row_num=2000".format(self.get_domain_id(domain_name)) headers = self.get_headers(url, ) req = requests.get(url=url, headers=headers,verify=False) req = req.json() for i in req['data']: if i['type'] == s_type: return i['record_id'] return False class Dns_com(object): _type = 0 # 0:lest 1:锐成 def __init__(self, key, secret, ): pass def get_dns_obj(self): p_path = '/www/server/panel/plugin/dns' if not os.path.exists(p_path +'/dns_main.py'): return None sys.path.insert(0,p_path) import dns_main public.mod_reload(dns_main) return dns_main.dns_main() def create_dns_record(self, domain_name, domain_dns_value): root, _, acme_txt = extract_zone(domain_name) if self._type == 1: acme_txt = acme_txt.replace('_acme-challenge.','') result = self.add_record(acme_txt + '.' + root,domain_dns_value) else: result = self.get_dns_obj().add_txt(acme_txt + '.' + root,domain_dns_value) if result == "False": raise ValueError('[DNS] This domain name does not exist in the currently bound Pagoda DNS cloud resolution account. Adding parsing failed!') time.sleep(5) def delete_dns_record(self, domain_name, domain_dns_value): root, _, acme_txt = extract_zone(domain_name) self.get_dns_obj().remove_txt(acme_txt + '.' + root)
Close