[PERL][РЕШЕНИЕ] ISPmanager и BIND Slave
Добавлено: 2010-06-09 15:09:10
1. В панели ISP создаем администратора с правами только на функцию domain
2. Подготавливаем slave и в настройках делаем include где у нас будут записи о зонах
На slave ставим скрипт в крон, я поставил раз в 30 минут.
Для работы скрипта необходимо
http://www.freshports.org/www/p5-libwww/
2. Подготавливаем slave и в настройках делаем include где у нас будут записи о зонах
На slave ставим скрипт в крон, я поставил раз в 30 минут.
Код: Выделить всё
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
my $isp_url = "https://[b]IP-АДРЕС[/b]/manager/ispmgr?authinfo=[b]ЛОГИН[/b]:[b]ПАРОЛЬ[/b]&func=domain&out=text"; # адрес к панели ISPmanager
my $slave_dir = "/etc/namedb/slave"; # папка где хранить зоны
my $slave_file = "/etc/namedb/slave.zone"; # фаил с описанием зон
my $master_ip = "[b]127.0.0.1[/b]"; # ip мастера
my $rndc_command = "/usr/sbin/rndc reload > /dev/null 2>&1"; # команда на релоуд binda
# шаблой записи зоны %ZONE% - имя зоны (пример: ya.ru), %SLAVE_DIR% - папка где хранить зоны, %MASTER_IP% - ip мастера
my $zone = <<EOF;
zone "%ZONE%" {
type slave;
file "%SLAVE_DIR%/%ZONE%";
masters { %MASTER_IP%; };
notify no;
};
EOF
if (my @dns_tmp = get_master($isp_url)) {
my @dns;
foreach my $zone_tmp (@dns_tmp) {
my $zone_save = $zone;
$zone_save =~ s/%ZONE%/$zone_tmp/gi;
$zone_save =~ s/%SLAVE_DIR%/$slave_dir/gi;
$zone_save =~ s/%MASTER_IP%/$master_ip/gi;
push(@dns, $zone_save);
}
if (@dns) {
if (save_slave($slave_file, @dns)) {
system($rndc_command);
}
}
}
sub get_master {
my ($isp_url) = @_;
my @a;
my $ua = LWP::UserAgent->new();
my $response = $ua->get($isp_url);
if ($response->is_success) {
my $line = $response->decoded_content;
$line =~ s/name=//gi;
$line =~ s/owner=(.*)//gi;
@a = split('\s\n', $line);
} else {
die $response->status_line;
}
return @a ? @a : '';
}
sub save_slave {
my ($fname, @dns) = @_;
open(F,'>', $fname) or die "Cannot write to file \"$fname\"!\n";
print F @dns;
close F;
return 1;
}
sub get_slave {
my ($slave_dir) = @_;
my @a;
opendir SLAVE, $slave_dir || die "can't opendir $slave_dir: $!";
while (my $file = readdir SLAVE) {
if ($file !~ m/^\./ and -f "$slave_dir/$file") {
push(@a, $file);
}
}
closedir SLAVE;
return @a ? @a : '';
}
http://www.freshports.org/www/p5-libwww/