Forgot renaming of script file

This commit is contained in:
Neshura 2022-11-28 20:30:27 +01:00
parent 687a089424
commit a41bab9639
No known key found for this signature in database
GPG key ID: ACDF5B6EBECF6B0A
2 changed files with 75 additions and 177 deletions

View file

@ -1,97 +0,0 @@
import sys
import ipaddress
from configparser import ConfigParser
import json
import copy
import CloudFlare
class DNSUpdater:
def __init__(self, args):
# Parse config
config = ConfigParser()
config.read('config.ini')
self.HOSTNAME = config['server']['HOSTNAME']
__TOKEN = config['cloudflare']['TOKEN']
# Parse args
try:
ipversion = args[1].lstrip('-')
ipaddress_new = args[2]
except IndexError:
ipaddress_new = ''
ipversion = 'skip'
match ipversion:
case '4': self.IPVER = 'ipv4'
case '6': self.IPVER = 'ipv6'
case 'skip': self.IPVER = ipversion
case other: raise ValueError(f"Wrong IP Address version given: {ipversion}")
self.IPNEW = ipaddress_new
# Cloudflare class
self._cloudflare = CloudFlare.CloudFlare(token=__TOKEN)
with open('cloudflare.json', 'r') as file:
self.dns_replacements = json.load(file)
def get_zones(self):
# Cloudflare get zones from API token
zones = self._cloudflare.zones.get()
for zone in zones:
self.zone_id = zone['id']
self.zone_name = zone['name']
print(f"Zone ID: {zone['id']} | Zone Name: {zone['name']}")
def get_dns_records(self, log=False):
dns_records_all = self._cloudflare.zones.dns_records.get(self.zone_id)
dns_records_to_update = {'A' : [], 'AAAA' : []}
for dnsrecord in dns_records_all:
if dnsrecord['type'] in ['A', 'AAAA']:
if log:
print(f"DNS Name: {dnsrecord['name']} | Type : {dnsrecord['type']} | IP: {dnsrecord['content']}")
dns_records_to_update[dnsrecord['type']].append(dnsrecord)
else:
if log:
print(f"| Unknow DNS | Type: {dnsrecord['type']} | Zone: {dnsrecord['name']}")
self.DNSRECORDS = copy.deepcopy(dns_records_to_update)
def update_records(self):
if self.IPVER == 'skip':
self.get_dns_records(log=True)
return
self.get_dns_records()
ipinformation = {
'ipv4': [ipaddress.IPv4Address, 'A'],
'ipv6': [ipaddress.IPv6Address, 'AAAA']
}
print(f"Updating IP of version {self.IPVER}")
assert isinstance(ipaddress.ip_address(self.IPNEW), ipinformation[self.IPVER][0]), f'IP {self.IPNEW} is not a valid IPv6 address'
dnstype = ipinformation[self.IPVER][1]
names_replace = self.dns_replacements[dnstype]
print(names_replace)
for name in names_replace:
fullname = f"{name}.{self.HOSTNAME}"
for record in self.DNSRECORDS[dnstype]:
if record['name'] == fullname:
new_dnsrecord = {"name": fullname, "type": dnstype, "content": self.IPNEW}
print(f"Sending request {new_dnsrecord}")
res = self._cloudflare.zones.dns_records.patch(self.zone_id, record['id'], data=new_dnsrecord)
if res['content'] != new_dnsrecord['content']:
print(res)
if __name__ == '__main__':
dnsupdate = DNSUpdater(sys.argv)
dnsupdate.get_zones()
dnsupdate.update_records()

View file

