Pull to refresh

Comments 11

Так эта, в lightsquid есть штатные realname.cfg и group.cfg

Я их скриптом просто генерирую несколько раз в стуки перед запуском парсера лайтсквида и всё, зачем лезть в код?

#!/usr/bin/perl -wT

use Net::LDAP;
use Encode qw(from_to);

my $prefix = '/var/www/stats';
my $users = $prefix.'/realname.cfg';
my $groups = $prefix.'/group.cfg';

my $ldap = Net::LDAP->new('ldap://dc.domain.ru') or die "$@";
my $result = $ldap->bind('CN=user,CN=Users,DC=domain,DC=ru', 'password' => 'xxxxx');

if($result->code) {
    die 'Bind failed!\n';
}

$result = $ldap->search(
    'base'   => 'OU=Пользователи,DC=domain,DC=ru',
    'filter' => '(&(objectClass=user)(!(UserAccountControl=66050)))',
    'scope'  => 'sub',
    'attrs'  => [ 'cn', 'sAMAccountName', 'Department' ]
);

if($result->entries <= 0) {
    die "Found no users\n";
}

my %groups = ();

open(OUT, '>' . $users);
foreach my $entry ($result->entries) {
    my $name = $entry->get_value('cn');
    my $login = lc($entry->get_value('sAMAccountName'));
    my $dept = $entry->get_value('Department');

    if(defined $dept) {
        $groups{$dept}{$login} = 1;
    }

    print OUT $login . "\t" . $name . "\n";
}
close(OUT);

my $i = 1;
open(OUT, '>' . $groups);
foreach my $group (sort keys %groups) {
    foreach my $login (sort keys %{$groups{$group}} ) {
        my $num = sprintf("%02d", $i);
        print OUT $login . "\t" . $num . "\t" . $group . "\n";
    }
    $i++;
}
close(OUT);

В общем-то у меня тоже была мысль через cron генерировать содержимое конфига Lightsquid, но честно, поленился. Подумал, что результат что так что так будет одинаковый.
А так ваше решение тоже хорошее, плюсую.
PS Кармы не хватает.
В моем подходе очевидный плос в том, что он вообще не грузит LDAP сервер т.к. операция поиска происходит один раз.

А в твоем случае — LDAP запрос (вызов функции ip2name) идет для каждой(!!!) строчки в логах:
while (<FF>) {
...
$user = Ip2Name($Lhost,$user,$Ltimestamp);
...
}


Вот за вчера у меня в нашей относительно небольшой конторе было:
# xzcat access.log-20140624.xz | wc -l
1691991

~1.7 миллиона строк, и столько раз лайтсквид бы дёргал контроллеры домена.
Простейшее кеширование рещаеть на раз проблемму 1691991 строк ;)
там в других ip2name есть примеры.
Вариант предложенный автором более правильный чем генерация конфигов по крону ;)
так и задумывалось.
именно для этой цели ip2name и был введен.

Это я как автор говорю.
Ну, это с какой стороны посмотреть :) Если кешировать в StartIp2Name() — то да, разницы в общем и целом никакой.
Но в том виде, в котором оно в статье — адский ад домен-контроллера :)
добавить кеширвание — дело минут.

с другой стороны, запросы то легковесные, пусть микрософт работает ;)

еще раз повторюсь, путь с ip2name — это путь как раз правильный.

перегенерация конфигов — костыль.

как нескромный автор lightsquid — рекомендую

в ip2name 3 функции

в StartIp2Name — вынести бинд к LDAP, зачем его каждый раз открывать, на каждую запись
сюда же инициализацию кеша

в StopIp2Name — закрытие коннекшена

в самом ip2name
проверить есть ли в хеше, если нет, запрашиваем LDAP и складываем в хеш
возвращаем значение из хеша

выглядит правильно.

как-то повлияло на скорость?
Обнаружилась ошибка — если в момент захода в интернет контроллёр домена недоступен, то в журнал Squid попадает не логин AD, а IP-адрес пользователя. В результате в функции Ip2Name LDAP-запрос возвращает пустое значение по IP, и на пустой ссылке вызывается метод get_value, затем скрипт зависает. Исправлено проверкой, определена ли $first_entry (см. листинг).
Sign up to leave a comment.

Articles