Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Сжать .wav после завершения переведенного звонка. [закрыт]

0
[incoming-call-rabotaem]
exten=>t,1,Goto(${EXTEN},1)
exten=>i,1,Goto(${EXTEN},1)
exten=>_X.,1,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d__%H-%M-%S)}__${CALLERID(number)}-${EXTEN})
    same=>n,Set(dfname=${path2rec}/${fname})
    same=>n,Set(monopt=nice -n 19)
    same=>n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
    same=>n,MixMonitor(${dfname}.wav,,System(oggenc ${dfname}.wav -Qq0 && rm ${dfname}.wav))
    same=>n,Dial(SIP/165&SIP/166,9,t)
    same=>n,Dial(SIP/165&SIP/166&SIP/401&SIP/402&SIP/101&SIP/102&SIP/103&SIP/104&SIP/105&SIP/106,6,t)
    same=>n,Dial(SIP/165&SIP/166&SIP/401&SIP/402&SIP/101&SIP/102&SIP/103&SIP/104&SIP/105&SIP/106&SIP/107&SIP/122&SIP/002,30,t)
    same=>n,Hangup
exten=>h,1,NoOp()
    same=>n,Set(fname2=${fname}_${DIALEDPEERNUMBER})
    same=>n,Set(fname2=${REPLACE(fname2,"/","_")})
    same=>n,Set(dfname2=${path2rec}/${fname2})
;    same=>n,System(oggenc ${dfname}.wav -Q -q 0 -o ${dfname2}.ogg && rm -f ${dfname}.wav)
    same=>n,System(/admin/ast_dial_rec ${dfname}.wav ${dfname2}.ogg)
    same=>n,Set(CDR(userfield)=in)
    same=>n,Set(CDR(record)=${fname2}.ogg)
    same=>n,Set(CDR(dialedpeernumber)=${DIALEDPEERNUMBER})

Посмотрите закоммеченную строку, из-за неё сжатие и удаление .wav происходит сразу после того как оператор1 положил трубку, хотя благодаря AUDIOHOOK_INHERIT запись продолжается после соединения клиента и оператора2. Чтобы решить эту проблему, вынес сжатие в скрипт, который проверяет свободен ли файл и только после это жмет его и удаляет.

#!/bin/bash

sleep 5

while fuser "$1"
do
  sleep 5
done

oggenc "$1" -Q -q 0 -o "$2"
rm "$1"

При ручном запуске скрипта во время прослуживания файла плеером по ssh (имитирую занятость файла), скрипт отрабатывает нормально. При проверке в астериске скрипт отрабатывает но без учета fuser "$1", т.е. проходит мимо как будто-то fuser вернул пустую строку, как в том случае, когда файл свободен. При этом если параллельно смотреть fuser в рутовой консоли, видно, что файл занят.

удалить переоткрыть спам изменить тег редактировать

спросил 2014-12-04 07:52:36 +0400

thunderamur Gravatar thunderamur
444 70 12 38

1 Ответ

1

В скрипте необходимо указывать ПОЛНЫЕ пути до бинарей, а не просто fuser и oggenc.

