Script DynDNS OVH en python avec Neuf Box SFR

Bannière logo python

Début octobre, SFR déployait le dernier firmware pour la Neuf Box SFR (NB4). Intitulé NB4 3.2.9, cette mise à jour apportait dans son lot de nouveautés la prise en charge d’un grande nombre de services de redirection, et notamment celui d’OVH. Comme mon nom de domaine est enregistré chez eux, je me suis dis super, je vais pouvoir mettre en place un DynDNS sur un sous-domaine afin de pouvoir accéder plus facilement à mon serveur. Je l’ai donc mis en place et tout fonctionnait à merveille !

Oui mais voilà, les développeurs de chez SFR n’ont visiblement pas suffisamment testé leur nouveau bébé puisque de nombreux abonnés se sont plaints de dysfonctionnements (notamment de déconnexions intempestives en WIFI ou de problèmes de connexions / déconnexions de périphériques sur la box). Du coup, SFR a effectué un rétropédalage et a tout simplement downgradé les box mises à jour vers la version antérieure : 3.1.10. Au revoir configuration OVH…

Et comme ça fait déjà presque deux mois que l’on n’a plus de nouvelles, j’ai décidé de chercher sur le net le moyen de mettre à jour les DNS d’OVH directement avec mon serveur. OVH fourni des instructions sur sa FAQ mais les liens proposés n’existent plus (erreurs 404), et les explications sont, disons… floues.

Heureusement, ftth est passé par là et à créé son propre script en python pour mettre vos enregistrements DNS automatiquement à jour. Il utilise en fait l’API REST de la Neuf Box pour récupérer son ip publique. Je le remercie donc pour son travail, que je me permets de reprendre.

Ce que fait ce script :

  • Détection de l’ip publique courante (via l’API de la Neuf Box) ;
  • Résolution de l’hôte DynDNS afin de comparer les adresses ip ;
  • Si besoin, mise à jour de l’enregistrement DNS.

Associé à un job cron, le script fait tout tout seul…

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from urllib import urlopen
from commands import getoutput
from socket import gethostbyname
import httplib
import base64
import sys
 
HOST = 'myhost.mydomain.org'
LOGIN = 'logindyndnsovh'
PASSWORD = 'password'
PROVIDER = 'www.ovh.com'
USER_AGENT = 'unkown'
ROUTER_IP = '192.168.1.1'
ROUTER_URL = 'http://%s/api/?method=ppp.getInfo' %ROUTER_IP
 
def parse_ip():
    print 'Checking for public IP on router', ROUTER_IP
    conn = urlopen(ROUTER_URL)
    data = conn.read()
    conn.close()
    import re
    pattern =  r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
    try:
        ip = re.search(pattern, data).group()
    except Exception:
        ip = None
    return ip
 
def update_ip(ip):
    url_suffix = '/nic/update?system=dyndns&hostname=%s&myip=%s&wildcard=OFF&backmx=NO' %(HOST, ip)
    h = httplib.HTTP(PROVIDER)
    h.putrequest("GET", url_suffix)
    h.putheader("HOST", PROVIDER)
    h.putheader("USER-AGENT", USER_AGENT)
    authstring = base64.encodestring(LOGIN + ":" + PASSWORD)
    authstring = authstring.replace("12", "")
    h.putheader("AUTHORIZATION", "Basic " + authstring)
    h.endheaders()
    errcode, errmsg, headers = h.getreply()
    if errmsg == 'OK':
        print 'Update completed fine, exiting'
        sys.exit()
    else:
        print 'WARNING, dynamic update could not be completed', errcode, errmsg
        sys.exit(1)
 
if __name__ == '__main__':
    try:
        ip = parse_ip()
        if ip is None:
            print 'Error, found no IP from router, exiting'
            sys.exit(1)
        old_ip = gethostbyname(HOST)
        if ip == old_ip:
            print 'No change, doing nothing'
            sys.exit()
        else:
            print 'Trying to update IP at', PROVIDER
            update_ip(ip)
    except Exception, e:
        print 'Unkown error occured', e
        sys.exit(1)

Placez le script dans un répertoire accessible par le PATH, puis ajoutez lui les droits d’exécution et le job cron pour l’automatisation.

sudo cp dyndns_update.py /usr/local/bin/dydns_update.py
sudo chmod +x /usr/local/bin/dyndns_update.py
user@machine:~$crontab -e
00 4 * * *   /usr/local/bin/dyndns_update.py

Dans cet exemple, le script est exécuté tous les jours à 4H du matin, et le résultat est notifié par email au compte local.

Source : fhackts | image

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email