Only delete the existing entry if it has the wrong content.

Add quiet option so it doesn't fill up the logs running as a cronjob.
Removed a couple of unnecessary semicolons.
This commit is contained in:
Hyperspeed1313 2024-10-11 22:53:02 -05:00
parent 22338834b5
commit a477a75e76
3 changed files with 23 additions and 10 deletions

View file

@ -1,36 +1,43 @@
import json
import requests
import re
import sys
def printIfAllowed(content): #print the status of a json query if it is not a success or if quiet mode is not enabled
if ("error" in content.lower()) or canPrint:
print(content)
def getRecords(domain): #grab all the records so we know which ones to delete to make room for our record. Also checks to make sure we've got the right domain
allRecords=json.loads(requests.post(apiConfig["endpoint"] + '/dns/retrieve/' + domain, data = json.dumps(apiConfig)).text)
if allRecords["status"]=="ERROR":
print('Error getting domain. Check to make sure you specified the correct domain, and that API access has been switched on for this domain.');
sys.exit();
# No reason to feed into printIfAllowed, it will always print
print('Error getting domain. Check to make sure you specified the correct domain, and that API access has been switched on for this domain.')
sys.exit()
return(allRecords)
def getMyIP():
ping = json.loads(requests.post(apiConfig["endpoint"] + '/ping/', data = json.dumps(apiConfig)).text)
return(ping["yourIp"])
def deleteRecord():
def replaceInvalidRecords():
for i in getRecords(rootDomain)["records"]:
if i["name"]==fqdn and (i["type"] == 'A' or i["type"] == 'ALIAS' or i["type"] == 'CNAME'):
print("Deleting existing " + i["type"] + " Record")
deleteRecord = json.loads(requests.post(apiConfig["endpoint"] + '/dns/delete/' + rootDomain + '/' + i["id"], data = json.dumps(apiConfig)).text)
if myIP != i["content"]:
printIfAllowed("Deleting existing " + i["type"] + " Record")
printIfAllowed( "DELETE: " + (json.loads(requests.post(apiConfig["endpoint"] + '/dns/delete/' + rootDomain + '/' + i["id"], data = json.dumps(apiConfig)).text)["status"]) )
printIfAllowed( "CREATE: " + (createRecord()["status"]) )
def createRecord():
createObj=apiConfig.copy()
createObj.update({'name': subDomain, 'type': 'A', 'content': myIP, 'ttl': 300})
endpoint = apiConfig["endpoint"] + '/dns/create/' + rootDomain
print("Creating record: " + fqdn + " with answer of " + myIP)
printIfAllowed("Creating record: " + fqdn + " with answer of " + myIP)
create = json.loads(requests.post(apiConfig["endpoint"] + '/dns/create/'+ rootDomain, data = json.dumps(createObj)).text)
return(create)
if len(sys.argv)>2: #at least the config and root domain is specified
apiConfig = json.load(open(sys.argv[1])) #load the config file into a variable
rootDomain=sys.argv[2].lower()
canPrint=not apiConfig["quiet"].lower=="true"
if len(sys.argv)>3 and sys.argv[3]!='-i': #check if a subdomain was specified as the third argument
subDomain=sys.argv[3].lower()
@ -46,8 +53,8 @@ if len(sys.argv)>2: #at least the config and root domain is specified
else:
myIP=getMyIP() #otherwise use the detected exterior IP address
deleteRecord()
print(createRecord()["status"])
replaceInvalidRecords()
else:
# No reason to feed into printIfAllowed, it will always print
print("Porkbun Dynamic DNS client, Python Edition\n\nError: not enough arguments. Examples:\npython porkbun-ddns.py /path/to/config.json example.com\npython porkbun-ddns.py /path/to/config.json example.com www\npython porkbun-ddns.py /path/to/config.json example.com '*'\npython porkbun-ddns.py /path/to/config.json example.com -i 10.0.0.1\n")