ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Метки статьи: ‘Asterisk’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Интеграция Asterisk и Telegram

На одном из форумов посвященных Asterisk`у в очередной раз подняли тему «Как не терять звонки». Тему о том как уведомлять, себя любимого, да и не только себя, о пропущенных вызовах и/или совершенной переадресации. И в очередной раз был предложен метод с использованием СМС. Но ведь есть и другой способ, который на мой взгляд лучше — Telegram.

Почему Telegram ? Потому, что данный мессенджер удобен и у него много приятных фишек, например таких как боты.
Собственно с помощью бота можно не только отправлять себе что-то, но и получить обратную связь.
У нас уже был опыт подобной связи и мы уже использовали эту возможность для соединения нашего чата с Telegram, дабы иметь возможность общаться не только сидя перед компом.

Итак далее про интеграцию Asterisk и Telegram.
Чтобы показать пример отправки сообщения в Telegram я по быстрому зарегистрировал нового бота и создал небольшой PHP скрипт, который расположил тут: http://bot.subnets.ru/telegram/
Принцип работы такой:

  • устанавливаем приложение telegram на телефон или используем web версию telegram
  • находим бота (по имени пользователя) @msaster_bot
  • отправлям боту команду /start
  • запоминаем свой ID в Telegram, который бот выдаст в ответе на команду/start (или отправляем боту команду /me)
  • затем используя ссылку вида http://bot.subnets.ru/telegram/simple.php?user=<TELEGRAM ID>&msg=<MESSAGE TEXT>
    • где <TELEGRAM ID> — ваш ID в Telegram
    • где <MESSAGE TEXT> — текст для отправки

    пример ссылки: http://bot.subnets.ru/telegram/simple.php?user=12345&msg=testMessage

После чего наблюдаем отправленный вами текст на экране своего смартфона/компа.
Таким образом используя вAsterisk функцию CURL и/или другой скрипт вызываемый с помощью функции System, или AGI скрипт, вообщем все то что может обратиться к URL, мы можем отправлять себе сообщения прямо из dialplan Asterisk или консоли сервера.

И вот тут у меня проснулся интерес. Отправлять сообщения конечно здорово, но иметь обратную связь с Asterisk будет ещё лучше.
Как эту обратную связь использовать ? Да первое что мне пришло на ум это callback. Тыкаем в команду бота и тут же получаем callback от своего Asterisk.
Здорово, но мало 🙂 А что если реализовать возможность отправлять в Asterisk команды CLI прямо из Telegram и получать вывод этих команд ? Да, было бы не лишним.
Почему не лишним ? Да потому что ты не все время у компа и если вдруг что-то пойдет не так и тебе позвонят с работы «Ой, все упало !», то подобная прямая связь с Asterisk была бы кстати, т.к. очень быстро готова к использованию и прямо с мобилы.

Потратив некоторое время на разработку функционала самого бота и написав PHP клиента для связи с Asterisk я все же добился необходимого мне результата.

Я смог выполнить произвольную команду в CLI Asterisk. На скриншоте ниже это выполнение команды core show calls:

Интеграция Asterisk и Telegram

Asterisk и Telegram

Ну или даже вот так:

Asterisk и Telegram

Asterisk и Telegram

Вот такой получился интересный, на мой взгляд, проект.

Для скептиков:
Функции защиты всего это добра от использования сторонними людьми предусмотрены:

  • привязка к конкретному Telegram ID
  • идентификация по паролю в самом боте
  • контрольная подпись при отправке/получении данных между ботом и PHP клиентом
  • возможность ограничить доступ к PHP клиенту по IP-адресам
  • возможность указать какие команды Asterisk CLI будут доступны для исполнения

P.S. Если Вы так же хотите попробовать покомандовать своим Asterisk через Telegram, то я могу предоставить Вам такую возможность.
Для этого Вам будет необходимо:

  • ваше желание тестировать и сообщать об ошибках
  • иметь свой сервер с Asterisk
  • иметь установленный PHP (не ниже версии 5.6)
  • запущенный HTTP сервис (например apache), до которого можно достучаться извне
  • обратиться ко мне ( virus [СОБАЧКА-ГАВ-ГАВ] subnets.ru ) для получения паролей и явок 🙂
  • скачать и настроить PHP клиента для связи с Вашим Asterisk (PHP клиент НЕ обязательно должен быть расположен на сервере с Asterisk, он может находится и отдельно (например на Вашем WEB сервере))
  • выполнить настройки HTTP службы в Asterisk

P.S.S. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Уважайте чужой труд.

Автор: Николаев Дмитрий (virus (at) subnets.ru

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (Еще не голосовали)
Загрузка...
Отправить на почту Отправить на почту

Channel Event Logging (CEL)

Дано:

  • FreeBSD 8.1-RELEASE
  • Asterisk 1.8.17.0

Полученные от CEL данные будем складывать в csv и MySQL.

MySQL CEL Backend:

Using MySQL for Channel Event records is supported by using ODBC and the cel_odbc module.

Ставим порты для ODBC

  • /usr/ports/databases/unixODBC
  • /usr/ports/databases/mysql-connector-odbc

# pkg_info | grep ODBC
mysql-connector-odbc-unixodbc-mysql55-5.1.9 ODBC driver for MySQL55 / unixodbc
unixODBC-2.3.1 ODBC library suite for Unix

# ls -la /usr/local/lib/libmyodbc*
-rwxr-xr-x 1 root wheel 260880 18 сен 09:21 /usr/local/lib/libmyodbc5.so

Смотрим расположение конфиг файлов:

# odbcinst -j

unixODBC 2.3.1
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 4
SQLLEN Size........: 4
SQLSETPOSIROW Size.: 2

Правим /usr/local/etc/odbcinst.ini

[MySQL]
Description=ODBC for MySQL
Driver=/usr/local/lib/libmyodbc5.so
UsageCount=20001

Инсталим драйвер:

# odbcinst -i -d -f /usr/local/etc/odbcinst.ini

Правим /usr/local/etc/odbc.ini:

[mysql-odbc-ini-asterisk]
Driver=MySQL
SERVER=127.0.0.1
PORT=3306
DATABASE=asterisk
USER=asterisk
PASSWORD=password
OPTION=4194304

Проверяем список доступных DSN:

# odbcinst -s -q

[mysql-odbc-ini-asterisk]

Настраиваем конфиги в Asterisk

/usr/local/etc/asterisk/cel.conf:

[general]
enable=yes
;apps=dial,park
;events=APP_START,CHAN_START,CHAN_END,ANSWER,HANGUP,BRIDGE_START,BRIDGE_END
apps=all
events=all
dateformat = %F %T

[manager]
enabled=no

[radius]

В /usr/local/etc/asterisk/cel_custom.conf раскомментируем секцию [mappings].
Проверим наличие директории /var/log/asterisk/cel-custom, если её нет то создадим ей и не забываем установить необходимые права, чтобы asterisk смог осуществить запись.

/usr/local/etc/asterisk/res_odbc.conf:
[asterisk-res-odbc]
enabled => yes
dsn => mysql-odbc-ini-asterisk
username => asterisk
password => password
pre-connect => yes

/usr/local/etc/asterisk/cel_odbc.conf:
[first]
connection=asterisk-res-odbc
table=cel
loguniqueid=yes

Создаем таблицу в базе:

CREATE TABLE IF NOT EXISTS `cel` (
  `id` int(11) NOT NULL auto_increment,
  `eventtype` varchar(30) NOT NULL,
  `eventtime` datetime NOT NULL,
  `cid_name` varchar(80) NOT NULL,
  `cid_num` varchar(80) NOT NULL,
  `cid_ani` varchar(80) NOT NULL,
  `cid_rdnis` varchar(80) NOT NULL,
  `cid_dnid` varchar(80) NOT NULL,
  `exten` varchar(80) NOT NULL,
  `context` varchar(80) NOT NULL,
  `channame` varchar(80) NOT NULL,
  `src` varchar(80) NOT NULL,
  `dst` varchar(80) NOT NULL,
  `channel` varchar(80) NOT NULL,
  `dstchannel` varchar(80) NOT NULL,
  `appname` varchar(80) NOT NULL,
  `appdata` varchar(80) NOT NULL,
  `amaflags` int(11) NOT NULL,
  `accountcode` varchar(20) NOT NULL,
  `uniqueid` varchar(32) NOT NULL,
  `linkedid` varchar(32) NOT NULL,
  `peer` varchar(80) NOT NULL,
  `userdeftype` varchar(255) NOT NULL,
  `eventextra` varchar(255) NOT NULL,
  `userfield` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `uniqueid_index` (`uniqueid`),
  KEY `linkedid_index` (`linkedid`)
);

Перезапускаем:
# asterisk -r
asterisk*CLI> module reload res_odbc.so
— Reloading module ‘res_odbc.so’ (ODBC resource)
== Parsing ‘/usr/local/etc/asterisk/res_odbc.conf’: == Found
[Sep 18 10:05:59] NOTICE[84181]: res_odbc.c:1531 odbc_obj_connect: Connecting asterisk-res-odbc
[Sep 18 10:05:59] NOTICE[84181]: res_odbc.c:1563 odbc_obj_connect: res_odbc: Connected to asterisk-res-odbc [mysql-odbc-ini-asterisk]
[Sep 18 10:05:59] NOTICE[84181]: res_odbc.c:920 load_odbc_config: Registered ODBC class ‘asterisk-res-odbc’ dsn->[mysql-odbc-ini-asterisk]
[Sep 18 10:05:59] DEBUG[84181]: res_odbc.c:1504 odbc_obj_disconnect: Database handle 0x2a9a6000 deallocated

asterisk*CLI> module reload cel_odbc.so
— Reloading module ‘cel_odbc.so’ (ODBC CEL backend)
== Parsing ‘/usr/local/etc/asterisk/cel_odbc.conf’: == Found
— Found CEL table cel@asterisk-res-odbc.

asterisk*CLI> module reload cel_custom.so
— Reloading module ‘cel_custom.so’ (Customizable Comma Separated Values CEL Backend)
== Parsing ‘/usr/local/etc/asterisk/cel_custom.conf’: == Found

Проверяем:
asterisk*CLI> cel show status
CEL Logging: Enabled
CEL Tracking Event: ALL
CEL Tracking Event: CHAN_START
CEL Tracking Event: CHAN_END
CEL Tracking Event: HANGUP
CEL Tracking Event: ANSWER
CEL Tracking Event: APP_START
CEL Tracking Event: APP_END
CEL Tracking Event: BRIDGE_START
CEL Tracking Event: BRIDGE_END
CEL Tracking Event: CONF_START
CEL Tracking Event: CONF_END
CEL Tracking Event: PARK_START
CEL Tracking Event: PARK_END
CEL Tracking Event: BLINDTRANSFER
CEL Tracking Event: ATTENDEDTRANSFER
CEL Tracking Event: TRANSFER
CEL Tracking Event: HOOKFLASH
CEL Tracking Event: 3WAY_START
CEL Tracking Event: 3WAY_END
CEL Tracking Event: CONF_ENTER
CEL Tracking Event: CONF_EXIT
CEL Tracking Event: USER_DEFINED
CEL Tracking Event: LINKEDID_END
CEL Tracking Event: BRIDGE_UPDATE
CEL Tracking Event: PICKUP
CEL Tracking Event: FORWARD
CEL Tracking Application: all
CEL Event Subscriber: ODBC CEL backend
CEL Event Subscriber: CEL Custom CSV Logging

asterisk*CLI> odbc show

ODBC DSN Settings
——————

Name: asterisk-res-odbc
DSN: mysql-odbc-ini-asterisk
Last connection attempt: 1970-01-01 03:00:00
Pooled: No
Connected: Yes

После чего при прохождении вызовов должна будет заполняться таблица cel в БД asteriskб так же файл /var/log/asterisk/cel-custom/Master.csv.

Описание: CEL Events and Fields

Существует возможность генерить свои event`ы: CELGenUserEvent Application:

