82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
import time
|
|
|
|
import CloudFlare
|
|
from flask import current_app
|
|
|
|
|
|
def cf_api_call():
|
|
cf_key = current_app.config.get("ACME_CLOUDFLARE_KEY", "")
|
|
cf_email = current_app.config.get("ACME_CLOUDFLARE_EMAIL", "")
|
|
return CloudFlare.CloudFlare(email=cf_email, token=cf_key)
|
|
|
|
|
|
def find_zone_id(host):
|
|
elements = host.split(".")
|
|
cf = cf_api_call()
|
|
|
|
n = 1
|
|
|
|
while n < 5:
|
|
n = n + 1
|
|
domain = ".".join(elements[-n:])
|
|
current_app.logger.debug("Trying to get ID for zone {0}".format(domain))
|
|
|
|
try:
|
|
zone = cf.zones.get(params={"name": domain, "per_page": 1})
|
|
except Exception as e:
|
|
current_app.logger.error("Cloudflare API error: %s" % e)
|
|
pass
|
|
|
|
if len(zone) == 1:
|
|
break
|
|
|
|
if len(zone) == 0:
|
|
current_app.logger.error("No zone found")
|
|
return
|
|
else:
|
|
return zone[0]["id"]
|
|
|
|
|
|
def wait_for_dns_change(change_id, account_number=None):
|
|
cf = cf_api_call()
|
|
zone_id, record_id = change_id
|
|
while True:
|
|
r = cf.zones.get(zone_id, record_id)
|
|
current_app.logger.debug("Record status: %s" % r["status"])
|
|
if r["status"] == "active":
|
|
break
|
|
time.sleep(1)
|
|
return
|
|
|
|
|
|
def create_txt_record(host, value, account_number):
|
|
cf = cf_api_call()
|
|
zone_id = find_zone_id(host)
|
|
if not zone_id:
|
|
return
|
|
|
|
txt_record = {"name": host, "type": "TXT", "content": value}
|
|
|
|
current_app.logger.debug(
|
|
"Creating TXT record {0} with value {1}".format(host, value)
|
|
)
|
|
|
|
try:
|
|
r = cf.zones.dns_records.post(zone_id, data=txt_record)
|
|
except Exception as e:
|
|
current_app.logger.error(
|
|
"/zones.dns_records.post %s: %s" % (txt_record["name"], e)
|
|
)
|
|
return zone_id, r["id"]
|
|
|
|
|
|
def delete_txt_record(change_ids, account_number, host, value):
|
|
cf = cf_api_call()
|
|
for change_id in change_ids:
|
|
zone_id, record_id = change_id
|
|
current_app.logger.debug("Removing record with id {0}".format(record_id))
|
|
try:
|
|
cf.zones.dns_records.delete(zone_id, record_id)
|
|
except Exception as e:
|
|
current_app.logger.error("/zones.dns_records.post: %s" % e)
|