URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 83892
[ Назад ]

Исходное сообщение
"isc-DHCPD, как узнать об аренде адресов?"

Отправлено Beavis , 30-Янв-09 21:04 
Необходимо запускать некий скрипт при каждой раздаче IP адреса юзерам, и при этом знать все параметны, которые dhcp сервер им передает(ну хотяб МАС и IP).
Это вообще можно как-нибудь сделать?
Погуглил, ни чего не нарыл :(
может быть как можно в реалтайме отслеживать изменение dhcpd.leasses ?

p.s.
FreeBSD 6.4
DHCPd 4.1.0


Содержание

Сообщения в этом обсуждении
"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 30-Янв-09 21:09 
Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
как это сделать?:)



"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Oleg Gawriloff , 17-Апр-09 12:12 
>Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
>как это сделать?:)

Штатными средствами: on commit, on release, on expiry. Есть в последних версиях.


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 12-Май-09 17:23 
>>Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
>>как это сделать?:)
>
>Штатными средствами: on commit, on release, on expiry. Есть в последних версиях.
>

Ага, но есть одна маленькая проблема :)
Не происходит ни каких действий при освобождении IP адреса :(
А именно если освобождение адреса происходит не по инициативе клиента, а по окончанию аренды(ну если выдернуть провод и подождать)

Пробовал на Dhcpd 3.1.2 и 4.1.0


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 12-Май-09 17:24 
>>Вообще нужно запускать скрипт при каждом изменении dhcpd.leasses
>>как это сделать?:)
>
>Штатными средствами: on commit, on release, on expiry. Есть в последних версиях.
>

Ага, но есть одна маленькая проблема :)
Не происходит ни каких действий при освобождении IP адреса :(
А именно если освобождение адреса происходит не по инициативе клиента, а по окончанию аренда(ну если выдернуть провод и подождать)

Пробовал на Dhcpd 3.1.2 и 4.1.0


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено aescook , 30-Янв-09 21:28 
>Необходимо запускать некий скрипт при каждой раздаче 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");
}


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 30-Янв-09 21:46 
>Вот скрипт, который генерит html страницу, добавь в крон, и запусти апач.
>Будет тебе счастье.

нет, через крон не подойдет.
неужеле в dhcpd не предусмотрено: как то объяснить внешним программам кому и что он раздает?


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Ночной админ , 31-Янв-09 02:36 
>>Вот скрипт, который генерит 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: ------------------------------------------------------------------------------


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 31-Янв-09 10:56 
>[оверквотинг удален]
>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: ------------------------------------------------------------------------------

А каким образом парсить лог?
Можно пример?


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Ночной админ , 01-Фев-09 00:37 
>[оверквотинг удален]
>>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)
и еще куча разных вариантов как вынуть из файла нужную инфу.


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено svol , 02-Фев-09 12:42 
>[оверквотинг удален]
>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 будут перенаправляться предварительно написанному парсеру


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 03-Фев-09 22:24 
Да фигня все это!
Всего то нада было подправить исходник и все делов :-Р
сейчас у меня запускается скрипт при каждом добавлении записи в dhcpd.leases, и при этом скрипту передаются все те параметры, которые мне необходимы :-Р
server/db.c функция int write_lease

"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Vladin , 04-Фев-09 00:05 
выложите на этот сайт как совет, может кому пригодится

"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 04-Фев-09 19:18 
>выложите на этот сайт как совет, может кому пригодится

правим исходник 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 адреса.


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено SubGun , 04-Фев-09 10:59 
Если наши советы "фигня это все", то нечего спрашивать. Терпеть не могу людей, которые не уважают других.

P.S. По теме: ddns


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено Beavis , 04-Фев-09 19:07 
>Если наши советы "фигня это все", то нечего спрашивать. Терпеть не могу
>людей, которые не уважают других.
>
>P.S. По теме: ddns

убейсебяопстену ;)
были бы дельные советы... и отношение былобы соответсвующее.
а если незнаешь что посоветоваль, лучше молчи и свое мнение оставь при себе.
P.S. тема про ddns ни скакого боку не поможет решить поставленную задачу, умри...

з.ы. хочешь, чтото сделать, сделай это сам ;)


"isc-DHCPD, как узнать об аренде адресов?"
Отправлено luckyredhot , 10-Ноя-09 11:36 
Огромнейшее спасибо за скрипт :)