@ -2,101 +2,96 @@ import sys
import ipaddress import ipaddress
from configparser import ConfigParser from configparser import ConfigParser
import json import json
import copy
import CloudFlare import CloudFlare
def main():
config = ConfigParser()
config.read('config.ini')
try: class DNSUpdater:
ipversion = sys.argv[1].lstrip('-') def __init__(self, args):
ip_address_new = sys.argv[2] # Parse config
except IndexError: config = ConfigParser()
ip_address_new = '' config.read('config.ini')
ipversion = 'skipping'
hostname = config['server']['HOSTNAME'] self.HOSTNAME = config['server']['HOSTNAME']
__TOKEN = config['cloudflare']['TOKEN']
cf = CloudFlare.CloudFlare(token=config['cloudflare']['TOKEN']) # Parse args
zones = cf.zones.get() try:
ipversion = args[1].lstrip('-')
ipaddress_new = args[2]
except IndexError:
ipaddress_new = ''
ipversion = 'skip'
for zone in zones: match ipversion:
zone_id = zone['id'] case '4': self.IPVER = 'ipv4'
zone_name = zone['name'] case '6': self.IPVER = 'ipv6'
print("zone_id=%s zone_name=%s" % (zone_id, zone_name)) case 'skip': self.IPVER = ipversion
case other: raise ValueError(f"Wrong IP Address version given: {ipversion}")
dns_records = cf.zones.dns_records.get(zone_id) self.IPNEW = ipaddress_new
dns_names = {'A' : [], 'AAAA' : []} # Cloudflare class
for dnsrecord in dns_records: self._cloudflare = CloudFlare.CloudFlare(token=__TOKEN)
if ipversion == 'skipping':
print(f"DNS Name: {dnsrecord['name']} | ID: {dnsrecord['id']} | Type : {dnsrecord['type']} | IP: {dnsrecord['content']}")
if dnsrecord['type'] in ['A', 'AAAA']: with open('cloudflare.json', 'r') as file:
dns_names[dnsrecord['type']].append(dnsrecord["name"]) self.dns_replacements = json.load(file)
else:
print(f"Cannot resolve record {dnsrecord['name']} because of type {dnsrecord['type']}")
print(f"------ Full DNS record ------\n"
f"{dnsrecord}"
f"\n---------------------------"
)
def get_zones(self):
# Cloudflare get zones from API token
zones = self._cloudflare.zones.get()
for zone in zones:
self.zone_id = zone['id']
self.zone_name = zone['name']
print(f"Zone ID: {zone['id']} | Zone Name: {zone['name']}")
with open('cloudflare.json', 'r') as file: def get_dns_records(self, log=False):
values = json.load(file) dns_records_all = self._cloudflare.zones.dns_records.get(self.zone_id)
print(values)
match ipversion: dns_records_to_update = {'A' : [], 'AAAA' : []}
case '4': for dnsrecord in dns_records_all:
print("Updating IPv4") if dnsrecord['type'] in ['A', 'AAAA']:
assert isinstance(ipaddress.ip_address(ip_address_new), ipaddress.IPv4Address), f'IP {ip_address_new} is not a valid IPv4 address' if log:
names_replace = values['A'] print(f"DNS Name: {dnsrecord['name']} | Type : {dnsrecord['type']} | IP: {dnsrecord['content']}")
print(names_replace) dns_records_to_update[dnsrecord['type']].append(dnsrecord)
for name in names_replace: else:
fullname = f"{name}.{hostname}" if log:
print(fullname) print(f"| Unknow DNS | Type: {dnsrecord['type']} | Zone: {dnsrecord['name']}")
for x in dns_records: self.DNSRECORDS = copy.deepcopy(dns_records_to_update)
if x['name'] == fullname:
dns_record_id = x['id']
print(dns_record_id)
if fullname in dns_names['A']: def update_records(self):
new_dnsrecords = {"name": fullname, "type": "A", "content": ip_address_new} if self.IPVER == 'skip':
print(f"Sending request {new_dnsrecords}") self.get_dns_records(log=True)
try: return
r = cf.zones.dns_records.patch(zone_id, dns_record_id, data=new_dnsrecords)
print(r)
except:
print("Error pushing entry")
case '6': self.get_dns_records()
print("Updating IPv6")
assert isinstance(ipaddress.ip_address(ip_address_new), ipaddress.IPv6Address), f'IP {ip_address_new} is not a valid IPv6 address'
names_replace = values['AAAA']
print(names_replace)
for name in names_replace:
fullname = f"{name}.{hostname}"
print(fullname)
for x in dns_records: ipinformation = {
if x['name'] == fullname: 'ipv4': [ipaddress.IPv4Address, 'A'],
dns_record_id = x['id'] 'ipv6': [ipaddress.IPv6Address, 'AAAA']
print(dns_record_id) }
print(f"Updating IP of version {self.IPVER}")
assert isinstance(ipaddress.ip_address(self.IPNEW), ipinformation[self.IPVER][0]), f'IP {self.IPNEW} is not a valid IPv6 address'
dnstype = ipinformation[self.IPVER][1]
names_replace = self.dns_replacements[dnstype]
print(names_replace)
for name in names_replace:
fullname = f"{name}.{self.HOSTNAME}"
for record in self.DNSRECORDS[dnstype]:
if record['name'] == fullname:
new_dnsrecord = {"name": fullname, "type": dnstype, "content": self.IPNEW}
print(f"Sending request {new_dnsrecord}")
res = self._cloudflare.zones.dns_records.patch(self.zone_id, record['id'], data=new_dnsrecord)
if res['content'] != new_dnsrecord['content']:
print(res)
if fullname in dns_names['AAAA']:
new_dnsrecords = {"name": fullname, "type": "AAAA", "content": ip_address_new}
print(f"Sending request {new_dnsrecords}")
try:
r = cf.zones.dns_records.patch(zone_id, dns_record_id, data=new_dnsrecords)
print(r)
except:
print("Error pushing entry")
case 'skipping':
print("Done")
case other:
print(f"Error with Ip version passed, {ipversion} is invalid")
if __name__ == '__main__': if __name__ == '__main__':
main() dnsupdate = DNSUpdater(sys.argv)
dnsupdate.get_zones()
dnsupdate.update_records()