Необходимо запускать некий скрипт при каждой раздаче IP адреса юзерам, и при этом знать все параметны, которые dhcp сервер им передает(ну хотяб МАС и IP).
Это вообще можно как-нибудь сделать?
Погуглил, ни чего не нарыл :(
может быть как можно в реалтайме отслеживать изменение dhcpd.leasses ?p.s.
FreeBSD 6.4
DHCPd 4.1.0
Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
как это сделать?:)
>Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
>как это сделать?:)Штатными средствами: on commit, on release, on expiry. Есть в последних версиях.
>>Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
>>как это сделать?:)
>
>Штатными средствами: on commit, on release, on expiry. Есть в последних версиях.
>Ага, но есть одна маленькая проблема :)
Не происходит ни каких действий при освобождении IP адреса :(
А именно если освобождение адреса происходит не по инициативе клиента, а по окончанию аренды(ну если выдернуть провод и подождать)Пробовал на Dhcpd 3.1.2 и 4.1.0
>>Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
>>как это сделать?:)
>
>Штатными средствами: on commit, on release, on expiry. Есть в последних версиях.
>Ага, но есть одна маленькая проблема :)
Не происходит ни каких действий при освобождении IP адреса :(
А именно если освобождение адреса происходит не по инициативе клиента, а по окончанию аренда(ну если выдернуть провод и подождать)Пробовал на Dhcpd 3.1.2 и 4.1.0
>Необходимо запускать некий скрипт при каждой раздаче IP адреса юзерам, и при
>этом знать все параметны, которые dhcp сервер им передает(ну хотяб МАС
>и IP).
>Это вообще можно как-нибудь сделать?
>Погуглил, ни чего не нарыл :(
>может быть как можно в реалтайме отслеживать изменение dhcpd.leasses ?
>
>p.s.
>FreeBSD 6.4
>DHCPd 4.1.0Вот скрипт, который генерит html страницу, добавь в крон, и запусти апач. Будет тебе счастье.
#
# dhcp.awk
#
# awk -f dhcp.awk < /var/db/dhcpd.leases
#
# dhcpd leases to html done in AWK
# Copyright (C) 2005 Juan J. Martнnez <reidrac*at*blackshell.usebox.net>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
BEGIN {
printf("<html>\n<head>\n<title>DHCP leases</title>\
<style type=\"text/css\">\
table { border: 1px solid #eee; width: 100%% }\
.header { background-color: #aaa; font-weight: bold }\
.data0 { background-color: #fff }\
.data1 { background-color: #eee }\
</style>\
</head>\n<body>\n");
printf("<h1>DHCP leases</h2>\n");
lease=0;
header=0;
fields=0;
data=0;
}lease==0 && /lease\ [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\ {/ {
lease=1;
if (header==0)
{
printf("<table class=\"table\">\
<tr class=\"header\">\
<td>IP</td>\n<td>Start</td>\n<td>End</td>\
<td>MAC Addr.</td>\n<td>Hostname</td>\n</tr>\n");
header=1;
}
if (data==0)
{
printf("<tr class=\"data0\">\n");
data=1;
}
else
{
printf("<tr class=\"data1\">\n");
data=0;
}
printf("<td>%s</td>\n", $2);
fields++;
}lease==1 && /starts\ [^;]*;/ {
sub(";", "", $4);
printf("<td>%s %s</td>\n", $3, $4);
fields++;
}lease==1 && /ends\ [^;]*;/ {
sub(";", "", $4);
printf("<td>%s %s</td>\n", $3, $4);
fields++;
}lease==1 && /hardware\ ethernet\ [^;]*;/ {
sub(";", "", $3);
printf("<td>%s</td>\n", $3);
fields++;
}
lease==1 && /client-hostname\ [^;]*;/ {
gsub(";", "", $2);
printf("<td>%s</td>\n", $2);
fields++;
}lease==1 && /}/ {
lease=0;
for(i=0;i<5-fields;i++)
printf("<td> </td>\n");
fields=0;
printf("</tr>\n");
}END {
if (header==0)
{
printf("<p>There are no leases</p>\n");
}
else
{
printf("</table>\n");
}printf("</body>\n</html>\n");
}
>Вот скрипт, который генерит html страницу, добавь в крон, и запусти апач.
>Будет тебе счастье.нет, через крон не подойдет.
неужеле в dhcpd не предусмотрено: как то объяснить внешним программам кому и что он раздает?
>>Вот скрипт, который генерит html страницу, добавь в крон, и запусти апач.
>>Будет тебе счастье.
>
>нет, через крон не подойдет.
>неужеле в dhcpd не предусмотрено: как то объяснить внешним программам кому и
>что он раздает?Логирование настроить демону и парсить лог скриптом ?
Jan 30 23:19:31 gw dhcpd: ------------------------------------------------------------------------------
Jan 30 23:19:31 gw dhcpd: Lease for 10.10.100.7
Jan 30 23:19:31 gw dhcpd: Vendor MSFT 98
Jan 30 23:19:31 gw dhcpd: DHCPREQUEST for 10.10.100.7 from 00:11:95:7e:7a:7f (my home) via le2
Jan 30 23:19:31 gw dhcpd: DHCPACK on 10.10.100.7 to 00:11:95:7e:7a:7f (my home) via le2
Jan 30 23:20:42 gw dhcpd: ------------------------------------------------------------------------------
Jan 30 23:20:42 gw dhcpd: Lease for 10.10.100.4
Jan 30 23:20:42 gw dhcpd: DHCPREQUEST for 10.10.100.4 from 00:18:f3:06:b1:8c (home-desktop) via le2
Jan 30 23:20:42 gw dhcpd: DHCPACK on 10.10.100.4 to 00:18:f3:06:b1:8c (home-desktop) via le2
Jan 30 23:21:55 gw dhcpd: ------------------------------------------------------------------------------
>[оверквотинг удален]
>via le2
>Jan 30 23:19:31 gw dhcpd: DHCPACK on 10.10.100.7 to 00:11:95:7e:7a:7f (my home)
>via le2
>Jan 30 23:20:42 gw dhcpd: ------------------------------------------------------------------------------
>Jan 30 23:20:42 gw dhcpd: Lease for 10.10.100.4
>Jan 30 23:20:42 gw dhcpd: DHCPREQUEST for 10.10.100.4 from 00:18:f3:06:b1:8c (home-desktop) via
>le2
>Jan 30 23:20:42 gw dhcpd: DHCPACK on 10.10.100.4 to 00:18:f3:06:b1:8c (home-desktop) via
>le2
>Jan 30 23:21:55 gw dhcpd: ------------------------------------------------------------------------------А каким образом парсить лог?
Можно пример?
>[оверквотинг удален]
>>Jan 30 23:20:42 gw dhcpd: ------------------------------------------------------------------------------
>>Jan 30 23:20:42 gw dhcpd: Lease for 10.10.100.4
>>Jan 30 23:20:42 gw dhcpd: DHCPREQUEST for 10.10.100.4 from 00:18:f3:06:b1:8c (home-desktop) via
>>le2
>>Jan 30 23:20:42 gw dhcpd: DHCPACK on 10.10.100.4 to 00:18:f3:06:b1:8c (home-desktop) via
>>le2
>>Jan 30 23:21:55 gw dhcpd: ------------------------------------------------------------------------------
>
>А каким образом парсить лог?
>Можно пример?както так:
tail -f /var/log/dhcpd.log | grep (regexp)
и еще куча разных вариантов как вынуть из файла нужную инфу.
>[оверквотинг удален]
>via le2
>Jan 30 23:19:31 gw dhcpd: DHCPACK on 10.10.100.7 to 00:11:95:7e:7a:7f (my home)
>via le2
>Jan 30 23:20:42 gw dhcpd: ------------------------------------------------------------------------------
>Jan 30 23:20:42 gw dhcpd: Lease for 10.10.100.4
>Jan 30 23:20:42 gw dhcpd: DHCPREQUEST for 10.10.100.4 from 00:18:f3:06:b1:8c (home-desktop) via
>le2
>Jan 30 23:20:42 gw dhcpd: DHCPACK on 10.10.100.4 to 00:18:f3:06:b1:8c (home-desktop) via
>le2
>Jan 30 23:21:55 gw dhcpd: ------------------------------------------------------------------------------я бы еще глянул в сторону syslogd. возможно, как-то так:
/etc/syslog.conf!dhcpd
*.notice | /usr/local/bin/dhcp-log-parserвсе логи dhcpd будут перенаправляться предварительно написанному парсеру
Да фигня все это!
Всего то нада было подправить исходник и все делов :-Р
сейчас у меня запускается скрипт при каждом добавлении записи в dhcpd.leases, и при этом скрипту передаются все те параметры, которые мне необходимы :-Р
server/db.c функция int write_lease
выложите на этот сайт как совет, может кому пригодится
>выложите на этот сайт как совет, может кому пригодитсяправим исходник server/db.h
находим функуию "write_lease"
в конец функции, перед "return !errors;" добавляем:
//------------------------------------------------------------------------------------------------------------------------------char stat[30];
memset(stat,0,30);
char ip[30];
memset(ip,0,30);
char mac[30];
memset(mac,0,30);if (lease -> binding_state > 0 && lease -> binding_state <= FTS_LAST)
{
memcpy(stat,binding_state_names [lease -> binding_state - 1],strlen(binding_state_names [lease -> binding_state - 1]));
if (lease -> hardware_addr.hlen)
{
memcpy(mac,print_hw_addr (lease -> hardware_addr.hbuf [0],lease -> hardware_addr.hlen - 1,&lease -> hardware_addr.hbuf [1]),strlen(print_hw_addr (lease -> hardware_addr.hbuf [0],lease -> hardware_addr.hlen - 1,&lease -> hardware_addr.hbuf [1])));
memcpy(ip,piaddr (lease -> ip_addr),strlen(piaddr (lease -> ip_addr)));char par[200];
memset(par,0,200);
sprintf(par,"/etc/dhcpd.script %s %s %s",stat,ip,mac);
system(par);
}
}//------------------------------------------------------------------------------------------------------------------------------
В итоге получаем запуск скрипта /etc/dhcpd.script с параметрами: статус(free или active), ip, mac, при каждом изменении dhcpd.leases
Скрипт запускается только тогда, когда статус либо free, либо active и когда присутвует mac, что и необходимо для учета получения и освобождения IP адреса.
Если наши советы "фигня это все", то нечего спрашивать. Терпеть не могу людей, которые не уважают других.P.S. По теме: ddns
>Если наши советы "фигня это все", то нечего спрашивать. Терпеть не могу
>людей, которые не уважают других.
>
>P.S. По теме: ddnsубейсебяопстену ;)
были бы дельные советы... и отношение былобы соответсвующее.
а если незнаешь что посоветоваль, лучше молчи и свое мнение оставь при себе.
P.S. тема про ddns ни скакого боку не поможет решить поставленную задачу, умри...з.ы. хочешь, чтото сделать, сделай это сам ;)
Огромнейшее спасибо за скрипт :)