nixos/home/routing-common: Add dynamic DNS update script
All checks were successful
CI / Check, build and cache Nix flake (push) Successful in 20m48s
All checks were successful
CI / Check, build and cache Nix flake (push) Successful in 20m48s
This commit is contained in:
35
nixos/boxes/home/routing-common/dns_update.py
Executable file
35
nixos/boxes/home/routing-common/dns_update.py
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import subprocess
|
||||
|
||||
import CloudFlare
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Cloudflare DNS update script')
|
||||
parser.add_argument('-k', '--api-token-file', help='Cloudflare API token file')
|
||||
parser.add_argument('zone', help='Cloudflare Zone')
|
||||
parser.add_argument('record', help='Cloudflare record name')
|
||||
args = parser.parse_args()
|
||||
|
||||
address = subprocess.check_output(
|
||||
['drill', '-Q', '-p5353', '@127.0.0.1', args.record, 'A'],
|
||||
encoding='utf8').strip()
|
||||
|
||||
cf_token = None
|
||||
if args.api_token_file:
|
||||
with open(args.api_token_file) as f:
|
||||
cf_token = f.readline().strip()
|
||||
|
||||
cf = CloudFlare.CloudFlare(token=cf_token)
|
||||
zones = cf.zones.get(params={'name': args.zone})
|
||||
assert zones, f'Zone {args.zone} not found'
|
||||
records = cf.zones.dns_records.get(zones[0]['id'], params={'name': args.record})
|
||||
assert records, f'Record {args.record} not found in zone {args.zone}'
|
||||
|
||||
print(f'Updating {args.record} -> {address}')
|
||||
cf.zones.dns_records.patch(
|
||||
zones[0]['id'], records[0]['id'],
|
||||
data={'type': 'A', 'name': args.record, 'content': address})
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Reference in New Issue
Block a user