From d48c5b876b7415431453fa34be277c82408c30d9 Mon Sep 17 00:00:00 2001 From: eddie-porkbun <69278600+eddie-porkbun@users.noreply.github.com> Date: Wed, 8 Sep 2021 14:43:12 -0700 Subject: [PATCH] Add modRecord deleteRecords now only removes non-A type records Adds modRecord function to preserve the current record settings, only updates IP --- porkbun-ddns.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/porkbun-ddns.py b/porkbun-ddns.py index 475161d..ac1b16c 100755 --- a/porkbun-ddns.py +++ b/porkbun-ddns.py @@ -4,7 +4,7 @@ import re import sys 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) + allRecords=json.loads(requests.post(apiConfig["endpoint"] + '/dns/retrieveByNameType/' + rootDomain + "/A/" + subDomain, 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(); @@ -16,17 +16,24 @@ def getMyIP(): def deleteRecord(): for i in getRecords(rootDomain)["records"]: - if i["name"]==fqdn and (i["type"] == 'A' or i["type"] == 'ALIAS' or i["type"] == 'CNAME'): + if i["name"]==fqdn and (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) def createRecord(): createObj=apiConfig.copy() - createObj.update({'name': subDomain, 'type': 'A', 'content': myIP, 'ttl': 300}) + createObj.update({'name': subDomain, 'type': 'A', 'content': myIP, 'ttl': 600}) endpoint = apiConfig["endpoint"] + '/dns/create/' + rootDomain print("Creating record: " + fqdn + " with answer of " + myIP) create = json.loads(requests.post(apiConfig["endpoint"] + '/dns/create/'+ rootDomain, data = json.dumps(createObj)).text) return(create) + +def modRecord(): + createObj=apiConfig.copy() + createObj.update({'content': myIP, 'ttl': 600}) + endpoint = apiConfig["endpoint"] + '/dns/editByNameType/' + rootDomain + '/A/'+ subDomain + mod = json.loads(requests.post(apiConfig["endpoint"] + '/dns/editByNameType/'+ rootDomain + '/A/'+ subDomain, data = json.dumps(createObj)).text) + return(mod) 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 @@ -45,9 +52,14 @@ if len(sys.argv)>2: #at least the config and root domain is specified myIP=sys.argv[5] else: myIP=getMyIP() #otherwise use the detected exterior IP address - - deleteRecord() - print(createRecord()["status"]) - + + deleteRecord() + + if getRecords(fqdn)["status"]=="ERROR": + print(createRecord()["status"]) + else: + modRecord() + print("Modifying record: " + fqdn + " with answer of " + myIP) + else: 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") \ No newline at end of file