Обсуждение статьи тематического каталога: Миграция с postfix + Active directory + squirrelmail на zimbra (postfix activedirectory ldap zimbra mail groupware)Ссылка на текст статьи: http://www.opennet.me/base/net/postfix_active_dir.txt.html
автор, почему ты такой безграмотный? Читать невозможно :(
ладно придираться - это ещё неплохо. С запятыми беда, но остальное терпимо. Вообще очень хорошее дело - падонки научили людей ценить грамотное письмо.Автору, если читает -
вместо длиннющих индусско-китайских повторений
$givenname=$entry->get_value(givenname);
$sn=$entry->get_value(sn);
[...]
if (length($displayName)>0) {
$LDAP{$id}{displayName} = $displayName;
}
if (length($sn)) {
$LDAP{$id}{sn} = $sn;
}
[...]Следовало использовать подобную конструкцию:
my @attrs = qw'givenname sn displayName...';
foreach my $attr (@attrs) {
$value{$attr} = $entry->get_value($attr);
}[...]
foreach my $attr (@attrs) {
$LDAP{$id}{$attr} = $value{$attr} if (length($value{$attr}));
}
У кого нить данный скрипт запустился?
Вот тут пишут, что работает: http://community.livejournal.com/ru_zimbra/34298.html
Научил Зимбру взаимодействовать с procmail и использовать внутренний антивирь, дабы не иметь 2-х одинаковых процессов. Если интересно - могу выложить конфиги.
Полезная статья. Использовал при интеграции ZCS 7.0 с AD, но русские имена пользователей переносятся с крякозяблами. Если модифицировать так чтобы запускались команды
zmprov ca acc@domain attr "русские буквы"
zmprov ca acc@domain attr "русские буквы"
то все ок, но очень медленно инициализируется zmprov на каждую команду, хз что делать даже.
Ктонить поборол Русские буквы в именах пользователей7
только что опять занялся зимброй
вот обновил немного скрипт, тут можно несколько доменов вводить и побеждена проблема с кракозябрами. Помогла только загрузка через zmprov -fможет ещё что-то сломал или исправил
ps: насчёт индусско-китайских повторений только увидел, чуть позже попробую понять. я не програмист, просто решаю иногда свои локальные задачи
#!/usr/bin/perl
use Net::LDAP;
use utf8;
use Encode;
#my @domains=("domain1.ru","domain2.net","domain.su");
my @domains=("domain1.ru");
my $domain="";
my $zmprov="/opt/zimbra/bin/zmprov -l";my $AD_server="192.168.0.10";
my $AD_user="aduser\@ad_domain.local";
my $AD_pass="";
my $AD_base="dc=ad_domain,dc=local";
my $LDAP_server="192.168.0.240";
my $LDAP_user="uid=zimbra,cn=admins,cn=zimbra";
my $LDAP_pass="passw";my $LDAP_base="";
my $LDAP_ad_base="";
my @LDAP_bases;#=("dc=fild,dc=su","dc=sapsun,dc=su","dc=promexped,dc=ru");my %LDAP=(),╜=();
#генерим на основе списка доменов список для поиска и список баз
for ($i=0;$i<=$#domains;$i++) {
$AD_search=$AD_search."(mail=*\@@domains[$i])";
my @temp=split(/\./,@domains[$i]);
for ($j=0;$j<=$#temp;$j++) {
if (length(@LDAP_bases[$i])==0) {
@LDAP_bases[$i]="dc=@temp[$j]";
}else {
@LDAP_bases[$i]=@LDAP_bases[$i].",dc=@temp[$j]";
}
}
}
$AD_search="(|$AD_search)";print "AD_search=$AD_search\n";
print "LDAP_bases=\"@LDAP_bases\"\n";
my %LDAP=(),╜=();#----------AD
$ldap = Net::LDAP->new($AD_server);
$ldap->bind($AD_user, password=>$AD_pass);$mesg = $ldap->search(filter=>"(&(objectclass=user)$AD_search(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",
base=>$AD_base,
attrs=> ['sAMAccountName','displayName','sn', 'givenname', 'initials','department','description','userAccountControl','mail','company','telephoneNumber']);
@entries = $mesg->entries;
foreach $entry (@entries) {my $name,$sn,$mail,$department,$company,$sAMAccountName;
$id=$entry->get_value(sAMAccountName);
$id=lc($id);
$displayName=$entry->get_value(displayName);
$sn=$entry->get_value(sn);
# print "--$sn\n";
$givenname=$entry->get_value(givenname);
$initials=$entry->get_value(initials);
$department=$entry->get_value(department);
$description=$entry->get_value(description);
$userAccountControl=$entry->get_value(userAccountControl);
$mail=$entry->get_value(mail);
$mail=lc($mail);$telephoneNumber=$entry->get_value(telephoneNumber);
$company=$entry->get_value(company);
$disabled=false;
if (length($mail)>0) {
# print "AD MAIL=$mail\n";
# $i=index($mail,"\@");
$domain=substr($mail,index($mail,"\@")+1);
$AD{$id}{domain} = $domain;
$AD{$id}{mail} = $mail;}
if (length($displayName)>0) {
$AD{$id}{displayName} = $displayName;
}
if (length($sn)>0) {
$AD{$id}{sn} = $sn;
}
if (length($givenname)>0) {
$AD{$id}{givenname} = $givenname;
}
if (length($initials)>0) {
$AD{$id}{initials} = $initials;
}
if (length($description)>0) {
$AD{$id}{description} = $description;
}
if (length($disabled)>0) {
$AD{$id}{disabled} = $disabled;
}
if (length($telephoneNumber)>0) {
$AD{$id}{telephoneNumber} = $telephoneNumber;
}
if (length($company)>0) {
$AD{$id}{company} = $company;
}
}
#---------- zimbra ldapprint "\nZIMBRA\n";
$ldap2 = Net::LDAP->new($LDAP_server);
$ldap2->bind($LDAP_user, password=>$LDAP_pass);#прогоняем все почтовые домены
for ($i=0;$i<=$#LDAP_bases;$i++) {
$mesg = $ldap2->search(filter=>"(&(objectClass=zimbraAccount)(!(userPassword=*))(!(zimbraCalResType=*)))",
base=>@LDAP_bases[$i],
attrs=> ['uid', 'displayName','sn','givenname','sn','mail','initials','description','zimbraPrefFromAddress','zimbraMailDeliveryAddress','zimbraAccountStatus','telephoneNumber','company'] );
my $id='',$displayName='',$sn='',$givenname='',$initials='',$department='',$description='',$disabled='',$mail='';
@entries = $mesg->entries;
foreach $entry (@entries) {
$id=$entry->get_value(uid);
if (($id ne "admin")&&($id ne "admin")&&($id ne "wiki")&&($id ne "ham.e3_qx4qs")&&($id ne "spam.p1vityb7")&&($id ne "galsync")) {
$displayName=$entry->get_value(displayName);
$sn=$entry->get_value(sn);
# print "$sn\n";
$givenname=$entry->get_value(givenname);
$sn=$entry->get_value(sn);
$initials=$entry->get_value(initials);
$description=$entry->get_value(description);
$telephoneNumber=$entry->get_value(telephoneNumber);
$company=$entry->get_value(company);
$status=$entry->get_value(zimbraAccountStatus);if (defined ($AD{$id})) {
if ("$status" ne "active")
{
# print "$id status=active\n";
$status="active";
}
else{
$status="";
}
}
else {
if ("$status" eq "active")
{
# print "$id status=locked\n";
$status="locked";
}
else{
$status="";
}
}
#получаем адрес алисаса
$mail=$entry->get_value(zimbraPrefFromAddress);
#если нетуу алиаса берём основной адрес
if (length($mail)==0)
{
$mail=$entry->get_value(zimbraMailDeliveryAddress);
}$domain=substr($mail,index($mail,"\@")+1);
$LDAP{$id}{domain_} = $domain;
if (length($displayName)>0) {
$LDAP{$id}{displayName} = $displayName;
}
if (length($sn)) {
$LDAP{$id}{sn} = $sn;
}
if (length($givenname)>0) {
$LDAP{$id}{givenname} = $givenname;
}
if (length($initials)>0) {
$LDAP{$id}{initials} = $initials;
}
if (length($description)>0) {
$LDAP{$id}{description} = $description;
}
if (length($telephoneNumber)>0) {
$LDAP{$id}{telephoneNumber} = $telephoneNumber;
}
if (length($company)>0) {
$LDAP{$id}{company} = $company;
}
if (length($mail)>0) {
$LDAP{$id}{mail} = $mail;
# print "ZIMBRA MAIL=$mail\n";
}
if (length($status)>0) {
$AD{$id}{status} = $status;
}
}}
}
#print ("\n===AD==\n");my $id='',$displayName='',$sn='',$givenname='',$initials='',$department='',$description='',$disabled='',$mail='';
print "-удаляем одинаковые и несовпадающие с ад поля\n";
my $k2,$v2;
while(my ($k,$v)=each(╜)) {
#Юзер уже есть
print "проверяем $k $v\n";
if (defined ($LDAP{$k})) {
while(($k2,$v2)=each(%{$AD{$k}})) {
print "$k2 # $v2\n";
print "LDAP=$LDAP{$k}{$k2} AD=$AD{$k}{$k2}\n";
if ($LDAP{$k}{$k2} ne $AD{$k}{$k2}) {
delete $LDAP{$k}{$k2};
print "удалено значение не соответсвующее АД значение\n";}
else {
print "Удалены идентичные значения\n";
delete $AD{$k}{$k2};
delete $LDAP{$k}{$k2};
}}
}
}
my $create;
my $attr_st;
my $alias_st;
open (FILE, ">commands.list");
# !!!!! временноwhile(my ($k,$v)=each(╜)) {
$create=0;
$attr_st="";
$alias_st="";
$from_st="";
if (!(defined ($LDAP{$k}))) {
$create=1;
}
# print "обновляем данные юзера\n";
while(my ($k2,$v2)=each(%{$AD{$k}})) {
# print "K==$k --> $k2:$v2\n";
if ($k2 eq "mail") {
$m=substr($v2,-(length($v2)-index($v2,"\@")-1));
if ("$k" ne "$m" ) {
$alias_st=$v2;
}
}
if ($k2 eq "displayName") {
$attr_st="$attr_st displayName \"$v2\"";
}
if ($k2 eq "sn") {
$attr_st="$attr_st sn \"$v2\"";
}
if ($k2 eq "givenname") {
$attr_st="$attr_st givenname \"$v2\"";
}
if ($k2 eq "initials") {
$attr_st="$attr_st initials \"$v2\"";
}
if ($k2 eq "description") {
$attr_st="$attr_st description \"$v2\"";
}
if ($k2 eq "sn") {
$attr_st="$attr_st sn \"$v2\"";
}
if ($k2 eq "status") {
# print "$k zimbraAccountStatus \"$v2\"\n";
$attr_st="$attr_st zimbraAccountStatus \"$v2\"";
}
if ($k2 eq "telephoneNumber") {
# print "$k telephoneNumber \"$v2\"\n";
$attr_st="$attr_st telephoneNumber \"$v2\"";
}
if ($k2 eq "company") {
# print "$k company \"$v2\"\n";
$attr_st="$attr_st company \"$v2\"";
}
}# print "username=$k\n";
# print "create=$create\n";
# print "attr_st=$attr_st\n";
# print "alias_st=$alias_st\n";
# print "-------------------\n\n";
# print "\n\n\n\n\n";
# print "AD domain $k= $AD{$k}{domain}\n";
# print "LDAP domain $k= $LDAP{$k}{domain_}\n";
if (length($AD{$k}{domain})>0)
{
$domain=$AD{$k}{domain}
}else {
$domain=$LDAP{$k}{domain_};
}if ($create==1) {
print FILE "ca $k\@$domain '' $attr_st\n";}
else {
if (length($attr_st)>0)
{
print FILE "ma $k\@$domain $attr_st\n";
}
}if (length($alias_st)>0) {
print FILE "aaa $k\@$domain $alias_st\n";
}
if (length($alias_st)>0) {
print FILE "ma $k\@$domain zimbraPrefFromAddress $alias_st\n";
}}
close(FILE);system "/opt/zimbra/bin/zmprov -f commands.list"
День добрый Boris!
Попробовал использовать Ваш скрипт последней версии(т.к. возникла проблема со старым из-за отображения русских имен) -
Получаю соответственно ошибки, где используются символы ╜
Например 26 строка - my %LDAP=(),╜=();
44, 217, 246
Пришлось по старинке как и в первом скрипте использовать структуру
my %LDAP=(),%AD=(); вместо > my %LDAP=(),╜=(); и других повторений ╜
да, как-то коряво вставился из буфера
Просьба есть:
как дописать скрипт, чтобы обновления из АД заливались на Зимбру?
Чтоб не ручками описание править и там и там..
Спасибо!
Зачем в 7ке скрипты, когда она с ад работает тз каробки? А если есть екченж то с него есть очень удобный импорт всего что касается почтовых ящиков.
при выполненнии скрипта ошибка
ZIMBRA
Can't call method "bind" on an undefined value at sync2.sh line 114, <DATA> line 558.в чем может быть проблема?
ругается на $ldap2->bind($LDAP_user, password=>$LDAP_pass);
проблема была в файле hosts маил домен нызвался mail.local, а в файле было MAIL.LOCAL
Используйте Zentyal !