Notes about IT

Позднее Ctrl + ↑

Удаление ветки в GIT

Удаление локально ветки

git branch -D branch_to_be_deleted

Удаление удаленной ветки

git push origin --delete branch_to_be_deleted
 7   2015   git

Уведомление на почту о заявке на обратный звонок

Файл 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

Обратный звонок - новая заявка
 8   2015   cms   web
 11   2015   cms   web

Установка git + gitolite на CentOS 7

Подразумеваем, что уже установлена 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

Настраиваем под свои нужды и заливаем изменения на сервер.

 16   2015   git   nix

CSS Unminifier

Случается, что нужно просмотреть сжатый css файл. Приходилось лезть на сайт и ждать когда вернется ответ, но был найден замечательный плагин для Sublime Text — CSS Unminifier.
Установка через Package Control (Ctrl+Shift+P), где выбрать Package Control: Install Package и ввести Css Unminifier.

Пользоваться CSS Unminifier проще простого: выделяем нужный текст и жмем Ctrl+Alt+U

 7   2014   css   web

Как установить msu-пакет через ГПО

В рамках обновления KB2998527 пришлось изучить вопрос установки msu-пакетов.

Решение нашлось простое:
1) Открываем нужную нам политику
2) Идем Конфигурация компьютера — Политики — Конфигурация Windows — Сценарии (Запуск/завершение)
3) Открываем Автозагрузка и создаем сценарий:
Имя сценария: wusa.exe
Параметры сценария: <путь>\Windows6.1-KB2998527-x64.msu /quiet /norestart

 10   2014   windows

Инвентаризация компьютеров средствами WMI и VBScript

Инвентаризация компьютеров при помощи данного скрипта поможет системному администратору решить следующие задачи в масштабе небольшой организации:

  • Подготовка отчета о количестве, размещении и составе системных блоков для бухгалтерии. Информацию о других основных средствах (мониторах, ИБП, принтерах и т. п.) придется собирать другими способами.
  • Отслеживание изменений в конфигурации компьютеров, в том числе — выявление случаев самовольной замены комплектующих.
  • Поиск, отбор и подсчет компьютеров с заданными характеристиками при планировании закупок или при решении каких-либо технических вопросов.

Возможности и особенности

Предлагаемый скрипт позволяет:

  • Собирать сведения о конфигурации множества компьютеров тремя разными способами — локально (если нет доступа по сети), удаленно (с рабочего места администратора), через logon-скрипт.
  • Сохранять отчеты о конфигурации компьютера в структурированный текстовый файл формата CSV, удобный для последующей автоматизированной обработки.
  • Создавать настраиваемый общий отчет по всем имеющимся компьютерам.

Отличительные особенности скрипта:

  • Используются встроенные в Windows 2000/XP/2003/Vista компоненты VBScript и WMI. Установка и лицензирование дополнительных программ не требуется.
  • В программном коде можно настроить состав и структуру отчета под свои нужды. При желании не трудно добавить вывод отчетов в других текстовых форматах (TXT, INI, HTML, XML), удобных для просмотра, печати или импорта в других программах.
  • Собираются и выводятся в отчет только действительно нужные для решения поставленных задач сведения. Скрипт не предназначен для сбора исчерпывающей информации о составе системного блока.

Загрузка и установка

Скрипт для инвентаризации компьютеров средствами WMI и VBScript, упакован ZIP: invent_comp.zip

Установка не требуется, достаточно распаковать архив в отдельный каталог на рабочей станции администратора.

Первый этап работы — сбор данных

Скрипт invent_comp.vbs собирает данные о конфигурации указанного компьютера и сохраняет отчет в формате CSV в заданный локальный каталог или на сетевой ресурс. Имя файла отчета соответствует сетевому имени компьютера. Есть несколько вариантов запуска.

Вариант 1 — для тестирования или для отдельных сетевых компьютеров и серверов

Для проверки скрипта при первом знакомстве, а также для сбора данных с серверов и отдельных компьютеров не дожидаясь их перезагрузки, можно запускать скрипт вручную, с рабочего места администратора. При этом достаточно использовать настройки по умолчанию, тогда отчеты будут сохраняться в подкаталог рядом со скриптом:

Const SILENT = FALSE 'тихий режим отключен, будет запрошено имя компьютера
Const DATA_DIR = "comp\" 'локальный каталог + "\" в конце

Вариант 2 — для сетевых рабочих станций

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

Сначала необходимо выделить сетевой ресурс для сохранения отчетов и дать разрешение на запись пользователю (или группе пользователей), от имени которого будет запускаться скрипт.

Настройки в самом скрипте такие:

Const SILENT = TRUE 'режим отчета о локальном компьютере, без вывода диалогов
Const DATA_DIR = "\\SRV\Invent\comp\" 'сетевой ресурс + "\" в конце

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

Вариант 3 — для компьютеров, не подключенных к сети

Если есть компьютеры, данные по которым невозможно собрать другими способами, можно скопировать скрипт на переносной диск и запускать с него. Настройки взять из варианта 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", "", _
  "Компьютер", _
  "Сетевое имя,Домен,Владелец,Текущий пользователь,Объем памяти (Мб)"

Параметры вызова подпрограммы разнесены на несколько строк для наглядности. Третий параметр чаще всего — пустая строка, и поэтому расположен на одной строке со вторым.

Пояснение к параметрам данного вызова подпрограммы:

  • «Win32_ComputerSystem» — класс WMI, к которому идет запрос
  • «Name,Domain,PrimaryOwnerName... — свойства WMI (через запятую), значения которых надо включить в отчет
  • »» — условие отбора по правилам WQL (подробности далее), или пустая строка.
  • «Компьютер» — название соответствующей секции отчета, выводится в первом столбще CSV-файла.
  • «Сетевое имя,Домен,Владелец... — названия параметров (через запятую), соответствующих перечисленным выше свойствам WMI, в том же порядке и количестве, выводится во втором столбце CSV-файла.

Чтобы корректно добавить или изменить подобный вызов, необходимо найти и изучить документацию по соответствующему WMI-классу:

Также для составления и тестирования запросов к WMI можно использовать программы:

  • Microsoft WMI Object Browser — работает через web-интерфейс, входит в состав «WMI Administrative Tools»
  • WMI Explorer — не требует установки, автор Alexander Kozlov

Удаление ненужных значений

Чтобы в отчет не попадали отключенные сетевые адаптеры, минипорты и виртуальные адаптеры 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-запрос.

(c) http://zheleznov.info

 67   2014   windows

Меняем URL Redmine по умолчанию на корневой

Нужно закомментировать строку «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
 10   2014   nix   web

Развертывание ip-телефонии для небольшой компании

Случилось мне столкнуться с заданием: настроить 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

Настройка IP-АТС

Допустим, 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 (положить трубку)

Создаем нужное количество групп

Создание голосового меню (IVR)

Для голосового меню нам нужны записаные фразы, записываем в любой любимой программе (например, 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

Для полноценной работы за 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 порты прописаны в файле 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

Звонки в разные города с разных SIP номеров

После развертывания АТС обнаружилось, что нужно совершать звонки в другой город, например Томск (код города 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 и настроили исходящие звонки для всех внутренних номеров в Томск через томский номер, а все остальные звонки — через московский номер.

 14   2014   voip

Что делать, если БД в состоянии Suspend?

Случилось, что после вынужденного выключения сервера БД одна из баз свалилась в состояние 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] вставить свою БД.

 7   2014   sql   windows
Ранее Ctrl + ↓