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 Кармы не хватает.
А так ваше решение тоже хорошее,
PS Кармы не хватает.
В моем подходе очевидный плос в том, что он вообще не грузит LDAP сервер т.к. операция поиска происходит один раз.
А в твоем случае — LDAP запрос (вызов функции ip2name) идет для каждой(!!!) строчки в логах:
Вот за вчера у меня в нашей относительно небольшой конторе было:
~1.7 миллиона строк, и столько раз лайтсквид бы дёргал контроллеры домена.
А в твоем случае — LDAP запрос (вызов функции ip2name) идет для каждой(!!!) строчки в логах:
while (<FF>) {
...
$user = Ip2Name($Lhost,$user,$Ltimestamp);
...
}
Вот за вчера у меня в нашей относительно небольшой конторе было:
# xzcat access.log-20140624.xz | wc -l
1691991
~1.7 миллиона строк, и столько раз лайтсквид бы дёргал контроллеры домена.
Вариант предложенный автором более правильный чем генерация конфигов по крону ;)
так и задумывалось.
именно для этой цели ip2name и был введен.
Это я как автор говорю.
так и задумывалось.
именно для этой цели ip2name и был введен.
Это я как автор говорю.
Ну, это с какой стороны посмотреть :) Если кешировать в StartIp2Name() — то да, разницы в общем и целом никакой.
Но в том виде, в котором оно в статье — адский ад домен-контроллера :)
Но в том виде, в котором оно в статье — адский ад домен-контроллера :)
как нескромный автор lightsquid — рекомендую
в ip2name 3 функции
в StartIp2Name — вынести бинд к LDAP, зачем его каждый раз открывать, на каждую запись
сюда же инициализацию кеша
в StopIp2Name — закрытие коннекшена
в самом ip2name
проверить есть ли в хеше, если нет, запрашиваем LDAP и складываем в хеш
возвращаем значение из хеша
в ip2name 3 функции
в StartIp2Name — вынести бинд к LDAP, зачем его каждый раз открывать, на каждую запись
сюда же инициализацию кеша
в StopIp2Name — закрытие коннекшена
в самом ip2name
проверить есть ли в хеше, если нет, запрашиваем LDAP и складываем в хеш
возвращаем значение из хеша
Обнаружилась ошибка — если в момент захода в интернет контроллёр домена недоступен, то в журнал Squid попадает не логин AD, а IP-адрес пользователя. В результате в функции Ip2Name LDAP-запрос возвращает пустое значение по IP, и на пустой ссылке вызывается метод get_value, затем скрипт зависает. Исправлено проверкой, определена ли $first_entry (см. листинг).
Sign up to leave a comment.
Автоматический импорт ФИО пользователей из Active Directory в Lightsquid