Страница 4 из 4
Re: AGI: write() returned error: Broken pipe
Добавлено: 16 май 2016, 19:06
Vlad1983
хотите морочьтесь дальше - дело ваше
при считывании результата каждой команды должен быть цикл while read..., а не единичный read
пример (вынесено в функу checkresults)
Re: AGI: write() returned error: Broken pipe
Добавлено: 16 май 2016, 21:20
booBot
Vlad1983 писал(а):при считывании результата каждой команды должен быть цикл while read..., а не единичный read
пример (вынесено в функу checkresults)
Огромное спасибо!
Я действительно хочу разобраться и сделать всё правильно.
То, как я сделал - взято прямо из книжки (гл.21), я и не подозревал, что там может быть написано "весьма приблизительно".
Я должен использовать из этого примера два куска:
- в начале сценария прочитать все передаваемые в сценарий переменные (что уже делается, но этот пример выглядит "солиднее" ):
Код: Выделить всё
declare -a array
while read -e ARG && [ "$ARG" ] ; do
array=(` echo $ARG | sed -e 's/://'`)
export ${array[0]}=${array[1]}
done
- после передачи в 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", правильно?
Re: AGI: write() returned error: Broken pipe
Добавлено: 17 май 2016, 00:42
booBot
Спасибо!
Цикл чтения ввода, ожидающий ответа "200 ", убрал ошибку
broken pipe, попутно выяснилось, что команда
SET VARIABLE VAR_NAME VAR_VALUE должна заканчиваться символом
\n.
Видимо всё работало без
\n только потому, что канал обрывался, имитируя этот управляющий символ.
Добавление
\n без цикла ожидания ответа не устраняло ошибку
broken pipe.
Код: Выделить всё
#!/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
Re: AGI: write() returned error: Broken pipe
Добавлено: 17 май 2016, 07:06
Vlad1983
booBot писал(а):То, как я сделал - взято прямо из книжки (гл.21), я и не подозревал, что там может быть написано "весьма приблизительно"
книги пишут люди далекие от практики применения
их цель подтолкнуть в нужном направлении
как говорил мой куратор в ВУЗе
проф. Мякин Владислав Николаевич писал(а):Ни в школе, ни в ВУЗе, ни в книгах, ни где-то ещё вам не дадут готовых для применения знаний. Они лишь учат учиться.
Вы сами должны переварить весь ворох информации, подаваемой там или дополнительных источников, запомнить алгоритм или варианты подхода к решению каких-то абстрактных задач. И затем научиться применять в реальных задачах. Без практики всё новое забывается через несколько недель.
Re: AGI: write() returned error: Broken pipe
Добавлено: 17 май 2016, 08:42
april22
booBot писал(а):v11 у меня валится при первом же звонке через него, но консоль его вполне работоспособна (пока нет звонков).
а я думал я один такой , с 11-м .
не поделитесь chan_dongle для 1.8?
Re: AGI: write() returned error: Broken pipe
Добавлено: 17 май 2016, 11:09
booBot
april22 писал(а):не поделитесь chan_dongle для 1.8?
Я бы с радостью - но пока ещё не сделал, и если сделаю для ramips/rt305x (chip-set в Asus WL-330N3G), то смогу помочь лишь для платформ, присутствующих в проекте OpenWrt.
Vlad1983 писал(а):booBot писал(а):То, как я сделал - взято прямо из книжки (гл.21), я и не подозревал, что там может быть написано "весьма приблизительно"
книги пишут люди далекие от практики применения
их цель подтолкнуть в нужном направлении
И большое им спасибо, но предупредить об особенностях они вполне могли бы.
Претензий к ним не было бы, если бы книга называлась "астериск для чайников", но она называется
Definitive Guide, и я сравниваю её с другими книгами O'Reily, которые ДЕЙСТВИТЕЛЬНО definitive.
Re: AGI: write() returned error: Broken pipe
Добавлено: 18 май 2016, 11:20
booBot
Чтобы закрыть вопрос окончательно - проверил, можно и команду echo использовать, главное - не ставить ей флаг -n, так как управляющий символ \n в конце передаваемой строки необходим.
За отсутствие ошибки broken pipe ответственен цикл чтения отклика в исполняемом сценарии.
И, наверное, перед вызовом сценария имеет смысл установить AGISIGHUP=yes, чтобы не оставлять сценарий-зомби, если пользователь прекратит вызов раньше, чем сценарий отработает.
Всем огромное спасибо!