Удаление ветки в GIT
Удаление локально ветки
git branch -D branch_to_be_deleted
Удаление удаленной ветки
git push origin --delete branch_to_be_deleted
Notes about IT
Удаление локально ветки
git branch -D branch_to_be_deleted
Удаление удаленной ветки
git push origin --delete branch_to_be_deleted
Файл app/addons/call_requests/controllers/frontend/call_requests.php
Найти
if (!defined('BOOTSTRAP')) { die('Access denied'); }
и заменить на
use Tygh\Mailer;
if (!defined('BOOTSTRAP')) { die('Access denied'); }
Ниже найти
elseif (!empty($res['notice'])) {
fn_set_notification('N', __('notice'), $res['notice']);
}
и заменить на (только вписать свои email адреса)
elseif (!empty($res['notice'])) {
Mailer::sendMail(array(
'to' => 'email@email.com',
'from' => 'email@email.com',
'reply_to' => 'email@email.com',
'data' => array(
),
'tpl' => 'addons/call_requests/notification.tpl',
), 'C');
fn_set_notification('N', __('notice'), $res['notice']);
}
Затем идем в design/themes/[ваша тема]/mail/templates/addons/call_requests и создаем там два файла:
1) notification.tpl
{include file="common/letter_header.tpl"}
{__("hello")}<br /><br />
Поступила новая заявка на обратный звонок. Подробная информация в <a href="http://www.mysite.ru/admin.php?dispatch=call_requests.manage" target="_blank">панели управления сайтом</a>
2) notification_subj.tpl
Обратный звонок - новая заявка
В файле install/app/Installer/Validator.php в районе 222 стоки находим
if (preg_match('/^[0-9a-zA-Z$_]{1,63}$/', $name)) {
и меняем на
if (preg_match('/^[0-9a-zA-Z$_-]{1,63}$/', $name)) {
Подразумеваем, что уже установлена CentOS 7 со всеми обновлениями (yum update).
Сначала подготовим платформу:
yum install perl-devel gcc wget
wget http://search.cpan.org/CPAN/authors/id/S/SM/SMUELLER/Data-Dumper-2.154.tar.gz
tar xvzf Data-Dumper-2.154.tar.gz
cd Data-Dumper-2.154
perl Makefile.PL
make && make install
Дальше устанавливаем git:
yum install git
Создаем пользователя:
useradd -p PASSWORD git
В файле /etc/ssh/sshd_config (не путать с ssh_config) и раскомментируем строки:
RSAAutentification yes
PubkeyAutentification yes
AuthorizedKeysFile .ssh/authorized_keys
Перезапускаем на сервере демон sshd:
service sshd restart
Заходим под пользователем git:
su git
cd ~
Создаем ключ для пользователя git (с именем, например, id_git):
ssh-keygen -t rsa -b 2048
Из под root выставляем права:
chown git:git /home/git/.ssh/id_git.pub
chmod 700 /home/git/.ssh/
chmod 600 /home/git/.ssh/authorized_keys
Создадим недостающие папки:
mkdir /home/git/.gitolite
mkdir /home/git/.gitolite/logs
Устанавливаем gitolite из под git:
git clone git://github.com/sitaramc/gitolite
mkdir -p ~/bin
gitolite/install -ln ~/bin
gitolite setup -pk id_git.pub
Если последняя команда вызывает ошибку, то:
$HOME/bin/gitolite setup -pk ~/.ssh/id_git.pub
Дальше стягиваем себе репозиторий:
git clone git@host:gitolite-admin
Настраиваем под свои нужды и заливаем изменения на сервер.
Случается, что нужно просмотреть сжатый css файл. Приходилось лезть на сайт и ждать когда вернется ответ, но был найден замечательный плагин для Sublime Text — CSS Unminifier.
Установка через Package Control (Ctrl+Shift+P), где выбрать Package Control: Install Package и ввести Css Unminifier.
Пользоваться CSS Unminifier проще простого: выделяем нужный текст и жмем Ctrl+Alt+U
В рамках обновления KB2998527 пришлось изучить вопрос установки msu-пакетов.
Решение нашлось простое:
1) Открываем нужную нам политику
2) Идем Конфигурация компьютера — Политики — Конфигурация Windows — Сценарии (Запуск/завершение)
3) Открываем Автозагрузка и создаем сценарий:
Имя сценария: wusa.exe
Параметры сценария: <путь>\Windows6.1-KB2998527-x64.msu /quiet /norestart
Инвентаризация компьютеров при помощи данного скрипта поможет системному администратору решить следующие задачи в масштабе небольшой организации:
Предлагаемый скрипт позволяет:
Отличительные особенности скрипта:
Скрипт для инвентаризации компьютеров средствами WMI и VBScript, упакован ZIP: invent_comp.zip
Установка не требуется, достаточно распаковать архив в отдельный каталог на рабочей станции администратора.
Скрипт invent_comp.vbs собирает данные о конфигурации указанного компьютера и сохраняет отчет в формате CSV в заданный локальный каталог или на сетевой ресурс. Имя файла отчета соответствует сетевому имени компьютера. Есть несколько вариантов запуска.
Для проверки скрипта при первом знакомстве, а также для сбора данных с серверов и отдельных компьютеров не дожидаясь их перезагрузки, можно запускать скрипт вручную, с рабочего места администратора. При этом достаточно использовать настройки по умолчанию, тогда отчеты будут сохраняться в подкаталог рядом со скриптом:
Const SILENT = FALSE 'тихий режим отключен, будет запрошено имя компьютера
Const DATA_DIR = "comp\" 'локальный каталог + "\" в конце
Скрипт может работать в «тихом» режиме, т. е. не выводить диалоги, собирать данные о локальном компьютере и сохранять отчет на заранее определенный сетевой ресурс. Таким образом возможен автоматический запуск на всех рабочих станциях сети, например при их включении. Для этого варианта запуска лучше создать и использовать отдельную копию файла.
Сначала необходимо выделить сетевой ресурс для сохранения отчетов и дать разрешение на запись пользователю (или группе пользователей), от имени которого будет запускаться скрипт.
Настройки в самом скрипте такие:
Const SILENT = TRUE 'режим отчета о локальном компьютере, без вывода диалогов
Const DATA_DIR = "\\SRV\Invent\comp\" 'сетевой ресурс + "\" в конце
Затем следует настроить запуск скрипта через logon-скрипт или групповую политику. Необходимо учитывать, что для обращения к компоненту WMI нужны права администратора — поэтому в групповой политике лучше включать скрипт в конфигурацию компьютера, а не пользователя.
Если есть компьютеры, данные по которым невозможно собрать другими способами, можно скопировать скрипт на переносной диск и запускать с него. Настройки взять из варианта 1, собранные отчеты добавить к остальным.
Формат отчета с результатами
Результаты сохраняются в текстовый файл формата CSV. Каждая строка файла состоит из 4 полей, разделенных символом ; («точка с запятой»):
Если в значении какого-либо параметра встретится символ ;, он будет заменен на символ _. Значения полей не заключаются в кавычки. Первая строка содержит заголовки столбцов. При желании можно отключить добавление этой строки в настройках:
Const HEAD_LINE = False 'НЕ выводить заголовки в первой строке CSV-файла
Пример отчета:
Секция отчета;Параметр;Номер экземпляра;Значение
Компьютер;Дата проверки;1;10.06.2009 22:33:44
Компьютер;UUID;1;67DB3380-FEB7-11D5-8ED2-001E8CAD784C
Компьютер;Сетевое имя;1;COMP
Компьютер;Домен;1;WORKGROUP
Компьютер;Владелец;1;User
Компьютер;Текущий пользователь;1;COMP\Pavel
Компьютер;Объем памяти (Мб);1;2047
Операционная система;Наименование;1;Microsoft Windows XP Professional
Операционная система;Версия;1;5.1.2600
Операционная система;Обновление;1;Service Pack 3
Операционная система;Зарегистрированный пользователь;1;User
Операционная система;Серийный номер;1;XXXXX-XXX-XXXXXXX-XXXXX
Операционная система;Организация;1;1
Операционная система;Дата установки;1;06.08.2008 12:34:56
Материнская плата;Производитель;1;ASUSTeK Computer INC.
Материнская плата;Наименование;1;P5KPL-VM
Материнская плата;Версия;1;x.xx
Материнская плата;Серийный номер;1;MT7082K06808353
BIOS;Производитель;1;American Megatrends Inc.
BIOS;Наименование;1;BIOS Date: 07/28/08 14:07:15 Ver: 08.00.12
BIOS;Версия;1;0904
BIOS;Серийный номер;1;System Serial Number
Процессор;Наименование;1;Intel(R) Core(TM)2 Duo CPU E8200 @ 2.66GHz
Процессор;Описание;1;x86 Family 6 Model 23 Stepping 6
Процессор;Частота (МГц);1;2664
Процессор;Частота FSB (МГц);1;333
Процессор;Размер L2-кеша (кб);1;6144
Процессор;Разъем;1;Socket 775
Модуль памяти;Размер (Мб);1;1024
Модуль памяти;Частота;1;800
Модуль памяти;Размещение;1;DIMM A1
Модуль памяти;Размер (Мб);2;1024
Модуль памяти;Частота;2;800
Модуль памяти;Размещение;2;DIMM B1
Диск;Наименование;1;WDC WD3200AAKS-00C9A0
Диск;Размер (Гб);1;298
Диск;Интерфейс;1;IDE
Логический диск;Наименование;1;C:
Логический диск;Файловая система;1;NTFS
Логический диск;Размер (Гб);1;32
Логический диск;Свободно (Гб);1;14
Логический диск;Серийный номер;1;8C959CAC
CD-привод;Наименование;1;Optiarc DVD RW AD-5200A
Полученные на первом этапе отчеты можно не только просматривать по-отдельности, но и свести в одну таблицу. Скрипт invent_comp_report.vbs просматривает заданный каталог и из всех найденных там отчетов извлекает данные.
Перед запуском надо проверить настройки в тексте скрипта:
Const DATA_DIR = "comp\" 'каталог для сохранения отчетов + "\" в конце
Const DATA_EXT = ".csv" 'расширение файлов с данными
Const HEAD_LINE = True 'пропустить первую строку в файле CSV - заголовок
Const REPORT_FILE = "comp_report_%DATE%.htm" 'файл для сохранения отчета
Не все данные из отдельного отчета нужны в общем отчете. Какие столбцы и в каком порядке попадут в общий отчет определяется в программном коде через массив:
'количество, порядок и названия столбцов отчета
'значения должны соответствовать первым двум полям CSV файла!
Dim col(21) '
После запуска скрипта invent_comp_report.vbs будет создан файл в формате XHTML, который можно открыть в браузере, импортировать в OpenOffice.org Calc или Microsoft Excel (не проверено).
В таблице каждому компьютеру соответствует одна строка. Если на компьютере есть несколько комплектующих одного типа, то они оформляются в виде списка.
Для дополнительной обработки табличного отчета и вывода на печать предлагается использовать специально предназначенные для этого программы, например, OpenOffice.org Calc.
Какие параметры и в каком порядке попадут в отчет определяется в программном коде процедуры InventComp. Каждой секции отчета, содержащей сведения по всем экземплярам какого-либо класса компонентов, соответствует один вызов подпрограммы Log. Вот пример:
Log "Win32_ComputerSystem", _
"Name,Domain,PrimaryOwnerName,UserName,TotalPhysicalMemory", "", _
"Компьютер", _
"Сетевое имя,Домен,Владелец,Текущий пользователь,Объем памяти (Мб)"
Параметры вызова подпрограммы разнесены на несколько строк для наглядности. Третий параметр чаще всего — пустая строка, и поэтому расположен на одной строке со вторым.
Пояснение к параметрам данного вызова подпрограммы:
Чтобы корректно добавить или изменить подобный вызов, необходимо найти и изучить документацию по соответствующему WMI-классу:
Также для составления и тестирования запросов к WMI можно использовать программы:
Чтобы в отчет не попадали отключенные сетевые адаптеры, минипорты и виртуальные адаптеры VMware, в запросе к классу Win32_NetworkAdapter добавлено условие:
"NetConnectionStatus > 0 AND NOT (Name LIKE 'VMware%')"
Чтобы в отчет попадали только локальные принтеры, подключенные через порт USB или LPT, в запросе к классу Win32_Printer добавлено условие:
"(Local = True OR Network = False) AND (PortName LIKE '%USB%' OR PortName LIKE '%LPT%')"
Чтобы в секцию отчета «Диск» попадали данные только о жестких дисках, в запросе к классу Win32_DiskDrive добавлено условие:
"InterfaceType <> 'USB'"
Соответственно, чтобы в секцию отчета «Логический диск» также попадали данные только о разделах жестких дисков, в запросе к классу Win32_LogicalDisk добавлено условие:
'DriveType = 3 - только локальные диски
'пропускаются USB-диски, размер которых обычно NULL
"DriveType = 3 AND Size IS NOT NULL"
В Windows 2000 компонент WMI не поддерживает некоторые WMI-классы, например сетевые адаптеры и принтеры. Причем, если все-таки отправить некорректный запрос, не вернется ни ответа, ни сообщения об ошибке — создание отчета просто прекратится. Поэтому добавлена проверка версии WMI-сервера — запрос выполняется только если номер сборки операционной системы больше или равен 2600 (Windows XP/2003):
If build >= 2600 Then
Log "Win32_NetworkAdapter", _
If build >= 2600 Then
Log "Win32_Printer", _
Видеоадаптеры ATI, имеющие два выхода отображаются как два отдельных адаптера, причем в названии второго есть слово «Secondary». Чтобы в отчете не отображались такие «двойники», в запросе к классу Win32_VideoController добавлено условие:
"NOT (Name LIKE '%Secondary')"
Размер дисков и объем памяти в WMI выдается в байтах. Чтобы в отчете значения какого-либо параметра выводились в более привычных кратных единицах, достаточно в конце названия параметра добавить условные символы (Мб) или (Гб). В скрипте есть проверка этих условных символов:
'если указана кратная единица измерения, перевести значение
ElseIf Right(names(i), 4) = "(Мб)" Then
value = CStr(Round(value / 1024 ^ 2))
ElseIf Right(names(i), 4) = "(Гб)" Then
value = CStr(Round(value / 1024 ^ 3))
Значения, имеющие тип «дата и время» распознаются по свойству CIMType и автоматически преобразуются в читаемый вид:
'если тип данных - дата, преобразовать в читаемый вид
ElseIf prop.CIMType = 101 Then
value = ReadableDate(value)
Если значение является массивом (например, перечень поддерживаемых форматов бумаги у принтера — свойство PrinterPaperNames класса Win32_Printer), то все значения автоматически «склеиваются» в строку с запятой в качестве разделителя:
'если тип данных - массив, собрать в строку
ElseIf IsArray(value) Then
value = Join(value,",")
При тестировании скрипта замечены такие ошибки:
Проблема | Вероятная причина | Как устранить |
Сообщение «Компьютер удаленного сервера не существует или недоступен» | Доступ к службе WMI удаленного компьютера заблокирован брандмауэром. | Отключить службу брандмауэра, подключившись к удаленному компьютеру через консоль (оснастку) «Управление компьютером». |
Сообщение «Разрешение отклонено» | Не удается создать новый или обновить существующий файл отчета. | Проверить, что в настройках скрипта указан нужный каталог для сохранения отчетов, файл отчета не занят другой программой и для него не установлен атрибут «только чтение», у скрипта достаточно разрешений на запись. |
Сообщение «Объект не поддерживает это свойство или метод» | Некоторые свойства объектов WMI не поддерживаются Windows 2000. При обращении к таким свойствам возникает ошибка. Например, при подключении к Windows 2000 такую ошибку вызывает обращение к свойствам ’NetConnectionStatus’, ’AdapterType’ элемента коллекции ’Win32_NetworkAdapter’. | Проверить в документации по WMI, какие свойства не поддерживаются в некоторых ОС и перед обращением к таким свойствам проверять версию ОС или вообще их не использовать. |
Неправильно определяется процессор Intel Core 2 в XP | Это неточность компонента WMI, см. статью Microsoft на эту тему. Цитата: `The data that is returned indicates that the CPU name is «Intel Pentium III Xeon» or «Intel Pentium III.» However, System Properties or System Information (MSInfo32.exe) shows the name as «Intel(R) Core(TM)2 Duo CPU E8000»`. | В упомянутой статье есть ссылка для загрузки исправления. |
Неправильно определяется процессор Intel Celeron в XP | Это неточность компонента WMI, см. статью Microsoft на эту тему. | В упомянутой статье есть ссылка для загрузки исправления. |
Не появляется окно «Отчет сохранен в файл», создание отчета останавливается | Отправлен некорректный WMI-запрос — допущена синтаксическая ошибка или запрошенное свойство не поддерживается. | Найти, исправить или отключить некорректный WMI-запрос. |
Нужно закомментировать строку «SetEnv RAILS_RELATIVE_URL_ROOT» и удалить «/redmine» в параметре PassengerPreStart URL в файле /opt/bitnami/apps/redmine/conf/httpd-app.conf:
<Directory "/opt/bitnami/apps/redmine/htdocs/public">
Options -MultiViews
<IfVersion < 2.3 >
Order allow,deny
Allow from all
</IfVersion>
<IfVersion >= 2.3>
Require all granted
</IfVersion>
# SetEnv RAILS_RELATIVE_URL_ROOT "/redmine"
PassengerAppRoot "/opt/bitnami/apps/redmine/htdocs"
<IfModule pagespeed_module>
ModPagespeedDisallow "*"
</IfModule>
</Directory>
PassengerPreStart http://127.0.0.1/
Закомментировать псевдонимы и директорию с веб-мордой в DocumentRoot в файле /opt/bitnami/apps/redmine/conf/httpd-prefix.conf:
# Alias /redmine/ "/opt/bitnami/apps/redmine/htdocs/public/"
# Alias /redmine "/opt/bitnami/apps/redmine/htdocs/public"
DocumentRoot "/opt/bitnami/apps/redmine/htdocs/public"
Include "/opt/bitnami/apps/redmine/conf/httpd-app.conf"
Проверить правильность конфигов:
$ sudo apachectl -t
Syntax OK
Наконец, если нет ошибок в конфигах, перезапустить Apache:
sudo /opt/bitnami/ctlscript.sh restart apache
Случилось мне столкнуться с заданием: настроить ip-телефонию для небольшой компании (в городе А) с филиалом (только для заключения договоров) в другом городе (городе Б).
Тех. задание было простое: есть sip номер города филиала с тремя линиями, нужно заставить его работать для экономии денежных средств из основного офиса города А абонентам города Б + обеспечение внутренней связи между офисом и филиалами и запись разговоров.
Задача поставлена, начнем реализацию.
Компания небольшая, сотрудников менее 30, значит подойдет машина не старше 5ти лет (CPU 2.5-3GHz, RAM 4Gb, HDD 1Tb). В работе было использовано следующее железо:
CPU AMD Athlon 64 X2 3GHz
RAM 2x2Gb
HDD 1x1Tb
С ПО вопрос решился моментально — это Asterisk в ввиду его бесплатности и большой базе знаний, да и на слуху именно он, но т. к. я с этим сталкиваюсь впервые, то мне нужен был GUI, а тут выбор богат (FreePBX, Elastix, TrixBox, Asterisk GUI, etc.)
Первое что я попробовал был Aserisk NOW с FreePBX в качестве GUI, но как-то не задалось с ним изначально — очень тяжело для первоначального изучения.
Вторым дистрибутивом стал Elastix. Были скачены Elastix 3.0.0 RC 1 и Elastix 2.4.0 Stable.
Все дистрибутивы я качал только 64-битные
Первая была установлена версия Elastix 3.0.0 RC 1 и она мне визуально очень понравилась, НО изменения в web-интерфейсе не отражались в конфигурационных файлах и, как выяснилось позднее, отсутсвуют многие пункты меню. В общем, из-за этих косяков я потратил пару дней и решил накатить версию Elastix 2.4.0 Stable. Вся дальнейшая настройка будет именно в этой версии.
Установить Elastix 2.4.0 Stable не составит труда. Пишем скаченный образ на диск и загружаемся с него. В начале отвечаем на простые вопросы (имя машины, как будем получать IP адрес, выбрать город для установки часового пояса, разметка диска). Перезагрузка. Задаем пароль root, пароль root для MySQL и пароль для admin от web морды Elastix.
После установки рекомендую подключиться к серверу по ssh и обновиться (на все вопросы отвечаем Y):
yum update
После обновления проверяем версии
# cat /etc/redhat-release
CentOS release 5.10 (Final)
# asterisk -V
Asterisk 11.10.0
Допустим, SIP-провайдер (mtt.ru) выдал нам:
номер 74995647814
логин 74995647814
пароль 1234567890
адрес подключения voip.mtt.ru
Заходим в web-интерфейс https://ip-adress/ с логином admin и паролем, который забили самый последний (пароль для superadmin).
Дашборд можно немного настроить под себя, скрыв ненужные для вас аплеты.
Для смены пароля/заведения новых пользователей web-морды идем в System — Users. Там же можно создать свои группы и назначить им права.
В System — Backup/Restore делаем бекапы с возможностью разворачивания.
Основная настройка происходит в меню PBX — PBX Configuration
Первое, что нужно сделать — это подключить выданный sip-номер.
Заходим в PBX — PBX Configuration — Trunks и создаем новый SIP-транк
Заполняем поля:
Секция General Settings
Trunk Name — пишем название нашего транка (я обозвал его tr74995647814)
Секция Outgoing Settings
Trunk Name — пишем название нашего транка (я обозвал его tr74995647814)
PEER Details — параметры подключения к sip-провайдеру, кодеки и пр.
; — знак комментария
type=peer
defaultuser=74995647814
fromuser=74995647814
secret=1234567890
insecure=port,invite
host=voip.mtt.ru
fromdomain=voip.mtt.ru
;nat=yes
;qualify=3000
dtmfmode=rfc2833
;directmedia=no
disallow=all
allow=alaw,ulaw,g729
Секция Incoming Settings
Очищаем все поля
Секция Registration
Register String — строка подключения, имеет вид: login:pass@voip.mtt.ru/login
74995647814:1234567890@voip.mtt.ru/74995647814
Сохраняем — Submit
Создадим исходящее правило
Исходящие правила создаются в меню PBX — PBX Configuration — Outbound Routes
Идем в PBX — PBX Configuration — Outbound Routes и начинаем заполнять поля:
Route Name: — название правила (я обозвал его out74995647814)
Поля Dial Patterns that will use this Route заполняем так:
(prepend) + prefix | [7XXXXXXXXXX] / XXX
(+7) + [78] | [XXXXXXXXXX] / XXX
Этим мы разрешили звонить на +7 и сделали автозамену +7 на 8.
Из выпадающего списка номер 0 Trunk Sequence for Matched Routes выбираем наш транк — tr74995647814
Сохраняем — Submit
Создадим входящее правило
Входящие правила в PBX — PBX Configuration — Inbound Routes
Идем в PBX — PBX Configuration — Inbound Routes и начинаем заполнять поля:
Description — название правила (я обозвал его in74995647814)
Language — указываем ru
В секции Set Destination пока выберем Terminate Call — Hungup
Сохраняем — Submit
Для начала нужно определиться с форматом внутренних номеров, я делал так:
100, 200,300 и т.д — это номера отцела целиком
101-199, 201-299, 301-399 и т. д. — номера сотрудников отделов
Думаю, что идея понятна.
Внутренние номера создаются в меню PBX — PBX Configuration — Extensions
Жмем Add Extension, выбираем Device — Generic SIP Device и жмем Submit
Секция Add Extension
User Extension — внутренний номер абонента
Display Name — отображаемое имя при звонке
Секция Device Options
secret — пароль
Секция Language
В поле Language Code прописываем ru
Секция Recording Options
В полях Record Incoming и Record Outgoing выбираеем Always
Сохраняем — Submit
Создаем нужное количество внутренних номеров.
Очереди позволяют организовать для поступающих звонков ожидание освободившегося оператора, возможность предоставить абоненту, ожидающему соединения, переход из очереди в интерактивное меню. С их помощью удобнее всего организовывать call-центры.
Очереди создаются в меню PBX — PBX Configuration — Queues
Секция Add Queue
Queue Number — номер очереди (у меня это номер отдела)
Queue Name — название очереди (наизвание отдела, например)
Static Agents — сотрудники отдела. Поле заполняется при выборе из выпадающего списка параметра Extension Quick Pick.
Секция Queue Options
Max Wait Time — максимальное время нахождения звонящего в очереди на ожидании
Max Callers — максимальное количество абонентов, ожидающих в очереди
Ring Strategy — определяет стратегию дозвона в очередь: ringall — звонят все телефонные аппараты в очереди, leastrecent — поступление звонка на наименее загруженного оператора, fewestcalls — поступление звонка на оператора с наименьшим количеством законченных разговоров, random — звонок поступает на случайным образом выбранного оператора, rrmemory — поступает на любого доступного оператора с учетом последнего ответившего, rrordered — похоже на предыдущую стратегию, но с учетом агентов в конфиг файле, linear — звонок поступает на агентов в том порядке в котором они перечислены, для динамических агентов — в порядке их регистрации, wrandom — звонок поступает на случайно выбранного оператора с учетом занятости.
Agent Timeout — время поступления звонка на оператора, до выдачи сообщения о недоступности
Skip busy agents — пропуск занятых операторов
Секция Caller Position Announcements
Отвечает за оповещение звонящего, каким по счету он является в очереди
Frequency — частота оповещения
Announce Position — оповещать о позиции в очереди
Announce Hold Time — оповещать о примерном времени ожидания
Секция Fail Oxer Destination
Выбираем куда отправится звонок по истечению времени ожидания (никто не ответил)
Пока выберем Terminate Call — Hungup (положить трубку)
Создаем нужное количество групп
Для голосового меню нам нужны записаные фразы, записываем в любой любимой программе (например, Sound Forge) в формате PCM Encoded, 16 Bits, at 8000Hz.
Записать нужно:
1) Приветствие (01-hello.wav) — Здравствуйте, вы позвонили в компанию РиК.
2) Меню (02-menu.wav) — Нажмите 1 для связи с отделом А. Нажмите 2 для связи с отделом Б. Или дождитесь ответа.
3) Если никто не берет трубку (03-buzy.wav) — Извините, в данный момент все заняты, ожидайте.
4) Если долго никто не берет трубку (04-buzy_call_later.wav) — Извините, все операторы заняты, перезвоните позже.
5) Время работы компании (05-work_time.wav) — Наша компания работает с понедельника по пятницу с 9:00 до 17:00.
Теперь нужно все эти записи передать Asterisk, для этого идем в меню PBX — PBX Configuration — System Recordings
Выбираем файл hello.wav и присваеваем имя нашей записи в поле Name this Recording (например, Hello)
Сохраняем — Save
Так же загружаем оставшиеся файлы.
Теперь можно приступить к созданию самого голосового меню
Голосовые меню создаются в меню PBX — PBX Configuration — IVR
Для создания нажимаем Add IVR
Change Name — название меню
Announcement — выбираем наше приветствие (01-hello)
Timeout — время ожидания нажатия клавиши (в секундах)
Enable Direct Dial — ставим галочку, если нужно, чтобы дозвонившийся мог набрать внутренний номер сотрудника
Дальше создаем наше меню:
1 Queuse 100
2 Queuse 200
3 Extensions 301
t Extensions 301
i Extensions 301
Цифра 1 — отправляем звонок в очередь 100
Цифра 2 — отправляем звонок в очередь 200
Цифра 3 — отправляем звонок на номер 301 (секретарь)
Если ничего не нажато после 10 секунд отправляем звонок на секретаря
Если нажата любая другая клавиша (кроме 1,2 и 3) отправляем звонок на секретаря
Сохраняем — Save
Создадим дополнительные анонсы для нашего меню
Переходим в меню PBX — PBX Configuration — Announcements
Создаем анонс — Add Announcement
Description — название (All buzy call later)
Recording — выбираем нашу хапись 04-buzy_call_later
В секции Destination after playback выбираем:
Terminate Call Hangup
Сохраняем — Submit Changes
Создадим еще одно меню IVR-CALL-LATER
Announcement — выбираем 04-buzy_call_later
Timeout — 1
Enable Direct Dial — галочку не ставим
В опицях указываем:
t Terminate Call Hangup
При переходе в это меню будет сказана фраза, чтобы перезвнили позже и через 1 секунду повесится трубка.
Отредактируем наши очереди.
Открываем очередь 100 и секции Fail Over Destination выбираем IVR IVR-CALL-LATER и сохраняем. То же проделываем с остальными очередями.
Не забываем после внесеныых изменений принимать их, нажимая на Apply Configuration Changes Here.
Создадим анонс WorkingTime с нашим звуковым файлом 05-work_time в меню PBX — PBX Configuration — Announcements
Перейдем в меню PBX — PBX Configuration — Time Group и создадим группу:
Description — название (TG-WorkingTime)
Time to start — 09:00
Time to finish — 17:00
Week Day Start — Monday
Week Day finish — Friday
Сохраняем — Submit
Переходим в меню PBX — PBX Configuration — Time Condition и создаем условие:
Time Condition name — название (TC-WorkingTime)
Time Group — выбираем созданную группу TG-WorkingTime
Destination if time matches — назначение при совпадении времени с тем, что указано в TG-WorkingTime.
IVR IVR-MAIN
Destination if time does not match — назначение при несовпадении времени с тем, что указано в TG-WorkingTime.
Announcements WorkingTime
Сохраняем — Submit
Скачиваем необходимые голосовые фразы: стандартные и расширенные
Сохраняем и разархивируем во временной директории на локальном компьютере
Содержимое архива закачиваем на Elastix в директорию /var/lib/asterisk/sounds/ru
В sip_general_custom.conf добавляем строку language=ru (отредактировать файл можно через веб-интерфейс, меню PBX-Tools-Asterisk File Editor)
Сохраняем — Save
Для того, чтобы научить наш Elastix/Asterisk принимать факс, необходимо следующее:
Переходим в меню PBX — PBX Configuration — Extensions
Создаем Generic IAX2 Device
Прописываем номер в User Extension (например, 901)
Даем имя в Display name (например, Fax)
Задаем пароль в secret
Секция Recording Options
Record Inbound — Never
Record Outbound — Never
Сохраняем — Submit
Далее зайдем и отредактируем созданный номер:
Секция Device Options
disallow — all
allow — alaw
Сохраняем — Submit
Переходим в меню Fax — New Virtual Fax
Virtual Fax Name — название
Associated Email — e-mail куда будет отсылаться факс
Fax Extension (IAX) — созданный выше Extension
Secret (IAX) — пароль
Country Code — префикс страны (8)
Area Code — код города
Сохраняем — Save
Если очень хочется, то можно руссифицировать письмо с факсом в меню Fax — Email Template
Что бы сделать вызов внешнего номера из голосового меню, необходимо узнать номер голосого меню (ivr), присвоенный системой, для этого идем в файл extensions_additional.conf и просматриваем наличие [ivr-<номер>], т. к. в этой статье создали два меню, то можно будет обнаружить два таких фрагмента. Определить нужный просто. Тот где много строк — нужный (например, [ivr-2]).
Необходимо, чтобы внутри массива ivr была строка include => ivr-<номер>-custom (например, include => ivr-2-custom)
После того, как узнали номер IVR, нужно в конце файла extensions_custom.conf прописать
[ivr-2-custom]
exten => _9,1,Dial(SIP/{Trunk}/{number})
где _9 — цифра вызова внешнего номера
SIP/{Trunk} — это строка SIP/tr74995647814 (см. создание транка)
{number} — внешний номер
Работает это так: звонит клиент, ему что-то говорится в меню, он нажимает 9 и Asterisk перекидывает звонок на внешний номер, а сам кладет трубку.
Для полноценной работы за NAT требуется доступ к портам 5060/UDP, 10000-20000/UDP и следующее содержание файла sip_nat.conf
nat=route
bindaddr=0.0.0.0/0.0.0.0
externip=88.88.88.88
localnet=192.168.0.1/255.255.255.0
canreivite=no
qualify=yes
directmedia=no
externip — внешний IP-адрес
localnet — внутренний IP-адрес/маска сети
Как и для голосового меню мелодии нужно сохранить в формате PCM Encoded, 16 Bits, at 8000Hz.
Имея 2-3 готовых файла идем в меню PBX — PBX Configuration — Music on Hold
Создаем новую категорию — Add Music Category, вводим в поле Category Name название и жмем Submit Changes.
Переходим в созданную категорию и заливаем наши файлы с мелодиями. Если хотите, чтобы каждый раз проигрывалась произвольная мелодия, необходимо прожать Enable Random Play.
Не забываем применить настойки кликом на Apply Configuration Changes Here.
Дальше необходимо отредактировать все очереди
Секция Queue Options
Music on Hold Class — выбираем созданную группу с мелодиями
Сохраняем — Submit Changes
Мониторить состояние транков можно в консоле командой:
asterisk -rx "sip show registy"
RTP порты прописаны в файле rtp.conf
;
; RTP Configuration
;
[general]
;
; RTP start and RTP end configure start and end addresses
; These are the addresses where your system will RECEIVE audio and video streams.
; If you have connections across a firewall, make sure that these are open.
;
rtpstart=10000
rtpend=20000
После развертывания АТС обнаружилось, что нужно совершать звонки в другой город, например Томск (код города 3822), а звонить с московского номера (в примере 74995647814) дорого. Для минимизации расходов было принято решение приобрести томский sip номер. Сказано — сделано.
Допустим, SIP-провайдер (mtt.ru) выдал нам:
номер 73822555555
логин 73822555555
пароль 1234567890
адрес подключения voip.mtt.ru
Заводим новый транк как делали это выше
После этого создадим исходящее правило для нового транка, но в полях секции Dial Patterns that will use this Route указываем следующее:
(prepend) + prefix | [73822XXXXXX] / XXX
+7 + [78] | [73822XXXXXX] / XXX
В секции Trunk Sequence for Matched Routes выбираем наш новый транк.
Этими правилами мы указываем, что при исходящем звонке на номера вида +7(3822) XX-XX-XX набор пойдет через томский номер +7(3822) 55-55-55
Так же не стоит забывать, что правила применяются сверху вниз, а это значит, что пока мы наше новое правила не поставим выше предыдущего все звонки будут идти с московского номера +7(499) 564-78-14, т. к. в исходящем правиле out74995647814 у нас прописаны строки вида
(prepend) + prefix | [7XXXXXXXXXX] / XXX
(+7) + [78] | [XXXXXXXXXX] / XXX
Что бы поставить правило out73822555555 выше out74995647814 нужно в выпадающем списке Route Position выбрать First before out4995647814 и сохранить изменения.
Таким образом мы подключили два sip номера к Asterisk и настроили исходящие звонки для всех внутренних номеров в Томск через томский номер, а все остальные звонки — через московский номер.
Случилось, что после вынужденного выключения сервера БД одна из баз свалилась в состояние Suspend. Конечно лучше делать бекапы, но не было их на тестовом сервере. Вот скрипт, который можно и в GUI проделать, который мне помог восстановить базу:
EXEC sp_resetstatus [DB];
ALTER DATABASE [DB]SET EMERGENCY
DBCC checkdb([DB])
ALTER DATABASE [DB]SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([DB], REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE [DB]SET MULTI_USER
Вместо [DB] вставить свою БД.