Wednesday, 24 October 2012

Конвертер bind конфига в mysql на perl



Скрипт в репозитории zone2sql_perl_convert_bare_to_mysql.pl.

Прямая ссылка: http://fastvps.googlecode.com/svn/trunk/powerdns_zone_converter/zone2sql_perl_convert_bare_to_mysql.pl

Среда разработки и тестирования: Debian 6, в папке /etc/bind/ имеется named.conf и куча зон.

dpkg -l |grep pdns
ii  pdns-backend-mysql               2.9.22-8+squeeze1            generic MySQL backend for PowerDNS
ii  pdns-doc                         2.9.22-8+squeeze1            PowerDNS manual
ii  pdns-server                      2.9.22-8+squeeze1            extremely powerful and versatile nameserver

Суть скрипта, берем команду:
zone2sql --on-error-resume-next=yes --named-conf=/etc/bind/named.conf --bare

Она парсит конфиг Bind и представялет его в виде удонбом для парсинга (парсить конфиг Bind самому - очень сложно, нужно учесть огромное множество моментов).

После этого, обрабатываем этот файл и делаем из него удобный для импорта sql файл, который генерируется идентично тому, что создает команда:
zone2sql --on-error-resume-next=yes --named-conf=/etc/bind/named.conf --gmysql

Зачем же, спросите Вы, плодить сущности? Это нужно потому что исправить генератор zone2sql (изменить способ создания зон, внести коррективы) почти нереалньо - он написан на сложном C++ c STL, владение которым обычно не значистя в списке умений системного администратора. А мой скрипт испарвить крайне легко! Так как это перл.

Тестирование работы скрипта и идентичности его результата работы тому, что генерирует gmysql.

Создаем папку:
mkdir var

Стягиваем скрипт по ссылке выше и даем ему право исполнения:
chmod +x zone2sql_perl_convert_bare_to_mysql.pl

Запускаем:
./zone2sql_perl_convert_bare_to_mysql.pl 


Он выдаст примерно следующее:
Convert zones to raw file
Process raw data file to sql

Работает он весьма быстро, на 150 тысячах зон всего:
real 0m16.537s
user 0m14.945s
sys 0m1.515s

В итоге в папке var появятся три файла:
error.log - это лог команды zone2sql --bare, некритичные ошибки из него игнорируются автоматически
result_fastvps.sql - результирующий sql файл
zone2sql_raw.dat - bare файл, сгенерированный командой zone2sql.

Итак, сравним результат с тем, что делает zone2sql, для этого вызовем zone2sql:
zone2sql --on-error-resume-next=yes --named-conf=/etc/bind/named.conf --gmysql | sort > var/result_zone2sql.sql
cat var/result_fastvps.sql | sort > var/result_fastvps_sorted.sql 

Сортировка необходима, так как парсеры генерируют немного в разной последовательности.

Сравним по md5:
md5sum var/result_zone2sql.sql
md5sum var/result_fastvps_sorted.sql 


Будьте внимательны при тесте, чтобы содержимое зон не менялось.




Актуальная версия всегда в репозитории: http://code.google.com/p/fastvps/wiki/zone2sql_Perl?ts=1351069503&updated=zone2sql_Perl

2 comments:

  1. Ошибка в тексте - Nginx в надо заменить на Bind

    ReplyDelete
  2. Ох, заработался! Исправил!

    ReplyDelete

Note: only a member of this blog may post a comment.