Понадобилось мне тут на одном хосте поднять ispconfig. Ниче так, работает, одна проблема: для поддержки DNS там используется MyDNS (реально mydns-ng), который как-то странно работает. В частности он не умеет (не смотря на заявления автора) IXFR, так что на нормальные вторичники зона не трансферится, пока там явно не включишь request-ixfr no; для первичного сервера. И вроде как заменить MyDNS нечем, исправить нереально, а работать должно. В итоге родилась извращенная идея генерить гонфиги и зоны для BIND на лету. Был написан такой скрипт:
#!/bin/sh
rm -f /etc/bind/mydns/db.*
echo -n > /etc/bind/named.conf.mydns
echo "select origin from dns_soa where active='Y';" | mysql --defaults-file=/etc/mysql/debian.cnf dbispconfig | while read DOMAIN;do
[ "$DOMAIN" = "origin" ]&&continue
mydnsexport "$DOMAIN" > /etc/bind/mydns/db."$DOMAIN"
XFER=$(echo "select xfer from dns_soa where origin=\"$DOMAIN\"" | mysql --defaults-file=/etc/mysql/debian.cnf dbispconfig | tail -n1|tr , \;| sed -e 's/;;/;/g' -e 's/^;$//')\;
echo "zone \"$DOMAIN\" { type master; allow-transfer { $XFER }; file \"/etc/bind/mydns/db.$DOMAIN\"; };" >> /etc/bind/named.conf.mydns
done
/etc/init.d/bind9 reload > /dev/null
где /etc/mysql/debian.cnf – это файл содержащий параметры доступа к mysql:
[client]
host = localhost
user = root
password = password
socket = /var/run/mysqld/mysqld.sock
Правда, как оказалось, mydnsexport генерирует невалидный файл зоны, так что пришлось его слегка пропатчить:
diff -rNu mydns-1.2.8/src/lib/rr.c mydns-1.2.8.patched/src/lib/rr.c
--- mydns-1.2.8/src/lib/rr.c 2009-02-03 12:15:26.000000000 +0300
+++ mydns-1.2.8.patched/src/lib/rr.c 2009-09-27 05:00:26.000000000 +0400
@@ -866,6 +866,7 @@
"%s%s%s"
"%s%s"
"%s%s"
+ "%s"
"%s",
columns,
@@ -891,8 +892,9 @@
(filter)? " AND " : "",
(filter)? filter : "",
+ " ORDER BY name,type",
/* Optional sorting */
- (mydns_rr_use_stamp)? " ORDER BY stamp DESC" : "");
+ (mydns_rr_use_stamp)? ",stamp DESC" : "");
RELEASE(namequery);
Ну и вставить вызов скрипта в крон. Извращение, но работает.