Потому то скрипт исполняется в консоли руками, но чудит когда исполняется от asterisk`а, т.к. у него нет переменных окружения и оно тупо не находит путь до fuser.

ссылка удалить спам редактировать

ответил 2014-12-04 09:30:00 +0400

virus_net Gravatar virus_net flag of Russian Federation
302 1 6
http://www.mega-net.ru/

обновил 2014-12-04 09:31:05 +0400

Comments

Блин! Точно! Спасибо, проверяю!

thunderamur ( 2014-12-04 13:02:45 +0400 )редактировать

Все равно не работает. Привел скрипт к такому виду:

#!/bin/bash

set -x
exec &>>/tmp/script.log

/bin/sleep 5

if /bin/ls "$1"
then
  if /bin/fuser "$1"
  then
    exit 0
  else
    echo "convert"
    #/usr/bin/oggenc "$1" -Q -q 0 -o "$2"
    #/bin/rm "$1"
  fi
fi

exit 0

но в логе вижу следующее:

+ /bin/sleep 5
+ /bin/ls /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ /bin/fuser /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ echo convert
convert
+ exit 0
+ /bin/sleep 5
+ /bin/ls /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ /bin/fuser /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ echo convert
convert
+ exit 0
thunderamur ( 2014-12-04 13:23:23 +0400 )редактировать

т.е. сжатие запускается даже когда файл занят, для проверки запускаю из консоли и занимаю файл плеером.

+ /bin/sleep 5
+ /bin/ls /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ /bin/fuser /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav: 15654
+ exit 0

Видно, что тут норм.

thunderamur ( 2014-12-04 13:24:35 +0400 )редактировать

man fuser:

EXIT STATUS The fuser utility returns 0 on successful completion and >0 otherwise.

Файл не занят:

# fuser dump_1417759166.pcap
dump_1417759166.pcap:

А вот файл занят, тогда помимо имени файла возвращается PID

# fuser dump_1417759227.pcap
dump_1417759227.pcap: 10063w  4182w

Вы анализируете EXIT status, а не возвращенные данные, потому и попадаете все время в convert, т.к. fuser завершается с кодом 0.

virus_net ( 2014-12-05 10:10:25 +0400 )редактировать
fuser may only be able to gather partial information unless run with privileges. As a consequence, files opened by processes belonging to other users may not be listed and executables may be classified as mapped only.

Installing fuser SUID root will avoid problems associated with partial information, but may be undesirable for security and privacy reasons.

Не хватает прав под asterisk. Либо давать права asterisk, либо ставить SUID на fuser. А мб можно как-то иначе в dialplan сделать?

thunderamur ( 2014-12-05 10:59:09 +0400 )редактировать

Последний пост, ты не прав. 0 возвращается только когда ни кем не занят файл. У меня в системе так. Кроме того, я показываю проверку запуска скрипта от рута, когда он работает нормально.

thunderamur ( 2014-12-05 11:01:04 +0400 )редактировать

У меня FreeBSD, в моем мане и по факту fuser работает так. Обычно все в UNIX похожи.

А кстати почему бы не пользовать exten => h,1,...

и вызызвать ваше сжатие там

virus_net ( 2014-12-05 21:01:03 +0400 )редактировать

Изначально так и сделано. При переводе звонка получаем вызов сжатия файла и удаление файла, который ещё пишется для записи разговора с оператором 2. После завершения разговора с оператором 2 вызывается ещё раз, но отрабатывает с ошибкой, т.к. .wav уже нет. На выходе имеем 2 записи в CDR, ссылающиеся на одну неполную запись, содержащую только разговор с оператором1.

thunderamur ( 2014-12-06 08:35:42 +0400 )редактировать

Прошу прощения, что тут сказать, слЯпой я... :) разглядел exten => h....

Ктстати вот ещё одно замечание. Читаем http://www.voip-info.org/wiki/view/Asterisk+func+AUDIOHOOK_INHERIT и смотрим пример.

В нем отчетливо видно, что сначала запускается MixMonitor, а затем устанавливается AUDIOHOOKINHERIT. А теперь смотрим в ваш диалплан, а там с тоностью до наоборот. Сначала у вас устанавливается AUDIOHOOKINHERIT, а потом запускается MixMonitor.

Перестановку местами не тестил, м.б. работает и так и так, но думаю что все же стоит сделать согласно мануалу.

Можете дополнить ваш первый пост и добавить в него текущий контекст как он сейчас есть ?

На тему fuser. Судя по гуглению у вас убунту и маны отличаются. http://manpages.ubuntu.com/manpages/hardy/man1/fuser.1.html

https://www.freebsd.org/cgi/man.cgi?query=fuser

P.S. Если так "лыжи не едут", то почему бы сжатие файлов не вынести в крон ?

virus_net ( 2014-12-06 11:22:40 +0400 )редактировать

Потести в bash if вместе с fuser.

Место установки переменной в данном случае не влияет.

Крон не походит, т.к. запись хотелось бы слушать сразу, а не потом. Слушать .wav не круто, т.к. нужно веб-интерфейс править - лениво.

В общем утром пришла в голову идея... Сделал так

thunderamur ( 2014-12-09 04:56:14 +0400 )редактировать
#!/bin/bash

FIRST_SIZE=`ls -l "$1" | awk -F " " '{ print $5 }'`
sleep 5
LAST_SIZE=`ls -l "$1" | awk -F " " '{ print $5 }'`
if [ "$FIRST_SIZE" == "$LAST_SIZE" ]
then
    /usr/bin/oggenc "$1" -Q -q 0 -o "$2"
    rm "$1"
fi

exit 0
thunderamur ( 2014-12-09 04:56:55 +0400 )редактировать

fuser недоступен под asterisk, в то время как с ls проблем нет.

thunderamur ( 2014-12-09 04:57:29 +0400 )редактировать

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2014-12-04 07:52:36 +0400

Просмотрен: 266 раз

Обновлен: Dec 04 '14

Похожие вопросы:

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.