[PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

[PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение thefree » 2010-06-09 15:09:10

1. В панели ISP создаем администратора с правами только на функцию domain
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/
Последний раз редактировалось Alex Keda 2010-06-09 19:59:36, всего редактировалось 1 раз.
Причина: Товарищщи, цените чужое время, юзайте кнопочку [code]...
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35458
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение Alex Keda » 2010-06-09 20:00:17

1. [quote] !=

Код: Выделить всё

2. ссылки на нормальные сайты оставлять не только можно, но и нужно - на этом интерент построен, вообще-то
Убей их всех! Бог потом рассортирует...

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: [PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение thefree » 2010-06-10 9:29:47

в [quote] просто отображаются bbcode
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: [PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение thefree » 2010-06-10 11:34:30

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

Код: Выделить всё

my $isp_url = "https://IP-АДРЕС/manager/ispmgr?authinfo=ЛОГИН:ПАРОЛЬ&func=domain&out=text"; # адрес к панели ISPmanager
my $slave_dir = "/etc/namedb/slave"; # папка где хранить зоны
my $slave_file = "/etc/namedb/slave.zone"; # фаил с описанием зон
my $master_ip = "127.0.0.1"; # ip мастера
my $rndc_command = "/usr/sbin/rndc reconfig > /dev/null 2>&1"; # команда на релоуд binda
our %zone_exception = ('exemple.com' => 0, 'exemple.net' => '0'); # домены которые исключаем, если не надо оставляем пустым (пример: our %zone_exception = ();)

# шаблой записи зоны %ZONE% - имя зоны (пример: exemple.com), %SLAVE_DIR% - папка где хранить зоны, %MASTER_IP% - ip мастера
my $zone = <<EOF;
zone "%ZONE%" {
	type slave;
	file "%SLAVE_DIR%/%ZONE%";
	masters { %MASTER_IP%; };
	notify no;
};
EOF
Вложения
ispmgr-bind.pl.txt
(2.32 КБ) 79 скачиваний
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

vitich
проходил мимо

Re: [PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение vitich » 2014-02-27 17:37:50

Debian7

Скрипт генерирует вот так

zone "mydomain.kiev.ua dispmydomain.kiev.ua" {
type slave;
file "/etc/bind/slave/mydomain.kiev.ua dispmydomain.kiev.ua";
masters { 8.8.8.8; };
notify no;
};

Я бы поставил фрю, но там вдс :)

rayder
лейтенант
Сообщения: 661
Зарегистрирован: 2008-12-18 16:29:43
Откуда: Ukraine/Kiev
Контактная информация:

Re: [PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение rayder » 2014-02-27 22:00:37

хм, для этого еще перл надо иметь... но фломастеры разные, так что такое

а я генерю обычным шеловским скриптиком :) вот таким:
(да, есть недочеты но оно работает а дописывать времени нет.)

Код: Выделить всё

#!/bin/sh

master="<masterhost>";
syncuser="<isplogin>";
syncpwd="<isppassword>";
syncdir="/opt/bind/sync";
bindchw="bind:bind";
binddir="/opt/bind/conf.d";
bindfile="${binddir}/${master}.include";
tmpfile="${syncdir}/${master}.tlist";


_wget="$(which wget)"
if [ -z "${_wget}" ]; then
    echo "Error: wget not found"
    exit 1
fi

_awk="$(which awk)"
if [ -z "${_awk}" ]; then
    echo "Error: awk not found"
    exit 1
fi

_cat="$(which cat)"
if [ -z "${_cat}" ]; then
    echo "Error: cat not found"
    exit 1
fi

_cp="$(which cp)"
if [ -z "${_cp}" ]; then
    echo "Error: cp not found"
    exit 1
fi

_rm="$(which rm)"
if [ -z "${_rm}" ]; then
    echo "Error: rm not found"
    exit 1
fi

_dig="$(which dig)"
if [ -z "${_dig}" ]; then
    echo "Error: dig not found"
    exit 1
fi

_sort="$(which sort)"
if [ -z "${_sort}" ]; then
    echo "Error: sort not found"
    exit 1
fi

_chown="$(which chown)"
if [ -z "${_chown}" ]; then
    echo "Error: chown not found"
    exit 1
fi

if [ -z "${_rndc}" ]; then
    echo "Error: rndc not found"
    exit 1
fi

_checkconf="$(which named-checkconf)"
if [ -z "${_checkconf}" ]; then
    echo "Error: named-checkconf not found"
    exit 1
fi



if [ -f ${bindfile}.gen ]; then
   ${_rm} ${bindfile}.gen
fi

masterip=`${_dig} +short ${master} A`

if [ "x${masterip}" == "x" ]; then
        echo "IP address for ${master} not found";
        exit 1;
fi


${_wget} --quiet --no-check-certificate "https://${master}/manager/ispmgr?authinfo=${syncuser}:${syncpwd}&func=domain&out=text" -O ${tmpfile} >> /dev/null
zonelist=`${_cat} ${tmpfile} | ${_awk} '{print $1}' | ${_awk} -F '=' '{print $2}' | ${_sort}`
for zone in ${zonelist}
do

echo "
        zone \"$zone\" {
                type slave;
                file \"slave/${zone}\";
                masters { ${masterip}; };
        };
" >> ${bindfile}.gen
done

${_checkconf} ${bindfile}.gen > /dev/null

if [ $? -ne 0 ]; then
        echo "Config error, abort";
        answer=`${_checkconf} ${bindfile}.gen`
        ${_rm} ${bindfile}.gen

        exit 1;
else
        if [ -f ${bindfile} ];then
                ${_cp} ${bindfile} ${bindfile}.last
        fi

        ${_cp} ${bindfile}.gen ${bindfile}
        ${_rm} ${bindfile}.gen
fi
${_chown} -R ${bindchw} ${binddir}

${_rndc} reload

if [ $? -ne 0 ];then
        echo "Reload fail, restore old file";
   ${_cp} ${bindfile}.last ${bindfile}
   ${_rm} ${bindfile}.last
   ${_rndc} reload
else
        if [ -f ${bindfile}.last ];then
                ${_rm} ${bindfile}.last
        fi
fi
вопрос к ТС: ты пробовал редактировать зоны через API? у меня что-то не вышло для subdomain редактировать записи (A,MX etc.).
Человеку свойственно ошибаться, но для нечеловеческих ляпов нужен компьютер.

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: [PERL][РЕШЕНИЕ] ISPmanager и BIND Slave

Непрочитанное сообщение thefree » 2014-03-16 8:47:53

vitich писал(а):Debian7

Скрипт генерирует вот так

zone "mydomain.kiev.ua dispmydomain.kiev.ua" {
type slave;
file "/etc/bind/slave/mydomain.kiev.ua dispmydomain.kiev.ua";
masters { 8.8.8.8; };
notify no;
};

Я бы поставил фрю, но там вдс :)
а там апи не изменились? у вы нет где потестировать. Если еще актуально, то в ЛС или тут отпишитесь.
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету