только что опять занялся зимброй
вот обновил немного скрипт, тут можно несколько доменов вводить и побеждена проблема с кракозябрами. Помогла только загрузка через 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"