Инструменты пользователя

Инструменты сайта


configure_asterisk_for_cloud_version

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
configure_asterisk_for_cloud_version [2020/11/25 16:29]
Евгений Романенко
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 не ниже ​или другие дистрибутивы с актуальной базой репозиториев.
  
   * 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 '',​
Строка 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)});​
Строка 151: Строка 155:
               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(filename)=${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-адрес/​Пароль) из регистрационного письма.
configure_asterisk_for_cloud_version.1606296545.txt.gz · Последние изменения: 2020/11/25 16:29 — Евгений Романенко