Для того, чтобы импортировать данные из LDAP:

1. Отредактируйте файл settings.override.yaml:

<nano/vim/mcedit> address-book/stable/settings.override.yaml

Заполните значения полей в соответствии с вашей инфраструктурой и соблюдая структуру YAML:

sources:  #Здесь задаются источники откуда брать данные
  ldap:
    - server: "example.com"
      source: "example.com"
      port: 389
      ssl: false
      timeout: 10000
      base_dn: "dc=example,dc=com"
      user_dn: "cn=admin,dc=example,dc=com"
      password: "example_password"
      base_ou: "Example Inc."

auto_update:
  ldap:
    enabled: false
    timeout: 86400000 # Обновление раз в день, время указывается в миллисекундах

# ============================
# ОБЩИЕ НАСТРОЙКИ
# ============================

additional_import_settings:
  common:
    include_incompletely_filled_contacts: false # | true   - если выключена, при импорте будут отброшены все контакты, у которых отсутствуют обязательные поля

    full_name_parsing:
      enabled: false
      pattern: "LFM" # L - last_name, M - middle_name, F - first_name
      fallback_enabled: true # если не удалось распарсить - класть всё в fallback_field
      fallback_field: "middle_name" # middle_name | first_name | last_name; по умолчанию middle_name

  ldap:
    ignore_data: [""]
    object_name: ["object", "string"]


sources: ldap:

    port  — Порт сервера LDAP;

    server/source  — Хост или доменное имя сервера LDAP;

    base_dn — Базовый DN (Distinguished Name), с которого начинается поиск пользователей и групп в LDAP;

    ssl — Использовать ли SSL для защищенного подключения к серверу;

    timeout — Таймаут для операций с сервером LDAP, задается в миллисекундах;

    user_dn  — Полный Distinguished Name (DN) администратора LDAP-сервера, необходимый для аутентификации;

    password  — Пароль администратора для доступа к серверу LDAP;

    base_ou  — Название базовой организационной единицы (OU — Organizational Unit) верхнего уровня;

auto_update: ldap:

    enabled  — Включить или отключить автоматическое обновление данных из LDAP;

    timeout — Время автоматического обновления данных в миллисекундах.

Для импорта из нескольких источников перечислите несколько источников ldap

sources:  #Здесь задаются источники откуда брать данные
  ldap:
    - server: "example.com"
      source: "example.com"
      port: 389
      ssl: false
      timeout: 10000
      base_dn: "dc=example,dc=com"
      user_dn: "cn=admin,dc=example,dc=com"
      password: "example_password"
      base_ou: "Example Inc."

    - server: "example2.com"
      source: "example2.com"
      port: 389
      ssl: false
      timeout: 10000
      base_dn: "dc=example,dc=com"
      user_dn: "cn=admin,dc=example,dc=com"
      password: "example_password"
      base_ou: "Example Inc."

auto_update:
  ldap:
    enabled: false
    timeout: 86400000 # Обновление раз в день, время указывается в миллисекундах



2. При необходимости  поменяйте настройки маппинга, указав в секции mappers:

# ============================
# КОНФИГУРАЦИЯ МАППИНГА
# ============================

# Конфигурация мапперов для трансформации данных из внешних источников в структуру контакта Address Book
#
# Доступные поля контакта: domain, external_id, birthday, common_name, first_name,
# last_name, middle_name, nickname, org, title, full_name, position, gender, avatar, addresses, emails, messengers,
# phones, additional_info
#
# Структура маппера:
#   <источник>:
#     <поле_контакта>: [<путь_к_данным_в_источнике>, <тип_данных>]
#     <поле_контакта>: [[<вложенный_путь>, <тип_данных>]]
#     additional_info:
#       <подполе>: [<путь_к_данным>, <тип_данных>]
#
# Поддерживаемые типы данных:
#   - string: строковые значения
#   - url: тип аватара; означает, что аватар хранится в виде пути
#   - jpeg: тип аватара; бинарные данные изображений
#   - email: адреса электронной почты
#   - phone: номера телефонов
#   - date: даты
#
# Особенности:
#   - Поле 'kind' автоматически устанавливается сервисом ('contact' или 'group')
#   - Поле 'additional_info' поддерживает только одноуровневую вложенность
#   - Вложенные структуры в 'additional_info' отбрасываются с записью в лог
#   - Для полей emails, phones, avatar поддерживается множественное отображение

mappers:
  ldap:
    common_name: ["ou", "string"]
    full_name: ["cn", "string"]
    first_name: ["givenName", "string"]
    middle_name: ["patronymic", "string"]
    last_name: ["sn", "string"]
    birthday: ["BirthDate", ["date", "{0D}.{0M}.{YYYY}"]]
    title: ["title", "string"]
    org: ["o", "string"]
    nickname: ["NickName", "string"]
    emails:
      [
        [["mailExt"], "email"],
        [["mail"], "email"]
      ]
    phones:
      [
        [["telephoneNumber"], ["phone", "work"]],
        [["TelephoneNumberExt"], ["phone", "work"]],
        [["homePhone"], ["phone", "home"]],
      ]
    avatar: [["jpegPhoto", "jpeg"], ["avatarURL", "url"]]


3. Подключитесь к docker-контейнеру сервиса Address Book:

docker exec -it address-book-stable-server-1 bash

4. Подключитесь к Erlang node по имени:

./ecss_address_book remote --name ecss_address_book

5. Выполните команду для запуска миграции LDAP:

EcssAddressBookCore.Actions.LdapImport.import()

Для базовой проверки полноты миграции можно обратиться напрямую к БД с запросом количества контактов:

EcssAddressBookDb.Actions.Contacts.count(%{})
{:ok, 1557}

Число после :ok должно совпадать с количеством контактов LDAP.

Для выхода из iex нажмите Ctrl+C дважды. Затем введите exit.