DPFPIC renaît de ses cendres...
Vous êtes ici : accueil » article » Comment Configurer Gandi avec une Ip dynamique sur un NAS Synology (Updatedns.py)
24 mai 2016

Comment Configurer Gandi avec une Ip dynamique sur un NAS Synology (Updatedns.py)

Rédigé par Dpfpic 6 commentaires
close

Cet article a été publié il y a 1 ans , 4 mois et 4 jours, il est donc possible qu'il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Si vous avez une IP dynamique et un nom de domaine chez Gandi.net, voici une solution pour se passer de services de DNS dynamiques tels que dyn.com ou noip.com. En effet, grâce à l’API de Gandi vous pouvez modifier vôtre zone DNS automatiquement. Et voici un script Python qui fait ça pour vous.

Je me suis inspiré de deux scripts que j'ai trouvé sur le net :

Gandyn Le script a été écrit par Charly Caulet dont l'url est: https://github.com/Chralu/gandyn
Ovh Update Le script a été trouvé sur le site de Seb dont l'url est: http://blog.isorez.fr/

Remarque : Seuls Free et Numéricable proposent une IP fixe et ne sont donc pas concernés.

Le Script updatedns.py permet de mettre à jour votre zone DNS chez Gandi et de recevoir une notification et un email sur votre Nas Synology lors du changement d'adresse IP.

Trêve de bavardages, c'est parti !

 Prérequis généraux

Pour pouvoir mettre en oeuvre ce qui suit, vous devez disposer des éléments suivants :

  • Un nom de domaine hébergé chez Gandi
  • Avoir activer l'API Gandi. (A noter que l'activation de l'API et la génération de la clé s'effectuent depuis l'interface Gandi la première fois, cette dernière permet de s'affranchir d'une authentification par mot de passe). 
  • Mon script Updatedns.py

Installation des logiciels nécessaires

Avant toute chose, il faut disposer de ipkg (un gestionnaire de paquets) sur son NAS Synology. L'installation est automatisée avec le paquet 'Bootstrap d'installation simple' de l'éditeur QTip.

Pour pouvoir utiliser le script, vous aurez besoin de Python et de Cron sur vôtre NAS. Pour l'installer, lancez les commandes suivantes en mode console : 

ipkg install python3

ipkg install cron

Installation du script

Maintenant il faut récupérer le script 'updatedns_1.1b.tar.gz' :

wget http://dpfpic.com/data/telechargements/synology/updatedns_1.1b.tar.gz

Puis,

tar xvzf updatedns_1.1b.tar.gz

et

cd updatedns

et pour finir

python3.4 setup.py install

Le résultat de la commande si tout se passe bien est :

:~/updatedns# python3.4 setup.py install
running install
running build
running build_scripts
creating build/scripts-3.4
copying and adjusting updatedns.py -> build/scripts-3.4
copying and adjusting speedtest.py -> build/scripts-3.4
copying gandierror.sh -> build/scripts-3.4
copying publicipchange.sh -> build/scripts-3.4
copying getpubliciperror.sh -> build/scripts-3.4
changing mode of build/scripts-3.4/updatedns.py from 644 to 755
changing mode of build/scripts-3.4/speedtest.py from 644 to 755
changing mode of build/scripts-3.4/getpubliciperror.sh from 644 to 755
running install_scripts
creating /opt/local
creating /opt/local/bin
copying build/scripts-3.4/updatedns.py -> /opt/local/bin
copying build/scripts-3.4/speedtest.py -> /opt/local/bin
copying build/scripts-3.4/gandierror.sh -> /opt/local/bin
copying build/scripts-3.4/publicipchange.sh -> /opt/local/bin
copying build/scripts-3.4/getpubliciperror.sh -> /opt/local/bin
changing mode of /opt/local/bin/updatedns.py to 755
changing mode of /opt/local/bin/speedtest.py to 755
changing mode of /opt/local/bin/gandierror.sh to 755
changing mode of /opt/local/bin/publicipchange.sh to 755
changing mode of /opt/local/bin/getpubliciperror.sh to 755
running install_egg_info
Creating /opt/local/lib/python3.4/site-packages/
Writing /opt/local/lib/python3.4/site-packages/updatedns-1.1b-py3.4.egg-info
:~/updatedns#

Créer un fichier de configuration  <updatedns.conf>  et insérer dedans les lignes suivantes : 

#API key generated by Gandi
API_KEY = 'your key'
#Name of the domain to update
DOMAIN_NAME = 'your domain'

#Time to live of the updated record
TTL = 300

#Filters used to find the record to update.
#By default, the updated record is "@ A xxx.xxx.xxx.xxx"
#Where 'xxx.xxx.xxx.xxx' is the updated value
RECORD = {'type':'A', 'name':'@'}

#Log level of the script. Values are :
# logging.DEBUG
# logging.INFO
# logging.WARNING
# logging.ERROR
# logging.CRITICAL
LOG_LEVEL = logging.DEBUG

#Path of the log file
LOG_FILE = '/var/log/updatedns.log'

 Placer  le fichier <updatedns.conf> dans un répertoire de préférence à l'abri des regards indiscrets,dans l'exemple ce sera :

mv updatedns.conf /opt/etc/updatedns.conf        #pour vous ce sera <Le chemin ou se trouve le fichier> vers <le chemin que vous avez envie de spécifier>

Tester updatedns.py ,dans l'exemple avec le chemin c'est celui que j'ai spécifié,le votre sera peut être différent. La commande est :

/opt/local/bin/updatedns.py --config /opt/etc/updatedns.conf

