Private GIT

Skip to content
Snippets Groups Projects
Commit 753f56d2 authored by fmonthel's avatar fmonthel
Browse files

Merge branch 'master' of https://github.com/rmarchant/gandi-ddns

parents c2b68c42 d77857f8
No related branches found
No related tags found
No related merge requests found
...@@ -9,7 +9,6 @@ The config-template.txt file should be renamed to config.txt, and modified with ...@@ -9,7 +9,6 @@ The config-template.txt file should be renamed to config.txt, and modified with
Every time the script runs, it will query an external service to retrieve the external IP of the machine, compare it to the current A record in the zone at gandi.net, and then update the record if the IP has changed. Every time the script runs, it will query an external service to retrieve the external IP of the machine, compare it to the current A record in the zone at gandi.net, and then update the record if the IP has changed.
Requirements: Requirements:
- Python 2.7
- ipaddress module (pip install ipaddress) - ipaddress module (pip install ipaddress)
- requests module (pip install requests) - requests module (pip install requests)
- json module (pip install json) - json module (pip install json)
...@@ -19,3 +18,12 @@ You can then run the script as a cron job : ...@@ -19,3 +18,12 @@ You can then run the script as a cron job :
``` ```
*/15 * * * * python /home/user/gandi-ddns.py */15 * * * * python /home/user/gandi-ddns.py
``` ```
macOS
```
cd gandi-ddns
ln -s $(pwd) /usr/local/gandi-ddns
sudo cp gandi.ddns.plist /Library/LaunchDaemons/
sudo launchctl /Library/LaunchDaemons/gandi.ddns.plist
```
import ConfigParser as configparser import configparser as configparser
import sys import sys
import os import os
import requests import requests
import json import json
import ipaddress import ipaddress
from datetime import datetime
config_file = "config.txt" config_file = "config.txt"
...@@ -18,7 +19,7 @@ def get_ip(): ...@@ -18,7 +19,7 @@ def get_ip():
print('Failed to retrieve external IP.') print('Failed to retrieve external IP.')
sys.exit(2) sys.exit(2)
if r.status_code != 200: if r.status_code != 200:
print('Failed to retrieve external IP. Server responded with status_code: %d' % r.status_code) print(('Failed to retrieve external IP. Server responded with status_code: %d' % r.status_code))
sys.exit(2) sys.exit(2)
ip = r.text.rstrip() # strip \n and any trailing whitespace ip = r.text.rstrip() # strip \n and any trailing whitespace
...@@ -45,8 +46,8 @@ def update_record(url, headers, payload): ...@@ -45,8 +46,8 @@ def update_record(url, headers, payload):
#Add record #Add record
r = requests.put(url, headers=headers, json=payload) r = requests.put(url, headers=headers, json=payload)
if r.status_code != 201: if r.status_code != 201:
print('Record update failed with status code: %d' % r.status_code) print(('Record update failed with status code: %d' % r.status_code))
print(r.text) print((r.text))
sys.exit(2) sys.exit(2)
print ('Zone record updated.') print ('Zone record updated.')
...@@ -62,6 +63,7 @@ def main(): ...@@ -62,6 +63,7 @@ def main():
sys.exit("Please fill in the 'config.txt' file.") sys.exit("Please fill in the 'config.txt' file.")
for section in config.sections(): for section in config.sections():
print('%s - section %s' % (str(datetime.now()), section))
#Retrieve API key #Retrieve API key
apikey = config.get(section, 'apikey') apikey = config.get(section, 'apikey')
...@@ -74,7 +76,7 @@ def main(): ...@@ -74,7 +76,7 @@ def main():
print(url) print(url)
#Discover External IP #Discover External IP
external_ip = get_ip() external_ip = get_ip()
print('External IP is: %s' % external_ip) print(('External IP is: %s' % external_ip))
#Prepare record #Prepare record
payload = {'rrset_ttl': config.get(section, 'ttl'), 'rrset_values': [external_ip]} payload = {'rrset_ttl': config.get(section, 'ttl'), 'rrset_values': [external_ip]}
...@@ -83,10 +85,10 @@ def main(): ...@@ -83,10 +85,10 @@ def main():
record = get_record(url, headers) record = get_record(url, headers)
if record.status_code == 200: if record.status_code == 200:
print('Current record value is: %s' % json.loads(record.text)['rrset_values'][0]) print(('Current record value is: %s' % json.loads(record.text)['rrset_values'][0]))
if(json.loads(record.text)['rrset_values'][0] == external_ip): if(json.loads(record.text)['rrset_values'][0] == external_ip):
print('No change in IP address. Goodbye.') print('No change in IP address. Goodbye.')
sys.exit() continue
else: else:
print('No existing record. Adding...') print('No existing record. Adding...')
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>gandi.ddns</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/python3</string>
<string>gandi-ddns.py</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>300</integer> <!-- every 5 mins -->
<key>KeepAlive</key>
<false/>
<key>WorkingDirectory</key>
<string>/usr/local/gandi-ddns/</string>
<key>StandardErrorPath</key>
<string>/usr/local/var/log/gandi-ddns/output.log</string>
<key>StandardOutPath</key>
<string>/usr/local/var/log/gandi-ddns/output.log</string>
</dict>
</plist>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment