Директории пользователей (User directory). Часть первая
Первая часть статьи по настройке директорий пользователя.
XML User Directory
Во FreeSWITCH $FS_ROOT/conf/directory/ содержит учетные записи (т.е. XML-файлы) для всех пользователей (т.е. телефоннных направлений SIP) которые могут быть зарегистрированы в системе.
Примечание: это не тот же самый синтаксис, что используется в Диалплане
Настройки пользователей
<include>
<user id="1000" cidr="12.34.56.78/32,20.0.0.0/8"> <!--ID — это имя пользователя SIP. CIDR является опциональным — если задано, то эти IP-адреса будут автоматически аутентифицироваться для этого пользователя-->
<params>
<param name="password" value="correcthorsebatterystaple"/> <!--Пароль SIP-->
<param name="vm-password" value="8761"/>
</params>
<variables><!--эти переменные являются доступными в канале-->
<variable name="accountcode" value="1000"/> <!--Используйте эту переменную в своём диалплане для авторизации и ограничений. Также cdr_csv может использовать её для отдельных CDR-файлов-->
<variable name="user_context" value="default"/> <!--волшебная переменная: задает контекст-->
<variable name="effective_caller_id_name" value="Extension 1000"/><!--волшебная переменная: используется для имени ID вызывающего абонента-->
<variable name="effective_caller_id_number" value="1000"/><!--волшебная переменная: используется для имени и номера ID вызывающего абонента-->
</variables>
</user>
</include>
Простая конфигурация
Базовая конфигурация довольно проста, вам просто нужно добавить имена пользователей и пароли.
В файл $FS_ROOT/conf/directory/mike_x2239.xml, например, добавьте:
<domain name="$${sip_profile}">
<user id="mike">
<params>
<param name="password" value="micke"/>
</params>
</user>
</domain>
Тег домена говорит FS, к какому домену относится этот пользователь. Обратите внимание, что у всех пользователей должен быть один и тот же тег домен, если вы не используете несколько доменов. Имя пользователя — это часть слева от @ в адресе SIP (в данном случае "mike" в "mike@sub.mydomain.com"). $${sip_profile} будет заменён доменом, указанным в vars.xml.
a1-hash
Текстовый пароль может быть заменён на "a1-hash". A1-hash генерируется путем применения алоритма хеширования MD5 в строке "username:domain:password" (без кавычек). В Linux закодированный пароль может быть сформирован таким образом: openssl dgst -md5 < filename или echo -n "username:domain:password" | openssl dgst -md5.
<domain name="$${sip_profile}">
<user id="mike">
<params>
<param name="a1-hash" value="c6440e5de50b403206989679159de89a"/>
</params>
</user>
</domain>
reverse authentication
Некоторые из конечных точек требуют аутентификации для определенных типов запросов (ex. SIP NOTIFY для повторной синхронизации). Вы можете указать учетные данные, используемые для дайджест-аутентификации.
<domain name="$${sip_profile}">
<user id="jim">
<params>
<param name="reverse-auth-user" value="jim" />
<param name="reverse-auth-pass" value="foo123" />
</params>
</user>
</domain>
VCards
Вы также можете добавить поддержку для vcards, если используете mod_dingaling. Для этого добавьте информацию в следующем формате:
<domain name="$${sip_profile}">
<user id="peter">
<params>
<param name="password" value="thepassword"/>
</params>
<!-- Это касается только mod_dingaling, так как он позволяет вывести vcards в компонентный режим-->
<vcard xmlns='vcard-temp'>
<FN>Peter Saint-Andre</FN>
<N>
<FAMILY>Saint-Andre</FAMILY>
<GIVEN>Peter</GIVEN>
<MIDDLE/>
</N>
<NICKNAME>stpeter</NICKNAME>
<URL>http://www.jabber.org/people/stpeter.php</URL>
<BDAY>1966-08-06</BDAY>
<ORG>
<ORGNAME>Jabber Software Foundation</ORGNAME>
<ORGUNIT>Jabber Software Foundation</ORGUNIT>
</ORG>
<TITLE>Executive Director</TITLE>
<ROLE>Patron Saint</ROLE>
<TEL><WORK/><VOICE/><NUMBER>303-308-3282</NUMBER></TEL>
<TEL><WORK/><FAX/><NUMBER/></TEL>
<TEL><WORK/><MSG/><NUMBER/></TEL>
<ADR>
<WORK/>
<EXTADD>Suite 600</EXTADD>
<STREET>1899 Wynkoop Street</STREET>
<LOCALITY>Denver</LOCALITY>
<REGION>CO</REGION>
<PCODE>80202</PCODE>
<CTRY>USA</CTRY>
</ADR>
<TEL><HOME/><VOICE/><NUMBER>303-555-1212</NUMBER></TEL>
<TEL><HOME/><FAX/><NUMBER/></TEL>
<TEL><HOME/><MSG/><NUMBER/></TEL>
<ADR>
<HOME/>
<EXTADD/>
<STREET/>
<LOCALITY>Denver</LOCALITY>
<REGION>CO</REGION>
<PCODE>80209</PCODE>
<CTRY>USA</CTRY>
</ADR>
<EMAIL><INTERNET/><PREF/><USERID>stpeter@jabber.org</USERID></EMAIL>
<JABBERID>stpeter@jabber.org</JABBERID>
<DESC>
More information about me is located on my
personal website: http://www.saint-andre.com/
</DESC>
</vcard>
</user>
</domain>
Группы (Groups)
Группа является логической совокупностью пользователей, которых FreeSWITCH может использовать для соединения вызовов последовательным или параллельным способом, в зависимости от аргументов к приложению group_call. Использование групп не является обязательным — если хотите, вы можете поместить своих пользователей прямо в раздел домена.
Это особенно полезно, если вы используете mod_xml_curl для передачи FreeSWITCH каталога пользователя и хотите сгруппировать некоторых пользователей в логическую структуру. В следующую группу '200' входит четыре пользователя. Интересно обратить внимание на параметр "dial-string", который используется для соединения с этими пользователями. Пользователи 1000 и 1001 будут использовать дефолтный "dial-string", в то время как пользователь 2014 использует кольцевой канал, таким образом FreeSWITCH может запросить диалплан, чтобы выяснить, как добраться до этого пользователя (это также работает для внешних номеров через OpenZAP и шлюзы):
type="pointer" — это указатель, с помощью которого вы можете одного пользователя занести в несколько групп. Это обычно подразумевает продолжение поиска пользователя в каталоге.
<document type="freeswitch/xml">
<section name="directory">
<domain name="sip.example.com">
<users>
<user id="1000">
<params>
<param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
</params>
<variables>
<variable name="user_context" value="default"/>
</variables>
</user>
<user id="1001">
<params>
<param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
</params>
<variables>
<variable name="user_context" value="default"/>
</variables>
</user>
</users>
<groups>
<group name="200">
<users>
<user id="2014">
<params>
<param name="dial-string" value="loopback/2014/default/XML"/>
</params>
<variables>
<variable name="user_context" value="default"/>
</variables>
</user>
<user id="1000" type="pointer"/>
<user id="1001" type="pointer"/>
</users>
</group>
</groups>
</domain>
</section>
</document>
Диалплан для вышеуказанной группы может быть определён так:
<extension name="Group 200">
<condition field="destination_number" expression="200">
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail=true"/>
<action application="set" data="originate_continue_on_timeout=true"/>
<action application="set" data="call_timeout=15"/>
<action application="bridge" data="${group_call(200@${domain_name}+F)}"/>
<action application="transfer" data="200 XML default"/>
<action application="hangup"/>
</condition>
</extension>
Направление 200 будет звонить всем пользователям, определенным в каталоге пользователей для группы 200 последовательным способом (указано аргументом +F, если вы хотите, чтобы позвонить всем пользователям сразу, используйте аргумент +A) в течение 15 секунд, а затем переключает вызов снова на эту же группу и так будет продолжаться бесконечно.
Объясним переменные, установленные перед соединением:
В hangup_after_bridge установлено значение true для следующего эффекта: если вызов успешно принят, после чего ответвление B кладет трубку, то ответвление A также повесит трубку.
В continue_on_fail установлено значение true для следующего: если соединение оборвётся, выполнение диалплана продолжится, и будет осуществлено переключение.
В originate_continue_on_timeout iустановлено значение true для следующего: если в строке набора соединения указано несколько направлений, разделенных знаком "|" (это для аварийного переключения), при тайм-ауте на неотвеченном назначении соединение будет пробовать следующее указанное назначение. Если в originate_continue_on_timeout не установлено значение true, при тайм-ауте на первом назначении соединение будет прекращено. (В приведенном выше примере строка соединения генерируется через group_call с параметром +F; это определяет строку набора, в которой все назначения группы разделены символом "|". Поэтому originate_continue_on_timeout должен иметь значение true для последовательного вызова.)
Параметр call_timeout задан так, чтобы при отсутствии ответа от назначения, попытка соединения прекращалась по тайм-ауту. Примечание: если назначение использует предответное проключение, вызов будет соединён (заранее) без тайм-аута! Для завершения по тайм-ауту попытки соединения с назначением, использующим предответное проключение, установите в ignore_early_media значение true.
Диалплан для пользователя 2014, который в этом примере должен быть завершён через шлюз, заранее установленный с помощью mod_lcr, может быть определён следующим образом:
<extension name="Extension 2014">
<condition field="destination_number" expression="2014">
<action application="lcr" data="2014"/>
<action application="set" data="dialed_ext=${lcr_auto_route}"/>
<action application="export" data="dialed_ext=${lcr_auto_route}"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="call_timeout=120"/>
<action application="bridge" data="${lcr_auto_route}"/>
<action application="hangup"/>
</condition>
</extension>
© Внимание! Все права на перевод принадлежат фирме Гарантум. При ссылке или цитировании данной информации обязательно вставляйте ссылку на источник.