Asterisk Realtime LDAP драйвер


Этот драйвер позволяет конфигурировать сервер asterisk, использовать в плане набора и для хранения информации об акаунтах сервер LDAP.
Он также позволяет производить запросы к базе данных ldap с помощью app_realtime.

Для его работы необходимы библиотеки openldap сервера (http://www.openldap.org).


Lightweight Directory Access Protocol


LDAP - это открытый и стандартизированный протокол для доступа к X.500 сервису каталогов.
Этот протокол использует для транспорта данных Интернет протоколы, например TCP.
LDAP является облегченной альтернативой X.500 Directory Access Protocol (DAP) протоколу, для использования в сети Интернет.
Также включает в себя другие упрощения базового протокола, например,
представление большинства значений атрибутов и элементов задействованных в протоколе в виде текстовых строк,что упрощает реализацию клиентов для этого протокола.

Каталоги представляют собой базу данных оптимизированную для операций чтения из нее.



Настройка


Первое, что необходимо сделать, чтобы Вы могли пользоваться ldap сервером: нужно добавить определение атрибутов (схему) в Вашу базу данных ldap сервера (предполагается, что он до этого был настроен и работоспособен) и перезапустить его.
Можно воспользоваться уже готовой схемой, которую Вы найдете в директории "configs/asterisk.ldap-schema" дистрибутива asterisk. (просто включите эту схему в Вашем файле конфигурации /etc/openldap/slapd.conf).
Обратите внимание: имена ldap атрибутов имеют префикс "oxy", для исключения возможности конфликтов имен атрибутов из других схем, но Вам ничего не мешает изменить имена атрибутов по Вашему желанию! Только не забудьте также изменить имена атрибутов в файле конфигурации in res_ldap.conf

Следующим шагом будет подготовка файла конфигурации res_ldap.conf:

Первая обязательная секция имеет имя: [global] , в ней определяются параметры доступа к Вашему ldap серверу.

Вот пример:
[general]
dbhost=ldap.mydomain.com, ldap2.mydomain.com	; Тут указано два ldap сервера
dbbasedn=dc=mydomain,dc=com                     ; Ваша baseDN
dbuser=cn=master,ou=accounts,dc=mydomain,dc=com ; Ваш bind DN
dbpass=my_secret				; Его пароль


Далее, Вам необходимо определить параметры для каждого из типа объектов, для которого будет использоваться ldap для получения параметров.

Ниже приводиться пример, для использования ldap вместо файлов конфигурации:
[config]
attributes=filename=oxyPBXConfigFilename,category=oxyPBXConfigCategory,variable_name=oxyPBXConfigVariableName,variable_value=oxyPBXConfigVariableValue,cat_metric=oxyPBXConfigCategoryMetric,commented=oxyPBXConfigCommented
additionalFilter=(objectClass=oxyPBXConfig)


Параметр "attributes" приводит в соответствие между переменными asterisk и именами ldap атрибутов.
В примере указано, что когда asterisk ищет переменную с именем 'filename', драйвер создаст фильтр поиска используя ldap атрибут 'oxyPBXConfigFilename', а перед тем, как вернуть результат обратно в asterisk, он переименует каждое полученное имя ldap атрибута в соответствующее имя переменной в asterisk.
Не указанные имена переменных или атрибутов передаются как есть, без преобразования.
Дополнительный фильтр поиска - additionalFilter, позволяет ограничить поиск (это ограничение будет будет добавлено к фильтру, который уже был сформирован драйвером согласно переменным, которые он получил от сервера asterisk.)

Вы можете подключить эту конструкцию в файле extconfig.conf, например, так:
sip.conf => ldap,ou=asterisk-configs,dc=mydomain,dc=com,config


Что позволит Вам вместо файла конфигурации sip.conf использовать значения переменных, которые будут получены с ldap сервера.

Ниже приводиться пример ldap записей для этого файла конфигурации:

dn: cn=sip-context,ou=asterisk-configs,dc=mydomain,dc=com
objectClass: top
objectClass: oxyPBXConfig
cn: sip-context
oxyPBXConfigCommented: FALSE
oxyPBXConfigFilename: sip.conf
oxyPBXConfigCategory: general
oxyPBXConfigVariableName: context
oxyPBXConfigVariableValue: default
oxyPBXConfigCategoryMetric: 1

dn: cn=sip-realm,ou=asterisk-configs,dc=mydomain,dc=com
objectClass: top
objectClass: oxyPBXConfig
cn: sip-realm
oxyPBXConfigFilename: sip.conf
oxyPBXConfigCommented: FALSE
oxyPBXConfigCategory: general
oxyPBXConfigVariableName: realm
oxyPBXConfigVariableValue: MyRealm
oxyPBXConfigCategoryMetric: 1


Что эквивалентно двум записям в файле конфигурации sip.conf в секции [general] :

[general]
context=default
realm=MyRealm



Также Вы можете хранить конфигурации sip пользователей в ldap, определив в extconfig.conf соответствующие директивы, например, так:

sipusers => ldap,dc=mydomain,dc=com,sipusers
sippeers => ldap,dc=mydomain,dc=com,sippeers


и соответствующее определение в res_ldap.conf:
[sipusers]
attributes=accountBaseDN=oxyPBXAccountBaseDN,accountcode=oxyPBXAccountAccountingCode,amaflags,oxyPBXAccountAMAFlags,callgroup,oxyPBXAccountCallGroup,callerid=oxyPBXAccountCallerID,canreinvite=oxyPBXAccountCanReinvite,context=oxyPBXAccountContext,dtmfmode=oxyPBXAccountDTMFMode,fromuser=oxyPBXAccountFromUser,fromdomain=oxyPBXAccountFromDomain,fullcontact=oxyPBXAccountFullContact,fullcontact=gecos,host=oxyPBXAccountHost,insecure=oxyPBXAccountInsecure,mailbox=oxyPBXAccountMailbox,md5secret=realmedPassword,nat=oxyPBXAccountNAT,deny=oxyPBXAccountDeny,permit=oxyPBXAccountPermit,pickupgroup=oxyPBXAccountPickupGroup,port,oxyPBXAccountPort,qualify=oxyPBXAccountQualify,restrictcid=oxyPBXAccountRestrictCID,rtptimeout=oxyPBXAccountRTPTimeout,rtpholdtimeout=oxyPBXAccountRTPHoldTimeout,type=oxyPBXAccountType,disallow=oxyPBXAccountDisallowedCodec,allow=oxyPBXAccountAllowedCodec,MusicOnHold=oxyPBXAccountMusicOnHold,regseconds=oxyPBXAccountExpirationTimestamp,regcontext=oxyPBXAccountRegistrationContext,regexten=oxyPBXAccountRegistrationExten,CanCallForward=oxyPBXAccountCanCallForward
additionalFilter=(objectClass=oxyPBXAccountSIP)(oxyPBXAccountType=user)

[sippeers]
attributes=accountBaseDN=oxyPBXAccountBaseDN,accountcode=oxyPBXAccountAccountingCode,amaflags,oxyPBXAccountAMAFlags,callgroup,oxyPBXAccountCallGroup,callerid=oxyPBXAccountCallerID,canreinvite=oxyPBXAccountCanReinvite,context=oxyPBXAccountContext,dtmfmode=oxyPBXAccountDTMFMode,fromuser=oxyPBXAccountFromUser,fromdomain=oxyPBXAccountFromDomain,fullcontact=oxyPBXAccountFullContact,fullcontact=gecos,host=oxyPBXAccountHost,insecure=oxyPBXAccountInsecure,mailbox=oxyPBXAccountMailbox,md5secret=realmedPassword,nat=oxyPBXAccountNAT,deny=oxyPBXAccountDeny,permit=oxyPBXAccountPermit,pickupgroup=oxyPBXAccountPickupGroup,port,oxyPBXAccountPort,qualify=oxyPBXAccountQualify,restrictcid=oxyPBXAccountRestrictCID,rtptimeout=oxyPBXAccountRTPTimeout,rtpholdtimeout=oxyPBXAccountRTPHoldTimeout,type=oxyPBXAccountType,disallow=oxyPBXAccountDisallowedCodec,allow=oxyPBXAccountAllowedCodec,MusicOnHold=oxyPBXAccountMusicOnHold,regseconds=oxyPBXAccountExpirationTimestamp,regcontext=oxyPBXAccountRegistrationContext,regexten=oxyPBXAccountRegistrationExten,CanCallForward=oxyPBXAccountCanCallForward
additionalFilter=(objectClass=oxyPBXAccountSIP)(oxyPBXAccountType=peer)



Далее, Вы можете использовать ldap в Вашем плане набора:
Например, определив контекст default в файле extensions.conf, по этому примеру:

[default]
switch => Realtime/default@realtime_ext


поправим extconfig.conf:
realtime_ext => ldap,ou=extensions,dc=mydomain,dc=com,extensions



и не забываем про res_ldap.conf:
[extensions]
attributes=context=oxyPBXExtensionContext,exten=oxyPBXExtensionExten,priority=oxyPBXExtensionPriority,app=oxyPBXExtensionApplication,appdata=oxyPBXExtensionApplicationData
additionalFilter=(objectClass=oxyPBXExtension)


Вы можете протестировать конфигурацию, например, с помощью двух нижеприведенных ldap записей:

dn: cn=203-1,ou=extensions,dc=mydomain,dc=com
objectClass: top
objectClass: oxyPBXExtension
cn: 203-1
oxyPBXExtensionContext: default
oxyPBXExtensionExten: 203
oxyPBXExtensionPriority: 1
oxyPBXExtensionApplication: NoOp
oxyPBXExtensionApplicationData: TEST LDAP

dn: cn=203-2,ou=extensions,dc=mydomain,dc=com
objectClass: top
objectClass: oxyPBXExtension
cn: 203-2
oxyPBXExtensionContext: default
oxyPBXExtensionExten: 203
oxyPBXExtensionPriority: 2
oxyPBXExtensionApplication: NoOp
oxyPBXExtensionApplicationData: TEST LDAP Priority 2


Что эквивалентно такому плану набора:

[default]
exten => 203,1,NoOp(TEST LDAP)
exten => 203,2,NoOp(TEST LDAP Priority 2)




И, наконец, Вы можете использовать ldap realtime driver, для получения переменных из ldap в Вашем плане набора при помощи app_realtime.so.
Например, так:

[default]
exten => 210,1,NoOp(210)
exten => 210,2,RealTime(testfamily|uid|manu|aprefix_)
exten => 210,3,NoOp(Result=${aprefix_gecos})


При Выполнении этих команд плана набора, Вы можете увидеть следующее:
-- Executing NoOp("SIP/myphone-4582", "210") in new stack
    -- Executing RealTime("SIP/myphone-4582", "testfamily|uid|manu|aprefix_") in new stack
       > Realtime Lookup: family:'testfamily' colmatch:'uid' value:'manu'
    -- Executing NoOp("SIP/myphone-4582", "Result=Manuel Guesdon") in new stack


Если у Вас в ldap есть запись по типу такой:

dn: cn=manu,ou=people,dc=mydomain,dc=com
objectClass: person
uid: manu
gecos: Manuel Guesdon


а в файле extconfig.conf есть такая директива:

testfamily => ldap,dc=mydomain,dc=com,testfamily


и в файле res_ldap.conf указано следующее:

[testfamily]
additionalFilter=(objectClass=person)


Удачи!

Автор оригинала: Manuel Guesdon AT oxymium.net>