dhcp костылинг для utm5
dhcp костылинг для utm5
Уважаемые гуру!
Поделитесь пожалуйста рабочими скриптами для выдергивания из базы данных связки "Передача IP-трафика", IP и MAC-адресов, с последующей заливкой в конфиг dhcp.conf (isc-dhcp).
Заранее спасибо!
P.S: Рабочий конфиг на последней странице!
Поделитесь пожалуйста рабочими скриптами для выдергивания из базы данных связки "Передача IP-трафика", IP и MAC-адресов, с последующей заливкой в конфиг dhcp.conf (isc-dhcp).
Заранее спасибо!
P.S: Рабочий конфиг на последней странице!
Последний раз редактировалось TiRider Ср май 05, 2010 16:10, всего редактировалось 1 раз.
Хотелось бы реальной помощи. Не знаю как заставить писать в конец файла конфигу новую, перед этим сортируя и проверяя, потом как выстраивать список в порядке увеличения ипов и по подсетям... Ну и как сделать так, чтобы если адрес "белый" то присваивалась опция "option host-name", и еще как подставить не достающих разделяющих [ : ] при выводе в файл, а то накиданный мной скрипт кривой... В программировании честно - не силен. Извините за кривые руки...
Код: Выделить всё
!/usr/bin/perl -w
#************************************************************************
# Назначение: Relay свяки login+mac+ip биллинга UTM5, для isc-dhcp
#************************************************************************
use DBI ();
# Подключение модуля для работы с базой данных
$dbname = 'UTM5'; # Название базы данных
$login = 'root'; # Имя пользователя
$password = ''; # Пароль
$host = 'localhost'; # Имя хоста на котором установлен MySQL
# Подключение к базе данных
$dbh = DBI->connect("DBI:mysql:database=$dbname;host=$host",
"$login", "$password", {'RaiseError' => 1});
# Чтение данных из таблицы
$sth = $dbh->prepare("set charset utf8;");
$sth->execute();
$sth = $dbh->prepare("SELECT inet_ntoa(0xFFFFFFFF & ip) as ip, mac FROM ip_groups WHERE mac!='' AND is_deleted=0, login
FROM users WHERE login!='' AND is_blocked=0 AND is_deleted=0");
$sth->execute();
while ($ref = $sth->fetchrow_hashref()) {
$login = $ref->{'login'};
$ip = $ref->{'ip'};
#$mac = $ref->{'mac'} = ~s/\./ /g;
$mac = $ref->{'mac'}=join ":",$mac =~ /.{2}/g; # У меня в базе маки хранятся в виде aaaa.bbbb.cccc с циски (заменяю на :), но не знаю как в выводящем файле подставить еще 3 - :, для разделения...
if ( $ip =~ /^172[.]19[.]([0-9]+)[.]([0-9]+)$/ && $mac =~ /^([0-9a-f]){4}[.]([0-9a-f]){4}[.]([0-9a-f]){4}$/ && $login =~ /^([0-9a-f])$/ ) {
$utm{$login}=$ip=$mac; } else if {
( $ip =~ /^IP[.]IP[.]IP([0-9]){1}[.]([0-9]+)$/ && $mac =~ /^([0-9a-f]){4}[.]([0-9a-f]){4}[.]([0-9a-f]){4}$/ && $login =~ /^([0-9a-f])$/ )
$utm{$login}=$ip=$mac; } else {
# ( $i.ip =~ /^0[.]0[.]0[.]0$/ && $i.mac =~ /^([0-9a-f]){4}[.]([0-9a-f]){4}[.]([0-9a-f]){4}$/ );
( $ip =~ /^ $/ && $mac =~ /^ $/ );
}
#print "\nhost $ip = $ref->{'ip'} {\noption host-name
#"$login = $ref->{'login'}.fliknet.ru";\nhardware ethernet
#$mac = $ref->{'mac'}=join ":",$mac =~ /.{2}/g;\nfixed-address
#$utm{$login}=$ip = $ref->{'ip'};\n}\n";
}
$sth->finish();
# Закрытие соединения с MySQL
$dbh->disconnect();
open (DHCPCONFIG, ">/usr/local/etc/dhcp.conf") || die •$!";
if (! print DHCPCONFIG "\nhost $ip = $ref->{'ip'} {\noption host-name
"$login = $ref->{'login'}.domain.ru";\nhardware ethernet
$mac = $ref->{'mac'}=join ":",$mac =~ /.{2}/g;\nfixed-address
$utm{$login}=$ip = $ref->{'ip'};\n}\n";, scalar(localtime) , "\n" ) {
warn "/usr/local/etc/dhcp.conf: $!" ;
}
close(DHCPCONFIG) ;
С запросом, косячокс вышел. Модифицировал.
Код: Выделить всё
SELECT users.login, inet_ntoa(ip & 0xFFFFFFFF) as ip, ip_groups.mac FROM ip_groups, iptraffic_service_links, service_links, users, accounts WHERE ip_groups.mac!='' AND accounts.id=users.basic_account AND service_links.user_id=users.id AND iptraffic_service_links.ip_group_id=ip_groups.ip_group_id AND service_links.id=iptraffic_service_links.id GROUP BY ip_groups.ip ORDER BY ip_groups.ip;
Мой велосипед:
Файл /etc/dhcpd.hosts инклудится в конфиг. Временный файл /tmp/dhcpd.hosts.new инклудится в тестовый конфиг /etc/dhcpd.conf.test. В лог /var/log/dhcpd_updater пишутся все изменения (на всякий случай). Логгер используем для своих целей, можно вырубить.
Код: Выделить всё
#!/usr/bin/perl
use DBI;
use DBD::mysql;
use lib '/cktv/perl';
use cktv::logger;
# Инициализация
loginfo "Обновление DHCPD";
$dbh = DBI->connect("DBI:mysql:UTM5", 'dblogin', 'dbpass') or die crit msg "Can't connect to DB!";
open F, ">", "/tmp/dhcpd.hosts.new";
# Получаем данные (192.168.128.1 -- 192.168.250.250)
my $items = $dbh->selectall_arrayref( "
SELECT inet_ntoa(ip&0xffffffff) AS sip,mac
FROM ip_groups
WHERE ip BETWEEN -1062699007 AND -1062667526 AND is_deleted=0
ORDER BY ip
" );
# Таблица для поиска дублей
my ( %MAC, %IP ) = ();
for my $item ( @$items ) {
my ( $ip, $mac ) = @$item;
$mac =~ s/^\s+//;
$mac =~ s/\s+$//;
$mac = uc $mac;
# Проверяем мак
unless ( $mac ) {
# DHCP не нужен
next;
} elsif ( $mac =~ /^[0-9A-F]{2}(?::[0-9A-F]{2}){5}$/ ) {
# Мак правильный
} elsif ( $mac =~ /([0-9A-F]{2})([0-9A-F]{2})\.?
([0-9A-F]{2})([0-9A-F]{2})\.?
([0-9A-F]{2})([0-9A-F]{2})/x ) {
# Цисковский или просто числа
$mac = "$1:$2:$3:$4:$5:$6";
msg "Fixed: $ip $mac";
} else {
crit msg "Wrong: $ip $mac";
next;
}
# Проверка на дубликаты
if ( $MAC{$mac} ) {
crit msg "Duplicate MAC: $ip $mac";
next;
}
if ( $IP{$ip} ) {
crit msg "Duplicate IP: $ip $mac";
next;
}
$IP{$ip} = 1;
$MAC{$mac} = 1;
# Сохраняем в конфиг
$ip =~ /^(\d+\.\d+)\.(\d+)\.(\d+)$/;
printf F "host pc_%03s_%03s { hardware ethernet %s; fixed-address %s; option routers %s; }\n",
$2, $3, $mac, $ip, "$1.$2.1";
}
# Отключаемся
$dbh->disconnect;
close F;
# Перезагружаем DHCPD если нужно
`diff /etc/dhcpd.hosts /tmp/dhcpd.hosts.new >/dev/null >> /var/log/dhcpd_updater || (
/usr/sbin/dhcpd -t -cf /etc/dhcpd.conf.test 2>&1 &&
cp /tmp/dhcpd.hosts.new /etc/dhcpd.hosts &&
/etc/init.d/dhcpd reload 2>&1 &&
echo Reboot: \`date\` >> /var/log/dhcpd_updater
)`;