Перейти к содержимому
Калькуляторы

DHCP server with SQL support on Perl DHCP сервер с базой SQL на Perl, с опцией 82, маршрутами и прочим

Решил почитать на ночь код и заметил следующий кусок:

#this keeps the program alive or something after exec'ing perl scripts
END()           { }
BEGIN() { }
{no warnings; *CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; }; };
eval q{exit};
if ($@) { exit unless $@ =~ /^fakeexit/; };

 

Вообще-то это что-то связанное с FastCGI ( к примеру, см. Perl + FastCGI + nginx , "Пример с codemongers.com"), а данном контексте оно что делает? Глобально переопределяет "exit"? Но тогда, если верить доке , переопределение должно быть сделано внутри блока BEGIN. Я попробовал потестировать это кусок кода, но в текущем виде не заметил от него никакой реакции. Кто-нибудь может подсказать, зачем он нужен в этом демоне?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кишки fastcgi враппера по ходу, откуда оно выросло...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кто-нибудь может подсказать, зачем он нужен в этом демоне?

Я не большой спец в перле, поэтому не исключено что это просто мусор.

Эти конструкции по замыслу нужны чтобы форкалось/работало демоном.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Демонизация и форканье тут

sub daemonize {
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
#setuid(65534)		or die "Can't set uid: $!\n"; # nobody

open(STDIN,  "+>/dev/null")	or die "Can't open STDIN: $!\n";
open(STDOUT, "+>&STDIN")	or die "Can't open STDOUT: $!\n";
open(STDERR, "+>&STDIN")	or die "Can't open STDERR: $!\n";
defined(my $tm = fork)	or die "Can't fork: $!\n";
exit if $tm;
setsid				or die "Can't start a new session: $!\n";
umask 0;
logger("Daemon mode");
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кишки fastcgi враппера по ходу, откуда оно выросло...

Походу да, потому что именно под FastCGI exit() делать нельзя и приходится выкручиваться, переопределением в том числе. Вот тут пример граблей, если вдруг кому интересно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет. Подскажите, что делаю не так, может чего не прописал.

 

Есть свитч, есть релей, есть абонент и сервер ДХЦП

схема:

абонент - свитч - релей - свитч - сервер

 

на свитче настроен влан, на релее прописано все на сервер, все работает. Добавил новый влан на свитч, в админке ДХЦП сервера, прописал этот влан, прописал маршруты, прописал в клиентах на 1 порт новый влан, клиент запрос шлет, сервер его видит, отправляет, и на этом все заканчивается.

 

Где косяк может быть?

 

 

П.С. Странно, вчера не работало, сегодня еще раз попробовал, пошло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все таки не работает.

 

Попробовал на свитче прям включить релей, вот что видит ДХЦП сервер:

15:52:43.011381 IP (tos 0x0, ttl 255, id 12222, offset 0, flags [none], proto UDP (17), length 334)
   10.10.10.224.bootpc > 10.10.10.50.bootps: [udp sum ok] BOOTP/DHCP, Request from a8:20:66:2a:45:8f (oui Unknown), length 306, hops 1, xid 0xf4487abe, secs 61, Flags [none] (0x0000)
         Gateway-IP 10.10.10.224
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Discover
           Parameter-Request Option 55, length 9:
             Subnet-Mask, Default-Gateway, Domain-Name-Server, Domain-Name
             Option 119, LDAP, Option 252, Netbios-Name-Server
             Netbios-Node
           MSZ Option 57, length 2: 1500
           Client-ID Option 61, length 7: ether a8:20:66:2a:45:8f
           Lease-Time Option 51, length 4: 7776000
           Hostname Option 12, length 10: "MBP-Dima-2"
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0
15:52:43.016069 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 341)
   10.10.10.50.bootps > 10.10.10.224.bootps: [bad udp cksum f29e!] BOOTP/DHCP, Reply, length 313, xid 0xf4487abe, secs 61, Flags [none] (0x0000)
         Gateway-IP 10.10.10.224
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Offer
           Server-ID Option 54, length 4: 10.10.10.50
           Lease-Time Option 51, length 4: 84600
           RN Option 58, length 4: 42300
           RB Option 59, length 4: 74025
           Subnet-Mask Option 1, length 4: 255.255.255.0
           Default-Gateway Option 3, length 4: 172.20.25.254
           Domain-Name-Server Option 6, length 8: 10.10.10.1,10.10.10.2
           Netbios-Node Option 46, length 1: h-node
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0

 

