Директории пользователей (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>

© Внимание! Все права на перевод принадлежат фирме Гарантум. При ссылке или цитировании данной информации обязательно вставляйте ссылку на источник.