Проблема: sip_autodestruct

 

Сервисы Общения Форумы Общие вопросы Проблема: sip_autodestruct

Помечено: , , ,

В этой теме 11 ответов, 3 участника, последнее обновление  Amon_R90 1 год, 9 мес. назад.

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)
  • Автор
    Сообщения
  • #12961

    Amon_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
    #12962

    Demon
    Участник

    Я думаю.. Вы уже гуглили и видели: http://asterisk-support.ru/question/50885/autodestruct-on-dialog/

    Может быть.. это связано с сторока:
    same => n,GoTo(scrtest,s,1)
    same => n,Hangup()
    Пожалуй, Вы думаете что после GoTo управление возвращается? Нет… не возвращается. В результате не делается HangUp.
    Следует использовать GoSub и Return в конце вызываемого контекста. Ну или Macro (считается depricated).

    #12965

    Amon_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 я переделал в экстеншенах, сейчас путями к файлам, папкам в порядке.

    #12966

    Demon
    Участник

    А файл в /var/spool/asterisk/outgoing создаётся? И содержимое его нормальное?

    Я вот не очень понимаю что значит “done < /var/spool/asterisk/$number"? Я понимаю что нужно сделать.. но не очень хорошо знаю bash чтобы осмыслить эту строку. Т.е. файл-то в outgoing корректный? А если этот файл скопировать не скриптом, а просто.. руками?

    #12974

    Amon_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, а это не слишком уж важная(нужная) задача для того кто следит за корректной работой программы. Да и ведь не всегда будет получаться что человек будет находиться на своем рабочем месте, и поэтому хотел, что бы этот процесс запускался из самого астера автоматически.

    #12978

    abadk
    Участник

    Вот смотрю я скрипт. А “number” он откуда берет?
    Обычно в скрипт передают аргументы, которые уже используются дальше.
    Кмк создавать файл и потом его читать лишнее. Сразу передавайте номер звонившего
    в скрипт. И еще формат номера посмотрите, возможно там стоит + в начале.
    Насколько это корректно для имени файла?

    #12986

    Amon_R90
    Участник

    Вот смотрю я скрипт. А “number” он откуда бере…

    “number” это файл в котором хранится номер того кому звонили(тот кто не ответил), а из этого файла и берется аргумент, и на его основе составляется .call-файл.
    Я не знаю как по другому сделать, что бы не “Кмк создавать файл и потом его читать лишнее.”, со скриптами 3й день только работаю, раньше – в жизни не прикасался, поэтому некоторые аспекты для меня в новинку. Может подскажете тогда как это реализовать?)
    Номер там без “+”, так как пока практикуюсь настраивать только внутреннюю сеть(номера там простые: 100,101,102, и тд).

    #12989

    abadk
    Участник

    Ну по идее нужно вот так сделать:
    exten => s,n,System(/var/spool/asterisk/test_call_list.sh ${CALLERID(num)})

    а в скрипте нужно будет написать так
    number = $1

    #12990

    abadk
    Участник

    И убрать конструкцию while. Цикл там не нужен. Нужно сформировать файл,
    записать его на диск и переместить в папку.

    #13004

    Amon_R90
    Участник

    И убрать конструкцию while…

    Спасибо большое!!!
    Со скриптом разобрался, понял как передавать в него переменную, все получается. Звоним, оставляем ГС, создается .call-файл, перемещается в папку, дозванивается и предупреждает о наличии нового ГС.
    Да, действительно, несколько строк кода можно теперь просто убрать:)

    А не подскажете как через System в скрипт передать два параметра? $1 – это у меня ${CONNECTEDLINE(number)}, и мне нужно второй передать в скрипт это – ${CALLERID(num)}. посмотрел получается либо через AGI, либо еще один скрипт создавать, в котором будет прописан список моих параметров передаваемых? ведь через “,” , “|” не получится…

    #13077

    abadk
    Участник

    Так через пробел. Первый будет $1, а второй $2, емнип.

    #13090

    Amon_R90
    Участник

    Так через пробел. Первый будет $1, а второй $2, емнип.

    Спасибо большое!:)

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)

Для ответа в этой теме необходимо авторизоваться.