First version of files
This commit is contained in:
parent
fc1451d793
commit
42d3901dd5
5 changed files with 122 additions and 2 deletions
31
README.md
31
README.md
|
@ -1,3 +1,32 @@
|
|||
# gandi-dynamic-dns
|
||||
# Gandi Dynamic DNS
|
||||
|
||||
Cron job to auto update a DNS record when WAN IP changes using Gandi Live DNS API on Debian GNU/Linux
|
||||
|
||||
## To install
|
||||
|
||||
```
|
||||
git clone https://gitlab.com/lab.8916100448256/gandi-dynamic-dns.git ./gandi-dynamic-dns
|
||||
cd ./gandi-dynamic-dns
|
||||
sudo bash ./install.sh
|
||||
```
|
||||
|
||||
Then configure DNS record info and API key in file /etc/live-dns/live-dns.conf
|
||||
|
||||
|
||||
## How it works
|
||||
### /etc/cron.d/live-dns-update
|
||||
Cron job definition to check for WAN IP change and call Live DNS API to update the DNS record if necessary. By default runs the check/update script 2 times per hour, at every hour past 12 and 42 minutes.
|
||||
|
||||
### /etc/live-dns/live-dns.conf
|
||||
Configuration file for the check/update script
|
||||
Needs to contains 3 environment variable definitions
|
||||
+ DOMAIN="domain.tld" : Replace domain.tld with your domain name
|
||||
+ RECORD="host" : Replace host with the sub domain you want to update when WAN IP changes
|
||||
+ APIKEY="Your-API-Key" : Replace with you API key generated on the Gandi web interface.
|
||||
|
||||
|
||||
### /usr/local/bin/live-dns-update.sh
|
||||
This the script that is called by the cron job.
|
||||
|
||||
This script is based on the sample provided on Gandi GitHub : [mywanip.sh](https://github.com/Gandi/api-examples/blob/master/bash/livedns/mywanip.sh)
|
||||
|
||||
|
|
4
etc/cron.d/live-dns-update
Normal file
4
etc/cron.d/live-dns-update
Normal file
|
@ -0,0 +1,4 @@
|
|||
# /etc/cron.d/live-dns-update crontab fragment for updating
|
||||
# DNS zone records with WAN IP address
|
||||
|
||||
12,42 * * * * root bash /usr/local/bin/live-dns-update.sh
|
3
etc/live-dns/live-dns.conf
Normal file
3
etc/live-dns/live-dns.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
DOMAIN="domain.tld"
|
||||
RECORD="host"
|
||||
APIKEY="Your-API-Key"
|
11
install.sh
Normal file
11
install.sh
Normal file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
cp usr/local/bin/live-dns-update.sh /usr/local/bin/live-dns-update.sh
|
||||
chmod +x /usr/local/bin/live-dns-update.sh
|
||||
|
||||
mkdir /etc/live-dns
|
||||
cp etc/live-dns/live-dns.conf /etc/live-dns/live-dns.conf
|
||||
chmod 400 /etc/live-dns/live-dns.conf
|
||||
|
||||
cp etc/cron.d/live-dns-update /etc/cron.d/live-dns-update
|
||||
|
73
usr/local/bin/live-dns-update.sh
Executable file
73
usr/local/bin/live-dns-update.sh
Executable file
|
@ -0,0 +1,73 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Updates DNS zone records using Gandi's LiveDNS API.
|
||||
# Before you use this script you need to configure record details and API key in
|
||||
# the file `/etc/live-dns/live-dns.conf`
|
||||
#
|
||||
# This script is meant to be run by cron.
|
||||
# through a crontab placed in /etc/cron.d/live-dns-update
|
||||
#
|
||||
# This script is based on the sample provided here :
|
||||
# https://github.com/Gandi/api-examples/blob/master/bash/livedns/mywanip.sh
|
||||
#
|
||||
|
||||
# Include configuration file
|
||||
source /etc/live-dns/live-dns.conf
|
||||
#echo Domain : $DOMAIN
|
||||
#echo Record : $RECORD
|
||||
#echo APIKey : $APIKEY
|
||||
|
||||
API="https://dns.api.gandi.net/api/v5/"
|
||||
IP_SERVICE="http://me.gandi.net"
|
||||
|
||||
|
||||
# Get WAN IP as seend from outside
|
||||
WAN_IP4=$(curl -s4 $IP_SERVICE)
|
||||
WAN_IP6=$(curl -s6 $IP_SERVICE)
|
||||
echo WAN IPv4 : $WAN_IP4 | logger
|
||||
echo WAN IPv6 : $WAN_IP6 | logger
|
||||
|
||||
if [[ -z "$WAN_IP4" && -z "$WAN_IP6" ]]; then
|
||||
echo "Something went wrong. Can not get your IP from $IP_SERVICE " | logger
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get IP from DNS
|
||||
DNS_IP4=$(dig +short @ns1.gandi.net -t A $RECORD.$DOMAIN)
|
||||
DNS_IP6=$(dig +short @ns1.gandi.net -t AAAA $RECORD.$DOMAIN)
|
||||
|
||||
echo DNS IPv4 : $DNS_IP4 | logger
|
||||
echo DNS IPv6 : $DNS_IP6 | logger
|
||||
|
||||
# Update IPV4 DNS record if IP adresses mismatch
|
||||
if [[ ! -z "$WAN_IP4" ]]; then
|
||||
if [[ "$WAN_IP4" != "$DNS_IP4" ]]
|
||||
then
|
||||
echo Updating IPv4 DNS records for $RECORD.$DOMAIN | logger
|
||||
DATA='{"rrset_values": ["'$WAN_IP4'"]}'
|
||||
IP4_RES=$(curl -s -XPUT -d "$DATA" \
|
||||
-H"X-Api-Key: $APIKEY" \
|
||||
-H"Content-Type: application/json" \
|
||||
"$API/domains/$DOMAIN/records/$RECORD/A" 2>&1)
|
||||
echo Update of IPv4 DNS record : $IP4_RES | logger
|
||||
else
|
||||
echo No need to update IPv4 DNS record for $RECORD.$DOMAIN | logger
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Update IPV6 DNS record if IP adresses mismatch
|
||||
if [[ ! -z "$WAN_IP6" ]]; then
|
||||
if [[ "$WAN_IP6" != "$DNS_IP6" ]]
|
||||
then
|
||||
echo Updating IPv6 DNS records for $RECORD.$DOMAIN | logger
|
||||
DATA='{"rrset_values": ["'$WAN_IP6'"]}'
|
||||
IP6_RES=$(curl -s -XPUT -d "$DATA" \
|
||||
-H"X-Api-Key: $APIKEY" \
|
||||
-H"Content-Type: application/json" \
|
||||
"$API/domains/$DOMAIN/records/$RECORD/AAAA" 2>&1)
|
||||
echo Update of IPv6 DNS record : $IP6_RES | logger
|
||||
else
|
||||
echo No need to update IPv6 DNS record for $RECORD.$DOMAIN | logger
|
||||
fi
|
||||
fi
|
Loading…
Reference in a new issue