В данном разделе приводится описание команд управления телефонной маршрутизацией на уровне виртуальной АТС.

Маршрутизация телефонных вызовов - это процесс определения интерфейса назначения для конкретного вызова на основании информации об интерфейсе источника вызова, информации о телефонном номере вызывающего и вызываемого абонента, категории вызывающего абонента, времени суток и дне недели.

Контекст маршрутизации - совокупность правил маршрутизации уникальная в домене маршрутизации, в рамках которого идет определение интерфейса вызываемого абонента.

<DOMAIN> - имя виртуальной АТС.

Созданные контексты маршрутизации, назначаются на iface. Более подробно описано на странице /domain//iface/ - команды управления интерфейсами

delete

Команда предназначена для удаления из системы заданного контекста маршрутизации.

Путь команды:

/domain/<DOMAIN>/routing/delete

Синтаксис:

delete <ROUTING_CONTEXT>

Параметры:

<DOMAIN> - имя виртуальной АТС;
<ROUTING_CONTEXT> - контекст маршрутизации, который требуется удалить.

Пример:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/delete test         
Context was deleted

[exec at: 11.03.2021 14:21:05, exec time: 24ms, nodes: ds1@ecss1 v.3.14.8.25]

edit

Данной командой производится редактирование  контекстов маршрутизации.

При выполнении команды осуществляется запуск редактора, который выбран командой shell-options editor

Путь команды:

/domain/<DOMAIN>/routing/edit

Синтаксис:

edit <NODE> <ROUTING_CONTEXT>

Параметры:

<NODE> - имя ноды;
<DOMAIN> - имя виртуальной АТС;
<ROUTING_CONTEXT> - название контекста маршрутизации.

Примеры:

Редактирование определенного контекста:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/edit ctx_city_common
Importing routing context from /tmp/routing-0.12471.0.xml
Success: Context was imported

[exec at: 11.03.2021 14:20:06, exec time: 24s 107ms, nodes: ds1@ecss2 v.3.14.8.25]

export

Данной командой производится экспорт модулей контекстов маршрутизации в файлы, описывающие эти контексты для их резервного копирования и/или модификации.

При выполнении команды осуществляется выгрузка информации о требуемом контексте маршрутизации в XML-файл с именем: имя_домена_имя_контекста_метка_даты-времени-последнего-изменения-маршрутизации.xml по следующему пути: ECSS_DATA_ROOT/routing/ctx/src/<DOMAIN>, по умолчанию это /var/lib/ecss/routing/ctx/src/<DOMAIN>. Информацию о конкретных путях в системе можно посмотреть по команде /node/nodes-info root_dirs.

Путь команды:

/domain/<DOMAIN>/routing/export

Синтаксис:

export <NODE> <ROUTING_CONTEXT>

Параметры:

<NODE> - имя ноды;
<DOMAIN> - имя виртуальной АТС;
<ROUTING_CONTEXT> - название контекста маршрутизации. При выборе "*" экспортируются все контексты

Примеры:

экспорт определенного контекста:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/export ecss1 ctx_city_common
Context ctx_city_common has been exported

[exec at: 11.03.2021 14:17:04, exec time: 39ms, nodes: ds1@ecss1 v.3.14.8.25, ds1@ecss2 v.3.14.8.25]

Экспорт всех контекстов:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/export ecss2 *
Context ctx_from_local has been exported
Context ctx_city_common has been exported
Context ctx_from_ewsd has been exported
Context ctx_to_ewsd has been exported
Context ctx_to_ivr has been exported
Context default_routing has been exported
Context test has been exported

[exec at: 11.03.2021 14:17:24, exec time: 328ms, nodes: ds1@ecss1 v.3.14.8.25, ds1@ecss2 v.3.14.8.25]

Содержимое каталога (команда выполняется на сервере из shell):

