<X-PRE-PROCESS cmd="set" data="default_provider_username=3435555555"/>
<variable name="outbound_caller_id_name" value="3435555566"/>
auto_login
Value: true
Enabled: true
После изменения значений на текущей странице нажимаем Save, на странице настроек по умолчанию Reload.Внимание!
Предлагаемые скрипты вы используете на свой страх и риск, автор не несет ответственности за их неправильное использование или неожиданные побочные эффекты их правильного использования.
.
- Присвойте переменной $nums значения, соответствующие вашим номерам.
- Перед использованием скриптов необходимо везде заменить UUID домена на значение, присвоенное домену при установке (поле domain_uuid).
- Так же необходимо заменить IP-адрес домена (172.18.253.1) на ваш.
- Не забудьте откорректировать значение ключа -SearchBase, указав свою область выборки вместо «OU=Ekaterinburg,DC=dc,DC=domain,DC=local»
- UUID приложения Voicemail (поле app_uuid) так же заменить на UUID, присвоенный при установке.
- Значения UUID'ов можно посмотреть, например, в таблице v_dialplans.
- Всем абонентским номерам будет присвоен пароль для регистрации «12345», пароль на голосовую почту и прочие сервисы — совпадающий с абонентским номером.
- Скрипт дописывает файлы построчно! Поэтому не забывайте удалять файлы перед каждым запуском скрипта или очищать их содержимое!
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
$nums=@{"1111"="5555555";"1112"="5555566"}
[System.IO.File]::AppendAllText("d:\v_extensions.csv", "extension_uuid;domain_uuid;extension;number_alias;password;accountcode;effective_caller_id_name;effective_caller_id_number;outbound_caller_id_name;outbound_caller_id_number;emergency_caller_id_name;emergency_caller_id_number;directory_full_name;directory_visible;directory_exten_visible;limit_max;limit_destination;missed_call_app;missed_call_data;user_context;toll_allow;call_timeout;call_group;call_screen_enabled;user_record;hold_music;auth_acl;cidr;sip_force_contact;nibble_account;sip_force_expires;mwi_account;sip_bypass_media;unique_id;dial_string;dial_user;dial_domain;do_not_disturb;forward_all_destination;forward_all_enabled;forward_busy_destination;forward_busy_enabled;forward_no_answer_destination;forward_no_answer_enabled;follow_me_uuid;enabled;description;forward_caller_id_uuid;absolute_codec_string;forward_user_not_registered_destination;forward_user_not_registered_enabled;force_ping`r`n", $Utf8NoBomEncoding)
[System.IO.File]::AppendAllText("d:\v_voicemails.csv", "domain_uuid;voicemail_uuid;voicemail_id;voicemail_password;greeting_id;voicemail_alternate_greet_id;voicemail_mail_to;voicemail_sms_to;voicemail_attach_file;voicemail_file;voicemail_local_after_email;voicemail_enabled;voicemail_description;voicemail_name_base64`r`n", $Utf8NoBomEncoding)
Get-ADUser -Filter * -SearchBase "OU=Ekaterinburg,DC=dc,DC=domain,DC=local" -Properties Telephonenumber,sn,initials,cn|%{
if(-not $_.Telephonenumber -eq ""){
if($nums.Get_Item($_.Telephonenumber) -eq $null)
{$outn = "5555555"}
else
{$outn = $nums.Get_Item($_.Telephonenumber)}
$extension_uuid = (New-Guid).Tostring()
$domain_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## Заменить!!!
$extension = $_.Telephonenumber
$number_alias = ""
$password = "12345"
$accountcode = "172.18.253.1"
$effective_caller_id_name = $_.sn + " " + $_.initials
$effective_caller_id_number = $extension
$outbound_caller_id_name = $outn
$outbound_caller_id_number = $outn
$emergency_caller_id_name = $effective_caller_id_name
$emergency_caller_id_number = $extension
$directory_full_name = $_.cn
$directory_visible = "true"
$directory_exten_visible = "true"
$limit_max = "1"
$limit_destination = "error/user_busy"
$missed_call_app = ""
$missed_call_data = ""
$user_context = "172.18.253.1"
$toll_allow = "domestic,international,local"
$call_timeout = "30"
$call_group = ""
$call_screen_enabled = "false"
$user_record = ""
$hold_music = "local_stream://default"
$auth_acl = ""
$cidr = ""
$sip_force_contact = ""
$nibble_account = ""
$sip_force_expires = "3600"
$mwi_account = ""
$sip_bypass_media = ""
$unique_id = ""
$dial_string = ""
$dial_user = ""
$dial_domain = ""
$do_not_disturb = ""
$forward_all_destination = ""
$forward_all_enabled = ""
$forward_busy_destination = ""
$forward_busy_enabled = ""
$forward_no_answer_destination = ""
$forward_no_answer_enabled = ""
$follow_me_uuid = ""
$enabled = "true"
$description = $_.sn + " " + $_.initials
$forward_caller_id_uuid = ""
$absolute_codec_string = ""
$forward_user_not_registered_destination = ""
$forward_user_not_registered_enabled = ""
$force_ping = ""
$csv="$extension_uuid;$domain_uuid;$extension;$number_alias;$password;$accountcode;$effective_caller_id_name;$effective_caller_id_number;$outbound_caller_id_name;$outbound_caller_id_number;$emergency_caller_id_name;$emergency_caller_id_number;$directory_full_name;$directory_visible;$directory_exten_visible;$limit_max;$limit_destination;$missed_call_app;$missed_call_data;$user_context;`"$toll_allow`";$call_timeout;$call_group;$call_screen_enabled;$user_record;$hold_music;$auth_acl;$cidr;$sip_force_contact;$nibble_account;$sip_force_expires;$mwi_account;$sip_bypass_media;$unique_id;$dial_string;$dial_user;$dial_domain;$do_not_disturb;$forward_all_destination;$forward_all_enabled;$forward_busy_destination;$forward_busy_enabled;$forward_no_answer_destination;$forward_no_answer_enabled;$follow_me_uuid;$enabled;$description;$forward_caller_id_uuid;$absolute_codec_string;$forward_user_not_registered_destination;$forward_user_not_registered_enabled;`"$force_ping`"`r`n"
[System.IO.File]::AppendAllText("d:\v_extensions.csv", $csv, $Utf8NoBomEncoding)
$voicemail_uuid = (New-Guid).Tostring()
$voicemail_id = $extension
$voicemail_password = $extension
$greeting_id
$voicemail_alternate_greet_id
$voicemail_mail_to = ""
$voicemail_sms_to
$voicemail_attach_file
$voicemail_file = ""
$voicemail_local_after_email = "true"
$voicemail_enabled = "false"
$voicemail_description = $description
$voicemail_name_base64
[System.IO.File]::AppendAllText("d:\v_voicemails.csv", "$domain_uuid;$voicemail_uuid;$voicemail_id;$voicemail_password;$greeting_id;$voicemail_alternate_greet_id;$voicemail_mail_to;$voicemail_sms_to;$voicemail_attach_file;$voicemail_file;$voicemail_local_after_email;$voicemail_enabled;$voicemail_description;$voicemail_name_base64`r`n", $Utf8NoBomEncoding)}}
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::AppendAllText("d:\v_destinations.csv", "domain_uuid;destination_uuid;dialplan_uuid;fax_uuid;destination_type;destination_number;destination_number_regex;destination_caller_id_name;destination_caller_id_number;destination_cid_name_prefix;destination_context;destination_app;destination_data;destination_enabled;destination_description;destination_accountcode`r`n", $Utf8NoBomEncoding)
[System.IO.File]::AppendAllText("d:\v_dialplans.csv", "domain_uuid;dialplan_uuid;app_uuid;dialplan_context;dialplan_name;dialplan_number;dialplan_continue;dialplan_order;dialplan_enabled;dialplan_description`r`n", $Utf8NoBomEncoding)
[System.IO.File]::AppendAllText("d:\v_dialplan_details.csv", "domain_uuid;dialplan_uuid;dialplan_detail_uuid;dialplan_detail_tag;dialplan_detail_type;dialplan_detail_data;dialplan_detail_break;dialplan_detail_inline;dialplan_detail_group;dialplan_detail_order`r`n", $Utf8NoBomEncoding)
$nums="1111=5555555;1112=5555566"
$nums.Split(";")|%{
$innum = $_.Split("=")[0]
$outnum = $_.Split("=")[1]
$domain_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## Заменить!!!
$destination_uuid = (New-Guid).Tostring()
$dialplan_uuid = (New-Guid).Tostring()
$fax_uuid
$destination_type = "inbound"
$destination_number = "343$outnum"
$destination_number_regex = "^(343$outnum)$"
$destination_caller_id_name
$destination_caller_id_number
$destination_cid_name_prefix
$destination_context = "public"
$destination_app
$destination_data
$destination_enabled = "true"
$destination_description = "$outnum-$innum"
$destination_accountcode
[System.IO.File]::AppendAllText("d:\v_destinations.csv", "$domain_uuid;$destination_uuid;$dialplan_uuid;$fax_uuid;$destination_type;$destination_number;$destination_number_regex;$destination_caller_id_name;$destination_caller_id_number;$destination_cid_name_prefix;$destination_context;$destination_app;$destination_data;$destination_enabled;$destination_description;$destination_accountcode`r`n", $Utf8NoBomEncoding)
$app_uuid = "ffffffff-ffff-ffff-ffff-ffffffffffff" ## Заменить!!!
$dialplan_context = "public"
$dialplan_name = $destination_number
$dialplan_number = $destination_number
$dialplan_continue = "false"
$dialplan_order = "100"
$dialplan_enabled = "true"
$dialplan_description = $destination_description
[System.IO.File]::AppendAllText("d:\v_dialplans.csv", "$domain_uuid;$dialplan_uuid;$app_uuid;$dialplan_context;$dialplan_name;$dialplan_number;$dialplan_continue;$dialplan_order;$dialplan_enabled;$dialplan_description`r`n", $Utf8NoBomEncoding)
$dialplan_detail_break
$dialplan_detail_inline
$dialplan_detail_group
$dialplan_detail_uuid = (New-Guid).Tostring()
$dialplan_detail_tag = "condition"
$dialplan_detail_type = "destination_number"
$dialplan_detail_data = "^(343$outnum)$"
$dialplan_detail_order = 20
[System.IO.File]::AppendAllText("d:\v_dialplan_details.csv", "$domain_uuid;$dialplan_uuid;$dialplan_detail_uuid;$dialplan_detail_tag;$dialplan_detail_type;$dialplan_detail_data;$dialplan_detail_break;$dialplan_detail_inline;$dialplan_detail_group;$dialplan_detail_order`r`n", $Utf8NoBomEncoding)
$dialplan_detail_uuid = (New-Guid).Tostring()
$dialplan_detail_tag = "action"
$dialplan_detail_type = "transfer"
$dialplan_detail_data = "$innum XML 172.18.253.1"
$dialplan_detail_order = 30
[System.IO.File]::AppendAllText("d:\v_dialplan_details.csv", "$domain_uuid;$dialplan_uuid;$dialplan_detail_uuid;$dialplan_detail_tag;$dialplan_detail_type;$dialplan_detail_data;$dialplan_detail_break;$dialplan_detail_inline;$dialplan_detail_group;$dialplan_detail_order`r`n", $Utf8NoBomEncoding)
}
Gateway: 172.16.253.3
Username: 3435555555
Password: not-used
From User: 3435555555
From Domain: 172.16.253.3
Proxy: 172.16.253.3
Register: False
Caller ID In From: True
Обратите внимание!В документации по FusionPBX недвусмысленно указывается, что при выполнении настроек поля, выделенные жирным текстом, обязательны для заполнения.Настройка ACL
Однако я, по непонятной мне причине, жирность поля Proxy не углядел и значение ему не выставил. В итоге получил работающие входящие внешние вызовы, но не работающие исходящие наружу. Командаsofia status gateway ffffffff-ffff-ffff-ffff-ffffffffffff
не показывала аномалий настройки и даже показывала назначенное значение поля Proxy, соответствующее значению Gateway. Точно такой же вывод команды при точно таких же настройках демонстрировал «голый» FreeSWITCH в предыдущей инсталляции, и при этом совершенно беспроблемно позволял совершать исходящие вызовы наружу.
FusionPBX же заработал только после явного указания значения Proxy.
*ffffffff-ffff-ffff-ffff-ffffffffffff
— UUID шлюза
Важно!
ACL-списки только для сетей и доменов провайдеров.
Ваших собственных сетей и доменов в них быть не должно.
Список domains должен быть по умолчанию deny.
Сами правила должны быть разрешающими и в них должен быть прописан IP-адрес шлюза провайдера с маской /32, поле domain заполнять не нужно.
Type: allow
CIDR: 172.16.253.3/32
Domain:
Description: default SIP-trunk
default_areacode: 343
default_language: ru
default_dialect: RU
default_voice: elena
ringback: $${ru-ring}
transfer_ringback: $${ru-ring}
Раздел IP Addressexternal_rtp_ip: 172.16.160.154
external_sip_ip: 172.16.160.154
Раздел SIP Profile: Internalinternal_auth_calls: true
Собственно говоря, именно эта переменная в значении true отвечает за считывание настроек абонентского номера и передачу из него значений ${outbound_caller_id_number} и ${outbound_caller_id_name}. Чтобы эта переменная имела силу, необходимо, чтобы была отключена авторизация внутренних абонентских номеров по ACL. По умолчанию, из коробки, это сделано и так: ACL-авторизация отсутствует, вместо нее используется Digest (по абонентскому номеру и паролю): internal_auth_calls: true
.Важно!Исходящие маршруты
Чтобы корректно определялись прямые городские номера, присвоенные внутренним в настройках через поля Outbound Caller ID Name и Outbound Caller ID Number, необходимо выполнение трех условий:
- Отсутствие ACL-авторизации внутренних абонентов
- Включенная Digest-авторизация в настройках SIP-профиля:
internal_auth_calls: true
- Наличие в настройках шлюза:
Caller ID In From: True
^(\d{7})$
(набор прямого городского 7-значного номера без всяких префиксов в виде нулей, девяток и прочего).^(8343\d{7})$
(набор городского 7-значного номера с префиксом 8343).^(89\d{9})$
(звонок на сотовый с префиксом 8, что является стандартом де-факто)^(8\d{10})$
(междугородний звонок, так же привычные: 8, код населенного пункта, номер абонента)^(810\d+)$
(стандартный же префикс 810, далее код страны, код территории, номер абонента).effective_caller_id_name=${default_areacode}${outbound_caller_id_name}
effective_caller_id_number=${default_areacode}${outbound_caller_id_number}
таким образом, чтобы передаваемый оператору номер вызывающего абонента включал в себя код города.aggressive-nat-detection
.aggressive-nat-detection
Value: true
Enabled: False
Русификация голосового откликаК сожалению, не доступен сервер mySQL