Débarrassez-vous de DynDNS en utilisant l'API de Gandi

Amis auto-hébergés, cet article vous est principalement destiné et surtout si votre nom de domaine a été acheté chez Gandi. Pour les autres, l'information qui suit peut peut-être s'avérer intéressante, on ne sait jamais...

Si comme moi, votre FAI ne vous fourni malheureusement pas d'adresse IP fixe, la solution généralement utilisée afin de mettre à jour votre IP est de créer un compte chez un fournisseur tel que DynDNS ou encore No-IP qui vous propose alors de choisir un domaine dans une liste imposée (ex. : homelinux.org). Vous pourrez alors déclarer l'enregistrement d'un hôte (limité à un seul chez DynDNS) dans ce domaine et ainsi mettre à jour cet enregistrement via un outil tel que Ddclient. Vous devrez ensuite créer des alias (CNAME) sur votre propre domaine et les faire pointer vers votre enregistrement DynDNS nouvellement créé (ex. toto.homelinux.org).

Une autre solution, si vous avez la main sur les serveurs DNS qui hébergent votre domaine (il faut dans ce cas que ces serveurs aient, eux, une ip fixe), est d'utiliser cette méthode proposée par GuiguiAbloc. Je confirme que cela fonctionne très bien, je l'utilise en production au boulot.

Enfin, la solution que je vous propose maintenant ne fonctionne qu'avec les noms de domaines enregistrés et gérés chez Gandi puisqu'elle s'appuie sur leur nouvelle API. Cette API en XML RPC permet d'automatiser ce qu'il est possible de faire via l'interface d'administration grâce à des scripts. La doc officielle fourni des exemples pour les langages suivants: python, php, nodejs, perl, ruby et C.

J'ai écrit le script suivant en Python 2.x (si une version en Python 3.x vous intéresse, laissez-moi un commentaire.). Un simple interpréteur Python suffit à le faire fonctionner sur toutes les plateformes supportées par le langage. La mise en place est très simple, copiez-le où bon vous semble sur votre serveur, rendez-le exécutable et modifiez les constantes en entête de fichier pour les faire correspondre à vos besoins. Planifiez ensuite son exécution à intervalles réguliers à l'aide d'une tâche cron et c'est tout.

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.

Voici donc le script commenté:

# -*- coding: UTF-8 -*-
import xmlrpclib, urllib2, time, re, sys

# API de Production
api = xmlrpclib.ServerProxy('https://rpc.gandi.net/xmlrpc/')

############ A Modifier #############

# URL de la page retournant l'ip publique
url_page = 'http://ifconfig.me/ip'

# Renseignez ici votre clef API générée depuis l'interface Gandi:
apikey = 'dshjhkqsdk566456dsjhgdj82k65hgdsuytzz'

# Domaine concerné
mydomain = 'mondomaineamoi.org'

# Enregistrement à modifier
myrecord = {'name': 'monserveur', 'type': 'A'}

# TTL
myttl = 300

# id de la zone concernée (à récupérer depuis l'interface Gandi) 
zone_id = xxxxxx

####################################

# Récupération de l'ancienne ip
oldip = api.domain.zone.record.list(apikey, zone_id, 0, myrecord)[0].get('value')

try:
    # Récupération de l'ip actuelle
    f = urllib2.urlopen(url_page, None, 10)
    data = f.read()
    f.close()
    pattern = re.compile('\\d+\\.\\d+\\.\\d+\\.\\d+')
    result = pattern.search(data, 0)
    if result == None:
        print("Pas d'ip dans cette page.")
        sys.exit() 
    else:
        currentip = result.group(0)

    # Comparaison et mise à jour si besoin
    if oldip != currentip:
        # On cree une nouvelle version de la zone
        version = api.domain.zone.version.new(apikey, zone_id)
        # Mise a jour (suppression puis création de l'enregistrement)
        api.domain.zone.record.delete(apikey, zone_id, version, myrecord)
        myrecord['value'] = currentip
        myrecord['ttl'] = myttl
        api.domain.zone.record.add(apikey, zone_id, version, myrecord)
        # On valide les modifications sur la zone
        api.domain.zone.version.set(apikey, zone_id, version)
        api.domain.zone.set(apikey, mydomain, zone_id)
        print("Modification de l'enregistrement effectuée avec l'ip: %s" % currentip)
except urllib2.HTTPError, xmlrpclib.ProtocolError:
    print("Site indisponible.")
finally:
    sys.exit()

Vous pouvez également le télécharger en cliquant sur ce lien.

MAJ du 19/03/2012: Plusieurs personnes m'ont demandé comment retrouver l'id de zone dans l'interface Gandi, il suffit de se positionner sur le domaine de son choix, puis de cliquer sur le lien "Voir" en face de "Fichier de zone" dans la colonne "Serveur de noms". Une fenêtre s'ouvre permettant de visualiser le fichier de zone, l'id se trouve dans l'url de cette fenêtre: https://www.gandi.net/admin/domain/zone/XXXXXX/see/ (représenté par des X ici)

MAJ du 03/10/2012: Charly Caulet a fait quelques modifs en se basant sur ce script et a packagé le tout. Vous pourrez trouver tout cela sur son dépôt.

Vus : 1740
Publié par Comète : 152