Compare commits

...
5 Commits
Author SHA1 Message Date
pavak 9ffa3cd076 renamed API Key to API Token 2022-06-01 20:39:58 +05:30
pavak e95018240c added instructions 2022-06-01 20:22:08 +05:30
pavak 49e7cd13b6 formatting and cleanup 2022-06-01 18:07:05 +05:30
pavak bb80e40ce9 Completed 2022-06-01 01:56:44 +05:30
pavak 254615eda6 added DNS export files to gitignore 2022-05-31 23:06:03 +05:30
5 changed files with 88 additions and 44 deletions

No files matched your search

+1
View File
@@ -170,3 +170,4 @@ cython_debug/
# Project setup # Project setup
config.json config.json
response-example* response-example*
dns-export*
+47
View File
@@ -1,3 +1,50 @@
# cloudflare-delete-all-dns-records # cloudflare-delete-all-dns-records
Delete all the DNS records in a domain in Cloudflare. Delete all the DNS records in a domain in Cloudflare.
This program will delete all the DNS records in a given domain. Before deletion, it'll also take a backup of the existing DNS records and save it as a .txt file in [BIND](https://www.isc.org/bind/) format.
## Prerequisites
- [Python 3](https://www.python.org/)
- Pip
>sudo apt install python3-pip
- [Python requests library](https://pypi.org/project/requests/)
>pip install requests
- CloudFlare API key
You need a CloudFlare API key with access to *edit zone DNS* access for the domain:
1. Go to your Cloudflare profile and then [API Tokens](https://dash.cloudflare.com/profile/api-tokens)
2. Click on *Create Token*
3. You can use the template *Edit Zone DNS*
4. Enter the of the domain(s) you want to delete DNS from in *Zone Resources*
5. Click *Continue to summary* and the *Create Token*
6. You should get an API Token now.
## Running the program
1. Download and extract the zip file or Clone this repository:
>git clone https://git.pavakpaul.com/pavak/cloudflare-delete-all-dns-records.git
2. cd to the directory:
>cd
cloudflare-delete-all-dns-records
3. Run app.py using python3 and follow the instructions
>python3 app.py
### Using a config file to pass the API credentials
If you want to delete all the DNS records from multiple domains, it is a good idea to use a single token for mutiple domains. In that case, you can use save your credentials in config.json. Simply rename config_sample.json to config.json: `mv config_sample.json config.json` and save your configuration there. To load the config file, simply pass the argument _loadconfig_:
>python3 app.py loadconfig
You still can't delete DNS from multiple domains to reduce accidental removals of DNS. To be safe, it's always a good idea to just create a token for a single domain.
+15 -32
View File
@@ -6,16 +6,15 @@ def getHeaders(credentials):
return headers return headers
def errorChecker(r): def errorChecker(r):
if r.status_code != 200: if r.status_code == 200:
return False
elif r.status_code == 429:
print(f'\n\n\n{"="*80}It looks like you have reached your rate limit to access CloudFlare APIs\nPlease try after 5 minutes.{"="*80}')
else:
print(f'Error {r.status_code}.\nDetails:\n{r.json()}') print(f'Error {r.status_code}.\nDetails:\n{r.json()}')
assert False assert False
def verifyCredentials(credentials): def verifyCredentials(credentials):
"""
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
-H "Authorization: Bearer <API TOKEN HERE>" \
-H "Content-Type:application/json"
"""
headers = getHeaders(credentials) headers = getHeaders(credentials)
r = requests.get('https://api.cloudflare.com/client/v4/user/tokens/verify', headers=headers) r = requests.get('https://api.cloudflare.com/client/v4/user/tokens/verify', headers=headers)
errorChecker(r) errorChecker(r)
@@ -23,51 +22,35 @@ curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
def listAllZones(credentials): def listAllZones(credentials):
"""
curl -X GET "https://api.cloudflare.com/client/v4/zones \
-H "X-Auth-Email: user@example.com" \
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
-H "Content-Type: application/json"
"""
headers = getHeaders(credentials)
zones = requests.get( zones = requests.get(
'https://api.cloudflare.com/client/v4/zones', 'https://api.cloudflare.com/client/v4/zones',
headers= getHeaders(credentials) headers= getHeaders(credentials)
) )
errorChecker(zones)
return zones return zones
def getAllDNS(credentials, id): def getAllDNS(credentials, id):
"""
curl -X GET "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records" \
-H "X-Auth-Email: user@example.com" \
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
-H "Content-Type: application/json"
"""
dns_records = requests.get( dns_records = requests.get(
f'https://api.cloudflare.com/client/v4/zones/{id}/dns_records', f'https://api.cloudflare.com/client/v4/zones/{id}/dns_records',
headers=getHeaders(credentials) headers=getHeaders(credentials)
) )
errorChecker(dns_records)
return dns_records return dns_records
def exportBindDNS(credentials, id): def exportBindDNS(credentials, id):
""" export_response = requests.get(
curl -X GET "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/export" \ f'https://api.cloudflare.com/client/v4/zones/{id}/dns_records/export',
-H "X-Auth-Email: user@example.com" \ headers=getHeaders(credentials)
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \ )
-H "Content-Type: application/json" errorChecker(export_response)
""" return export_response
def deleteARecord(credentials, zone_id, dns_id): def deleteARecord(credentials, zone_id, dns_id):
"""
curl -X DELETE "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" \
-H "X-Auth-Email: user@example.com" \
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
-H "Content-Type: application/json"
"""
delete_response = requests.delete( delete_response = requests.delete(
f'https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{dns_id}', f'https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{dns_id}',
headers=getHeaders(credentials) headers=getHeaders(credentials)
) )
errorChecker(delete_response)
return delete_response return delete_response
+24 -11
View File
@@ -1,16 +1,15 @@
import json import json
import uuid
import datetime
from fileinput import filename
from sys import argv from sys import argv
from pathlib import Path from pathlib import Path
from unittest import result
import dns
# import requests
from apicalls import * from apicalls import *
# Get API key and Email address # Get API tocken and Email address
def getCredentials(): def getCredentials():
api_key = input("Enter the Cloudflare API key: ") api_key = input("Enter the Cloudflare API token: ")
email_address = input("Enter the Cloudflare Email address: ") email_address = input("Enter the Cloudflare Email address: ")
return {"api_key": api_key, "email": email_address} return {"api_key": api_key, "email": email_address}
@@ -21,7 +20,8 @@ if len(argv) > 1 and 'loadconfig' in argv:
if Path("config.json").exists(): if Path("config.json").exists():
configfile = open("config.json") configfile = open("config.json")
config = json.load(configfile) config = json.load(configfile)
credentials = {'api_key': config['API_Key'], 'email': config['Email']} credentials = {
'api_key': config['API_Token'], 'email': config['Email']}
else: else:
print('config.json was not found. Please enter the credentials manually') print('config.json was not found. Please enter the credentials manually')
credentials = getCredentials() credentials = getCredentials()
@@ -46,19 +46,32 @@ if domainToDelete in zone_list:
zone_owner = zone_list[domainToDelete]['owner'] zone_owner = zone_list[domainToDelete]['owner']
confirmation = input(f'Are you sure to delete all the DNS records from the domain {domainToDelete}, owned by {zone_owner}?\nEnter YES to continue: ') confirmation = input(f'Are you sure to delete all the DNS records from the domain {domainToDelete}, owned by {zone_owner}?\nEnter YES to continue: ')
if confirmation == 'YES': if confirmation == 'YES':
# Get Bind DNS
bind_DNS = exportBindDNS(credentials, zone_id).text
# Write to a file
file_name = f'dns-export-{str(uuid.uuid4())[0:8]}-{domainToDelete}-{datetime.datetime.now().strftime("%d-%b-%Y-%H-%M-%S")}.txt'
print(f'Backing up DNS records to {file_name}')
bind_export_file = open(file_name, 'w')
bind_export_file.write(bind_DNS)
bind_export_file.close()
print('Successfully backed up DNS records in BIND format.')
# get DNS Records # get DNS Records
dns_records = getAllDNS(credentials, zone_id).json()["result"] dns_records = getAllDNS(credentials, zone_id).json()["result"]
# Delete DNS Records # Delete DNS Records
print('Starting Deletion of DNS records')
for record in dns_records: for record in dns_records:
dns_id = record['id'] dns_id = record['id']
dns_type = record['type'] dns_type = record['type']
dns_name = record['name'] dns_name = record['name']
dns_content = record['content'] dns_content = record['content']
print(f'Deleting:\n{dns_type}\t{dns_name}\t{dns_content}...') print(f'Deleting:\n{dns_type}\t{dns_name}\t{dns_content}...')
# deleteARecord(credentials, zone_id, dns_id) delete_response = deleteARecord(credentials, zone_id, dns_id)
print(f'Deleted {dns_id}') if delete_response.json()['result']['id'] == dns_id:
pass print(f'Successfully Deleted {dns_id}')
else:
print('Something is wrong, abroading...')
assert False
else: else:
print('Aborted, bye...') print('Aborted, bye...')
else: else:
print('We don\'t have access to the domain name you have entered. Please make sure the API key you have provided has access to the domain name you have entereed.') print('We don\'t have access to the domain name you have entered. Please make sure the API token you have provided has access to the domain name you have entereed.')
+1 -1
View File
@@ -1,4 +1,4 @@
{ {
"API_Key": "your api key goes here", "API_Token": "your api key goes here",
"Email": "your cloudflare email address" "Email": "your cloudflare email address"
} }