LinuxForum.Fans
Тема

Парсинг dhcpd.leases для sarg

Автор: u________________7 9 сообщений 2662 просмотров
#344759

Добрый день!
Помогите, подскажите как написать следующий скрипт. Я в Perl'е новичек.

Имеем: Сервер Ubuntu 12.04, как шлюз интернет. На нем - Сервер DHCP, Прокси-сервер Squid, SquidGuard и SARG. Пользователи ходят в инет без всяких авторизаций. SARG генерит отчеты, кто и куда ходил. Но вместо имен компьютеров в отчете IP адреса. SARG умеет разрешать имена хостов из адресов, но для этого ему надо файл формата IP:host_name.

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

text
#!/usr/bin/perl
open(InFile, "/var/lib/dhcp/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 ($n2 eq "ddns-fwd-name")
        {
        $name=$n4;
        }

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 );

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

#344760
text

$ ./script.pl >> out.txt

Если по-простому.
UPD.

"Ромашов Дмитрий" написал:
исключение повторяющихся записей

А, этот момент упустил...

#344762
-=Serj=- написал:
text

$ ./script.pl >> out.txt

Если по-простому.
UPD. [quote="Ромашов Дмитрий"]исключение повторяющихся записей

А, этот момент упустил...[/quote]

Это просто. И есть один недостаток, он дописывает массив в конец файла.

#344763

Ромашов Дмитрий, в вашем случае, как мне кажется, можно обойтись sed'ом.

#344764
-=Serj=- написал:
Ромашов Дмитрий, в вашем случае, как мне кажется, можно обойтись sed'ом.

Хм... Наверно... Это всего лишь попытка доработать решение, которое есть... Покопаю sed

UDP
Казалось, что есть рабочий вариант и его немного нужно "допилить"...

#344766
"Ромашов Дмитрий" написал:
Казалось, что есть рабочий вариант и его немного нужно "допилить"...

Ну, если вы знаете perl.. Я его не знаю)

#344767
-=Serj=- написал:
[quote="Ромашов Дмитрий"]Казалось, что есть рабочий вариант и его немного нужно "допилить"...

Ну, если вы знаете perl.. Я его не знаю)[/quote]
А если советуете sed, то может не нем что-то сгенерите?) Для затравки)

UDP
Кстати, если делать так

text
$ ./script.pl > out.txt

, а не

text
$ ./script.pl >> out.txt

то файл перезаписывается, а не дописывается вроде...

#344835

очень на быструю руку

text
#!/usr/bin/perl
$test = "0";
open(InFile, "/home/user/in.bd") || die;
open(OutFile, ">/home/user/out.bd") || 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 ($n2 eq "ddns-fwd-name") { $name=$n4; }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "") { chop ($mak); chop ($name); $lenname = length ($name); $n = substr ($name, "1" , $len-2); $test++; $line = "$ip $sdate $edate $mak $n \n"; @data[$test] = ($line);

$sdate=""; $edate=""; $mak=""; $name=""; $n=""; $lenname=""; } } close ( InFile );

foreach $item (@data) { $seen{$item}++; } @uniq = sort keys %seen;

foreach $lline (@uniq) { print OutFile $lline ; } close (OutFile);

#345062
Kettler написал:
очень на быструю руку
Показать
text
#!/usr/bin/perl
$test = "0";
open(InFile, "/home/user/in.bd") || die;
open(OutFile, ">/home/user/out.bd") || 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 ($n2 eq "ddns-fwd-name") { $name=$n4; }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "") { chop ($mak); chop ($name); $lenname = length ($name); $n = substr ($name, "1" , $len-2); $test++; $line = "$ip $sdate $edate $mak $n \n"; @data[$test] = ($line);

$sdate=""; $edate=""; $mak=""; $name=""; $n=""; $lenname=""; } } close ( InFile );

foreach $item (@data) { $seen{$item}++; } @uniq = sort keys %seen;

foreach $lline (@uniq) { print OutFile $lline ; } close (OutFile);

Спасибо за желание помочь!)
OutFile пустой... Пытаюсь разобраться...

UDP Разобрался, допилил. Результат вот.

Показать
#!/usr/bin/perl
$test = "0";
open(InFile, "/var/lib/dhcp/dhcpd.leases") || die;
open(OutFile, ">/etc/sarg/usertab") || 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-1);
$test++;
$line = "$ip $n \n";
@data[$test] = ($line);

$sdate="";
$edate="";
$mak="";
$name="";
$n="";
$lenname="";
}
}
close ( InFile );

foreach $item (@data)
{
$seen{$item}++;
}
@uniq = sort keys %seen;

foreach $lline (@uniq)
{
print OutFile $lline ;
}
close (OutFile);

Вариант польностью рабочий для SARG'а. Может кому пригодится.
Большое спасибо!!!

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