dhcp костылинг для utm5

Технические вопросы по UTM 5.0
Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

dhcp костылинг для utm5

Сообщение TiRider »

Уважаемые гуру!

Поделитесь пожалуйста рабочими скриптами для выдергивания из базы данных связки "Передача IP-трафика", IP и MAC-адресов, с последующей заливкой в конфиг dhcp.conf (isc-dhcp).

Заранее спасибо!

P.S: Рабочий конфиг на последней странице!
Последний раз редактировалось TiRider Ср май 05, 2010 16:10, всего редактировалось 1 раз.

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

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

Antares
Сообщения: 59
Зарегистрирован: Вт мар 11, 2008 08:28

Сообщение Antares »

Тоже ищу

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

select ip,mac from ip_groups ?

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

login - users, mac, ip - ip_groups и чтобы в конфигу dhcp заливать можно было. Либо выводить в отдельный файлик данные

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Набросал скрипт. Не знаю как заставить писать в конфиг dhcp.conf в самый конец файла. В порядке увеличения ипов и по сетям :(

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Хотелось бы реальной помощи. Не знаю как заставить писать в конец файла конфигу новую, перед этим сортируя и проверяя, потом как выстраивать список в порядке увеличения ипов и по подсетям... Ну и как сделать так, чтобы если адрес "белый" то присваивалась опция "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) ;

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

С запросом, косячокс вышел. Модифицировал.

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

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;

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Кто реально может помочь со скриптом?

dwemer
Сообщения: 276
Зарегистрирован: Чт янв 25, 2007 05:59

Сообщение dwemer »

TiRider писал(а):Кто реально может помочь со скриптом?
Скрипт простой как 2 копейки, какие у вас конкретно затруднения?

Общую часть оставьте в dhcpd.conf, остальное инклюдом из отдельного файла . Этот файл и генерьте на основе данных из ip_groups.

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

Мой велосипед:

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

#!/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
)`;
Файл /etc/dhcpd.hosts инклудится в конфиг. Временный файл /tmp/dhcpd.hosts.new инклудится в тестовый конфиг /etc/dhcpd.conf.test. В лог /var/log/dhcpd_updater пишутся все изменения (на всякий случай). Логгер используем для своих целей, можно вырубить. :)

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Уважаемый dwemer, выше я объяснил ситуацию. Не силен в программинге...

Уважаемый dk, спасибо огромное за скрипт, попробую!

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

А скажите пожалуйста, как решили проблему замены цисовских маков на isc-dhcp? хххх.хххх.хххх которые на хх:хх:хх:хх:хх:хх

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Пардон. Глаза разул :)

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

Скажите пожалуйста, а что нужно еще дописать к вашему файлу, чтобы "option host-name" передавалось, если ип белый... Че то подумал, не выходит привентить данный параметр...

Ответить