The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Тематический каталог: Миграция с postfix + Active directory ..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Тематический каталог: Миграция с postfix + Active directory ..."  +/
Сообщение от auto_topic on 27-Фев-10, 19:51 
Обсуждение статьи тематического каталога: Миграция с postfix + Active directory + squirrelmail на zimbra (postfix activedirectory ldap zimbra mail groupware)

Ссылка на текст статьи: https://www.opennet.ru/base/net/postfix_active_dir.txt.html

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от eth1 on 27-Фев-10, 19:51 
автор, почему ты такой безграмотный? Читать невозможно :(
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от ACCA (ok) on 08-Мрт-10, 03:40 
ладно придираться - это ещё неплохо. С запятыми беда, но остальное терпимо. Вообще очень хорошее дело - падонки научили людей ценить грамотное письмо.

Автору, если читает -

вместо длиннющих индусско-китайских повторений

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от capitan__nemo email on 17-Мрт-10, 17:02 
У кого нить данный скрипт запустился?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Миграция с postfix + Active directory + squirrelmail на zimb"  +/
Сообщение от grishick email on 10-Июн-10, 22:47 
Вот тут пишут, что работает: http://community.livejournal.com/ru_zimbra/34298.html
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от thunder email(??) on 06-Янв-11, 10:26 
Научил Зимбру взаимодействовать с procmail и использовать внутренний антивирь, дабы не иметь 2-х одинаковых процессов. Если интересно - могу выложить конфиги.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от unpropable on 21-Фев-11, 18:22 
Полезная  статья. Использовал при интеграции ZCS 7.0 с AD, но русские имена пользователей переносятся с крякозяблами. Если модифицировать так чтобы запускались команды
zmprov ca acc@domain attr "русские буквы"
zmprov ca acc@domain attr "русские буквы"
то все ок, но очень медленно инициализируется zmprov на каждую команду, хз что делать даже.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Justbox email on 12-Мрт-11, 22:02 
Ктонить поборол Русские буквы в именах пользователей7
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Boris email(??) on 27-Мрт-11, 11:43 
только что опять занялся зимброй
вот обновил немного скрипт, тут можно несколько доменов вводить и побеждена проблема с кракозябрами. Помогла только загрузка через 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 ldap

print "\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"

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

9. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Илья email(??) on 29-Мрт-11, 11:22 
День добрый Boris!
Попробовал использовать Ваш скрипт последней версии(т.к. возникла проблема со старым из-за отображения русских имен) -
Получаю соответственно ошибки, где используются символы ╜
Например 26 строка - my %LDAP=(),╜=();
44, 217, 246
Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Илья email(??) on 29-Мрт-11, 12:20 
Пришлось по старинке как и в первом скрипте использовать структуру
my %LDAP=(),%AD=(); вместо > my %LDAP=(),╜=();  и других повторений ╜
Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

11. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от boris email(??) on 04-Апр-11, 00:56 
да, как-то коряво вставился из буфера
Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Илья email(??) on 29-Апр-11, 15:00 
Просьба есть:
как дописать скрипт, чтобы обновления из АД заливались на Зимбру?
Чтоб не ручками описание править и там и там..
Спасибо!
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

13. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Костик email(??) on 30-Авг-11, 22:22 
Зачем в 7ке скрипты, когда она с ад работает тз каробки? А если есть екченж то с него есть очень удобный импорт всего что касается почтовых ящиков.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Denis email(??) on 19-Июл-12, 08:28 
при выполненнии скрипта ошибка
ZIMBRA
Can't call method "bind" on an undefined value at sync2.sh line 114, <DATA> line 558.

в чем может быть проблема?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

15. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Denis email(??) on 20-Июл-12, 12:05 
ругается на $ldap2->bind($LDAP_user, password=>$LDAP_pass);
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

16. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от Denis email(??) on 23-Июл-12, 14:44 
проблема была в файле hosts маил домен нызвался mail.local, а в файле было MAIL.LOCAL
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

17. "Миграция с postfix + Active directory + squirrelmail на zimb..."  +/
Сообщение от В email on 07-Дек-13, 19:05 
Используйте Zentyal !
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру