mirror of
https://github.com/jung-geun/DynamicDNS-SSL.git
synced 2025-12-19 20:44:40 +09:00
chore: Update cronjob schedule and default_env.json, Add CLOUDFLARE_CNAME configuration
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
This project aims to implement a Dynamic DNS (DDNS) solution using Cloudflare's API.
|
This project aims to implement a Dynamic DNS (DDNS) solution using Cloudflare's API.
|
||||||
|
|
||||||
|
[](https://sonar.pieroot.xyz/dashboard?id=pieroot_cloudflare-ddns_e6da100b-a671-4736-87ac-9a41acda99f6)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
Dynamic DNS allows you to associate a domain name with a changing IP address, making it easier to access your network resources remotely. Cloudflare's API provides the necessary tools to automate this process.
|
Dynamic DNS allows you to associate a domain name with a changing IP address, making it easier to access your network resources remotely. Cloudflare's API provides the necessary tools to automate this process.
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ class DDNS:
|
|||||||
return response.text
|
return response.text
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
# print(f"Error: {e}")
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def previous_ip(self):
|
def previous_ip(self):
|
||||||
@@ -87,7 +86,6 @@ class DDNS:
|
|||||||
os.mknod("/tmp/external_ip.txt")
|
os.mknod("/tmp/external_ip.txt")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
# print(f"Error: {e}")
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def check_ip(self):
|
def check_ip(self):
|
||||||
@@ -107,7 +105,6 @@ class DDNS:
|
|||||||
file.write(ip)
|
file.write(ip)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
# print(f"Error: {e}")
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def read_record(self, type=Literal["A", "CNAME"], name=None, content=None):
|
def read_record(self, type=Literal["A", "CNAME"], name=None, content=None):
|
||||||
@@ -118,8 +115,10 @@ class DDNS:
|
|||||||
"name": name,
|
"name": name,
|
||||||
"content": content,
|
"content": content,
|
||||||
}
|
}
|
||||||
response = requests.get(url, headers=self.HEADERS, params=params)
|
response = requests.get(url, headers=self.HEADERS, params=params).json()
|
||||||
records = response.json()["result"]
|
records = response["result"]
|
||||||
|
if not response["success"]:
|
||||||
|
raise Exception(f"Failed to get DNS records")
|
||||||
return records if records else None
|
return records if records else None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
@@ -137,8 +136,12 @@ class DDNS:
|
|||||||
"ttl": 1,
|
"ttl": 1,
|
||||||
"proxied": proxy,
|
"proxied": proxy,
|
||||||
}
|
}
|
||||||
response = requests.post(url, headers=self.HEADERS, data=json.dumps(data))
|
response = requests.post(
|
||||||
success = response.json()["success"]
|
url, headers=self.HEADERS, data=json.dumps(data)
|
||||||
|
).json()
|
||||||
|
success = response["success"]
|
||||||
|
if not success:
|
||||||
|
raise Exception(f"Failed to create {name}")
|
||||||
return success if success else None
|
return success if success else None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
@@ -156,8 +159,12 @@ class DDNS:
|
|||||||
"ttl": 1,
|
"ttl": 1,
|
||||||
"proxied": proxy,
|
"proxied": proxy,
|
||||||
}
|
}
|
||||||
response = requests.put(url, headers=self.HEADERS, data=json.dumps(data))
|
response = requests.put(
|
||||||
success = response.json()["success"]
|
url, headers=self.HEADERS, data=json.dumps(data)
|
||||||
|
).json()
|
||||||
|
success = response["success"]
|
||||||
|
if not success:
|
||||||
|
raise Exception(f"Failed to update {name}")
|
||||||
return success if success else None
|
return success if success else None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
@@ -166,9 +173,10 @@ class DDNS:
|
|||||||
def delete_record(self, record_id):
|
def delete_record(self, record_id):
|
||||||
try:
|
try:
|
||||||
url = f"https://api.cloudflare.com/client/v4/zones/{self.config['CLOUDFLARE_ZONE_ID']}/dns_records/{record_id}"
|
url = f"https://api.cloudflare.com/client/v4/zones/{self.config['CLOUDFLARE_ZONE_ID']}/dns_records/{record_id}"
|
||||||
|
response = requests.delete(url, headers=self.HEADERS).json()
|
||||||
response = requests.delete(url, headers=self.HEADERS)
|
success = response["success"]
|
||||||
success = response.json()["success"]
|
if not success:
|
||||||
|
raise Exception(f"Failed to delete {record_id}")
|
||||||
return success if success else None
|
return success if success else None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
@@ -185,39 +193,49 @@ class DDNS:
|
|||||||
result = self.create_record(
|
result = self.create_record(
|
||||||
type="CNAME", name=cname, content=domain, proxy=proxy
|
type="CNAME", name=cname, content=domain, proxy=proxy
|
||||||
)
|
)
|
||||||
logger.info(f"{cname} is created")
|
if not result:
|
||||||
|
logger.error(f"Failed to create {cname}")
|
||||||
|
else:
|
||||||
|
logger.info(f"{cname} is created")
|
||||||
else:
|
else:
|
||||||
pre_list = {}
|
pre_list = {}
|
||||||
for r in records_list:
|
for r in records_list:
|
||||||
pre_list[r["name"].split(".")[0]] = [r["proxied"], r["id"]]
|
pre_list[r["name"].split(".")[0]] = [r["proxied"], r["id"]]
|
||||||
|
|
||||||
for cname, proxy in cname_list.items():
|
for cname, proxy in cname_list.items():
|
||||||
if cname in pre_list.keys():
|
if cname in pre_list.keys():
|
||||||
if proxy != pre_list[cname][0]:
|
if proxy != pre_list[cname][0]:
|
||||||
self.update_record(
|
result = self.update_record(
|
||||||
record_id=r["id"],
|
record_id=pre_list[cname][1],
|
||||||
type="CNAME",
|
type="CNAME",
|
||||||
name=cname,
|
name=cname,
|
||||||
content=domain,
|
content=domain,
|
||||||
proxy=proxy,
|
proxy=proxy,
|
||||||
)
|
)
|
||||||
logger.info(f"{cname} is updated")
|
if result:
|
||||||
|
logger.info(f"{cname} is updated")
|
||||||
|
else:
|
||||||
|
logger.error(f"Failed to update {cname}")
|
||||||
pre_list.pop(cname)
|
pre_list.pop(cname)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
result = self.create_record(
|
result = self.create_record(
|
||||||
type="CNAME", name=cname, content=domain, proxy=proxy
|
type="CNAME", name=cname, content=domain, proxy=proxy
|
||||||
)
|
)
|
||||||
logger.info(f"{cname} is created")
|
if not result:
|
||||||
|
logger.error(f"Failed to create {cname}")
|
||||||
|
else:
|
||||||
|
logger.info(f"{cname} is created")
|
||||||
|
|
||||||
for p in pre_list:
|
for p in pre_list:
|
||||||
records = self.read_record(type="CNAME", name=p + "." + domain)
|
records = self.read_record(type="CNAME", name=p + "." + domain)
|
||||||
record_id = records[0]["id"]
|
record_id = records[0]["id"]
|
||||||
result = self.delete_record(record_id)
|
result = self.delete_record(record_id)
|
||||||
logger.info(f"{p} is deleted")
|
if not result:
|
||||||
|
logger.error(f"Failed to delete {p}")
|
||||||
|
else:
|
||||||
|
logger.info(f"{p} is deleted")
|
||||||
|
|
||||||
if not result:
|
|
||||||
logger.error("Failed to update DNS CNAME record")
|
|
||||||
return -1
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error: {e}")
|
logger.error(f"Error: {e}")
|
||||||
return -1
|
return -1
|
||||||
@@ -241,6 +259,9 @@ if __name__ == "__main__":
|
|||||||
result = API.create_record(
|
result = API.create_record(
|
||||||
type="A", name=config["CLOUDFLARE_DOMAIN"], content=API.current_ip
|
type="A", name=config["CLOUDFLARE_DOMAIN"], content=API.current_ip
|
||||||
)
|
)
|
||||||
|
if not result:
|
||||||
|
logger.error("Failed to create DNS A record")
|
||||||
|
sys.exit(0)
|
||||||
API.update_ip(API.current_ip)
|
API.update_ip(API.current_ip)
|
||||||
else:
|
else:
|
||||||
ip_list = [API.get_ip(), API.previous_ip()]
|
ip_list = [API.get_ip(), API.previous_ip()]
|
||||||
@@ -264,13 +285,16 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
logger.error("Failed to update DNS A record")
|
logger.error("Failed to update DNS A record")
|
||||||
# # print("Failed to update DNS record")
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.info("IP has not changed")
|
logger.info("IP has not changed")
|
||||||
|
|
||||||
# Update CNAME records
|
# Update CNAME records
|
||||||
API.update_cname_list(config["CLOUDFLARE_CNAME"], config["CLOUDFLARE_DOMAIN"])
|
result = API.update_cname_list(
|
||||||
|
config["CLOUDFLARE_CNAME"], config["CLOUDFLARE_DOMAIN"]
|
||||||
|
)
|
||||||
|
if result == -1:
|
||||||
|
logger.error("Failed to update CNAME records")
|
||||||
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|||||||
Reference in New Issue
Block a user