импорт из mysql в openldap средствами perl'a

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
exploid
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-17 12:35:14

импорт из mysql в openldap средствами perl'a

Непрочитанное сообщение exploid » 2008-07-08 9:54:24

Доброго времени суток.
Немножко о проблемке.. Есть почтовый сервак настроенный, кстати, по конфигу с этого сайта http://www.lissyara.su/?id=1173 (exim, dovecot, postfixadmin). Все работает правда под линухом, автору статьи и администрации сайта отдельное спасибо.

Так вот, появилась необходимость перенести информацию об учетных записях из mysql в openldap, ака address book для the bat. Первое что пришло в голову - скриптик на перле, потом вешаем задание в кроне - и все гут. При заведении новой учетной записи синхронизация по расписанию - все ок, по необходимости - обновление адресной книги в самом the bat.

С mysql проблем нет:

Код: Выделить всё

use Net::LDAP;
use Mysql;
$ldap = Net::LDAP->new('localhost') or die "$@";
$mesg = $ldap->bind ('cn=admin, dc=myorg, dc=ru', password => 'mypass' );
my $DNbranch = "ou=addressbook, dc=myorg, dc=ru";

$dbh = Mysql->Connect("localhost", "exim", "*", "*") or die print "can't connect";
$sth = $dbh->Query("SELECT username, name FROM mailbox where active=1") or die print "Can't prepare statement";
$sth->execute();
т.е. данные выбирает как надо, все ок, а вот дальше не пойму, чего ему не нравится???

Код: Выделить всё

while ( my ($username, $name) = $sth->fetchrow_array()) {
    #print " $username $name  \n";
    my ($username, $name) = $sth->fetchrow_array();
    my $CreateArray = [
        objectClass => [ "top", "person", "organizationalPerson", "inetOrgPerson" ],
        cn => $name,        #
        uid => "0000001",  # позже 
        sn => $name,        # будет 
        mail => $username# исправляться..
    ];
    my $NewDN = "@$CreateArray[2]=".
            "@$CreateArray[3]+".
            "@$CreateArray[4]=".
            "@$CreateArray[5],".
            $DNbranch;
    my $result = LDAPentryCreate($ldap, $NewDN, $CreateArray);
    sub LDAPentryCreate {
        my ($ldap, $dn, $whatToCreate) = @_;
        my $result = $ldap->add ( $dn, attrs => [ @$whatToCreate ] );
        if ( $result->code ) {
            LDAPerror ( "Searching", $result );
        };
    };
};
sub LDAPerror {
    my ($from, $mesg) = @_;
    print "Return code: ", $mesg->code;
    print "\tMessage: ", $mesg->error_name;
    print " :",          $mesg->error_text;
    print "MessageID: ", $mesg->mesg_id;
    print "\tDN: ", $mesg->dn;
};
ругается именно сюда:

Код: Выделить всё

my $result = $ldap->add ( $dn, attrs => [ @$whatToCreate ] );
говорит что не правильный DN (LDAP invalid DN syntax).

причем, когда убираем цикл и подставляем в $mycreatearray просто текстовые значения - все ок.
С перлом очень плохо знаком, делал по примерам, так что просьба сильно не пинать..

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: импорт из mysql в openldap средствами perl'a

Непрочитанное сообщение ProFTP » 2008-07-08 15:41:54

c ldap не работал, если бы в пыжык, то можно...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

exploid
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-17 12:35:14

Re: импорт из mysql в openldap средствами perl'a

Непрочитанное сообщение exploid » 2008-07-09 9:35:14

привел запись в ldap к следующему виду:

Код: Выделить всё

while ( my ($username, $password) = $sth->fetchrow_array()) {
    my $result = $ldap->add ( dn => "cn=$name,".$DNbranch,
                              attr => [ objectClass => [ "top", "person", "organizationalPerson", "inetOrgPerson" ],
                                        cn => $name, 
                                        sn => $name, 
                                        mail => $username
                                       ]
    );
};
здесь все гут:

Код: Выделить всё

cn => $name, 
sn => $name, 
mail => $username
а вот сдесь он ругается..

Код: Выделить всё

dn => "cn=$name,".$DNbranch,
причем пробовал и так:

Код: Выделить всё

dn => "cn=".$name.",".$DNbranch,
одинаково... ldap naming violation..

я вот думаю, может быть при передаче данных из mysql передаются еще какие-нибудь символы, может быть где-нить есть лишние пробелы, etc...??
вообще print "$name" вернет именно то значение которое находится в $name или преобразует его (уберет лишние пробелы)?
неужели никто не работал с ldap в перле???

exploid
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-17 12:35:14

Re: импорт из mysql в openldap средствами perl'a

Непрочитанное сообщение exploid » 2008-07-09 15:12:56

В общем разобрался, может быть кому пригодится.. Спасобо всем кто пытался оказать посильную поддержку.
В самой базе поле name хранится в cp1251, а системная локаль utf8...
По этому:

Код: Выделить всё

use Text::Iconv;
и в цикле:

Код: Выделить всё

 while ( my ($username, $name) = $sth->fetchrow_array()) {
   $conv = Text::Iconv->new('windows-1251','utf-8');              #      от 
   my $string = $conv->convert($name);                            # <-  тута
   my $result = $ldap->add ( "dn" => "cn=$string , ".$DNbranch,
                              "attr" => [ objectClass => [ "top", "person", "org
                                        cn => "$string",
                                        sn => ' ',
                                        mail => "$username"
                                      ]
                            );
..

Все. Всем спасибо.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: импорт из mysql в openldap средствами perl'a

Непрочитанное сообщение zg » 2008-07-09 18:37:30

exploid писал(а):В самой базе поле name хранится в cp1251, а системная локаль utf8...
тут иконв не нужен, нужно правильно выставить кодировки на соединение, можно так

Код: Выделить всё

set names "utf8"
тогда данные будут корректно гоняться туда и обратно.

exploid
проходил мимо
Сообщения: 4
Зарегистрирован: 2008-06-17 12:35:14

Re: импорт из mysql в openldap средствами perl'a

Непрочитанное сообщение exploid » 2008-07-09 23:05:21

может быть и так, но пока что нужно было добиться экспорта\импорта из MySQL в OpenLDAP, и.. заработало..
Но всеравно, спасибо за совет