Code:
#!/usr/bin/perl
use Net::LDAP;
use utf8;
use Encode;
my $domain="mail_domain";
my $zmprov="/opt/zimbra/bin/zmprov -l";
my $AD_server="10.0.0.150";
my $AD_user="jabberd\@domain.ru";
my $AD_pass="passwd";
my $AD_base="dc=domain,dc=ru";
my $LDAP_server="10.0.0.242";
my $LDAP_user="uid=zimbra,cn=admins,cn=zimbra";
my $LDAP_pass="ldap";
my $LDAP_base="dc=mail_domain,dc=ru";
my %LDAP=(),%AD=();
#----------AD
$ldap = Net::LDAP->new($AD_server);
$ldap->bind($AD_user, password=>$AD_pass);
$mesg = $ldap->search(filter=>"(&(objectclass=user)(mail=*\@$domain)(!(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);
$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($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($mail)>0) {
$AD{$id}{mail} = $mail;
}
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);
$mesg = $ldap2->search(filter=>"(&(objectClass=zimbraAccount)(!(userPassword=*))(!(zimbraCalResType=*)))",
base=>$LDAP_base, 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 "spam.2bv4rvsjs")&&($id ne "ham.xdnsnpsmd3")) {
$displayName=$entry->get_value(displayName);
$sn=$entry->get_value(sn);
$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');
}
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;
}
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(%AD)) {
#Юзер уже есть
if (defined ($LDAP{$k})) {
while(($k2,$v2)=each(%{$AD{$k}})) {
# print "$k2 # $v2\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};
}
}
}
}
open(PIPE,'|/opt/zimbra/bin/zmprov -l');
my $create;
my $attr_st;
my $alias_st;
open (FILE, ">commands.list");
while(my ($k,$v)=each(%AD)) {
$create=0;
$attr_st="";
$alias_st="";
$from_st="";
if (!(defined ($LDAP{$k}))) {
$create=1;
}
#обновляем данные юзера
while(my ($k2,$v2)=each(%{$AD{$k}})) {
# print "$k --> $k2:$v2\n";
if ($k2 eq "mail") {
if ("$k\@$domain" ne "$v2" ) {
$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\"";
}
}
if ($create==1) {
print PIPE "ca $k\@$domain '' $attr_st\n";
print FILE "ca $k\@$domain '' $attr_st\n";
}
else {
if (length($attr_st)>0)
{
print PIPE "ma $k\@$domain $attr_st\n";
print FILE "ma $k\@$domain $attr_st\n";
}
}
if (length($alias_st)>0) {
print PIPE "aaa $k\@$domain $alias_st\n";
print FILE "aaa $k\@$domain $alias_st\n";
}
if (length($alias_st)>0) {
print PIPE "ma $k\@$domain zimbraPrefFromAddress $alias_st\n";
print FILE "ma $k\@$domain zimbraPrefFromAddress $alias_st\n";
}
}
close(FILE);
close(PIPE); What you need to alter the script so that the names were in Russian ?