вот как это выглядит если релеит то что все релеит :)

 

15:55:20.713824 IP (tos 0x0, ttl 64, id 38340, offset 0, flags [none], proto UDP (17), length 334)
   10.10.10.254.bootps > 10.10.10.50.bootps: [udp sum ok] BOOTP/DHCP, Request from a8:20:66:2a:45:8f (oui Unknown), length 306, hops 1, xid 0xf4487ac0, secs 51, Flags [none] (0x0000)
         Gateway-IP 172.20.25.254
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Discover
           Parameter-Request Option 55, length 9:
             Subnet-Mask, Default-Gateway, Domain-Name-Server, Domain-Name
             Option 119, LDAP, Option 252, Netbios-Name-Server
             Netbios-Node
           MSZ Option 57, length 2: 1500
           Client-ID Option 61, length 7: ether a8:20:66:2a:45:8f
           Lease-Time Option 51, length 4: 7776000
           Hostname Option 12, length 10: "MBP-Dima-2"
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0
15:55:20.718029 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 341)
   10.10.10.50.bootps > 172.20.25.254.bootps: [bad udp cksum 808b!] BOOTP/DHCP, Reply, length 313, xid 0xf4487ac0, secs 51, Flags [none] (0x0000)
         Gateway-IP 172.20.25.254
         Client-Ethernet-Address a8:20:66:2a:45:8f (oui Unknown)
         Vendor-rfc1048 Extensions
           Magic Cookie 0x63825363
           DHCP-Message Option 53, length 1: Offer
           Server-ID Option 54, length 4: 10.10.10.50
           Lease-Time Option 51, length 4: 84600
           RN Option 58, length 4: 42300
           RB Option 59, length 4: 74025
           Subnet-Mask Option 1, length 4: 255.255.255.0
           Default-Gateway Option 3, length 4: 172.20.25.254
           Domain-Name-Server Option 6, length 8: 10.10.10.1,10.10.10.2
           Netbios-Node Option 46, length 1: h-node
           Agent-Information Option 82, length 18:
             Circuit-ID SubOption 1, length 6: ^@^D^@M-a^A^A
             Remote-ID SubOption 2, length 8: ^@^FprM-O==w
           END Option 255, length 0

 

Сейчас задампил клиента, посмотрю что там, но клиент не получает ответ сервера... Что не так делаю? Свитч прописан в базе, расположение, клиенты...

 

На клиенте, по дампу видно, что клиент DHCP DISCOVER шлет, но ответа не получает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может udp check sum в системе на сервере отключено и релей такие пакеты дропает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У вас в логе выше видно что контрольная сумма у некоторых пакетов совсем не та.

Нужно или совсем выключать проверку и генерацию или делать чтобы она правильной была.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

если Вы про [bad udp cksum 808b!] то такое пишется и на работающих домах...

 

10.10.10.50.bootps > 172.20.19.254.bootps: [bad udp cksum 46f6!]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

лог с абонентского ПК

http://yadi.sk/d/VJKpBv6lKcFHB

Почему то один и тот же ВЛАН на 1 свитче запускается, на другом не хочет.

Дискавер уходит от клиента, офер приходит, и на этом заканчивается.

пробую на одном и том же свитче, два разных влана.

Настроил 1, проверил, все работает (задал расположение в нем выбрал свитч этот)

Пробую неработающее расположение (выбираю рабочий свитч). Не идет....

 

Пересоздал расположение, все заработало.... Странно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

День добрый Иван!

а реализация скрипта для работы с IPv6 запросами у вас есть?

 

хотелось бы параллельно с в4 и в6 раздавать ( айпи на клиента + делегировать ему подсеть )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нету.

Когда я последний раз смотрел то класса для ипв6 не было, а писать его самому не было мотивации.

Технически там ничего сложного нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

отпишу по своей проблеме, так и не нашел (с дебагом) почему не выдает ИП. Единственное что сыпет (в дебаг)