asterisk*CLI> core show application CELGenUserEvent

  -= Info about application 'CELGenUserEvent' =-

[Synopsis]
Generates a CEL User Defined Event.

[Description]
A CEL event will be immediately generated by this channel, with the supplied
name for a type.

[Syntax]
CELGenUserEvent(event-name[,extra])

[Arguments]
extra
    Extra text to be included with the event.

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор:  Николаев Дмитрий (virus (at) subnets.ru

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 1, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Столкнулись с проблемой в Asterisk 1.8 при auto-dial out.

Честно сказать не знаю то ли мы такие «везучие», то ли лыжи не едут, но в очередной раз мы наступаем на грабли о которых гугл и великий ALL толком ничего «сказать» не может. У всех все типа работает и если есть похожее, то оно решается путем чтения мануала до полного просветления.

Имеем:

  • Virtualbox 4.0.12
  • Freebsd 8.1-RELEASE
  • Asterisk 1.8.17.0

В очередно раз появилась задача поднять Asterisk, нужно это для предоставления услуг IP-АТС для физиков.

Ранее мы ставили Asterisk 1.4, а тут решили что пора бы уже попробовать перейти на версию 1.8. Сказано — сделано.

Установка прошла как обычно, без проблем. После настройки, установки собственного web-интерфейса управления астериском и небольших изменений в виду некоторых отличий конфигов версии 1.8 от 1.4 мы приступили к тестированию.
Было обнаружено, что не работают функции callback, email2fax, web2fax.  Все эти функции упираются в одну точку и имя ей auto-dial out, генерация call файлов для совершения автоматического исходящего вызова.
Начинаем разбираться. Запускаем астериск, заходим в консоль и включаем verbose:
# asterisk -r
aster*CLI> core set verbose 3
Verbosity is at least 3

Звоним на callback номер, где после проверки php скрипт генерит call-файл для совершения обратного вызова и отправляет его в /var/spool/asterisk/outgoing для непосредственно совершения вызова и зрим в консоль:
aster*CLI> [Oct 17 12:49:49] WARNING[35623]: pbx_spool.c:258 apply_outgoing: At least one of app or extension must be specified, along with tech and dest in file /var/spool/asterisk/outgoing/callback_1_813.call aster*CLI>
[Oct 17 12:49:49] WARNING[35623]: pbx_spool.c:419 scan_service: Invalid file contents in /var/spool/asterisk/outgoing/callback_1_813, deleting

Называется приехали… Сначала мы подумали что из-за разницы в версиях астера есть какое то отличие в синтаксисе call файла.

После прочтения auto-dial out заново стало понятно что это не так. Отличий нет. Хм….

Едем далее. Убираем из скрипта автоперемещение call файла в /var/spool/asterisk/outgoing и кладем его в созданную диру /var/spool/asterisk/outgoing-test и смотрим на результат генерации:
Channel: LOCAL/005@users_813_clientID_1
Callerid: 813
MaxRetries: 5
RetryTime: 15
WaitTime: 60
Context: callback_813_clientID_1
Extension: s
Priority: 1

Абсолютно нормальный call файл. Берем и копируем call файл руками:
# /bin/cp /tmp/aster/callback_1_813.call /var/spool/asterisk/outgoing/
И о чудо, астер уже не ругается в консоли и спокойно начинает обрабатывать файл и совершает исходящий вызов. Хм……
Тестим исходящий факс, где call файл уже генерится perl скриптом. Та же ситуёвина. При перемещении call файла в /var/spool/asterisk/outgoing скриптом в консоли астера идет ругань на call файл, а при копирования файла руками все ОК.
Хм….. снова приехали…..
Включаем дебаг:
aster*CLI> core set debug 9
Не помогает ничем, более детально проблема так и не описана. Чешем репу… гуглим… есть похожие случаи, но все равно не то что у нас.
Начинаем строить предположения:
а) Астер начинает обрабатывать call файл в соответствии с датой модификации файла (mtime). Проблема с touch (который сдвигает дату модификации call файла перед перемещением в outgoing) ?
б) проблема с правами на файл ?

