VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

[РЕШЕНО] AGI: write() returned error: Broken pipe

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: AGI: write() returned error: Broken pipe

Сообщение Vlad1983 »

хотите морочьтесь дальше - дело ваше
при считывании результата каждой команды должен быть цикл while read..., а не единичный read
пример (вынесено в функу checkresults)
ЛС: @rostel
booBot
Сообщения: 40
Зарегистрирован: 09 май 2016, 16:56

Re: AGI: write() returned error: Broken pipe

Сообщение booBot »

Vlad1983 писал(а):при считывании результата каждой команды должен быть цикл while read..., а не единичный read
пример (вынесено в функу checkresults)
Огромное спасибо!

Я действительно хочу разобраться и сделать всё правильно.
То, как я сделал - взято прямо из книжки (гл.21), я и не подозревал, что там может быть написано "весьма приблизительно".
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: как я это понял
Я должен использовать из этого примера два куска:
  1. в начале сценария прочитать все передаваемые в сценарий переменные (что уже делается, но этот пример выглядит "солиднее" :) ):

    Код: Выделить всё

    declare -a array
    while read -e ARG && [ "$ARG" ] ; do
    	array=(` echo $ARG | sed -e 's/://'`)
    	export ${array[0]}=${array[1]}
    done
    
  2. после передачи в AGI значения своей переменной OP - дождаться подтверждения (RESPONSE 200 result=0):

    Код: Выделить всё

    checkresults() {
    	while read line
    	do
    	case ${line:0:4} in
    	"200 " ) echo $line >&2
    	         return;;
    	"510 " ) echo $line >&2
    	         return;;	
    	"520 " ) echo $line >&2
    	         return;;
    	*      ) echo $line >&2;;	#keep on reading those Invlid command
    					#command syntax until "520 End ..."
    	esac
    	done
    
И, как я понял, все echo ... >&2 будут видны в консоли при "-rvvv", правильно?
asterisk v1.8.32.3 под OpenWrt CC 15.05.1 на Asus WL-330N3G + Huawei E3131s-2 + 8GB miniSDHC в считывателе модема (для ПО, включен pivot overlay).
booBot
Сообщения: 40
Зарегистрирован: 09 май 2016, 16:56

Re: AGI: write() returned error: Broken pipe

Сообщение booBot »

Спасибо!

Цикл чтения ввода, ожидающий ответа "200 ", убрал ошибку broken pipe, попутно выяснилось, что команда SET VARIABLE VAR_NAME VAR_VALUE должна заканчиваться символом \n.
Видимо всё работало без \n только потому, что канал обрывался, имитируя этот управляющий символ.
:)
Добавление \n без цикла ожидания ответа не устраняло ошибку broken pipe.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: сделано так

Код: Выделить всё

#!/bin/ash
# MNP checking script.
# AGI expects it to be in /var/lib/asterisk/agi-bin/
# The script accepts a 10-digit number
# The OP variable is set to YYYY[:ZZZZ] string,
# where YYYY is the original serving operator code,
# and ZZZZ is a "moved to" operator code if the subscriber
# has done MNP. If no MNP move was done - only YYYY is returned.

USERAGENT='asterisk v1.8.32.3'

while read VAR && [ -n ${VAR} ] ; do : ; done

printf "SET VARIABLE OP $(/usr/bin/wget 2>&1 -O - -q -T 5 -U "$USERAGENT" "http://rosreestr.subnets.ru/index.php?get=num&num=$1" |/bin/grep -o 'operatorID: [0-9]\+' |/bin/sed 's/operatorID: //' |/bin/sed 'N;s/\n/:/')\n"

while read line                      
 do                                   
  case ${line:0:4} in
  "200 " ) return;;
  *      ) ;; # keep on reading
  esac                                       
 done                                       

exit 0
asterisk v1.8.32.3 под OpenWrt CC 15.05.1 на Asus WL-330N3G + Huawei E3131s-2 + 8GB miniSDHC в считывателе модема (для ПО, включен pivot overlay).
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: AGI: write() returned error: Broken pipe

Сообщение Vlad1983 »

booBot писал(а):То, как я сделал - взято прямо из книжки (гл.21), я и не подозревал, что там может быть написано "весьма приблизительно"
книги пишут люди далекие от практики применения
их цель подтолкнуть в нужном направлении

как говорил мой куратор в ВУЗе
проф. Мякин Владислав Николаевич писал(а):Ни в школе, ни в ВУЗе, ни в книгах, ни где-то ещё вам не дадут готовых для применения знаний. Они лишь учат учиться.
Вы сами должны переварить весь ворох информации, подаваемой там или дополнительных источников, запомнить алгоритм или варианты подхода к решению каких-то абстрактных задач. И затем научиться применять в реальных задачах. Без практики всё новое забывается через несколько недель.
ЛС: @rostel
april22
Сообщения: 2187
Зарегистрирован: 09 июл 2012, 09:47

Re: AGI: write() returned error: Broken pipe

Сообщение april22 »

booBot писал(а):v11 у меня валится при первом же звонке через него, но консоль его вполне работоспособна (пока нет звонков).
а я думал я один такой , с 11-м .

не поделитесь chan_dongle для 1.8?
Своими вопросами , вы загоняете меня в ГУГЛЬ.
booBot
Сообщения: 40
Зарегистрирован: 09 май 2016, 16:56

Re: AGI: write() returned error: Broken pipe

Сообщение booBot »

april22 писал(а):не поделитесь chan_dongle для 1.8?
Я бы с радостью - но пока ещё не сделал, и если сделаю для ramips/rt305x (chip-set в Asus WL-330N3G), то смогу помочь лишь для платформ, присутствующих в проекте OpenWrt.
Vlad1983 писал(а):
booBot писал(а):То, как я сделал - взято прямо из книжки (гл.21), я и не подозревал, что там может быть написано "весьма приблизительно"
книги пишут люди далекие от практики применения
их цель подтолкнуть в нужном направлении
И большое им спасибо, но предупредить об особенностях они вполне могли бы.
Претензий к ним не было бы, если бы книга называлась "астериск для чайников", но она называется Definitive Guide, и я сравниваю её с другими книгами O'Reily, которые ДЕЙСТВИТЕЛЬНО definitive.
asterisk v1.8.32.3 под OpenWrt CC 15.05.1 на Asus WL-330N3G + Huawei E3131s-2 + 8GB miniSDHC в считывателе модема (для ПО, включен pivot overlay).
booBot
Сообщения: 40
Зарегистрирован: 09 май 2016, 16:56

Re: AGI: write() returned error: Broken pipe

Сообщение booBot »

Чтобы закрыть вопрос окончательно - проверил, можно и команду echo использовать, главное - не ставить ей флаг -n, так как управляющий символ \n в конце передаваемой строки необходим.
За отсутствие ошибки broken pipe ответственен цикл чтения отклика в исполняемом сценарии.

И, наверное, перед вызовом сценария имеет смысл установить AGISIGHUP=yes, чтобы не оставлять сценарий-зомби, если пользователь прекратит вызов раньше, чем сценарий отработает.

Всем огромное спасибо!
asterisk v1.8.32.3 под OpenWrt CC 15.05.1 на Asus WL-330N3G + Huawei E3131s-2 + 8GB miniSDHC в считывателе модема (для ПО, включен pivot overlay).
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH