Автоматическая загрузка звонков в плане набора

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

Мой extensions.conf выглядит примерно так

exten => _!,n,System(mkdir “/var/spool/asterisk/${CALLERID(number)}”)
exten => _!,n,Set(FILENAME=CallingTime(${EPOCH})-Called(${EXTEN}))
exten => _!,n,Set(MONITOR_EXEC_ARGS=&& mv “/var/spool/asterisk/monitor/${FILENAME}.wav” “/var/spool/asterisk/${CALLERID(number)}/”)
exten => _!,n,Monitor(wav,${FILENAME},mb)
exten => _!,n,Dial(SIP/100,r)
exten => _!,n,Hangup()

Я пытался добавить

exten => _!,n,System( uploader ${CALLERID(number)} /var/spool/asterisk/${CALLERID(number)}/ ${FILENAME}.wav)

но запись еще не доступна

Я пытался добавить его после зависания

exten => h,1,System( uploader ${CALLERID(number)} /var/spool/asterisk/${CALLERID(number)}/ ${FILENAME}.wav )

но запись еще не доступна

я попытался добавить функцию загрузки в MONITOR_EXEC_ARGS, которая выглядит примерно так

exten => _!,n,Set(MONITOR_EXEC_ARGS=&& mv “/var/spool/asterisk/monitor/${FILENAME}.wav” “/var/spool/asterisk/${CALLERID(number)}/” && uploader ${CALLERID(number)} /var/spool/asterisk/${CALLERID(number)}/ ${FILENAME}.wav )

Но запись не может объединить два файла ног

Если вы можете указать мне правильное направление или найти то, что я делаю неправильно, это было бы очень полезно. Спасибо в ожидании

2 ответа

Вы не должны добавлять длинные действия в обработчик зависания. Это может привести к застреванию звездочки.

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

Примечания:

При попытке воспроизвести поведение вашего диалплана у меня это не сработало, поскольку кавычки в вашем примере диалплана были неправильными. мне пришлось изменитьсяк". Я тестировал конечную точку SIP с идентификатором вызывающего абонента.+17777888и точка входа в диалплан была1234@default.

Решение:

Избегайте фигурных скобок в переменной имени файла, чтобы ее можно было безопасно правильно использовать в команде оболочки приложением монитора asterisk:

старый:

новый:

В качестве альтернативы, если имя вашего файла обязательно должно содержать фигурные скобки, вы можете попытаться экранировать скобки с помощью обратной косой черты в имени переменной, но отследить последствия экранирования относительно сложно.

Полный диалплан, который у меня сработал:

      [default]
exten => _!,1,System(mkdir -p "/var/spool/asterisk/${CALLERID(number)}")
exten => _!,n,Verbose(0,trying mkdir "/var/spool/asterisk/${CALLERID(number)}". system app result: '${SYSTEMSTATUS}')
exten => _!,n,Set(FILENAME=CallingTime_${EPOCH}-Called_${EXTEN})
exten => _!,n,Set(MONITOR_EXEC_ARGS=&& mv "/var/spool/asterisk/monitor/${FILENAME}.wav" "/var/spool/asterisk/${CALLERID(number)}/")
exten => _!,n,Monitor(wav,${FILENAME},m)
exten => _!,n,Answer()
exten => _!,n,MusicOnHold(default,5)
exten => _!,n,Hangup()
exten =>  h,1,Goto(999)
exten =>  h,999,NoOp(hangup)

Подход/Отладка

Проверьте, был ли результат System-Execution mkdir успешным

проверьте документацию системного приложения:

      asthost*CLI> core show application System

  -= Info about application 'System' =-

[Synopsis]
Execute a system command.

[Description]
Executes a command  by  using  system(). If the command fails, the console
should report a fallthrough.
Result of execution is returned in the ${SYSTEMSTATUS} channel variable:
${SYSTEMSTATUS}:
    FAILURE: Could not execute the specified command.
    SUCCESS: Specified command successfully executed.

[Syntax]
System(command)

[Arguments]
command
    Command to execute
    WARNING!!!: Do not use untrusted strings such as ${CALLERID(num)} or
    ${CALLERID(name)} as part of the command parameters.  You risk a command
    injection attack executing arbitrary commands if the untrusted strings
    aren't filtered to remove dangerous characters.  See function ${FILTER()}.

[See Also]
Not available

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

      exten => _!,n,System(mkdir "/var/spool/asterisk/${CALLERID(number)}")
exten => _!,n,Verbose(0,trying mkdir "/var/spool/asterisk/${CALLERID(number)}". system app result: '${SYSTEMSTATUS}')

Вывод должен быть таким:

      trying mkdir "/var/spool/asterisk/+17777888". system app result: 'SUCCESS'

Если каталог уже существует, вы получите статус ошибки, напримерAPPERROR. Вы можете добавить-pвариант для вашегоmkdirкоманда всегда получатьSUCCESSценностьSYSTEMSTATUSпеременная, даже если каталог уже существует.

Посмотрите, что именно приложение-монитор вызывает в системе

Сначала установите уровень отладки на 1, чтобы увидеть больше результатов:

      asthost*CLI> core set debug 1

Затем инициируйте новый вызов. После того, как вы повесите трубку, в asterisk cli должно появиться что-то вроде этого:

      [2023-03-13 11:40:01] DEBUG[681389][C-0000008c]: res_monitor.c:532 __ast_monitor_stop: monitor executing ( nice -n 19 sox -m "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-in.wav" "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-out.wav" "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234).wav" && mv “/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234).wav” “/var/spool/asterisk/+17777888/” && rm -f "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-"* ) &

Теперь проверим, какие файлы находятся в каталоге после завершения звонка:

      root@asthost:/# ls -l /var/spool/asterisk/monitor/*
-rw-r--r-- 1 root root 240684 Mar 13 11:40 '/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-in.wav'
-rw-r--r-- 1 root root 240044 Mar 13 11:40 '/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-out.wav'

Как мы видим, несмешанный-in.wavи-out.wavфайлы все еще находятся в каталоге, поэтому смешивание файлов, похоже, не удалось. Попробуйте запустить ту же команду на консоли bash:

      root@asthost:/# ( nice -n 19 sox -m "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-in.wav" "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-out.wav" "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234).wav” && mv "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234).wav" "/var/spool/asterisk/+17777888/" && rm -f "/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-"* ) &

Консоль выводит сообщение об ошибке:

      root@asthost:/# sox FAIL formats: can't open input file `/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-out.wav': No such file or directory

Попробуйте найти файл. Появляется сообщение об ошибке:

      root@asthost:/# ls /var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-out.wav
bash: syntax error near unexpected token `('

Попробуйте использовать экранированные скобки. Что будет делать:

      root@asthost:/# ls /var/spool/asterisk/monitor/CallingTime\(1678703986\)-Called\(1234\)-in.wav
'/var/spool/asterisk/monitor/CallingTime(1678703986)-Called(1234)-in.wav'

Исправьте свой диалплан

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

старый:exten => _!,n,Set(FILENAME=CallingTime(${EPOCH})-Called(${EXTEN}))

новый:exten => _!,n,Set(FILENAME=CallingTime_${EPOCH}-Called_${EXTEN})

Перезагрузите свой дилаплан

      asthost*CLI> dialplan reload

Проверьте поведение

Теперь должно работать. Активируйте уровень отладки 1 и инициируйте новый вызов.

      asthost*CLI> core set debug 1
...
[2023-03-13 12:16:26] DEBUG[682358][C-00000095]: res_monitor.c:532 __ast_monitor_stop: monitor executing ( nice -n 19 sox -m "/var/spool/asterisk/monitor/CallingTime_1678706180-Called_1234-in.wav" "/var/spool/asterisk/monitor/CallingTime_1678706180-Called_1234-out.wav" "/var/spool/asterisk/monitor/CallingTime_1678706180-Called_1234.wav" && mv "/var/spool/asterisk/monitor/CallingTime_1678706180-Called_1234.wav" "/var/spool/asterisk/+17777888/" && rm -f "/var/spool/asterisk/monitor/CallingTime_1678706180-Called_1234-"* ) &

Проверьте свои файлы.

monitorкаталог не должен содержать wav-файлы последнего звонка:

      root@asthost:/# ls -l /var/spool/asterisk/monitor/
total 0

Каталог caller-id должен содержать wav-файлы последнего звонка:

      root@asthost:/# ls -l /var/spool/asterisk/+17777888/
total 92
-rw-r--r-- 1 root root 93484 Mar 13 12:16 CallingTime_1678706180-Called_1234.wav

Это выглядит так, как и ожидалось.

Другие вопросы по тегам