Не буду подробно расписывать весь мозговой и ручной процесс, ибо это долго, а напишу вкратце.
Проверяем догадку «а»:
Смотрим какие у нас даты после создания call файла:
# stat /var/spool/asterisk/outgoing-test/callback_1_813.call
72 47370 -rw-r--r-- 1 asterisk asterisk 191847 238 "Oct 17 14:34:50 2012" "Oct 17 14:30:32 2012" "Oct 17 15:19:02 2012" "Oct 17 14:29:50 2012" 16384 4 0 callback_1_813.call

Даты перечисляются в таком порядке: a, m, c, B.

  • a — access time, время последнего доступа к файлу
  • m — modificatiom time, время последнего изменения файла
  • c — create time, дата создания файла
  • B — birth time of the inode, дата дескриптора

Как видно из вывода stat даты разные и сдвинуты во времени относительно СЕЙЧАС в будущее, напомню что это делается в скрипте генерации call файла командой touch.
Вывод: тут все ОК.

Проверяем догадку «б»:
какие права на файл не поставь, от какого юзера asterisk не запусти — результат тот же — в консоле астера:
At least one of app or extension must be specified, along with tech and dest in file
Мда…. asterisk запущенный от пользователя root не может прочитать файл с владельцем root или asterisk… это уже не в какие ворота….

