LinuxForum.Fans
Тема

Парсинг dhcpd.leases

Автор: pashtet51 9 сообщений 2913 просмотров
#222441

Доброго времени суток!

Система Debian Lenny 5.0, DHCP Server V3.1.1

Нужда заставила поковыряться в dhcpd.leases и выцарапать оттуда айпишник и имя компа. И все бы хорошо, но это дело нужно записать в файл для дальнейшего его использования в lightsquid'е.
Да и не просто записать, а сделать соответствие ip и имени в одну строку.

Кусок из файла dhcpd.leases:

text

lease 192.168.2.12 {
  starts 2 2012/01/17 03:49:16;
  ends 3 2012/01/18 03:49:16;
  tstp 3 2012/01/18 03:49:16;
  cltt 2 2012/01/17 03:49:16;
  binding state active;
  next binding state free;
  hardware ethernet 00:xx:xx:xx:xx:35;
  uid "\001\000\035\222,\2435";
  client-hostname "user-pc";

Как это дело можно реализовать?

#222468
pashtet51 написал:
Нашел здесь же на форуме скрипт на перле: http://linuxforum.ru/viewtopic.php?pid=187230#p187230

Но результата нет. Тишина...

Из той же темы:

text
awk '$1 =="lease" || $1 =="client-hostname" {print}'  /var/lib/dhcp3/dhcpd.leases 

Результат:

text

lease 192.168.2.14 {
  client-hostname "user-pc";

Как бы это все дело причесать в вид:

text

192.168.2.14 user-pc

?

#222471

pashtet51, сразу предупреждаю, я не программист :o
Это только образец скрипта, а не полностью рабочий скрипт.

Показать

test.sh
text

#!/bin/bash
LOG=${1}
IP=$(awk '/lease/ {print $2}' ${LOG})
NAME=$(awk -F '"' '/client/ {print $2}' ${LOG})
echo ${IP} ${NAME}

[console]
lupo@gentoo-laptop /tmp % ./test.sh test.txt
192.168.2.12 user-pc
[/console]

P.S. Покажите кусок файла по-больше.

#222507

Lupo Alberto,

Сколько угодно:) :

Показать
text

lease 192.168.2.15 {
  starts 2 2012/01/17 03:49:16;
  ends 3 2012/01/18 03:49:16;
  tstp 3 2012/01/18 03:49:16;
  cltt 2 2012/01/17 03:49:16;
  binding state active;
  next binding state free;
  hardware ethernet 1e:xx:xx:xx:xx:rf;
  uid "\001\000\035\222,\2435";
  client-hostname "admin";

lease 192.168.2.23 { starts 2 2012/01/17 03:49:16; ends 3 2012/01/18 03:49:16; tstp 3 2012/01/18 03:49:16; cltt 2 2012/01/17 03:49:16; binding state active; next binding state free; hardware ethernet 04:xx:xx:xx:xx:е4; uid "\001\000\035\222,\2435"; client-hostname "user-pc2";

lease 192.168.2.42 { starts 2 2012/01/17 03:49:16; ends 3 2012/01/18 03:49:16; tstp 3 2012/01/18 03:49:16; cltt 2 2012/01/17 03:49:16; binding state active; next binding state free; hardware ethernet 01:xx:xx:xx:xx:а3; uid "\001\000\035\222 client-hostname "user-pc3";

Спасибо за скрипт! То что нужно! Завтра подправлю под себя, чтоб еще и столбцами выводил :)

Kettler

Сам удивился!:)

#222519
pashtet51 написал:
Спасибо за скрипт!

Не за что, там пилить и пилить — он работает только с отдельной записью :(

#222535

Нашол косяк лови. У тебя просто Bind не прикручен к DHCP
Ваш случай.

text

#!/usr/bin/perl
open(InFile, "/var/log/dhcpd.leases") || die;
while ($line = <InFile>)
{
($n1, $n2, $n3, $n4) = split (" ", $line);
        if ($n1 eq "lease")
        {
        $ip=$n2;
        }
        if ($n1 eq "starts")
        {
        $sdate=$n3;
        }
        if ($n1 eq "ends")
        {
        $edate=$n3;
        }
        if ($n1 eq "hardware")
        {
        $mak=$n3;
        }
        if ($n1 eq "client-hostname")
        {
        $name=$n2;
        }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "") { chop ($mak); chop ($name); $lenname = length ($name); $n = substr ($name, "1" , $len-2); print $ip , " ", $sdate, " ", $edate, " ", $mak, " ", $n, " ", "\n"; $sdate=""; $edate=""; $mak=""; $name=""; $n=""; $lenname=""; } } close ( InFile );

Выхлоп

172.16.0.62 2012/01/17 2012/01/17 6c:f0:xxx:xxx:xxx:xxx computer-ee99a

#222574

Lupo Alberto,

Работает он правильно, но выводит данные в строку вида:

[console]
192.168.2.15 192.168.2.42 192.168.2.42 admin user-pc2 user-pc3
[/console]

Допилить осталось до вида:

[console]
192.168.2.15 admin
192.168.2.42 user-pc2
192.168.2.42 user-pc3
[/console]
Но это мелочи:)

Kettler,

Да, теперь заработал.
Плюс твоего скрипта - выводит инфу только по активным адресам.
У Lupo Alberto вывод идет по всем айпишникам (как активным, так и не очень), что тоже может где-нибудь пригодиться:)

В любом случае - спасибо обоим!:)

Войдите или зарегистрируйтесь, чтобы ответить.