Автоматическая загрузка звонков в плане набора
У меня проблема с записью звонков. Что я хотел сделать, это автоматически загрузить запись вызова после зависания
Мой 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
Это выглядит так, как и ожидалось.