Проблема: sip_autodestruct
Сервисы Общения › Форумы › Общие вопросы › Проблема: sip_autodestruct
Помечено: Asterisk, sip, sip_autodestruct, warning
- В этой теме 11 ответов, 3 участника, последнее обновление 7 лет, 10 месяцев назад сделано Amon_R90.
-
АвторСообщения
-
28.11.2016 в 05:30 #12961Amon_R90Участник
Всем привет! недавно начал свое знакомство с Астериском, и была ранее поставлена задача о создании .call файла и автодозвона. Создал(позаимствовал) скрипт не разобравшись в нем(в синтаксисе), после его исполнения пару раз все хорошо работало, но через некоторое время начались ошибки. В скрипте разобрался, там ничего криминального не было, почистил,убрал лишнее, но видимо не в нем дело, так как ошибка продолжает появляться, может кто нибудь направит меня в нужное русло?? Ссылка на предыдущую тему связанную со скриптом не отображается почему-то..в общем тема “Внутренняя голосовая почта”
sip.conf:
[general] language=ru context=default allowoverlap=no udpbindaddr=0.0.0.0 tcpenable=no tcpbindaddr=0.0.0.0 transport=udp srvlookup=yes allowguest=no limitonpeers=yes [authentication] [phones](!) type=friend context=internal secret=123 host=dynamic nat=no qualify=yes canreinvite=no callgroup=1 pickupgroup=1 call-limit=1 dtmfmode=auto disallow=all allow=alaw allow=ulaw allow=g729 allow=g723 allow=g722 [700](phones) callerid="Number 700" <700> mailbox=700@voicemail [701](phones) callerid="Number 701" <701> mailbox=701@voicemail [703](phones) callerid="Number 703" <703> mailbox=703@voicemail
extensions.conf:
[general] static=yes writeprotect=no [globals] [default] [phones] include => internal include => scrtest include => out_voicemessage [internal] exten => _XXX,1,Dial(SIP/${EXTEN},10) same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) same => n(unavail),VoiceMail(${EXTEN}@voicemail,u) same => n,GoTo(scrtest,s,1) same => n,Hangup() same => n(busy),VoiceMail(${EXTEN}@voicemail,b) same => n,GoTo(scrtest,s,1) same => n,Hangup() exten => 1,1,VoiceMailMain(${CALLERID(num)}@voicemail) same => n,Hangup() [scrtest] exten => s,1,System(echo "${CALLERID(num)}" >> /var/spool/asterisk/temp1234/${CALLERID(num).txt) ;exten => s,n,System(/var/spool/asterisk/test_call_list.sh) [out_voicemessage] exten => s,1,Answer exten => s,n,Wait(2) exten => s,n,Background(/var/lib/asterisk/sounds/vm-youhave) exten => s,n,Background(/var/lib/asterisk/sounds/vm-INBOX) exten => s,n,Background(/var/lib/asterisk/sounds/vm-message) exten => s,n,Hangup
Сама ошибка:
[root@unused211 asterisk]# asterisk -rvvvvvvvvv Asterisk 13.11.2 <…> =================================== Connected to Asterisk 13.11.2 currently running on unused211 (pid = 3301) [Nov 28 11:56:01] WARNING[3831]: chan_sip.c:4324 __sip_autodestruct: Autodestruct on dialog 'NzE1YmIwNjk0ZTI2MTM2ZWFjYzJmMmI0YWM4YmY3OTc.' with owner SIP/701-0000008c in place (Method: BYE). Rescheduling destruction for 10000 ms [Nov 28 11:56:02] WARNING[3831]: chan_sip.c:4324 __sip_autodestruct: Autodestruct on dialog '_0-Q6fWdOXiBworeORJo_A..' with owner SIP/703-0000008e in place (Method: BYE). Rescheduling destruction for 10000 ms
28.11.2016 в 08:12 #12962DemonУчастникЯ думаю.. Вы уже гуглили и видели: http://asterisk-support.ru/question/50885/autodestruct-on-dialog/
Может быть.. это связано с сторока:
same => n,GoTo(scrtest,s,1)
same => n,Hangup()
Пожалуй, Вы думаете что после GoTo управление возвращается? Нет… не возвращается. В результате не делается HangUp.
Следует использовать GoSub и Return в конце вызываемого контекста. Ну или Macro (считается depricated).28.11.2016 в 10:09 #12965Amon_R90УчастникСледует использовать GoSub и Return в конце вызываемого контекста. Ну или Macro (считается depricated).
проблему эта вроде бы пока решилась, и варнинги не выдает больше, перезапуск всего астера помог.
В экстеншенах поменял, то что Вы указали, спасибо, не знал, что не возвращает(видимо, где-то читал, но проглядел этот пункт:))А может быть Вы мне здесь поможете с предыдущим моим вопросом, связанный с созданием .call – файла?
Суть такова что: звоним на номер, не ответили, мы записываем голосовое сообщение, после создается $number – файл с номером звонившего, далее создается .call-файл, и дозванивается до абонента которому мы оставили голосовое сообщение(.call -файл начинает работу с эксеншена где просто проигрывается гол.сообщение о новой голосовой почте, вешает трубку).
В принципе, все что нужно выше изложено, только вот текст самого скрипта:#!/bin/sh while read number; do cat <<EOF > /var/spool/asterisk/$number Channel: SIP/$number Callerid: $number MaxRetries: 3 RetryTime: 20 WaitTime: 30 Context: out_voicemessage Extension: s Priority: 1 EOF chown asterisk:asterisk /var/spool/asterisk/$number mv /var/spool/asterisk/$number /var/spool/asterisk/outgoing done < /var/spool/asterisk/$number exit 0
когда просто создаю .call файл, копирую его в outgoing, то все нормально, создается вызов и тд, все хорошо. А вот с помощью скрипта…даже ни малейшего движения не наблюдается..
путь к файлу $number я переделал в экстеншенах, сейчас путями к файлам, папкам в порядке.28.11.2016 в 12:21 #12966DemonУчастникА файл в /var/spool/asterisk/outgoing создаётся? И содержимое его нормальное?
Я вот не очень понимаю что значит “done < /var/spool/asterisk/$number"? Я понимаю что нужно сделать.. но не очень хорошо знаю bash чтобы осмыслить эту строку. Т.е. файл-то в outgoing корректный? А если этот файл скопировать не скриптом, а просто.. руками?
30.11.2016 в 03:07 #12974Amon_R90УчастникА файл в /var/spool/asterisk/outgoing создаётся? И содержимое его нормальное?
/outgoing это папка астериска, в которую перемещается .call-файл, и при попадании туда, астер начинает его сразу обрабатывать: читает, создает канал связи на основе пункта Chanel, и пытается дозвониться на номер который там указан(тот номер который только что позвонил, оставил голосовое сообщение). Если не дозвонился, то согласно пункту MaxRetries:3(к примеру) в .call-файле пытается дозвониться указанное количество раз(3), после того как дозвонился\нет, и этот файл полностью отработал, астер его удаляет(сам).
на сколько я понял, это строка указывает на то что файл $number выполнен, и с ним больше не работать. Единственная проблема, после проработки всего скрипта нужно явное указание файла( в моем случае это будет не $number, а файл с конкретным именем звонившего (700, к примеру) который создается строкой
[scrtest] exten => s,1,System(echo "${CALLERID(num)}" >> /var/spool/asterisk/temp1234/${CALLERID(num).txt)
и скрипт не отрабатывает эту команду, так как название файла не явное.(не знаю пока как сделать что бы была конкретная ссылка, работаю над этим). Если эту команду не написать, то скрипт(при исполнении для начала в консоли Centos, а не в астере), начинает выдавать ошибки, думая что 2 строчка скрипта – директория, а это не так, это тот файл который создается командой System(echo …) \выше которая\. Я пока только начал знакомство с bash, и всей логики пока не знаю, и не знаю как починить эту ошибку.
Копировать и скопировать можно и руками(или в ручную каждый раз запускать скрипт на создание .call-файла), но представьте, если будет большое количество абонентов, и много будет тех кто не ответят на вызов, это придется каждый раз в ручную смотреть логи кто кому звонил, когда, искать файл с необходимым номером дозвона, создавать .call-файл,и копировать в outgoing, а это не слишком уж важная(нужная) задача для того кто следит за корректной работой программы. Да и ведь не всегда будет получаться что человек будет находиться на своем рабочем месте, и поэтому хотел, что бы этот процесс запускался из самого астера автоматически.
30.11.2016 в 11:24 #12978abadkУчастникВот смотрю я скрипт. А “number” он откуда берет?
Обычно в скрипт передают аргументы, которые уже используются дальше.
Кмк создавать файл и потом его читать лишнее. Сразу передавайте номер звонившего
в скрипт. И еще формат номера посмотрите, возможно там стоит + в начале.
Насколько это корректно для имени файла?02.12.2016 в 04:51 #12986Amon_R90УчастникВот смотрю я скрипт. А “number” он откуда бере…
“number” это файл в котором хранится номер того кому звонили(тот кто не ответил), а из этого файла и берется аргумент, и на его основе составляется .call-файл.
Я не знаю как по другому сделать, что бы не “Кмк создавать файл и потом его читать лишнее.”, со скриптами 3й день только работаю, раньше – в жизни не прикасался, поэтому некоторые аспекты для меня в новинку. Может подскажете тогда как это реализовать?)
Номер там без “+”, так как пока практикуюсь настраивать только внутреннюю сеть(номера там простые: 100,101,102, и тд).02.12.2016 в 10:40 #12989abadkУчастникНу по идее нужно вот так сделать:
exten => s,n,System(/var/spool/asterisk/test_call_list.sh ${CALLERID(num)})а в скрипте нужно будет написать так
number = $102.12.2016 в 10:59 #12990abadkУчастникИ убрать конструкцию while. Цикл там не нужен. Нужно сформировать файл,
записать его на диск и переместить в папку.05.12.2016 в 04:59 #13004Amon_R90УчастникИ убрать конструкцию while…
Спасибо большое!!!
Со скриптом разобрался, понял как передавать в него переменную, все получается. Звоним, оставляем ГС, создается .call-файл, перемещается в папку, дозванивается и предупреждает о наличии нового ГС.
Да, действительно, несколько строк кода можно теперь просто убрать:)А не подскажете как через System в скрипт передать два параметра? $1 – это у меня ${CONNECTEDLINE(number)}, и мне нужно второй передать в скрипт это – ${CALLERID(num)}. посмотрел получается либо через AGI, либо еще один скрипт создавать, в котором будет прописан список моих параметров передаваемых? ведь через “,” , “|” не получится…
12.12.2016 в 13:27 #13077abadkУчастникТак через пробел. Первый будет $1, а второй $2, емнип.
14.12.2016 в 04:38 #13090Amon_R90УчастникТак через пробел. Первый будет $1, а второй $2, емнип.
Спасибо большое!:)
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.