Bind9 DNS Zone Transfer Script - Bash скрипт, чтобы избежать дублирования - PullRequest
0 голосов
/ 20 сентября 2010

Я создал скрипт bash для переноса моих зон между моим основным и дополнительным DNS-сервером. Он загружает мой список зон из основного и проверяет наличие новых зон, а затем загружает и вставляет эти файлы зон в каталог зон и в файл .local для привязки.

Проблема, с которой я столкнулся, заключается в том, что если файл зоны не существует, сценарий будет вводить данные в .local независимо от того, существует ли этот конфиг или нет.

Может кто-нибудь помочь мне отличить уже существующие зоны и просто загрузить файл зоны. Я вставил свой скрипт ниже, и если у кого-то есть какие-либо вопросы о том, как он работает, пожалуйста, не стесняйтесь спрашивать. (может кто-нибудь обернуть код, пожалуйста, он никогда не работает должным образом в любом браузере, который я пытаюсь!)

#!/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

Ответы [ 2 ]

0 голосов
/ 21 сентября 2010

Если вы решите все эти проблемы с синхронизацией named.conf, вы можете просто синхронизировать всю конфигурацию , включая файлы зон , и не беспокоиться об использовании зонных передач между основной и дополнительной.1004 *

Не обязательно использовать AXFR для подчиненных серверов.Если у вас есть административный контроль над всеми серверами для зоны, вполне приемлемо рассматривать их как хозяев.

0 голосов
/ 20 сентября 2010

Одной из проблем может быть то, что ваш wget создает файл независимо от того, существует ли исходный файл, поэтому проверка на существование всегда будет выполняться.

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

проверит, является ли он пустым или не существует, и завершит работу, если это так. Это может быть проблемой с вашим if [ -e $ZONELOCATION/$ZONE.db ].

sed или awk может сделать все это в одной строке:

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

но мне нужно будет посмотреть некоторые примеры данных, чтобы предложить решение.

Упрощенное цитирование:

echo "done. ($TMPZONEFILE)"

Вы не используете переменную IGNORE или updates. Я не вижу причин для его экспорта. Кроме того, если вы полагаетесь на него в другом месте, его значение не сохранится после выхода из цикла while, поскольку передача чего-либо (в данном случае grep) в while устанавливает подоболочку. Может быть лучше сделать один из них:

Bash:

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

ш

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

Кстати, я рекомендую использовать mktemp или tempfile для создания временных файлов.

Это может быть более читабельным и позволяет вам включать кавычки без необходимости экранировать их:

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

Это всегда хорошая привычка заключать в кавычки переменные, которые содержат имена файлов.

...