The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Миграция с postfix + Active directory + squirrelmail на zimb..."
Отправлено Boris, 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"

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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