mirror of
https://github.com/timothymiller/cloudflare-ddns.git
synced 2026-03-21 22:48:57 -03:00
Public release
Added removal of stable, duplicate records per subdomain.
This commit is contained in:
98
cloudflare-ddns.py
Executable file
98
cloudflare-ddns.py
Executable file
@@ -0,0 +1,98 @@
|
||||
import requests
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
|
||||
PATH = os.getcwd() + "/"
|
||||
version = float(str(sys.version_info[0]) + "." + str(sys.version_info[1]))
|
||||
|
||||
if(version < 3.5):
|
||||
raise Exception("This script requires Python 3.5+")
|
||||
|
||||
with open(PATH + "config.json") as config_file:
|
||||
config = json.loads(config_file.read())
|
||||
|
||||
|
||||
def getIPs():
|
||||
a = requests.get("https://api.ipify.org?format=json").json().get("ip")
|
||||
aaaa = requests.get("https://api6.ipify.org?format=json").json().get("ip")
|
||||
ips = []
|
||||
|
||||
if(a.find(".") > -1):
|
||||
ips.append({
|
||||
"type": "A",
|
||||
"ip": a
|
||||
})
|
||||
|
||||
if(aaaa.find(":") > -1):
|
||||
ips.append({
|
||||
"type": "AAAA",
|
||||
"ip": aaaa
|
||||
})
|
||||
|
||||
return ips
|
||||
|
||||
|
||||
def commitRecord(ip):
|
||||
stale_record_ids = []
|
||||
for c in config["cloudflare"]:
|
||||
subdomains = c["subdomains"]
|
||||
response = cf_api("zones/" + c['zone_id'], "GET", c)
|
||||
base_domain_name = response["result"]["name"]
|
||||
for subdomain in subdomains:
|
||||
exists = False
|
||||
record = {
|
||||
"type": ip["type"],
|
||||
"name": subdomain,
|
||||
"content": ip["ip"],
|
||||
"proxied": c["proxied"]
|
||||
}
|
||||
list = cf_api("zones/" + c['zone_id'] + "/dns_records&per_page=100?type=" + ip["type"], "GET", c)
|
||||
full_subdomain = subdomain + "." + base_domain_name
|
||||
dns_id = ""
|
||||
for r in list["result"]:
|
||||
if (r["name"] == full_subdomain):
|
||||
exists = True
|
||||
if (r["content"] != ip["ip"]):
|
||||
if (dns_id == ""):
|
||||
dns_id = r["id"]
|
||||
else:
|
||||
stale_record_ids.append(r["id"])
|
||||
if(exists == False):
|
||||
print("Adding new record " + str(record))
|
||||
response = cf_api(
|
||||
"zones/" + c['zone_id'] + "/dns_records", "POST", c, {}, record)
|
||||
elif(dns_id != ""):
|
||||
# Only update if the record content is different
|
||||
print("Updating record " + str(record))
|
||||
response = cf_api(
|
||||
"zones/" + c['zone_id'] + "/dns_records/" + dns_id, "PUT", c, {}, record)
|
||||
|
||||
# Delete duplicate, stale records
|
||||
for identifier in stale_record_ids:
|
||||
print("Deleting stale record " + str(identifier))
|
||||
response = cf_api("zones/" + c['zone_id'] + "/dns_records/" + identifier, "DELETE", c)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def cf_api(endpoint, method, config, headers={}, data=False):
|
||||
headers = {
|
||||
"X-Auth-Email": config['account_email'],
|
||||
"X-Auth-Key": config['api_key'],
|
||||
**headers
|
||||
}
|
||||
|
||||
if(data == False):
|
||||
response = requests.request(
|
||||
method, "https://api.cloudflare.com/client/v4/" + endpoint, headers=headers)
|
||||
else:
|
||||
response = requests.request(
|
||||
method, "https://api.cloudflare.com/client/v4/" + endpoint, headers=headers, json=data)
|
||||
|
||||
return response.json()
|
||||
|
||||
|
||||
for ip in getIPs():
|
||||
print("Checking " + ip["type"] + " records")
|
||||
commitRecord(ip)
|
||||
Reference in New Issue
Block a user