#!/bin/bash # Variables de la box: # Postulat de départ: # Les fichiers de zone sont stockés dans le dossier 00_zones_local # leur forme est du type: db.example.com # la syntaxe à l'intérieur est: #; BIND data file for example.com #; #$TTL 300 #$ORIGIN example.com. #@ IN SOA ns1.example.com. hostmaster.example.com. ( # 2019010101 ; Serial YYYYMMDDNN # 1200 ; Refresh # 600 ; Retry # 2419200 ; Expire # 3600) ; Negative Cache TTL #; Cles DNSSEC #$INCLUDE "/etc/bind/00_zones_local/example.com/Kexample.com.zsk.key"; #$INCLUDE "/etc/bind/00_zones_local/example.com/Kexample.com.ksk.key"; # #; Serveurs de Nom: NS #@ IN NS ns1.example.com. # IN NS ns6.gandi.net. #@ IN A 123.123.123.123 #ns6.gandi.net. IN A 217.70.177.40 # #; Serveur de Mail: MX #@ IN MX 10 mail #@ IN MX 20 mail2 # #; Correspondances nom-IP #ns1 IN A 123.123.123.123 #ns1 IN AAAA 123a:123a:123a:123a:123a:123a:123a:123a #mail IN A 123.123.123.123 #mail IN AAAA 123a:123a:123a:123a:123a:123a:123a:123a #www IN A 123.123.123.123 #www IN AAAA 123a:123a:123a:123a:123a:123a:123a:123a # #; Enregistrements SPF #@ IN TXT "v=spf1 ip4:123.123.123.123 -all" #mail IN TXT "v=spf1 mx -all" #mail IN TXT "v=spf1 a ~all" # # Les fichiers temporaires sont créés et stockés dans le dossier racine de bind: /etc/bind/ # Les zones signées, le dsset et les clés sont stockés dans un sous dossier de 00_zones_local au nom du domaine soit /etc/bind/00_zones_local/example.com/ # Le script de mise à jour des glue-record est #Variables de connection à la livebox url="192.168.1.1" login="admin" pwd="ton_mot_de_passe" # Variables locales datenum=$(date +%Y%m%d) datenumheure=$(date +Y%m%d%H%M) datenumlong=$(date +%Y%m%d%H%M%S) datednssec=$(expr $datenumlong + 10000000000) # On part du principe que les fichiers correspondant aux zones gérées en local sont dans le dossier 00_zones_local urlzones="/etc/bind/00_zones_local/" urlbase="/etc/bind/" cd $urlbase # On stocke l'IP courante comme IP_old mv ip.box ip.box.old # Récupération de l'adresse IP sur la livebox et stockage dans ip.box curl -s -X POST "http://$url/sysbus/NMC:getWANStatus?username=$login&password=$pwd" | sed -e 's/.*"IPAddress":"\(.*\)","Remo.*/\1/' > ip.box # On crée les deux variables correspondant a l'ancienne et la nouvelle IP read ip_old < ip.box.old read ip_new < ip.box # Début du script basé sur la comparaison entre l'ancienne et la nouvelle IP if [ "$ip_old" = "$ip_new" ] then # Si l'IP est la même on ne fait rien, on supprime ip.box.old et on envoie un mail pour dire que rien n'a changé rm ip.box.old echo "Le script de contrôle d'IP WAN de la box s'est lancé et n'a détecté aucun changements. L'adresse ip est toujours: $ip_new" | mail -s "Aucun changement d'IP sur $HOSTNAME" ton_mail@example.com else # Sinon on continue le script pour mettre à jour l'IP et on supprime ip.box.old # On garde une trace de l'ancienne ip dans ip.box.stock echo $ip_old $datenum >> $urlbase/ip.box.stock # Pour chacune des occurence de fichier commençant par db. on effectue les modifications for i in $urlzones/db.* do # On extrait le nom de domaine du nom de fichier qui est $fichier tout le tps de la boucle fichier=`basename $i` # On récupère le nom de domaine d'après le nom du fichier qui est de la forme db.example.tld sans le "db." ndd=${fichier:3} # On garde une copie du fichier de zone avec la date (ça peut servir) cp $urlzones$fichier $urlzones$ndd/zonebackup/$fichier.$datenum # Met à jour l'IP dans toutes les occurences du fichier et stocke en temporaire sed "s/"$ip_old"/"$ip_new"/g" $urlzones$fichier > $urlbase"db.tmp" # Change le numéro de version du fichier # On part du principe qu'il n'y a pas 2 changements d'ip par jour # mais comme ce n'est pas un bon principe il faut faire un script pour incrémenter le numéro # s'il y a deux changements le même jour # A faire: Un test si le changement arrive une nouvelle fois le même jour et incrément si c'est le cas # on peut se servir de la date enregistrée avec la dernière sauvegarde du fichier dans zonebackup sed -r -e "s/.*[0-9]{8}.*; Serial/ "$datenum"01 ; Serial/" $urlbase"db.tmp" > $urlbase"db.tmp2" # On supprime les fichiers devenus inutiles rm $urlzones$fichier $urlbase/db.tmp $urlbase/ip.box.old # On remplace le fichier de zone par la version modifiée mv $urlbase"db.tmp2" $urlzones$fichier # Resigner la zone pour DNSSEC chemin=$urlzones$ndd/ cd $chemin # Ici on part du principe que les clés sont de la forme Kexample.com.ksk.key et Kexample.com.zsk.key et adapté en fonction du domaine à gérer dnssec-signzone -e $datednssec -f $chemin$fichier.signed -g -k $chemin/K$ndd.ksk.key -o $ndd $urlzones$fichier $chemin/K$ndd.zsk.key # Met à jour le glue-record chez gandi curl -X PUT https://api.gandi.net/v5/domain/domains/$ndd/hosts/ns1 -H 'authorization: Apikey XXXXXXXXXXXXXXXXXXXXX' -H 'content-type: application/json' -d '{"ips":["'$ip_new'"]}' #Envoie un mail pour prévenir de la modification echo "Le script de contrôle d'IP WAN de la box s'est lancé et l'adresse IP WAN de la box a changée, la nouvelle adresse est: $ip_new . Les changements sur $HOSTNAME $ndd ont été correctement effectués ainsi que les modifications dans les glue-record de gandi" | mail -s "Changement d'IP sur $HOSTNAME $ndd" ton_mail@example.com done fi # On vérifie une dernière fois la bonne supression de ip.box.old if [ -f "/etc/bind/ip.box.old" ];then rm $urlbase/ip.box.old; fi