sasha@ecss1:/var/lib/ecss/routing/ctx/src/biysk.local$ ls -la /var/lib/ecss/routing/ctx/src/biysk.local/biysk_local_*
-rw-rw-r-- 1 ssw ssw 4348 Jan 28 13:33 /var/lib/ecss/routing/ctx/src/biysk.local/biysk_local_ctx_city_common_2020_5_13_7_14_39_611066.xml
-rw-rw-r-- 1 ssw ssw 4385 Mar 11 14:17 /var/lib/ecss/routing/ctx/src/biysk.local/biysk_local_ctx_city_common_2021_3_7_22_34_2_23189.xml
-rw-rw-r-- 1 ssw ssw 1077 Feb 26 15:38 /var/lib/ecss/routing/ctx/src/biysk.local/biysk_local_ctx_to_ivr_2021_2_17_9_10_47_163257.xml

generate_digitmaps

Данной командой производится генерация плана нумерации для всех контекстов маршрутизации в указанном домене (где поле плана нумерации устанавливается в "auto") и сохранение в DS.

Путь команды:

/domain/<DOMAIN>/routing/generate_digitmaps

Синтаксис:

generate_digitmaps

Параметры:

<DOMAIN> - имя виртуальной АТС.

Пример:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/generate_digitmaps   
Starting digitmap generation for context: test
Success: undefined
Starting digitmap generation for context: ctx_city_common
Success: X.
Starting digitmap generation for context: ctx_to_ewsd
Success: X.
Starting digitmap generation for context: default_routing
Success: (*[0-9*][0-9*].#|#[0-9*][0-9*].#|*#[0-9*][0-9*].#|1xx.|10xx.)
Starting digitmap generation for context: ctx_from_ewsd
Success: X.
Starting digitmap generation for context: ctx_from_local
Success: (002|004|01|02|03|04|05X|06X|07|09|1XX|2XXXXX|385XXXXXXX|3XXXXX|4XXXXX|
5XXXXX|7XXXXX|810X.|81XX|85XXXXXXXXXXX|8XXXXXXXXXX|9XXXXX|C101|C102|C103)
Starting digitmap generation for context: ctx_to_ivr
Success: (C101|C102|C103)
Generation has been finished
ok

[exec at: 11.03.2021 14:16:20, exec time: 72ms, nodes: ds1@ecss2 v.3.14.8.25]

import

Команда осуществляет импорт ранее сохраненных файлов, описывающих контексты маршрутизации.

Файлы должны находиться по по пути: ECSS_DATA_ROOT/routing/ctx/src/<DOMAIN>, по умолчанию это /var/lib/ecss/routing/ctx/src/<DOMAIN>. Информацию о конкретных путях в системе можно посмотреть по команде /node/nodes-info root_dirs.

Во время импортирования производится проверка на правильность формата файла (проверка корректности XML описания контекста маршрутизации), производится компиляция контекста маршрутизации. Полученный исполняемый модуль встраивается в систему маршрутизации. При совпадении имени контекста маршрутизации с существующим в системе контексте производится замена существующего контекста на импортируемый контекст маршрутизации.

Путь команды:

/domain/<DOMAIN>/routing/import

Синтаксис:

import <NODE> <FILE>

Параметры:

<NODE> - имя ноды;
<DOMAIN> - имя виртуальной АТС;
<FILE> - имя файла с контекстом маршрутизации, который необходимо установить;

При задании имени файла можно использовать маску поиска:

  • "?" - соответствует одному символу;
  • "*" - соответствует любому количеству символов до конца файла, следующей точки или символа "/". {Item,...} - для указания альтернативного файла.

Пример:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/import ecss1 ctx_from_local.xml 
importing file ctx_from_local.xml...
generated 133 rules
1 context has been successfully imported

[exec at: 11.03.2021 14:15:46, exec time: 1s 272ms, nodes: ds1@ecss1 v.3.14.8.25]

list

Команда позволяет просмотреть список имен контекстов маршрутизации в данном домене.

Путь команды:

/domain/<DOMAIN>/routing/list

Синтаксис:

list

Параметры:

<DOMAIN> - имя виртуальной АТС.

Пример:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/list
Routing contexts:

ctx_city_common
ctx_from_ewsd
ctx_from_local
ctx_to_ewsd
ctx_to_ivr
default_routing
test
---------
Total: 7

[exec at: 11.03.2021 14:15:10, exec time: 5ms, nodes: ds1@ecss1 v.3.14.8.25]

show

Команда позволяет просмотреть содержание файла контекста маршрутизации с именем <ContextName>.

Путь команды:

/domain/<DOMAIN>/routing/show

Синтаксис:

show <ROUTING_CONTEXT>

Параметры:

<ROUTING_CONTEXT> - имя контекста маршрутизации.

Пример:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/show ctx_to_ivr
Context was imported at 11.03.2021 11:52:18

<?xml version="1.0" encoding="UTF-8"?>
  <context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="ctx_to_ivr" np="np_240" digitmap="auto">
    <rule name="to_cc_ivr">
      <conditions>
        <cdpn digits="C101"/>
      </conditions>
      <actions>
        <cdpn nai="subscriberNumber" ni="private"/>
      </actions>
      <result>
        <ivr script="064c4e4b460b0d74"/>
      </result>
    </rule>
    <rule name="to_conf">
      <conditions>
        <cdpn digits="C102"/>
      </conditions>
      <actions>
        <cdpn ni="private" nai="subscriberNumber"/>
      </actions>
      <result>
        <ivr script="enter_number_of_teleconference"/>
      </result>
    </rule>
    <rule name="to_conf_room">
      <conditions>
        <cdpn digits="C103"/>
      </conditions>
      <actions>
        <cdpn nai="subscriberNumber" ni="private"/>
      </actions>
      <result>
        <ivr script="enter_number_of_conference_room"/>
      </result>
    </rule>
  </context>



[exec at: 11.03.2021 14:12:37, exec time: 18ms, nodes: ds1@ecss1 v.3.14.8.25]
XML

trace

Данной командой осуществляется запуск процесса маршрутизации и вывод результатов для указанного набора входных данных об устанавливаемом телефонном соединении.
Эта команда предоставляет удобный способ проверки корректности описания маршрутизации в системе, четко отображающий шаги маршрутизации конкретного вызова с указанием переходов между контекстами маршрутизации.

Путь команды:

/domain/<DOMAIN>/routing/trace

Синтаксис:

trace [<KEY1> = <VALUE1>[, ... [, <KEY> = <VALUE>]]]

Параметры:

<KEY> - название параметра, принимает следующие значения:

  • calling. - переопределение свойств алиаса А (calling.access_intercity, calling.access_international, calling.access_local, calling.access_private, calling.access_zone, calling.category, calling.provider), опциональный параметр.
  • cause - причина разъединения;
  • cdpn. - параметры вызываемого абонента (cdpn.digits, cdpn.incomplete, cdpn.inni, cdpn.nai, cdpn.ni, cdpn.npi), обязательный параметр cdpn.digits;
  • cgpn. - параметры вызывающего абонента (cgpn.apri, cgpn.digits, cgpn.incomplete, cgpn.nai, cgpn.ni, cgpn.npi, cgpn.screening), опциональный параметр;
  • context - исходный контекст маршрутизации, опциональный параметр. По умолчанию устанавливается контекст маршрутизации для интерфейса А. Задается в виде имя_домена/контекст_маршрутизации;
  • date - дата эмуляции вызова, задается в виде: D.M.Y или Y/M/D, опциональный параметр. По умолчанию устанавливается текущая дата;
  • iface - интерфейс вызывающего абонента;
  • iface_name - имя интерфейса;
  • mode - режим набора по префиксу(опциональный параметр, по умолчанию установлено: overlap), принимает значения:
    • enblock - номер абонента передается блоком;
    • overlap - номер абонента передается с перекрытием (по одной цифре);
  • ocdpn. - оригинальный номер абонента(ocdpn.apri, ocdpn.digits, ocdpn.empty, ocdpn.incomplete, ocdpn.nai, ocdpn.ni, rgn.npi);

  • rgn. - переадресованный номер(rgn.apri, rgn.digits, rgn.empty, rgn.incomplete, rgn.nai, rgn.ni, rgn.npi);

  • tag - специальный параметр, который можно установить для вызова при маршрутизации. Параметр действует только на этапе маршрутизации, устанавливается в каком-либо правиле маршрутизации и в последующем используется для изменения отработки логики маршрутизации;
  • time - время эмуляции вызова, задается в виде: H:M, опциональный параметр. По умолчанию устанавливается текущее время.

<VALUE> - значение параметра.

Пример:

admin@mycelium1@ecss1:/$ domain/biysk.local/routing/trace cgpn.digits=240465 cdpn.digits=416370 mode=enblock     
Traceroute to 416370 from 240465(<<"064bc964fbacf7eb">>) at 11.03.2021 14:13:59, final number
Default context is ctx_from_local
   digitmap: (002|004|01|02|03|04|05X|06X|07|09|1XX|2XXXXX|385XXXXXXX|3XXXXX|4XXXXX|5XXXXX|7XXXXX|810X.|81XX|85XXXXXXXXXXX|8XXXXXXXXXX|9XXXXX|C101|C102|C103)
   Update numbering plan on <<"np_240">>
1. ctx_from_local / default
   A:  "240465"(displayName=undefined, ni=private, nai=subscriberNumber, inc=false, npi=isdnTelephony, apri=presentationAllowed, screening=networkProvided, category=ordinarySubscriber(10), caller_id="240465")
   B:  "416370"(displayName=undefined, ni=undefined, nai=unknown, inc=false, inni=undefined, npi=undefined, category=undefined)
   applying rule: normalize_subscriber_to_national (CGPN: 240___, nai:subscriberNumber)
   action: transform cgpn nai: nationalNumber, digits: 3854240465
   action: transform calling alias - sorm_digits: "73854240465", sorm_ni: private
   result: keep on
2. ctx_from_local / default
   A:  "3854240465"(displayName=undefined, ni=private, nai=nationalNumber, inc=false, npi=isdnTelephony, apri=presentationAllowed, screening=networkProvided, category=ordinarySubscriber(10), caller_id="240465")
   B:  "416370"(displayName=undefined, ni=undefined, nai=unknown, inc=false, inni=undefined, npi=undefined, category=undefined)
   applying rule: collect_external_subscribers (CDPN: digits=4_____)
   action: change context to ctx_city_common
   action: transform cdpn nai: nationalNumber, digits: 3854416370
   action: transform called alias - sorm_digits: "416370", sorm_ni: local
   result: keep on
3. ctx_city_common / default
   A:  "3854240465"(displayName=undefined, ni=private, nai=nationalNumber, inc=false, npi=isdnTelephony, apri=presentationAllowed, screening=networkProvided, category=ordinarySubscriber(10), caller_id="240465")
   B:  "3854416370"(displayName=undefined, ni=undefined, nai=nationalNumber, inc=false, inni=undefined, npi=undefined, category=undefined)
   applying rule: city (CDPN: digits=3854______, nai:nationalNumber)
   action: change context to ctx_to_ewsd
   action: transform cdpn nai: subscriberNumber, digits: 416370, ni: local
   result: keep on
4. ctx_to_ewsd / default
   A:  "3854240465"(displayName=undefined, ni=private, nai=nationalNumber, inc=false, npi=isdnTelephony, apri=presentationAllowed, screening=networkProvided, category=ordinarySubscriber(10), caller_id="240465")
   B:  "416370"(displayName=undefined, ni=local, nai=subscriberNumber, inc=false, inni=undefined, npi=undefined, category=undefined)
   applying rule: to_ewsd_sorm (CDPN: digits=%)
   action: set external trunks [{<<"smg-4">>,1,undefined}]
   action: transform cdpn digits: 416370

------------------------------------------
Routing result: external
A:  "3854240465"(displayName=undefined, ni=private, nai=nationalNumber, inc=false, npi=isdnTelephony, apri=presentationAllowed, screening=networkProvided, category=ordinarySubscriber(10), caller_id="240465")
B:  "416370"(displayName=undefined, ni=local, nai=subscriberNumber, inc=false, inni=undefined, npi=undefined, category=undefined)
Options:
   sorm_ni_b: local
   sorm_ni_a: private
   sorm_digits_b: 416370
   sorm_digits_a: 73854240465

A interface info:                                                               B interfaces info:
#{[account] => {"...50-52-48-52-54-53","...117-105-99-97-49-111-101-78"},       [#{['cfc-support'] => true,
  ['cfc-support'] => true,                                                         [gate] =>
  [gate] =>                                                                            {gate_amqp,<<"acp.adapter.init.ex">>,<<"acp.sip.sip1.ipset1.init.rk">>},
      {gate_amqp,<<"acp.adapter.init.ex">>,<<"acp.sip.sip1.ipset1.init.rk">>},     [group] => "smg.gr",
  [group] => "loc.gr",                                                             [iface] => <<"smg-4">>,
  [iface] => <<"064bc964fbacf7eb">>,                                               [isActive] => true,
  [isActive] => true,                                                              ['media-profile'] =>
  ['media-profile'] =>                                                                 {media_profile,"default",user,
      {media_profile,"default",user,                                                       [{media_profile_codecs,'<other>',
          [{media_profile_codecs,'<other>',                                                     [{media_profile_codec,<<"<other>">>,<<"*">>,true,#{}}],
               [{media_profile_codec,<<"<other>">>,<<"*">>,true,#{}}],                          #{offroad => false,'rtcp-enabled' => true}},
               #{offroad => false,'rtcp-enabled' => true}},                                 {media_profile_codecs,audio,
           {media_profile_codecs,audio,                                                         [{media_profile_codec,<<"G722">>,<<"*">>,true,#{}},
               [{media_profile_codec,<<"G722">>,<<"*">>,true,#{}},                               {media_profile_codec,<<"PCMA">>,<<"*">>,true,#{}},
                {media_profile_codec,<<"PCMA">>,<<"*">>,true,#{}},                               {media_profile_codec,<<"PCMU">>,<<"*">>,true,#{}},
                {media_profile_codec,<<"PCMU">>,<<"*">>,true,#{}},                               {media_profile_codec,<<"G729">>,<<"*">>,true,#{}},
                {media_profile_codec,<<"G729">>,<<"*">>,true,#{}},                               {media_profile_codec,<<"telephone-event">>,<<"*">>,true,#{}}],
                {media_profile_codec,<<"telephone-event">>,<<"*">>,true,#{}}],                  #{offroad => false,'rtcp-enabled' => true}}],
               #{offroad => false,'rtcp-enabled' => true}}],                               #{'dtmf-receive-type' => auto,'dtmf-transmit-type' => transit}},
          #{'dtmf-receive-type' => auto,'dtmf-transmit-type' => transit}},         [mode] => sipt,
  [name] => "240465@biysk.local",                                                  [name] => "smg-4",
  [owner] => "sip1",                                                               [owner] => "sip1",
  ['routing.context'] => ctx_from_local,                                           ['routing.context'] => ctx_from_ewsd,
  [site] => <<"local">>,                                                           [site] => <<"local">>,
  [subtype] => user,                                                               [subtype] => trunk,
  [terminal_type] => basic,                                                        [terminal_type] => smart,
  [type] => sip,                                                                   [trunk] => "biysk.local.smg.gr.trunk.autoname",
  [zone] => <<"default">>}                                                         [type] => sip,
A alias info:                                                                      [zone] => <<"default">>}]
#{[access_group] => all,                                                        
  [address] => "240465",                                                        
  [alias] => {"biysk.local",<<"064bc964fbacf7eb">>},                            
  [cdr_group] => bsk3,                                                          
  [cpt,traces] => [],                                                           
  [domain] => "biysk.local",                                                    
  [iface] => <<"064bc964fbacf7eb">>,                                            
  [isActive] => true,                                                           
  [language] => ru,                                                             
  [last_incoming_call_info] =>                                                  
      {rtop_last_incoming_call_info,1,"9609468387",348465789,                   
          {1614,675923,338557}},                                                
  ['media-profile'] =>                                                          
      {media_profile,"default",user,                                            
          [{media_profile_codecs,'<other>',                                     
               [{media_profile_codec,<<"<other>">>,<<"*">>,true,#{}}],          
               #{offroad => false,'rtcp-enabled' => true}},                     
           {media_profile_codecs,audio,                                         
               [{media_profile_codec,<<"G722">>,<<"*">>,true,#{}},              
                {media_profile_codec,<<"PCMA">>,<<"*">>,true,#{}},              
                {media_profile_codec,<<"PCMU">>,<<"*">>,true,#{}},              
                {media_profile_codec,<<"G729">>,<<"*">>,true,#{}},              
                {media_profile_codec,<<"telephone-event">>,<<"*">>,true,#{}}],  
               #{offroad => false,'rtcp-enabled' => true}}],                    
          #{'dtmf-receive-type' => auto,'dtmf-transmit-type' => transit}},      
  [original_address] => "240465",                                               
  [original_cdpn_address] => "416370",                                          
  [password] => "pda",                                                          
  [pin] => "1111",                                                              
  [ss] =>                                                                       
      [{ss_entity,teleconference_manager,4,true,true,undefined,[],[],           
           [{ss_property,second_line,undefined,[],undefined,false,[],0}]},      
       {ss_entity,teleconference,6,true,true,undefined,[],[],[]},               
       {ss_entity,meet_me_conference,3,true,true,undefined,[],[],               
           [{ss_property,mode,undefined,master,undefined,false,[],0},           
            {ss_property,destroy_mode,undefined,by_no_more_calls,undefined,     
                false,[],0},                                                    
            {ss_property,room_number,undefined,[],undefined,false,[],0}]},      
       {ss_entity,ctr,6,true,true,undefined,[],                                 
           [{ss_property,dtmf_detector,undefined,true,undefined,false,[],0}],   
           []},                                                                 
       {ss_entity,conference,11,true,true,undefined,[],[],                      
           [{ss_property,destroy_mode,undefined,by_no_master,undefined,false,   
                [],0},                                                          
            {ss_property,max_participants,undefined,16,undefined,false,[],0}]}, 
       {ss_entity,cnip,4,true,true,undefined,[],[],[]},                         
       {ss_entity,clip,6,true,true,undefined,[],[],[]},                         
       {ss_entity,chold,9,true,true,undefined,[],                               
           [{ss_property,dtmf_detector,undefined,true,undefined,false,[],0}],   
           [{ss_property,disable_moh,undefined,false,undefined,false,[],0},     
            {ss_property,dtmf_sequence_as_flash,undefined,false,undefined,      
                false,[],0}]},                                                  
       {ss_entity,cc_agent,4,true,true,undefined,[],[],                         
           [{ss_property,extra_number,undefined,[],undefined,false,[],0}]}],    
  [ss,mgm,telephone] => enabled,                                                
  [subscriber_portal,login] => "240465",                                        
  [subscriber_portal,password] => "pmMvfG3LPBeR",                               
  [teleconference,password] => "9P4VXa0SAZHN",                                  
  [timezone] => 'UTC+07:00',                                                    
  [uid] => <<"064bc964fbd3af5c">>}                                              


[exec at: 11.03.2021 14:13:59, exec time: 36ms, nodes: ds1@ecss2 v.3.14.8.25]