ddns script with porkbun api
This commit is contained in:
parent
de31591832
commit
a8a1316967
1 changed files with 97 additions and 0 deletions
97
python_scripts/ddns-porkbun
Normal file
97
python_scripts/ddns-porkbun
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import os, json, sys, ipaddress, time, re
|
||||||
|
import requests
|
||||||
|
|
||||||
|
API_SLEEP = 3
|
||||||
|
NET_ERR_SLEEP = 300
|
||||||
|
|
||||||
|
class PorkbunClient():
|
||||||
|
def __init__(self):
|
||||||
|
self.secret_key = os.environ["PORKBUN_SECRET_API_KEY"]
|
||||||
|
self.api_key = os.environ["PORKBUN_API_KEY"]
|
||||||
|
self.client = requests.Session()
|
||||||
|
self.porkbun_url_base = "https://porkbun.com/api/json/v3"
|
||||||
|
self.domain = os.environ["DOMAINS"][0]
|
||||||
|
self.ttl = os.environ.get("DNS_TTL", "5184000")
|
||||||
|
|
||||||
|
self.get_ips()
|
||||||
|
self.update_records()
|
||||||
|
|
||||||
|
def make_base_auth_body(self):
|
||||||
|
return {
|
||||||
|
"secretapikey": self.secret_key,
|
||||||
|
"apikey": self.api_key
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_ips(self):
|
||||||
|
ip_naive = self.get_ip()
|
||||||
|
if ipaddress.ip_address(ip_naive).version == 4:
|
||||||
|
self.ipv4 = ip_naive
|
||||||
|
else:
|
||||||
|
self.ipv6 = ip_naive
|
||||||
|
time.sleep(API_SLEEP)
|
||||||
|
self.ipv4 = self.get_ip(True)
|
||||||
|
|
||||||
|
|
||||||
|
def get_ip(self, force_v4 = False):
|
||||||
|
try:
|
||||||
|
json_body = self.make_base_auth_body()
|
||||||
|
if force_v4:
|
||||||
|
url = "https://api-ipv4.porkbun.com/api/json/v3/ping"
|
||||||
|
else:
|
||||||
|
url = self.porkbun_url_base + "/ping"
|
||||||
|
resp = self.client.post(url, json = json_body)
|
||||||
|
if resp.status == 200:
|
||||||
|
return json.loads(resp.text)['yourIp']
|
||||||
|
else:
|
||||||
|
print('API error')
|
||||||
|
sys.exit(1)
|
||||||
|
except:
|
||||||
|
print('Network error')
|
||||||
|
time.sleep(NET_ERR_SLEEP)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
def update_dns_record(self, content, record_type="A"):
|
||||||
|
try:
|
||||||
|
record = self.get_existing_record(record_type)
|
||||||
|
time.sleep(API_SLEEP)
|
||||||
|
json_body = self.make_base_auth_body()
|
||||||
|
if record == None:
|
||||||
|
url = self.porkbun_url_base + "/dns/create/" + self.domain
|
||||||
|
json_body.update({
|
||||||
|
"type": record_type,
|
||||||
|
"content": content,
|
||||||
|
"ttl": self.ttl
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
url = self.porkbun_url_base + "/dns/editByNameType/" + self.domain + "/" + record_type
|
||||||
|
json_body.update({
|
||||||
|
"content": content,
|
||||||
|
"ttl": self.ttl
|
||||||
|
})
|
||||||
|
resp = self.client.post(url, json = json_body)
|
||||||
|
if resp.status != 200:
|
||||||
|
print('API error')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
except:
|
||||||
|
print("Network error")
|
||||||
|
time.sleep(NET_ERR_SLEEP)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
|
||||||
|
def update_records(self):
|
||||||
|
if hasattr(self, "ipv4"):
|
||||||
|
self.update_dns_record(self.ipv4)
|
||||||
|
if hasattr(self, "ipv6"):
|
||||||
|
self.update_dns_record(self.ipv6, "AAAA")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
porkbun_client = PorkbunClient()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
Loading…
Reference in a new issue