Первая часть статьи по настройке директорий пользователя.
Во 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 генерируется путем применения алоритма хеширования 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>
Некоторые из конечных точек требуют аутентификации для определенных типов запросов (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, если используете 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>
Группа является логической совокупностью пользователей, которых 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>
© Внимание! Все права на перевод принадлежат фирме Гарантум. При ссылке или цитировании данной информации обязательно вставляйте ссылку на источник.