вторник, 20 августа 2013 г.

Адресная книга из БД Postgresql

есть почтовый сервер хранящий учетки юзеров в Postgresql
запускаем скрипт - perl ldap.pl (например по расписанию)
он выгружает нам email и ФИО на сервер openldap
далее мы может подключить как адресную книгу например в Outlook

upd1. косяк - создаются копии адресной книги, видимо каждый раз как скрипт срабатывает
сразу скажу что скрипт в стадии доработки, как дойдут руки прикручу фильтр(не все же выгружать ящики, есть и системные и просто тестовые), но что есть - работает

use Net::LDAP;
use DBI;
# имя базы данных
$dbname = "mailbase";
# имя пользователя
$username = "pgsql";
# пароль на БД
$password = "123456";
# имя или IP адрес сервера
$dbhost = "postgresql_server";
# порт
$dbport = "5432";
# опции
$dboptions = "-e";
# терминал
$dbtty = "utf8";
$server = "openldap"; #ldap server
$port = "389"; #port
$binddn = "cn=root,dc=test,dc=com";#
$passwd = "654321" ;#пароль для учетки cn=root,dc=test.com,dc=com
$basedn = "dc=test,dc=com";#

#подключаемся к базе postgresql
$dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport;options=$dboptions;tty=$dbtty","$username","$password",
        {PrintError => 0});

if ($DBI::err != 0) {
  print $DBI::errstr . "\n";
  exit($DBI::err);
}
#подключаемся к таблице user_accounts1
$query = "SELECT * FROM user_accounts1";

$sth = $dbh->prepare($query);
$rv = $sth->execute();
$ldap = Net::LDAP->new($server);
$mesg = $ldap->bind($binddn, password=>$passwd);
if (!defined $rv) {
  print "При выполнении запроса '$query' возникла ошибка: " . $dbh->errstr . "\n";
  exit(0);
}

while ($ref = $sth->fetchrow_hashref()) {
  ($name, $mail) = ($ref->{'realname'}, $ref->{'email'});
  #print "$name\t$mail\n";
$result = $ldap->add("cn=$name,ou=addressbook,dc=test,dc=com", 
                attr => [ 'cn' => $name,
                          'sn' => $name,
                          'givenName' => $name,
                          #'homePhone' => '555-2020',
                          'mail' => $mail,
                          'objectclass' => [ 'top','person', 'inetOrgPerson']
                       ]
           );
  }

$ldap->unbind;
$sth->finish();
$dbh->disconnect();

Комментариев нет:

Отправить комментарий