-
Notifications
You must be signed in to change notification settings - Fork 3
/
massDNSupdates.py
140 lines (111 loc) · 5.05 KB
/
massDNSupdates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#! /usr/bin/python
import json, cloudconnect, requests, argparse, time, sys
'''
Examples:
# Create www CNAME pointed to root and Orange Cloud
python massDNSupdates.py --key xxxx --email [email protected] --new --proxy --record-name www --record-type CNAME --content @
# Delete www CNAME
python massDNSupdates.py --key xxxx --email [email protected] --delete --record-name www --record-type CNAME
# Modify www CNAME records and Grey cloud
python massDNSupdates.py --key xxxx --email [email protected] --edit --no-proxy --record-name www --record-type CNAME --content sub.domain.com
# Content match. Only view/edit specific IP address. Useful if some zones don't share the same IP or if you have multiple IPs.
python massDNSupdates.py --key xxxx --email [email protected] --edit --record-name www.test --record-type A --content 4.5.6.9 --content-match 4.5.6.8
'''
parser = argparse.ArgumentParser()
# Authentication
parser.add_argument('--key', help='API key', required=True)
parser.add_argument('--email', help='API email', required=True)
parser.add_argument('--identity', help='Use this instead of key and email if you have keyrings') # Future Dev with keyrings
# Actions
parser.add_argument('--new', help='Create new DNS records', action='store_true')
parser.add_argument('--delete', help='Delete DNS records', action='store_true')
parser.add_argument('--edit', help='Modify DNS records', action='store_true')
parser.add_argument('--view', help='View DNS records', action='store_true')
parser.add_argument('--exclude', help='Exclude domains') # Future Dev
# DNS parameters
parser.add_argument('--content', help='Where the record will resolve to')
parser.add_argument('--record-name', dest='recordName', help='If not defined root will be chosen, other wise only provide subdoamain name')
# example --record-name www
parser.add_argument('--record-type', dest='recordType' , help='Only A records will be changed by default. You can use @ point to root domain')
# example --record-type CNAME
parser.add_argument('--content-match', dest='contentMatch', help='Only match this content. This helps only replace some domains.')
# example --content-match 2.3.4.5
# Orange/Grey Cloud
parser.add_argument('--proxy', help='Orange Cloud all records', dest='proxy', action='store_true')
parser.add_argument('--no-proxy', help='Grey Cloudall records', dest='proxy', action='store_false')
parser.set_defaults(proxy=True)
args = parser.parse_args()
cc = cloudconnect.CloudConnect(args.email, args.key)
page = 1
while True:
listZones = cc.list_zones(page=page, per_page=20)
for zone in listZones['result']:
zid = zone['id']
zName = zone['name']
content = args.content
# Point cname record to root
if args.content == '@':
content = zName
# Defaults
recType = []
contentMatch = []
proxied = args.proxy
# Record Name
if args.recordName == '@':
recName = zName
elif args.recordName:
recName = '{}.{}'.format(args.recordName, zName)
else:
# Default to root
recName = zName
if args.recordType:
recType = args.recordType.upper()
if args.proxy:
proxied = args.proxy
if args.contentMatch:
contentMatch = args.contentMatch
# View DNS records
if args.view:
listDNSRecs = cc.list_dns_records(zid, type=recType, name=recName, content=contentMatch)
if listDNSRecs['success']:
for dnsRecs in listDNSRecs['result']:
did = dnsRecs['id']
dName = dnsRecs['name']
dType = dnsRecs['type']
dContent = dnsRecs['content']
if dnsRecs['proxied']:
dProxy = '+'
else:
dProxy = '-'
print '{} {} {} {} {}'.format(dProxy, did, dName, dType, dContent)
# Create New DNS Records
if args.new:
createDNS = cc.create_dns_record(zid, recType, recName, content=content, proxied=proxied)
if createDNS['success']:
print 'Created {} to {}'.format(recName, content)
else:
print 'Tried creating {} and failed'.format(recName)
print >> sys.stderr, 'Failure: {} Message: {}'.format(recName, createDNS)
else:
dnsRecs = cc.list_dns_records(zid, name=recName, type=recType, content=contentMatch)
for dnsRec in dnsRecs['result']:
recID = dnsRec['id']
# Delete DNS records
if args.delete:
deleteDNS = cc.delete_dns_record(zid, recID)
if deleteDNS['success']:
print 'deleted {} {}'.format(recType, recName)
else:
print 'Tried deleting {} and Failed'.format(recName)
print >> sys.stderr, 'Failure: {} Message: {}'.format(recName, deleteDNS)
# Modify DNS records
if args.edit:
updateDNS = cc.update_dns_record(zid, recID, content=content, type=recType, name=recName, proxied=proxied)
if updateDNS['success']:
print 'updated {} to {}'.format(recName, content)
else:
print 'Tried modifying {} and Failed'.format(recName)
print >> sys.stderr, 'Failure: {} Message: {}'.format(recName, updateDNS)
page = page + 1
if listZones['result_info']['count'] == 0:
break