initial working state
This commit is contained in:
commit
6762480a15
17
.project
Normal file
17
.project
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>gandi_live_dns</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.python.pydev.PyDevBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.python.pydev.pythonNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
8
.pydevproject
Normal file
8
.pydevproject
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?eclipse-pydev version="1.0"?><pydev_project>
|
||||
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
|
||||
<path>/${PROJECT_DIR_NAME}/src</path>
|
||||
</pydev_pathproperty>
|
||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
|
||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
|
||||
</pydev_project>
|
2
src/.gitignore
vendored
Normal file
2
src/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/config.py
|
||||
/test.py
|
BIN
src/config.pyc
Normal file
BIN
src/config.pyc
Normal file
Binary file not shown.
43
src/example.config.py
Normal file
43
src/example.config.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
'''
|
||||
Created on 13 Aug 2017
|
||||
@author: cave
|
||||
Copy this file to config.py and update the settings
|
||||
'''
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
'''
|
||||
Get your API key
|
||||
Start by retrieving your API Key from the "Security" section in new Account admin panel to be able to make authenticated requests to the API.
|
||||
https://account.gandi.net/
|
||||
'''
|
||||
api_secret = '---my_secret_API_KEY----'
|
||||
|
||||
'''
|
||||
Gandiv5 LiveDNS API Location
|
||||
http://doc.livedns.gandi.net/#api-endpoint
|
||||
https://dns.beta.gandi.net/api/v5/
|
||||
'''
|
||||
api = 'https://dns.beta.gandi.net/api/v5'
|
||||
|
||||
#your domain with the subdomains in the zone file/UUID
|
||||
domain = 'mydomain.tld'
|
||||
|
||||
#enter all subdomains to be updated, subdomains must already exist to be updated
|
||||
subdomains = ["subdomain1", "subdomain2", "subdomain3"]
|
||||
|
||||
#300 seconds = 5 minutes
|
||||
ttl = '300'
|
||||
|
||||
'''external ip provider
|
||||
run your own external IP provider:
|
||||
+ https://github.com/mpolden/ipd
|
||||
+ <?php $ip = $_SERVER['REMOTE_ADDR']; ?>
|
||||
<?php print $ip; ?>
|
||||
e.g.
|
||||
+ http://ifconfig.me/ip
|
||||
+ https://ifconfig.co
|
||||
+ http://whatismyip.akamai.com/
|
||||
+ http://ipinfo.io/ip
|
||||
'''
|
||||
ifconfig = 'choose_from_above_or_run_your_own'
|
92
src/gandi_live_dns.py
Normal file
92
src/gandi_live_dns.py
Normal file
|
@ -0,0 +1,92 @@
|
|||
'''
|
||||
Gandi v5 LiveDNS - DynDNS Update via REST API and CURL/requests
|
||||
|
||||
@author: cave
|
||||
Licsense GPLv3
|
||||
https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
Created on 13 Aug 2017
|
||||
http://doc.livedns.gandi.net/
|
||||
http://doc.livedns.gandi.net/#api-endpoint -> https://dns.beta.gandi.net/api/v5/
|
||||
'''
|
||||
|
||||
import requests, json
|
||||
import config
|
||||
|
||||
|
||||
def get_dynip(ifconfig_provider):
|
||||
''' find out own IPv4 at home <-- this is the dynamic IP which changes more or less frequently
|
||||
similar to curl ifconfig.me/ip, see example.config.py for details to ifconfig providers
|
||||
'''
|
||||
r = requests.get(ifconfig_provider)
|
||||
print 'Checking dynamic IP: ' , r._content.strip('\n')
|
||||
return r.content.strip('\n')
|
||||
|
||||
def get_uuid():
|
||||
'''
|
||||
find out ZONE UUID from domain
|
||||
Info on domain "DOMAIN"
|
||||
GET /domains/<DOMAIN>:
|
||||
|
||||
'''
|
||||
url = config.api + '/domains/' + config.domain
|
||||
u = requests.get(url, headers={"X-Api-Key":config.api_secret})
|
||||
json_object = json.loads(u._content)
|
||||
return json_object['zone_uuid']
|
||||
|
||||
def get_dnsip(uuid):
|
||||
''' find out IP from first Subdomain DNS-Record
|
||||
List all records with name "NAME" and type "TYPE" in the zone UUID
|
||||
GET /zones/<UUID>/records/<NAME>/<TYPE>:
|
||||
'''
|
||||
|
||||
url = config.api + '/zones/' + uuid + '/records/' + config.subdomains[0] + '/A'
|
||||
headers = {"X-Api-Key":config.api_secret}
|
||||
u = requests.get(url, headers=headers)
|
||||
json_object = json.loads(u._content)
|
||||
print 'Checking IP from DNS Record' , config.subdomains[0], ' : ', json_object['rrset_values'][0].encode('ascii','ignore').strip('\n')
|
||||
return json_object['rrset_values'][0].encode('ascii','ignore').strip('\n')
|
||||
|
||||
def update_records(uuid, dynIP, subdomain):
|
||||
''' update DNS Records for Subdomains
|
||||
Change the "NAME"/"TYPE" record from the zone UUID
|
||||
PUT /zones/<UUID>/records/<NAME>/<TYPE>:
|
||||
curl -X PUT -H "Content-Type: application/json" \
|
||||
-H 'X-Api-Key: XXX' \
|
||||
-d '{"rrset_ttl": 10800,
|
||||
"rrset_values": ["<VALUE>"]}' \
|
||||
https://dns.beta.gandi.net/api/v5/zones/<UUID>/records/<NAME>/<TYPE>
|
||||
'''
|
||||
url = config.api + '/zones/' + uuid + '/records/' + subdomain + '/A'
|
||||
payload = {"rrset_ttl": config.ttl, "rrset_values": [dynIP]}
|
||||
headers = {"Content-Type": "application/json", "X-Api-Key":config.api_secret}
|
||||
record_update = requests.put(url, data=json.dumps(payload), headers=headers)
|
||||
json_object = json.loads(record_update._content)
|
||||
print 'Status Code: ', record_update.status_code, ', ', json_object['message'], ', IP updated for', subdomain
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
#get zone ID from Account
|
||||
uuid = get_uuid()
|
||||
|
||||
#compare dynIP and DNS IP
|
||||
dynIP = get_dynip(config.ifconfig)
|
||||
dnsIP = get_dnsip(uuid)
|
||||
|
||||
if dynIP == dnsIP:
|
||||
print "IP Address match - no further action"
|
||||
else:
|
||||
print "IP Address mismatch - going to update the DNS Records for the subdomains"
|
||||
for sub in config.subdomains:
|
||||
update_records(uuid, dynIP, sub)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in a new issue