Ну что ж, здравые идеи закончились и видимо без «напильника» уже не обойтись, т.к. проблему кроме нас самих никто не решит.
Лезем в исходки астера на предмет установления места где идет обработка call файла и его обработка. За обработку call файлов отвечает спулер:

/usr/ports/net/asterisk/work/asterisk-1.8.17.0/pbx/pbx_spool.c.

Открываем его для изучения с места где отпечатывается выше указанные ошибки при обработке call файла и смотрим строчки с номерами, которые печатаются в консоль в сообщении об ошибке: стр. 258 и стр. 419. Приходим к тому что без дебага того что же все же видит астер в call файле не обойтись. Добавляем:
ast_debug( 1, "[%s]: mode: %o, uid: %d, gid: %d, size: %ld, now: %ld, mtime: %ld, atime: %ld, ctime: %ld, birth: %ld\n", filename, st.st_mode, st.st_uid, st.st_gid, (long) st.st_size, (long) now, (long) st.st_mtime, (long) st.st_atime, (long) st.st_ctime, (long) st.st_birthtime );
Чтобы видеть права, пользователя, группу и даты. Запускаем скрипт генерации call файла и зрим в консоль:
[Oct 17 17:58:08] DEBUG[2027]: pbx_spool.c:517 queue_file: [/var/spool/asterisk/outgoing/callback_1_813.call]: mode: 100000, uid: 0, gid: 931, size: 0, now: 1350482288, mtime: 1350482288, atime: 1350482288, ctime: 1350482288, birth: 1350482288
Мда…. Размер файла ноль байт! О как ! Теперь понятно почему астер плюет ошибки при обработке файла, ведь он считает что файл ПУСТОЙ !
Так же смотрим man 2 stat на предмет значения mode и понимаем что права на файл (даже на чтение) отсутствуют у всех ! Так же видно что unixtime даты в полях now, mtime, atime, ctime, birth одинаковы и это текущая дата, а не даты, которые приведены выше в выводе stat /var/spool/asterisk/outgoing-test/callback_1_813.call копируемого файла.
Отсюда появляется догадка «в»:
При копировании call файла скриптом астер не дает файлу докопироваться и пускает его в обработку и анализу ДО того как он полностью перемещается в /var/spool/asterisk/outgoing.
Проверяем догадку «в»:
Ищем решение и оно нашлось достаточно быстро и достаточно тривиальное: «попросить» астер «заснуть» на 30 мс перед тем как хапать файл.
Делаем добавление в функции static void queue_file(const char *filename, time_t when) вызова usleep( 30000 ); перед if (stat(filename, &st)) { (в оригинальном исходном коде этот условный переход расположен в строке 484) и снова смотрим в консоль:
[Oct 17 17:58:08] DEBUG[2027]: pbx_spool.c:517 queue_file: [/var/spool/asterisk/outgoing/callback_1_813.call]: Data BEFORE usleep: mode: 100000, uid: 0, gid: 931, size: 0, now: 1350482288, mtime: 1350482288, atime: 1350482288, ctime: 1350482288, birth: 1350482288
[Oct 17 17:58:08] DEBUG[2027]: pbx_spool.c:532 queue_file: [/var/spool/asterisk/outgoing/callback_1_813.call]: Data AFTER usleep: mode: 100644, uid: 931, gid: 931, size: 153, now: 1350482288, mtime: 1350482298, atime: 1350482298, ctime: 1350482288, birth: 1350482288

Называется «почувствуйте разницу!».

Права и даты в строке выводимой после usleep уже правильные и соответствуют копируемому файлу.

И снова чудо ! Действительно этой задержки перед обработкой оказалось достаточно для завершения полного копирования call файла и он начал нормально обрабатываться asterisk`ом уже без ругани.

Вот такая вот история. Надеемся что кому нить поможет если он столкнется с похожей ситуёвиной.

Найти ответ на вопрос «Почему при копированием скриптом астер не дает файлу докопироваться, а при копировании руками все ОК ?»  мы так и не сумели. Если у кого то есть предположения, то милости просим в комменты к статье.

Ну и напоследок:
Мы немного расширили режим отладки обработки call-файлов. Теперь при наложении нашего патча и указании вывода дебага (core set debug 1) будем видеть всю «историю процесса».
Пример:
[Oct 17 17:58:08] DEBUG[2027]: pbx_spool.c:765 scan_thread: Directory changed, rescan
[Oct 17 17:58:08] DEBUG[2027]: pbx_spool.c:517 queue_file: [/var/spool/asterisk/outgoing/callback_1_813.call]: Data BEFORE usleep: mode: 100000, uid: 0, gid: 931, size: 0, now: 1350482288, mtime: 1350482288, atime: 1350482288, ctime: 1350482288, birth: 1350482288
[Oct 17 17:58:08] DEBUG[2027]: pbx_spool.c:532 queue_file: [/var/spool/asterisk/outgoing/callback_1_813.call]: Data AFTER usleep: mode: 100644, uid: 931, gid: 931, size: 153, now: 1350482288, mtime: 1350482298, atime: 1350482298, ctime: 1350482288, birth: 1350482288
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:146 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: Fresh data: mode: 100644, uid: 931, gid: 931, size: 153, mtime: 1350482298, atime: 1350482298, ctime: 1350482288, birth: 1350482288
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:147 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: Read content
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 1: Channel: LOCAL/005@users_813_clientID_1
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 2: Callerid: 813
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 3: MaxRetries: 5
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 4: RetryTime: 15
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 5: WaitTime: 60
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 6: Context: callback_813_clientID_1
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 7: Extension: s
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:181 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: line 8: Priority: 1
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:277 apply_outgoing: [/var/spool/asterisk/outgoing/callback_1_813.call]: processed 8 lines
[Oct 17 17:58:18] DEBUG[2027]: pbx_spool.c:291 safe_append: Outgoing LOCAL/005@users_813_clientID_1: StartRetry

-- Attempting call on LOCAL/005@users_813_clientID_1 for s@callback_813_clientID_1:1 (Retry 1)

...

[Oct 17 17:58:23] NOTICE[2027]: pbx_spool.c:388 attempt_thread: Call completed to LOCAL/005@users_813_clientID_1
[Oct 17 17:58:23] DEBUG[2027]: pbx_spool.c:765 scan_thread: Directory changed, rescan

Т.е. теперь видны не только права и даты ДО и ПОСЛЕ, но и само содержимое call файла, которое хпнул asterisk.

Наш патч можно поместить прямо в порт /usr/ports/net/asterisk/files и пересобрать астер.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы:  Панфилов Алексей (lehis (at) subnets.ru) и Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 6, среднее: 3,67 из 5)
Загрузка...
Отправить на почту Отправить на почту

Не так давно поставили очень удобный gsm-voip шлюз на 2 sim и 2 fxo  addpac GS1002 для работы в связке с Asterisk.

До этого работал addpac AP1100F для оцифровки входящих аналоговых линий, они работают под одной OS, так что конфиг похожий на AP1100f:

GS1002# show running-config

# навесим IP на wan:
interface FastEthernet0/0
ip address 10.100.0.248 255.255.255.0
!
! VoIP configuration.
!
!
! Voice service voip configuration.
!
voice service voip
protocol sip
dtmf-relay out-of-band
fax protocol t38 redundancy 0
fax rate 9600
h323 call start fast
h323 call tunnel enable
no call-barring unconfigured-ip-address
no voip-inbound-call-barring enable
!
!
! Voice port configuration.

# тут вешаем на какой номер отправлять входящие звонки на астериск
! GSM
voice-port 0/0
connection plar 377737708
ring number 10
ring detect-timeout 100
ring detect-timer 900
no announcement
no caller-id enable
!
!
! GSM
voice-port 0/1
connection plar 377737709
ring number 10
ring detect-timeout 100
ring detect-timer 900
no announcement
no caller-id enable
!
# fxo порты не исользуем, если надо по образцу выше
! FXO
voice-port 0/2
no caller-id enable
!
!
! FXO
voice-port 0/3
no caller-id enable
!
 # заведем dial-peer destination-pattern по кол портов:
!
dial-peer voice 0 pots
destination-pattern T
port 0/0

!
dial-peer voice 1 pots
destination-pattern T
port 0/1
!
!

# заведем sip cервер с destination-pattern
! Voip peer configuration.
!
dial-peer voice 300 voip
destination-pattern T
# IP sip серевера, куда кидаем входящие звонки

session target ip 10.100.0.1 session protocol sip voice-class codec 1 no vad dtmf-relay info fax protocol t38 redundancy 0 fax rate 9600 ! ! ! ! ! # выставим 711alaw кодек приоритетным ! Codec classes configuration. ! voice class codec 1 codec preference 1 g711alaw ! ! ! ! SIP UA configuration. ! sip-ua user-register sip-server 10.100.0.1 register e164
На аддпаке всё, если есть нюансы можно смотреть дебаг:

GS1002# debug voip call

GS1002# terminal monitor

 

На Астериске:

В  дефаулт секции в  extensions.conf укажем default контекст:

[general]
context=INBOUND

в конексте INBOUND обработаем входящие вызовы с шлюза

[INBOUND]

exten => 377737708,1,Goto(INBOUND,3777377,1)
exten => 377737709,1,Goto(INBOUND,3777377,1)

Для исходящих вызовов в конексте исходящих звонков в  extensions.conf просто кидаем вызов на IP шлюза 10.100.0.248:

exten => _XXXXXXXXXX,1,Dial(SIP/${EXTEN}@10.100.0.248,90,r)

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.

Автор: stalex

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 4,40 из 5)
Загрузка...
Отправить на почту Отправить на почту

Возможности создаваемой системы:

  • Отправка факсов с windows машин в локальных доверенных сетях
  • Отправка факсов с почты
  • Отправка факсов с web-интерфейса
  • Уведомление о состоянии отправленных факсов по почте/сообщения по сети индивидуальному/групповому пользователю
  • Прием факсов и распечатка на принтере
  • Доступность списка полученных факсов через сетевую директорию (в нашем случае samba)
  • Доступность с писка полученных факсов через web-интерфейс
  • Здесь сильно нехвататет:

  • dialup доступ к системе на случай аварии
  • Использования голосовых функций модема при отправке и приеме, т.к. у меня просто нет такого модема
  • Установлена Freebsd 7.3-stable, hylafax-6.0.4_1.
    Для работы с почтой:

    • Любой MTA (я буду использовать exim)

    Для работы в виндовой сетке

    • samba
    • cups/lpr
    • /usr/ports/print/hplip — драйвера для моего HP принтера

    Для работы через веб интерфейс:

    • apache22-itk
    • php5
    • mysql
    • phpmyadmin
    • cd /usr/ports/databases/pear-MDB2_Driver_mysql
    • pear-1.9.0
    • PHP PEAR 5 including MDB2_driver_mysql, Mail and Mail_Mime
    • PECL FileInfo
    • PHP mbstring — for improved UTF-8 sorting support (optional)
    • PHP MySQL 5
    • MySQL server 4.1.12 or better (see Important Notes below)
    • ImageMagick
    • ghostscript
    • libtiff
    • netpbm-devel
    • libungif
    • sudo

    Характеристики железа, на котором все это работает:

    1. pentium3-1Ghz/512Mb/40Gb hdd
    2. 4 модема courier
    3. МУльтикарта mosChip nm9835

    У меня установлена мультикарта для работы 2 модемов и можно подгрузить puc модуль, но модемы у меня упорно не виделись, так что тем, кто использует мультикарты, надо собрать ядро с device puc.

    Все поставлено, можно начинать настройку.

    Настройка hylafax
    Команды:

    • faxsetup — сделает общие настройки факс- сервера.
    • faxaddmodem — позволит добавить модем

    Файлы (все конфиги находятся в /var/spool/hylafax/etc):

  • FaxDispatch
    • FILETYPE=tif;
      SENDTO=mail@your-server.ru;
  • FaxNotify
    • NOTIFY_FAXMASTER=yes;
      RETURNFILETYPE=tif
  • В файл конфига модема:
    • FaxrcvdCmd: «bin/faxrcvd.php»
      DynamicConfig: «bin/dynconf.php»
      NotifyCmd: «bin/notify.php «
  • В файл /etc/ttys
    • cuad0  «/usr/local/sbin/faxgetty»  unknown on insecure
      ln -s /var/spool/hylafax/bin/ps2fax /var/spool/hylafax/bin/ps2fax.gs
      ln -s /var/spool/hylafax/bin/pdf2fax /var/spool/hylafax/bin/pdf2fax.gs

    —————————————————————————————————————
    Настроим веб сервер.

    Т.к. сервер будет исполнять системные команды, я предпочел использовать apache22 с патчем itk. Это позволит мне ограничить работу виртуального хоста в системе действиями от непривелигированного пользователя uucp, например. Для активации патча необходимо сделать:
    # sudo make WITH_MPM=itk -C /usr/ports/www/apache22/

    Этот рецепт можно также использовать на собственном виртуальном хостинге, но следует учитывать, что apache22-itk работает примерно в 5 раз медленнее простого апача, так что может это кому-то пойдет только во вред. Мне нет, у меня нет больших нагрузок и я решил попробовать что-то необычное

    ServerAdmin it@your-server.ru
    DocumentRoot «/usr/local/www/avantfax»
    ServerName fax.your-server.ru
    ErrorLog «/var/log/fax-error_log»
    CustomLog «/var/log/fax-access_log» common
    # Включилась паранойя, и я изменил все запросы с http на https
    RewriteEngine on
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
    # Настроим от чьего имени будет работать этот виратуальный хост

    AssignUserId uucp uucp

    # Тут настроим работу php
    php_admin_value upload_tmp_dir /usr/local/www/avantfax/tmp
    php_admin_flag safe_mode off # Обязательно, иначе не будет работать avantfax, указываю не в глобальной конфигурации, чтобы остальные вируальные хосты работали в сейвмоде
    php_admin_flag display_errors on # Посмотрим будут ли ошибки, потом можно отключить
    php_admin_value doc_root /usr/local/www/avantfax
    php_admin_value user_dir «www»
    php_admin_value open_basedir «/usr/local/www/avantfax:/usr/local/share/pear:/var/spool/hylafax:/usr/local/bin» # Разрешим этому вируальному хосту испольнять код-пхп в определенных директориях.
    php_admin_value session.save_path /usr/local/www/avantfax/tmp
    php_admin_value memory_limit «64M»
    php_flag max_execution_time 60

    —————————————————————————————————————
    Делаем веб морду

    0. Качаем архив с скриптами http://downloads.sourceforge.net/project/avantfax/avantfax-3.2.2.tgz?use_mirror=ignum

    1. Этот скрипт написан для разных систем, поэтому сперва изменим пути в нескольких скриптах, или создадим символические ссылки.

    Я предпочитаю сменить пути в файлах:
    avantfax/includes/faxrcvd.php, notify.php, remold.php, faxcover.php, phb.php

    Создадим базу вебморды нашей факс машины
    # mysql -uroot -p < create_user.sql
    # mysql -uavantfax -ppassword avantfax < create_tables.sql

    2. Приведем avantfax/includes/local_config.php в соответстви с нашей системой:
    cp /usr/local/www/avantfax/avantfax/includes/local_config-example.php /usr/local/www/avantfax/avantfax/includes/local_config.php

    Опишу необходимые настройки в local_config.php:

  • Ищем $BINARYDIR = ‘/usr/bin’;, меняем на $BINARYDIR = ‘/usr/local/bin’;
  • $dft_config_lang поставим ru вместо en
  • $HYLAFAX_PREFIX
  • 3. # sudo chmod -R 777 tmp faxes templates/admin_theme/templates_c и templates/main_theme/templates_c

    4. Сделаем символическую ссылки на наши скрипты:

  • # ln -s /usr/local/www/avantfax/includes/faxrcvd.php /var/spool/hylafax/bin/faxrcvd.php
  • # ln -s /usr/local/www/avantfax/includes/dynconf.php /var/spool/hylafax/bin/dynconf.php
  • # ln -s /usr/local/www/avantfax/includes/notify.php /var/spool/hylafax/bin/notify.php
  • 5. Отредактируем конфигурацию модема (первый модем в моей системе /dev/cuad0):
    # vi /var/spool/hylafax/etc/config.cuad0

      FaxrcvdCmd: bin/faxrcvd.php
      DynamicConfig: bin/dynconf.php
      UseJobTSI: true

    6. # vi /var/spool/hylafax/etc/config

      NotifyCmd: bin/notify.php

    7. Заменим стандарный faxcover на авантфаксовый:

      # mv /usr/bin/faxcover /usr/bin/faxcover.old
      # ln -s /usr/local/www/avantfax/avantfax/includes/faxcover.php /usr/local/bin/faxcover

    8. Настроим управление очередью факса от имени нашего веб сервера (добавим аккаунт в фаил hosts.faxd uucp). Именно поэтому я использую апач c патчем itk, с ним легко можно ограничить действия виртуального хоста в системе. Это нужно для того, чтобы администратор системы был юзер hylafax, от имени которого работает вся наша система:

      # /usr/sbin/faxadduser -a my_password apache
      # /usr/sbin/faxdeluser localhost
      # /usr/sbin/faxdeluser 127.0.0.1
      # echo 127.0.0.1 >> /var/spool/hylafax/etc/hosts.hfaxd

    Помните , что указанный пароль используется в файле local_config.php as $FAXRMPWD.

    9. Добавим два скрипта от рута в крон (/etc/crontab). Один нужен для создания адресной книги, а второй удаляет все временные файлы, которые остают после заливки файлов юезрами в факс-машину через веб морду:

      0 * * * * /var/www/avantfax/includes/phb.php
      0 0 * * * /var/www/avantfax/includes/avantfaxcron.php -t 2

    10. Настроим возможность выполнения некоторых команд в системе от имени root, но с правами юзера hylafax (/usr/local/etc/sudoers):
    hylafax ALL = NOPASSWD: /sbin/reboot, /sbin/halt, /usr/local/sbin/faxdeluser, /usr/local/sbin/faxadduser -u * -p * *

    11. Теперь можно перезапустить машину для проверки, что все само стартует в случае перегрузки и пробовать войти в вебинтерфейс avantfax:

    http://fax.your-server.ru/admin/

    Если все в порядке, то появится запрос на ввод логина/пароля.

    ПО-умолчанию: admin/password. При первом входе будет предложено сменить пароль на что-то иное.

    Первое что необходимо сделать это создать всех пользователей системы и все модемы, распределить их на группы в соответвии с желаемымой маршрутизацией.

    Например:

    • device: cuad0
    • alias: dep1
    • contact: faxdep1@your-server.ru

    Теперь каждый факс, пришедший на факс cuad0, будет отправлен в pdf на адрес faxdep1@your-server.ru.

    Настроить как будет рассылать MTA эти письма, вы сами решайте. У нас пересылается на секретаря. Остальные модемы настраиваются аналогично.

    На всякий случай, импортировать уже принятые факсы в вебморду можно следующим образом:

      # cd /var/spool/hylafax; for i in `ls recvq/*`; do bin/faxrcvd.php $i ttyS0; done

    Для импорта отправленных:

      # cd /var/spool/hylafax; for i in `ls doneq/q*`; do bin/notify.php $i done :30; done

    —————————————————————————————————————
    Настройка самба для расшаривания папки с принятыми факсами:

    [Fax_Rec]
    comment = Incoming Faxes
    browseable = yes
    writable = yes
    path = /var/spool/hylafax/recvq
    public = yes

    Зная умения пользователей, подстрахуемся сетевой корзиной:
    vfs objects = recycle full_audit
    recycle:repository = /usr/home/data/fax/.killed
    recycle:keeptree = yes
    recycle:versions = yes

    —————————————————————————————————————
    Автоматическое распечатывание cups принятых факсов.

    Установим и настроим cups.
    Я поставил вот такие пакеты: cups-base-1.4.2_4, cups-client-1.4.2_4, cups-image-1.4.2_4, cups-pstoraster-8.15.4_5, cups-samba-6.0_3, cups-smb-backend-1.0_3.
    Последние 2 нужны были для публикации притеров посредством самбы. Некоторые из отправляющих факсы с клиента программ работают через самба-принтер. Так что возможно многим оно и не понадобится. Далее установим hplip-2.8.2_7 — это драйвера для принтеров HP.

    Установка закончена, теперь настраиваем:

    В файле /usr/local/etc/cups/cupsd.conf делаем следующие изменения:

      Listen 127.0.0.1:631
      Listen :631

    Остальное я не правил, меня устроил дефолтный конфиг. Теперь добавим принтер:

      1. http://local_address:631/
      2. Нажимаем на Printers.
      3. Add Printer. Вводим имя root и его пароль.
      4. Name: имя вашего принтера (название может быть любое). Все остальное не заполняем. Continue.
      6. Не забудьте сделать печать тестовой страницы. Если увидели картинку, то все в порядке.
      7. Далее я долго мучался, почему мой принтер не печататет и нашел ответ. Надо сделать симлинки от старого lpr:
      # cd /usr/bin
      # mv lp lp.bak
      # mv lpq lpq.bak
      # mv lpr lpr.bak
      # mv lprm lprm.bak
      # ln -s /usr/local/bin/lp /usr/bin/lp
      # ln -s /usr/local/bin/lpq /usr/bin/lpq
      # ln -s /usr/local/bin/lpr /usr/bin/lpr
      # ln -s /usr/local/bin/lprm /usr/bin/lprm
      У меня возникла проблема с принтером принтером HP 2055dn, его драйверов не было, поэтому я воспользовался драйвером входящим в состав порта hplip-2.8.2_7 и положил его в /usr/local/etc/cups/ppd/HP_2055.ppd. Больше проблем не было,я и не настраивал больше ничего тут. Таким образом идем далее..

      Для автоматического распечатывания пришедших факсов используйте код в файле

      # /usr/local/bin/tiff2ps -1 $1 | /usr/bin/lpr

    Ваш принтер должен быть PostScript своместимый. Можно указать явно размер бумаги, это необходимо для некоторых типов принтеров:

      # /usr/bin/tiff2ps -1 -h 11.1082 -w 7.8543 $1 | /usr/bin/lpr

    Мы используем для получения аванфаксовый файл faxrcvd.php поэтому в конфиге надо выставить

      $PRINTFAXRCVD = true;
      $PRINTFAX2PS  = ‘/usr//local/bin/fax2ps’;

    —————————————————————————————————————
    Рассмотрим работу с несколькими модемами и принтерами.

    Тут все очень просто. Т.к. наша система плотно связана с avantfax, то и настройки мы должны проводить в неё.Идем в админку http://fax.your-server.ru/admin/. Тут Заходим в пункт «параметры модемов» и заполняем: название модем, на какой принтер печатать, какой номер. Собственно после этого у вас должно заработать как надо.
    —————————————————————————————————————
    Что делать тем, кто не хочет установить avantfax?

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

      case «$DEVICE» in cuad0)
      SENDTO=name@your-server.ru
      PRINTER=lj2015
      ;;
      esac

    —————————————————————————————————————
    Отправка факсов с рабочих мест:
    Скачаем вот это http://prdownloads.sourceforge.net/winprinthylafax/WinprintHylaFAX-1.2.9.exe?download, и несколько автоматизируем процесс настройки клиентов таким reg-файлом:

      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v Username /t reg_sz /d %username% /f
      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v Password /t reg_sz /d PassWord /f
      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v DefaultEmail /t reg_sz /d %username%@your-server.ru /f
      reg add «HKLM\SYSTEM\ControlSet001\Control\Print\Monitors\Winprint Hylafax\Ports\HFAX1:» /v AddressBookPath /t reg_sz /d %userprofile% /f

    Этот кусок реестра форточек позволяет настроить параметры winprint, для настройки уведомлений и авторизированного доступа к системе. Теперь пользователь может отправить факс простым распечатыванием на специальный факсовый принтер. Впрочем, можно обойти все машины и настроить факсовый притер вручную.
    —————————————————————————————————————
    Работа с почтовым сервером

    Мозга до sendmail мне никогда не хватало, поэтому в /etc/mail/mailer.conf:

      sendmail /usr/local/sbin/exim
      send-mail /usr/local/sbin/exim
      mailq /usr/local/sbin/exim -bp
      newaliases /usr/local/sbin/exim -bi
      hoststat /usr/local/sbin/exim
      purgestat /usr/local/sbin/exim

    Транспорт
    faxmail:
    driver = accept
    condition = ${if eq{$local_part}{fax}{yes}{no}}
    transport = faxmail
    no_more

    faxmail:
    driver = pipe
    command =»/usr/local/bin/faxmail -n -t done -d $h_subject $sender_address»

    Теперь при посылке почты на fax@your-server.ru ексим выполнит отправку факса. Соответвенно, если у вас почтовый сервер и сервер с факсами разные, то на основном сервере надо настроить пересылку почты на смтп нашей факсмашины.

    Дальше больше и интереснее.
    Теперь рассмотрим работу hylafax с asterisk и iaxmodem. Как настраивать астреиск, тема другой статьи, поэтому я предполагаю, что он уже настроен у вас.
    Итак, устанавливаем /usr/ports/net/iaxmodem. Создаем конфиг программного модема /usr/local/etc/iaxmodem/ttyIAX0:
    mode 660
    port 4570
    refresh 300
    server 127.0.0.1
    peername iaxmodem0
    secret parolka
    cidname subnets.ru
    cidnumber 203
    codec alaw

    В /etc/rc.conf для автостарта:
    iaxmodem_enable=»YES»

    Командой faxaddmodex ttyIAX0 добавим новый модем и настроим его. В итоге получим конфиг модема IAX0 для hylafax.

    Настроим iax.conf для астериска:
    [general]
    bindport=4569
    bindaddr=127.0.0.1
    bandwidth=low
    disallow=lpc10
    jitterbuffer=no
    forcejitterbuffer=no
    autokill=yes

    [iaxmodem0]
    type=friend
    username=iaxmodem0
    context=office
    secret=parolka
    host=127.0.0.1
    port=4570
    qualify=yes
    disallow=all
    allow=ulaw
    trunk=no

    Ну и sip.conf:
    exten => 203,1,Set(LANGUAGE()=ru)
    exten => 203,n,Dial(IAX2/iaxmodem0/${EXTEN},10,r)

    Несколько советов по управлению факс-машиной:

      Очистка факс машины:
      # cd /var/spool/hylafax/
      # rm archive/* docq/* log/* recvq/* sendq/* tmp/*

    З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

    Автор: makky
    Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 3,75 из 5)
    Загрузка...
    Отправить на почту Отправить на почту