Автор Тема: Как переименовать DIT?  (Прочитано 17928 раз)

d06pbiu

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Как переименовать DIT?
« : 10 Октябрь 2012, 21:26:34 »
Всем доброго времени суток!
Вот в чем мой вопрос: в настоящий момент есть DIT с суффиксом olcSuffix: ou=example,o=net, под него БД - bdb, в ней хранаяться записи о пользователях - пользователей добавлял используя, например, dn: uid=user,ou=example,o=net, так вот, если  я поменяю olcSuffix на оu=mycompany,o=net, записи о пользвателях в БД тоже изменяться на, к примеру, uid=user,ou=mycompany,o=net?
Т.е. достаточно ли сменить суффикс в  olcDatabase={Х}bdb,cn=config чтобы можно было иметь доступ к записям в БД используя новый суффикс?
Или каким образом это можно сделать? И как правильно поменять суффикс?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Как переименовать DIT?
« Ответ #1 : 11 Октябрь 2012, 16:05:48 »
Здравствуйте! Задачка, конечно, нетривиальная, мягко скажем =) . Дело в том, что изменить olcSuffix в olcDatabase={X}bdb OpenLDAP позволяет (при этом нужно сразу же менять и olcRootDN, а то slapd не даст Вам подключиться к базе, а при рестарте вообще не запустится):

dn: olcDatabase={1}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: ou=mycompany,o=net
-
replace: olcRootDN
olcRootDN: dc=manager,ou=mycompany,o=net
Кроме того, нужно не забыть переделать все упоминания о старом суффиксе, например в ACL или настройке наложений к этой базе. Но, самое главное, после всех этих манипуляций, само содержимое базы ou=example,o=net останется в неизменном виде, и запрос с указанием нового суффикса выдаст No such object:

# ldapsearch -x -LLL -b 'ou=mycompany,o=net'
No such object (32)
То есть все наши старания пошли на смарку. Поэтому я бы не рекомендовал так делать.

Но всё же решить задачу можно, "изобразив" восстановление из резервной копии. Порядок действий такой (подразумевается, что все пути и настройки под Ubuntu, команды выполняются из под root):

1. Останавливаем slapd:
# /etc/init.d/slapd stop

2. Делаем резервные копии slapd.d и директории с файлами bdb "на случай ядерной войны":
# mkdir /tmp/slapd.backup
# cp -rp /etc/ldap/slapd.d /tmp/slapd.backup/
# cp -rp /var/lib/ldap /tmp/slapd.backup/

3. Делаем резервную копию каталога ou=example,o=net с помощью slapcat (пока в чистом виде, на случай экстренного восстановления):
# slapcat -b 'ou=example,o=net' -l /tmp/slapd.backup/dump.ldif

4. Ещё раз прогоняем slapcat, избавляясь от ldif wrapping и заменяя старый суффикс на новый:
# slapcat -b 'ou=example,o=net' | perl -p00e 's/\r?\n //g' | perl -p00e 's/ou=example,o=net/ou=mycompany,o=net/g' | perl -p00e 's/ou: example/ou: mycompany/g' > /tmp/slapd.backup/newdb.ldif

5. Теперь нужно править slapd.d. Очень внимательно изучаем файлы, относящиеся к olcDatabase={X}bdb в каталоге /etc/ldap/slapd.d/cn=config, в первую очередь сам olcDatabase={X}bdb.ldif, а также наложения в поддиректории olcDatabase={X}bdb. Правим всё, что относится к старому суффиксу. Трижды всё проверьте!!!

6. Очищаем директорию с файлами bdb (Вы же сделали резервную копию?) и копируем в неё DB_CONFIG:
# rm -f /var/lib/ldap/*
# cp /tmp/slapd.backup/ldap/DB_CONFIG /var/lib/ldap/

7. "Восстанавливаем" базу данных из полученного на шаге 4 файла:
# slapadd -b 'ou=mycompany,o=net' -l /tmp/slapd.backup/newdb.ldif
_#################### 100.00% eta   none elapsed            none fast!         
Closing DB...
Важно, чтобы slapadd завершился без ошибок.

8. Устанавливаем корректные права:
# chown -R openldap:openldap /var/lib/ldap/

9. По идее всё, можно запускать slapd:
# /etc/init.d/slapd start

Теперь ldapsearch нормально отрабатывает и выдаёт содержимое ou=mycompany,o=net:
# ldapsearch -x -LLL -b 'ou=mycompany,o=net'
dn: ou=mycompany,o=net
objectClass: organizationalUnit
ou: mycompany
...

Хочу отметить, что всё это на свой страх и риск. Выполняйте команды только после того, как разобрались, что конкретно они делают. Будьте очень внимательны и ОБЯЗАТЕЛЬНО делайте резервные копии!!! И не говорите, что Вас не  предупреждали.

Может есть другой, более безопасный способ, если кто подскажет, буду очень признателен.

Еще, может не в тему, но... Сейчас принято именовать каталоги примерно так: dc=mycompany,dc=net

Егор. 

« Последнее редактирование: 12 Октябрь 2012, 01:00:55 от egor »

d06pbiu

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Как переименовать DIT?
« Ответ #2 : 15 Октябрь 2012, 19:41:29 »
Спасибо за помощь! Сделал все по Вашей схеме - все работает!)