LOG_FILE = script_dir + "/clean.log" if os.path.exists(LOG_FILE): os.remove(LOG_FILE) logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.ERROR, filename=LOG_FILE) try: my_acct = Account(api_key=API_KEY, api_secret=API_SECRET) client = Client(my_acct) except Exception as err: logging.error(f"Account config error: {err}") def findTXTID(data): ids = [] for record in data: if "_acme-challenge" in record['name']: ids.append(record['name']) return ids try: records = client.get_records(CERTBOT_DOMAIN, record_type='TXT') results = findTXTID(records) for result in results: client.delete_records(CERTBOT_DOMAIN, name=result) except Exception as err: logging.error(f"client.delete_records error: {err}")
class GodaddyApi: def __init__(self, api_key, api_secret): self.api_key = api_key self.api_secret = api_secret my_acct = Account(api_key, api_secret) self.__client = Client(my_acct) self.Authorization = "sso-key %s:%s" % (self.api_key, self.api_secret) self.headers = {"Authorization": self.Authorization, "accept": "application/json","Content-Type": "application/json"} def domain_list(self): Authorization = "sso-key %s:%s" % (self.api_key, self.api_secret) headers = {"Authorization": Authorization} all_domain = [] status = True marker = "" while True: url = 'https://api.godaddy.com/v1/domains?limit=1000&marker={}'.format(marker) r = requests.get(url, headers=headers) status = True if r.json() else False if not status: break for domain in r.json(): all_domain.append(domain['domain']) marker = domain['domain'] return all_domain def domain_info(self, domain): ''' :param domain: get "domain" information. :return: dict ''' return self.__client.get_domain_info(domain) # return self.__client.get_domain_info(domain)['expires'] # return self.__client.get_domain_info(domain)['nameServers'] def record_list(self, domain): ''' :param domain: get "domain" records. :return: list, each one record is a dict, include 'data' 'name' 'ttl' and 'type' field. ''' return self.__client.get_records(domain) def record_create(self,domain,data,name,type): data_dict = [{"data": data, "name": name, "ttl": 3600, "type": type}] data_dict_json = json.dumps(data_dict) Authorization = "sso-key %s:%s" % (self.api_key, self.api_secret) headers = {"Authorization": Authorization,"accept": "application/json","Content-Type": "application/json"} url = "https://api.godaddy.com/v1/domains/{}/records".format(domain) r = requests.patch(url,data_dict_json,headers=headers) return r.status_code def record_edit(self,domain, data, record_type=None, name=None): data_dict = [{"data":data}] data_dict_json = json.dumps(data_dict) url = "https://api.godaddy.com/v1/domains/{}/records/{}/{}".format(domain,record_type,name) r = requests.put(url,data_dict_json,headers=self.headers) return r.status_code #获取单个记录的值,也用来判断记录是否存在 def get_record(self,domain,record,type): """ 返回的结果为[{'data': '42.97.23.79', 'name': 'test2', 'ttl': 600, 'type': 'A'}]这种数据结构 """ url = "https://api.godaddy.com/v1/domains/{}/records/{}/{}".format(domain,type,record) r = requests.get(url,headers=self.headers) return r.json() def record_delte(self,domain,record_name): self.__client.delete_records(domain,record_name) def edit_ns(self,domain,nameservers): """nameservers为列表,元素为需要设置的nameserver域名""" data = {"locked":True,"nameServers":nameservers,"renewAuto":False} url = "https://api.godaddy.com/v1/domains/{}".format(domain) r = requests.patch(url,data=json.dumps(data),headers=self.headers) return r.text
class GoDaddy: def __init__(self, **config): self.domain_name = config.get('domain_name') self.alias_name = config.get('alias_name') self.__access_id = config.get('access_id') self.acct = Account(api_key=self.__access_id, api_secret=config.get('access_key')) self.__client = Client(self.acct) def describe_record(self, *args, **kwargs): return self.__client.get_records(kwargs.get('domain_name'), record_type=kwargs.get('domain_type'), name=kwargs.get('domain_rr')) def add_record(self, *args, **kwargs): params = dict(name=kwargs.get('domain_rr'), data=kwargs.get('domain_value'), type=kwargs.get('domain_type'), ttl=int(kwargs.get('domain_ttl'))) result_data = self.__client.add_record(kwargs.get('domain_name'), params) if result_data is True: result_data = str(uuid()) return result_data def update_record(self, *args, **kwargs): params = dict(name=kwargs.get('domain_rr'), data=kwargs.get('domain_value'), type=kwargs.get('domain_type'), ttl=int(kwargs.get('domain_ttl'))) result_data = self.__client.update_record(kwargs.get('domain_name'), params) return result_data def remark(self, *args, **kwargs): return dict(code=0, msg='GoDaddy不支持修改') def set_record_status(self, *args, **kwargs): if kwargs.get('status') in ['开启', '启用', 'Enable', 'enable', 'ENABLE']: self.add_record(**kwargs) elif kwargs.get('status') in ['暂停', '禁用', 'disable']: self.del_record(**kwargs) else: return False return True def del_record(self, *args, **kwargs): domain_name = kwargs.get('domain_name') name = kwargs.get('domain_rr') record_type = kwargs.get('domain_type') result_data = self.__client.delete_records(domain_name, name, record_type=record_type) return result_data def describe_domains(self): domain_list = self.__client.get_domains() if not domain_list: return False for domain in domain_list: domain_info_list = self.__client.get_domain_info(domain) domain_info_list['records'] = len( self.__client.get_records(domain)) yield domain_info_list def record_generator(self, **domain): record_info_list = self.__client.get_records(domain.get('domain')) if not record_info_list: return False for record in record_info_list: yield dict(domain_name=domain.get('domain'), data_dict=record)
with open("/var/nomx/localCidr", "w") as file: file.write(localCidr) if domains != oldDomains: with open("/var/nomx/domains", "w") as file: file.write(domains) from godaddypy import Client, Account cur = db.cursor() cur.execute("SELECT `domain`, `gduser`, `gdpass` FROM `domain` WHERE `domain` != \"ALL\"") for row in cur.fetchall(): if row[1] == "": continue print("[%s] Checking domain %s..." % (datetime.datetime.now().isoformat(), row[0])) client = Client(Account(api_key = row[1], api_secret = row[2])) try: for domain in client.get_domains(): if row[0].endswith(domain): client.delete_records(row[0], name = "mail") client.add_record(row[0], {'data': ip, 'name': 'mail', 'ttl': 3600, 'type': 'A'}) print("[%s] DNS record for mail.%s has been updated with IP %s successfully." % (datetime.datetime.now().isoformat(), row[0], ip)) time.sleep(10) client.delete_records(row[0], name = "localmail") client.add_record(row[0], {'data': localIp, 'name': 'localmail', 'ttl': 3600, 'type': 'A'}) print("[%s] DNS record for localmail.%s has been updated with IP %s successfully." % (datetime.datetime.now().isoformat(), row[0], localIp)) cur.execute("INSERT INTO `log` (`timestamp`, `username`, `domain`, `action`, `data`) VALUES (NOW(), \"system\", \"%s\", \"godaddy dns synchronization\", \"Successfully updated.\")" % row[0]) except Exception as e: cur.execute("INSERT INTO `log` (`timestamp`, `username`, `domain`, `action`, `data`) VALUES (NOW(), \"system\", \"%s\", \"godaddy dns synchronization\", \"Error, please check logs.\")" % row[0]) print("[%s] There was an error communicating with GoDaddy: %s" % (datetime.datetime.now().isoformat(), str(e)))