2010-09-20 4 views
0

J'ai créé un script bash pour transférer mes zones entre mon serveur DNS primaire et secondaire. Il télécharge ma liste de zone à partir du serveur principal et recherche les nouvelles zones, puis télécharge et insère ces fichiers de zone dans le répertoire de la zone et dans le fichier .local pour bind. Le problème que j'ai est que si le fichier de zone n'existe pas, le script va entrer les détails dans le fichier .local indépendamment du fait que cette configuration existe déjà ou non.Bind9 Script de transfert de zone DNS - Script Bash pour éviter les doublons

Quelqu'un peut-il m'aider à faire la distinction entre les zones qui existent déjà et simplement télécharger le fichier de zone. J'ai collé mon script ci-dessous et si quelqu'un a des questions sur comment cela fonctionne, n'hésitez pas à demander. (quelqu'un peut envelopper le code s'il vous plaît, il ne fonctionne correctement pour moi dans tout navigateur, j'essaie!)

#!/bin/sh 
NAMED="/etc/bind/named.conf.local" 
TMPNAMED="/tmp/zns-441245.temp" 
TMPZONEFILE="/tmp/zones.txt" 
TMP="/tmp/zns-732.temp" 
ZONELOCATION="/var/cache/bind" 
IGNORE=`cat ignore.txt` 

logger DNS Update script running... 
echo -n "Checking for new named.conf... " 
wget -q http://91.121.75.205:10801/named/named.conf -O $TMPNAMED 
if [ -e $TMPNAMED ] 
then 
     echo "done." 
else 
     echo "no new data!" 
     exit 
fi 
echo -n "Generating zone names... " 

grep "^zone" $TMPNAMED | cut -d " " -f "2" | cut -d "\"" -f 2 > $TMPZONEFILE 
sed '1,5d' $TMPZONEFILE > $TMP 
mv $TMP $TMPZONEFILE 

echo "done. ("$TMPZONEFILE")" 

echo "Generating zone info... " 

grep -vf ignore.txt $TMPZONEFILE | while read ZONE; do 

echo -n "Checking for $ZONELOCATION/$ZONE.db " 

if [ -e $ZONELOCATION/$ZONE.db ] 
then 
    echo "[ exists ]" 
else 
    export updates="yes" 
    echo "[ doesn't exist ]" 
    echo "New zone available ($ZONE)... " 
    echo "zone \"$ZONE\" { 
    type slave; 
    file \"$ZONELOCATION/$ZONE.db\"; 
    masters { 91.121.75.205; }; 
    allow-notify { 91.121.75.205; }; 
    };" >> $NAMED 
fi 

done 

echo "Updating Bind configuration... " 
/etc/init.d/bind9 restart 

rm $TMPZONEFILE 
rm $TMPNAMED 
+0

Votre question est étiquetée '[bash]' mais votre shebang dit '#!/Bin/sh'. Lequel est-ce? –

Répondre

0

Un problème peut être que votre wget crée un fichier indépendamment du fait que il y a un fichier source de vérifier si l'existence sera toujours vrai.

if [ -s $TMPNAMED ] 
then 
    echo "done." # file exists AND has data 
else 
    echo "no new data!" 
    exit 
fi 

va tester pour voir si elle est vide ou inexistante et quitter si c'est le cas. Cela peut être un problème avec votre if [ -e $ZONELOCATION/$ZONE.db ].

sed ou awk pourrait faire tout cela en une ligne:

grep "^zone" $TMPNAMED | cut -d " " -f "2" | cut -d "\"" -f 2 > $TMPZONEFILE 
sed '1,5d' $TMPZONEFILE > $TMP 

mais je aurais besoin de voir quelques exemples de données pour offrir une solution.

simplifié citant:

echo "done. ($TMPZONEFILE)" 

Vous n'êtes pas en utilisant la variable IGNORE ou la variable updates. Je ne vois aucune raison de l'exporter. En outre, si vous comptez sur elle ailleurs, sa valeur ne survivra pas une fois que la boucle while se ferme depuis que piping quelque chose (grep dans ce cas) dans while configure un sous-shell. Il peut être préférable de faire un de ces:

Bash:

while ... 
do 
    ... 
done <(grep -vf ignore.txt $TMPZONEFILE) 

sh:

grep -vf ignore.txt $TMPZONEFILE > tmp.out 
while ... 
do 
    ... 
done < tmp.out 

Je recommande d'utiliser mktemp ou tempfile pour créer des fichiers temporaires, par la manière.

Cela pourrait être plus lisible et permet d'inclure des citations sans avoir à leur échapper:

cat <<EOF>> "$NAMED" 
zone "$ZONE" { 
    type slave; 
    file "$ZONELOCATION/$ZONE.db"; 
    masters { 91.121.75.205; }; 
    allow-notify { 91.121.75.205; }; 
    }; 
EOF 

Il est toujours une bonne habitude de citer les variables qui contiennent des noms de fichiers.

+0

Ceci est très explicatif, je vais devoir y travailler et tester les méthodes que vous avez décrites et voir comment ça se passe. Je suis très novice en matière de script sous linux et je n'ai jamais vraiment appris quoi que ce soit de plus que ce que je devais faire et qui a fonctionné. – kaotix

0

Si vous allez à tous que la difficulté de synchroniser named.conf vous pourriez tout aussi bien rsync l'ensemble config y compris la zone fichiers, et non à l'aide des transferts de déranger la zone entre primaire et secondaire.

Il n'est en aucun cas obligatoire d'utiliser AXFR pour les serveurs esclaves.Si vous avez un contrôle administratif sur tous les serveurs d'une zone, il est tout à fait acceptable de les traiter tous comme des maîtres.

+0

C'est une très bonne idée, une idée que je n'avais même pas envisagée. Je vais chercher à configurer cette méthode. Ma seule différence serait que l'emplacement des fichiers de zone de bind n'est pas le même sur les deux serveurs, donc je devrais changer cela en utilisant une forme de script? – kaotix

+0

vous pourriez juste mettre dans un lien symbolique pour faire le répertoire (manquant) du point named.conf de votre maître principal au répertoire réel. – Alnitak