Le résultat est dans le fichier à l'emplacement que vous avez spécifié dans le fichier pour l'exemple ce sera : /var/log/updatedns.log Si tout a bien fonctionné vous devriez avoir les lignes suivantes dans ce fichier, l'exemple ici une IP représentée par des X est inchangée.

Tue, 24 May 2016 12:13:31 DEBUG DNS record IP address : xxx.xxx.xxx.xxx
Tue, 24 May 2016 12:13:31 DEBUG Current public IP address : xxx.xxx.xxx.xxx
Tue, 24 May 2016 12:13:31 DEBUG Public IP address unchanged. Nothing to do.

Utilisation de Crontab

Créer une tâche cron pour mettre tout ça en auto. Pour obtenir une exécution toutes les 5mn de updatedns.py, ajouter la ligne ci-dessous au fichier crontab (/opt/etc/crontab) Attention au chemin que vous avez spécifié, éditez le fichier, dans l'exemple avec Synology, ce se sera:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/sbin:/opt/bin
MAILTO=""
HOME=/
# ---------- ---------- Default is Empty ---------- ---------- #
*/5 * * * * root /opt/local/bin/updatedns.py --config /opt/etc/updatedns.conf

Activer la tâche en relançant cron

/opt/etc/init.d/S10cron

Voici un exemple de réception de mail lors du changement d'adresse ip externe :

Cher utilisateur,

L'adresse IP publique sur Svrsokar a changée. 
DNS Gandi travaille sur une nouvelle zone. Ancienne adresse IP publique : xxx.xxx.xxx.xxx Nouvelle adresse IP publique : yyy.yyy.yyy.yyy Débit internet : ---------------- Ping: 22.138 ms Download: 5.81 Mbit/s Upload: 0.73 Mbit/s Sincères salutations, Synology DiskStation

Notes complémentaires :

L'installation est donnée ici à titre d'exemple sur un NAS Synology modèle DS415+, il est évident que sur ce type de NAS, c'est en console que se déroulera l'installation . Il est important que les fichiers soient sécurisés, accessibles que par root, voir chiffrés avec mdp, il ne faut pas oublier qu'il y a des données importantes mais c'est un autre sujet…

Vous avez aimé cet article ? Alors partagez-le avec vos amis en cliquant sur les boutons ci-dessous :

6 commentaires

#1  - leclownnn a dit :

Bonjour,
Je tente de mettre en place ce programme sur mon syno 415+ et je rencontre l'erreur suivante : `sh gandierror.sh "<Fault 581050: "Error on object : OBJECT_ZONE (CAUSE_NORIGHT) [XX0000-GANDI isn't allowed to modify zone XXXXXX]">"
Auriez-vous une idée sur cette erreur?
Je vous remercie par avance.
Leclownnn

Répondre
#2  - Dpfpic a dit :

Bonjour Clownnn,
Avez vous crée un compte API chez Gandi.net ?
Voir ce lien https://wiki.gandi.net/fr/xml-api/activate
Cordialement,
DPFPIC

Répondre
#3  - leclownnn a dit :

Bonjour,
Merci pour le retour, il fallait créer un nouveau fichier de zone pour que cela fonctionne :-/
Par contre mon Syno a un comportement erratique depuis la mise en place de la solution...
Je retente l'opération ce weekend et vous tient au courant
Leclownnn

Répondre
#4  - Grimdur a dit :

Hello,
C'est un peu un poste d'outre tombe, mais j'essaie de faire tourner ce script sur mon synology, et j'obtiens une erreur de certificat SSL lorsque je le lance:
Traceback (most recent call last):
File "/opt/bin/updatedns.py", line 174, in <module>
main(sys.argv, globals(), locals())
File "/opt/bin/updatedns.py", line 140, in main
previous_ip_address = gandi_updater.get_record_value()
File "/opt/bin/updatedns.py", line 46, in get_record_value
zone_id = self.__get_active_zone_id()
File "/opt/bin/updatedns.py", line 40, in __get_active_zone_id
self.domain_name
File "/client.py", line 1112, in __call__
File "/client.py", line 1452, in __request
File "/client.py", line 1154, in request
File "/client.py", line 1166, in single_request
File "/client.py", line 1279, in send_request
File "/client.py", line 1309, in send_content
File "/client.py", line 1234, in endheaders
File "/client.py", line 1026, in _send_output
File "/client.py", line 964, in send
File "/client.py", line 1400, in connect
File "/ssl.py", line 401, in wrap_socket
File "/ssl.py", line 808, in __init__
File "/ssl.py", line 1061, in do_handshake
File "/ssl.py", line 683, in do_handshake
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] unknown error (_ssl.c:749)

Il faut obligatoirement avoir acheté un certificat SSL pour faire tourner l'API gandi ? Avez vous une idée de ce qui pourrait cuasser ce problème ?

Merdi d'avance !

Répondre
#5  - Dpfpic a dit :

Bonsoir,
Il n'y a pas besoin d'un certificat spécifique celui par défaut est suffisant.
Je ne vois pas ou peut ce situer le probème.
Avez bien renseigné la API_KEY dans le fichier de configuration ?
DPFPIC

Répondre
#6  - Grimdur a dit :

Bonsoir,

Oui, j'ai bien entré la clé API depuis l'interface du site web de GANDI ainsi que mon nom de domaine, très étrange. Je continue de chercher en vain une explication à ce problème !

Répondre

Écrire un commentaire

    Se rappeler de moi sur ce site
Quelle est la première lettre du mot gsia ?

Fil RSS des commentaires de cet article

↓