Argument "172.20.3.40" isn't numeric in numeric ne (!=) at /lib/dhcp-perl/dhcpd.pl line 1075.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Смотрите внимательнее на тот код который вы дописывали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну я не до такой степени вносил изменения...а в той строке

$client_ip = $_[1]->ciaddr;

$gateway_ip = $_[1]->giaddr;

if (defined($_[1]->getOptionRaw(DHO_DHCP_CLIENT_IDENTIFIER()))) {

$client_ident = BuffToHEX($_[1]->getOptionRaw(DHO_DHCP_CLIENT_IDENTIFIER()));

}else{

$client_ident = '';

}

if (defined($_[1]->getOptionRaw(DHO_DHCP_REQUESTED_ADDRESS()))) {

$requested_ip = $_[1]->getOptionValue(DHO_DHCP_REQUESTED_ADDRESS());

}else{

if ($client_ip!="") {

$requested_ip = $client_ip;

}

else {

$requested_ip = '';

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Могу подсказать по общей логике и по дхцп в частности.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

может подскажите, где посмотреть, почему у меня создав расположение и клиентов, сервер видит запрос и отправляет оффер и на этом заканчивается обмен. Удалив и создав заново расположение, все работает нормально.

 

П.С. Сам в перле не очень :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

if ($client_ip!="")	{
$requested_ip = $client_ip;
}
else {
$requested_ip = '';
}

заменить на

$requested_ip = '';
$requested_ip = $client_ip if ($client_ip ne "");

Изменено пользователем pppoetest

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем привет.

Хочу поднять тему про пул адресов, хочу поставить вифи точку фрии, чтоб раздавало адреса из пула.

И еще вопрос, иногда бывает конфликт ИП адресов, в лог в теории должно попадать DHCPDecline, но ничего такого нет, можно как то решить?

 

 

П.С. Доната нет? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Там для записи decline есть отдельная функция: db_lease_decline - добавляйте туда какой угодно запрос к базе.

Денег, давайте :)

Яндекс кошелёк: 410011898378762

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подскажите, по силам данному скрипту решить такую проблему? http://forum.nag.ru/forum/index.php?showtopic=95051

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подскажите по правильности db_lease_decline

В теории хочу просто видеть в логах, где произошел конфликт ИП.

 

sub db_lease_decline {

#my $dbh = $_[0];

#my $dhcpreq = $_[1];

return(0);

my ($mac, $sth);

my ($dhcp_opt82_vlan_id, $dhcp_opt82_unit_id, $dhcp_opt82_port_id, $dhcp_opt82_chasis_id);

my ($client_ip, $gateway_ip, $client_ident, $requested_ip, $hostname, $dhcp_vendor_class, $dhcp_user_class);

my ($message_type);

 

$message_type = $_[1]->getOptionValue(DHO_DHCP_MESSAGE_TYPE());

 

# change hw addr format

$mac = FormatMAC(substr($_[1]->chaddr(), 0, (2 * $_[1]->hlen())));

 

$sth = $_[0]->prepare("");

 

$sth = $_[0]->prepare("INSERT INTO `log_dhcp`

(`t`, `agent_mac`, `agent_ip`, `cl_mac`, `cl_ip`, `cl_port`, `cl_vlan`, `cl_name`, `cl_vendor`, `m_type`)

VALUES(NOW(), '$dhcp_opt82_chasis_id', '$gateway_ip', '$mac', '$requested_ip', '$dhcp_opt82_port_id', '$dhcp_opt82_vlan_id', '$hostname', '$dhcp_vendor_class', $message_type)

");

 

if ($DEBUG > 1) { logger("INSERT INTO `log_dhcp`

(`t`, `agent_mac`, `agent_ip`, `cl_mac`, `cl_ip`, `cl_port`, `cl_vlan`, `cl_name`, `cl_vendor`, `m_type`)

VALUES(NOW(), '$dhcp_opt82_chasis_id', '$gateway_ip', '$mac', '$requested_ip', '$dhcp_opt82_port_id', '$dhcp_opt82_vlan_id', '$hostname', '$dhcp_vendor_class', $message_type)

") }

 

$sth->execute();

$sth->finish();

 

return(0);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.