Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
configure_asterisk_for_cloud_version [2020/11/18 09:47] Евгений Романенко |
configure_asterisk_for_cloud_version [2023/04/18 19:18] (текущий) Евгений Романенко |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| **Системные требования.** | **Системные требования.** | ||
| - | * На сервере (здесь и далее примем, что “сервером” может быть как отдельный компьютер, \\ так и виртуальная машина, VPS/VDS и т .д. должна быть установлена операционная система Linux семейства Debian не ниже 7.0 (Ubuntu 14.04 и выше), CentOS не ниже 6.5 или другие дистрибутивы с актуальной базой репозиториев. | + | * На сервере (здесь и далее примем, что “сервером” может быть как отдельный компьютер, \\ так и виртуальная машина, VPS/VDS и т .д. \\ Также отметим: docker-контейнер с локальной версией системы статистики может быть запущен как на том же сервере, что и АТС Asterisk, так и на отдельном сервере) должна быть установлена операционная система Linux семейства Debian не ниже 10.0 (Ubuntu 18.04 и выше), CentOS не ниже 7 или другие дистрибутивы с актуальной базой репозиториев. |
| * IP АТС Asterisk должна быть версии не ниже 1.8. \\ На Asterisk должна быть настроена запись информации о разговорах в таблицы cel, cdr и queue_log, подробную информацию о необходимых настройках Asterisk вы найдете ниже в разделе "Настройки Asterisk". | * IP АТС Asterisk должна быть версии не ниже 1.8. \\ На Asterisk должна быть настроена запись информации о разговорах в таблицы cel, cdr и queue_log, подробную информацию о необходимых настройках Asterisk вы найдете ниже в разделе "Настройки Asterisk". | ||
| Строка 17: | Строка 17: | ||
| `src` VARCHAR(80) NOT NULL DEFAULT '', | `src` VARCHAR(80) NOT NULL DEFAULT '', | ||
| `dst` VARCHAR(80) NOT NULL DEFAULT '', | `dst` VARCHAR(80) NOT NULL DEFAULT '', | ||
| + | `realsrc` VARCHAR(80) NOT NULL DEFAULT '', | ||
| + | `realdst` VARCHAR(80) NOT NULL DEFAULT '', | ||
| `dcontext` VARCHAR(80) NOT NULL DEFAULT '', | `dcontext` VARCHAR(80) NOT NULL DEFAULT '', | ||
| `channel` VARCHAR(80) NOT NULL DEFAULT '', | `channel` VARCHAR(80) NOT NULL DEFAULT '', | ||
| Строка 29: | Строка 31: | ||
| `uniqueid` VARCHAR(32) NOT NULL DEFAULT '', | `uniqueid` VARCHAR(32) NOT NULL DEFAULT '', | ||
| `userfield` VARCHAR(255) NOT NULL DEFAULT '', | `userfield` VARCHAR(255) NOT NULL DEFAULT '', | ||
| - | `recordingfile` VARCHAR(255) NOT NULL DEFAULT '', | + | `filename` VARCHAR(255) NOT NULL DEFAULT '', |
| PRIMARY KEY (`id`), | PRIMARY KEY (`id`), | ||
| KEY `calldate` (`calldate`), | KEY `calldate` (`calldate`), | ||
| Строка 89: | Строка 91: | ||
| - Инсталлируем необходимые пакеты (для примера в Debian/Ubuntu) <code bash>aptitude install unixodbc-dev libmyodbc</code> | - Инсталлируем необходимые пакеты (для примера в Debian/Ubuntu) <code bash>aptitude install unixodbc-dev libmyodbc</code> | ||
| - Asterisk должна быть собрана со следующими опциями {{::9d37fd2a5c08439f8a69fe81a398891c.png?400|}}{{::34d0b50241d3443d827afa222aede0f4.png?400|}} | - Asterisk должна быть собрана со следующими опциями {{::9d37fd2a5c08439f8a69fe81a398891c.png?400|}}{{::34d0b50241d3443d827afa222aede0f4.png?400|}} | ||
| - | - Далее редактируем несколько конфиг-файлов:\\ **/etc/asterisk/res_odbc.conf** <code bash>[asterisk] | + | - Далее редактируем несколько конфиг-файлов:\\ **/etc/asterisk/res_odbc.conf** <code bash>[asteriskcdrdb] |
| enabled => yes | enabled => yes | ||
| dsn => MySQL-asterisk | dsn => MySQL-asterisk | ||
| Строка 107: | Строка 109: | ||
| ;Port = 3306 | ;Port = 3306 | ||
| Socket = /var/run/mysqld/mysqld.sock | Socket = /var/run/mysqld/mysqld.sock | ||
| - | Database = asterisk | + | Database = asteriskcdrdb |
| Charset = utf8</code> **/etc/odbcinst.ini** <code>[MySQL] | Charset = utf8</code> **/etc/odbcinst.ini** <code>[MySQL] | ||
| Description = MySQL driver | Description = MySQL driver | ||
| Строка 113: | Строка 115: | ||
| Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so | Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so | ||
| CPTimeout = | CPTimeout = | ||
| - | CPReuse =</code> в конец **/etc/asterisk/cdr_mysql.conf** добавить <code bash>alias recordingfile => recordingfile</code> | + | CPReuse =</code> в конец **/etc/asterisk/cdr_mysql.conf** добавить <code bash>alias filename => filename</code> |
| - | - Внесем в **/etc/asterisk/extconfig.conf** <code bash>queue_log => odbc,asterisk</code> | + | - Внесем в **/etc/asterisk/extconfig.conf** <code bash>queue_log => odbc,asteriskcdrdb</code> |
| - **cel.conf** выглядит так <code bash>[general] | - **cel.conf** выглядит так <code bash>[general] | ||
| enable=yes | enable=yes | ||
| Строка 122: | Строка 124: | ||
| [manager] | [manager] | ||
| [radius]</code> | [radius]</code> | ||
| - | - **cel_odbc.conf** <code bash>[asterisk] | + | - **cel_odbc.conf** <code bash>[asteriskcdrdb] |
| - | connection=asterisk | + | connection=asteriskcdrdb |
| table=cel | table=cel | ||
| loguniqueid=yes | loguniqueid=yes | ||
| Строка 143: | Строка 145: | ||
| macro recording (calling,called) { | macro recording (calling,called) { | ||
| if ("${RECORDING}" = "1"){ | if ("${RECORDING}" = "1"){ | ||
| + | Set(CUTTEDCHANNEL=${CUT(CHANNEL,,1)}); | ||
| + | Set(CUTTEDCHANNEL=${CUT(CUTTEDCHANNEL,/,2)}); | ||
| Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called}); | Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called}); | ||
| Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)}); | Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)}); | ||
| Строка 148: | Строка 152: | ||
| System(mkdir -p ${WAV}/${datedir}); | System(mkdir -p ${WAV}/${datedir}); | ||
| Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3"); | Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3"); | ||
| - | Set(CDR(recordingfile)=${fname}.mp3); | + | Set(CDR(filename)=${fname}.mp3); |
| Set(CDR(realdst)=${called}); | Set(CDR(realdst)=${called}); | ||
| Set(CDR(realsrc)=${calling}); | Set(CDR(realsrc)=${calling}); | ||
| + | ExecIf($["${calling}" = "${called}"]?Set(CDR(realsrc)=${CUTTEDCHANNEL})); | ||
| MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt}); | MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt}); | ||
| Строка 176: | Строка 181: | ||
| [macro-vistep.ru-record] | [macro-vistep.ru-record] | ||
| exten => s,1,NoOp(== START macro-vistep.ru-record ==) | exten => s,1,NoOp(== START macro-vistep.ru-record ==) | ||
| - | same => n,Set(CallerID=${ARG1}) | + | same => n,Set(CallerID=${ARG1}) |
| - | same => n,Set(CalleeID=${ARG2}) | + | same => n,Set(CalleeID=${ARG2}) |
| - | same => n,NoOp(CalleeID=${CalleeID}, CallerID=${CallerID}) | + | same => n,Set(CUTTEDCHANNEL=${CUT(CHANNEL,,1)}) |
| - | same => n,NoOp(VISTEPRURECORDING = ${VISTEPRURECORDING}) | + | same => n,Set(CUTTEDCHANNEL=${CUT(CUTTEDCHANNEL,/,2)}) |
| - | same => n,GotoIf($["${VISTEPRURECORDING}" = "0"]?end) | + | same => n,NoOp(CalleeID=${CalleeID}, CallerID=${CallerID}) |
| - | same => n,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${CallerID}-${CalleeID}) | + | same => n,NoOp(VISTEPRURECORDING = ${VISTEPRURECORDING}) |
| - | same => n,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)}) | + | same => n,GotoIf($["${VISTEPRURECORDING}" = "0"]?end) |
| - | same => n,System(mkdir -p ${MP3}/${datedir}) | + | same => n,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${CallerID}-${CalleeID}) |
| - | same => n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3") | + | same => n,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)}) |
| - | same => n,Set(CDR(recordingfile)=${fname}.mp3) | + | same => n,System(mkdir -p ${MP3}/${datedir}) |
| - | same => n,Set(CDR(realdst)=${CalleeID}) | + | same => n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3") |
| - | same => n,Set(CDR(realsrc)=${CallerID}) | + | same => n,Set(CDR(filename)=${fname}.mp3) |
| - | same => n,MixMonitor(${WAV}/${fname}.wav,b,${monopt}) | + | same => n,Set(CDR(realdst)=${CalleeID}) |
| - | same => n(end),MacroExit() | + | same => n,Set(CDR(realsrc)=${CallerID}) |
| + | same => n,ExecIf($["${CallerID}" = "${CalleeID}"]?Set(CDR(realsrc)=${CUTTEDCHANNEL})) | ||
| + | same => n,MixMonitor(${WAV}/${fname}.wav,b,${monopt}) | ||
| + | same => n(end),MacroExit() | ||
| ;пример использования | ;пример использования | ||
| Строка 198: | Строка 206: | ||
| [from-pstn-custom] | [from-pstn-custom] | ||
| exten => _XX.,1, Macro(vistep.ru-record,${CALLERID(number)},${EXTEN})</code> | exten => _XX.,1, Macro(vistep.ru-record,${CALLERID(number)},${EXTEN})</code> | ||
| + | - Или у вас внезапно lua <code lua> | ||
| + | WAV = "/opt/records/wav" -- Временный каталог с WAV | ||
| + | MP3="/opt/records/mp3" --Куда выгружать mp3 файлы | ||
| + | RECORDING=1 -- 1 - запись включена. | ||
| + | |||
| + | function recording(calling,called) | ||
| + | if RECORDING == 1 then | ||
| + | fname = channel.UNIQUEID:get() .. "-" .. channel.STRFTIME("${EPOCH},,%Y-%m-%d-%H_%M".."-"..calling.."-"..called):get() | ||
| + | datedir = channel.STRFTIME("${EPOCH},,%Y/%m/%d"):get().."/" | ||
| + | os.execute("mkdir -p " .. WAV.."/"..datedir) | ||
| + | os.execute("mkdir -p " .. MP3.."/"..datedir) | ||
| + | WAVfname = WAV..datedir..fname..".wav" | ||
| + | MP3fname = MP3..datedir..fname..".mp3" | ||
| + | channel.CDR("filename"):set(MP3fname) | ||
| + | channel.CDR("realdst"):set(called) | ||
| + | channel.CDR("realsrc"):set(calling) | ||
| + | monopt = string.format("nice -n 19 /usr/bin/lame -b 32 --silent %s %s && rm -f %s && chown o+r %s",WAVfname,MP3fname,WAVfname,MP3fname) | ||
| + | app.mixmonitor(WAVfname,b,monopt) | ||
| + | return | ||
| + | end; | ||
| + | end; | ||
| + | |||
| + | extensions = { | ||
| + | ["local"] = { | ||
| + | --локальные вызовы на номера XXX | ||
| + | ["_XXX"] = function(context,extension) | ||
| + | app.answer() | ||
| + | recording(channel.CALLERID("num"):get(),extension) | ||
| + | app.dial("SIP/"..extension,300,"t") | ||
| + | app.hangup() | ||
| + | end; | ||
| + | }; | ||
| + | |||
| + | } | ||
| + | |||
| + | </code> | ||
| - С препарированием нашей АТС закончили! \\ Переходим к настройке синхронизации БД и файлов записей разговоров в облако ViStep.RU. Для этого воспользуйтесь инструкцией - https://wiki.vistep.ru/doku.php?id=cloud_daemon_sync | - С препарированием нашей АТС закончили! \\ Переходим к настройке синхронизации БД и файлов записей разговоров в облако ViStep.RU. Для этого воспользуйтесь инструкцией - https://wiki.vistep.ru/doku.php?id=cloud_daemon_sync | ||
| - Для входа в систему статистики используйте данные авторизации (Email-адрес/Пароль) из регистрационного письма. | - Для входа в систему статистики используйте данные авторизации (Email-адрес/Пароль) из регистрационного письма. | ||