Страница 1 из 1

помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-09 11:36:03
lutik
Доброго дня Уважаемым.

Помогите плз. найти багу в скрипте.
Вобщем все просто должно быть по замыслу -
1) печатаем хедер Update {name}..............................
2) если есть бекап {name}.old - удаляем, если есть {name} - делаем его {name}.old
3) wget'ом грузим новые бинарники
4) если все удачно - удаляем {name}.old, ставим овнера и права.
если неудачно - из {name}.old востанавливаем старый бинарник
5) печатаем хедер [ DONE | FAIL ]

/usr - read only.. соответственно вначале маунтим -uw в конце -ur
на постоянные
RESP=$( .............. 2>&1 ) ;
не смотреть. По заказу ничего кроме пунктов 1) и 5) на консоль выводится не должно под страхом смертной казни..

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

expr='/bin/expr' ;
cp='/bin/cp -R -p' ;
rm='/bin/rm -f' ;
echo='/bin/echo' ;
chown='/usr/sbin/chown' ;
chmod='/bin/chmod' ;
grep='/usr/bin/grep' ;
awk='/usr/bin/awk' ;
printf='/usr/bin/printf' ;
mount='/sbin/mount' ;
wget='/usr/bin/wget' ;

U_SRV='192.168.221.4' ;
U_PATH='/update/zebra' ;
U_USR='caks' ;
U_PAS='update' ;

LocalExePath='/usr/local/bin' ;
LocalLibPath='/usr/local/lib' ;
LocalEtcPath='/tmp/etc' ;

Services="  zebra
                ospfd
                hdlcd
" ;
Libraries="  libzebra.a
                  libzebra.lai
                  libzebra.so.0
                  libzebra.la
                  libospf.a
                  libospf.lai
                  libospf.so.0
                  libospf.la
" ;
R_STR="";

#------------------------------------------------------------------------------
PrintDotHeader()
{
  S_HEAD="$1" ;
  STR_LEN=${#S_HEAD} ;
  i="$STR_LEN";

  while [ "$i" -lt 50 ]
    do
      S_HEAD="$S_HEAD""." ;
      i=`${expr} $i + 1` ;
  done ;
  S_HEAD="$S_HEAD"" " ;
  ${echo} -n "$S_HEAD" ;
  return 0 ;
}
PreGetAction()
{
  File="$1" ;

  if [ -f "$File" ]; then
    if [ -f "$File.old" ]; then
      RESP=$( ${rm} "$File.old" ) ;
    fi ;
    RESP=$( ${cp} "$File" "$File.old" ) ;
    RESP=$( ${rm} "$File" ) ;
  fi ;
  return 0 ;
}
PostGetAction()
{
  File="$1" ;

  if [ -f "$File" ]; then
    RESP=$( ${chmod} 0555 "$File" ) ;
    RESP=$( ${chown} caks "$File" ) ;
    if [ -f "$File.old" ]; then
      RESP=$( ${rm} "$File.old" ) ;
    fi ;
    return 0 ;
  else
    if [ -f "$File.old" ]; then
        RESP=$( ${cp} "$File.old" "$File" ) ;
        RESP=$( ${rm} "$File.old" ) ;
    fi ;
    return 1 ;
  fi ;
}

${mount} -uw /usr ;

${echo} "UPDATING SERVICES:"
for Item in ${Services}
  do
    R_STR="[ FAIL ]" ;
    PrintDotHeader "Update $Item" ;
    PreGetAction "$LocalExePath/$Item" ;
    RESP=$( ${wget} -P"$LocalExePath" --ftp-user="$U_USR" --ftp-password="$U_PAS" --no-proxy ftp://"$U_SRV"/"$U_PATH"/"$Item" 2>&1 ) ;
    PostGetAction "$LocalExePath/$Item" ;
    if [ "$?" = "0" ]; then   R_STR="[ DONE ]" ;
    fi ;
    echo $R_STR ;
done ;

${echo} "UPDATING LIBRARIES:"
for Item in ${Libraries}
  do
    R_STR="[ FAIL ]" ;
    PrintDotHeader "Update $Item" ;
    PreGetAction "$LocalLibPath/$Item" ;
    RESP=$( ${wget} -P"$LocalLibPath" --ftp-user="$U_USR" --ftp-password="$U_PAS" --no-proxy ftp://"$U_SRV"/"$U_PATH"/"$Item" 2>&1 ) ;
    PostGetAction "$LocalLibPath/$Item" ;
    if [ "$?" = "0" ]; then     R_STR="[ DONE ]" ;
    fi ;
    echo $R_STR ;
done ;

${mount} -ur /usr ;
вот..
Теперь проблемы:
работа скрипта всегда завершается варнингом

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

softdep_waitidle: Failed to flush worklist for 0xc2558a60
после работы скрипта 'fsck /usr' выдает во множестве такое

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

UNREF FILE  I=8132  OWNER=caks MODE=100555
SIZE=202427 MTIME=Jan  1 02:09 2003
эту конструкцию для удаленного обновления бинарников использую давно и раньше проблем небыло.
небыло библиотек. Посему есть подозрение что бага происходит ввиду того что обновляемые библиотеки уже загружены в память и чето там не стыкуется.
ldconfig -r грит что либы таки загружены.. тока как их предварительно выгрузить х.з.
man ldconfig ниче не грит за выгрузку
Присоветуйте плз. куда рыть и чито курить.

Заранее спасибо.

Re: помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-09 19:32:19
Andy
Где shebang то?

Re: помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-09 19:44:09
lutik
Andy писал(а):Где shebang то?
есть оно там..

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

#!/bin/sh
это не весь скрипт.. забыл этот кусок скопировать.

У меня, кстати совсем крыша уплывает. не в библиотеках дело и не в wget'е

трабла вылазит и на таком кусочке
(выдержка из предыдущего)

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

............................
PreGetAction()
{
  File="$1" ;

  if [ -f "$File" ]; then
    if [ -f "$File.old" ]; then
      RESP=$( ${rm} "$File.old" ) ;
    fi ;
    RESP=$( ${cp} "$File" "$File.old" ) ;
    RESP=$( ${rm} "$File" ) ;
  fi ;
  return 0 ;
}
PostGetAction()
{
  File="$1" ;

  if [ -f "$File" ]; then
    RESP=$( ${chmod} 0555 "$File" ) ;
    RESP=$( ${chown} caks "$File" ) ;
    if [ -f "$File.old" ]; then
      RESP=$( ${rm} "$File.old" ) ;
    fi ;
    return 0 ;
  else
    if [ -f "$File.old" ]; then
        RESP=$( ${cp} "$File.old" "$File" ) ;
        RESP=$( ${rm} "$File.old" ) ;
    fi ;
    return 1 ;
  fi ;
}

${mount} -uw /usr ;

${echo} "UPDATING SERVICES:"
for Item in ${Services}
  do
    R_STR="[ FAIL ]" ;
    PrintDotHeader "Update $Item" ;
    PreGetAction "$LocalExePath/$Item" ;
    PostGetAction "$LocalExePath/$Item" ;
    if [ "$?" = "0" ]; then   R_STR="[ DONE ]" ;
    fi ;
    echo $R_STR ;
done ;
.............................................
${mount} -ur /usr ;
тоесть тупо скопировали файл туда-обратно и все..

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

UNREF FILE  I=8132  OWNER=caks MODE=100555
SIZE=202427 MTIME=Jan  1 02:09 2003
чудеса какието..
может софтапдейт виноват??

Re: помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-09 20:29:12
Alex Keda
писал бы ты попроще....
команды - командами, и т.п. - без извратов вида (cp) - а то даже вкуривать нехочется.
тока час времень убьешь.
красиво написанный скрипт читается влёт. твой - нет.

Re: помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-10 14:20:22
Гость
[off]ндя, без комментариев...[/off]

lutik, попробуй добавить sleep(1) и sync(1) перед mount -ur ..., т.е. sleep 20 && sync && sleep 5 && $mount -ur /usr (фигурные скобки тя не спасут от пробелов, а точка-запятая в большинстве случаев заменяется "новой строкой").

Кста...

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

RESP=$( ${cp} "$File" "$File.old" ) ;
RESP=$( ${rm} "$File" ) ;
это вообще что? Если отлов exit code в переменную, то надо добавить echo $? в конец (перед последней скобкой).Если же вывод команды, то он будет сплющен в одну строку.

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

i=`${expr} $i + 1` ;
Сколько раз повторять, что чем меньше внешних команд, тем портируемей скрипт будет. Сия конструкция с легкостью заменяется на i=$((i+1)) или i=`let i + 1`

ps: чем rsync или lftp -c 'mirror -n ... не угодил?

Re: помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-10 14:21:31
Гость
s/sync(1)/sync(8)/

Re: помогите найти баг в скрипте обновления бинарников

Добавлено: 2007-11-12 11:45:17
lutik
отвечаем по порядку
lissyara писал(а):писал бы ты попроще....
как смог после часового знакомства с скриптингом.
мне, балин, проще было-бы на C наваять алгоритм..
остановило токма то что это девелоперское решение.. заказчику не уйдет.
Гость писал(а):Сколько раз повторять, что чем меньше внешних команд, тем портируемей скрипт будет. Сия конструкция с легкостью заменяется на i=$((i+1)) или i=`let i + 1`
ну.. собсно.. все та же тема про час. в первой попавшейся книженке по sh нашел раздел с арифметикой...
Гость писал(а): Кста...

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

RESP=$( ${cp} "$File" "$File.old" ) ;
RESP=$( ${rm} "$File" ) ;
это вообще что?
дык просто все.. переименовываем старый файл и удаляем его
я ж писал что

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

RESP=$( ........... ) ;
это просто чтобы ничего на консоль ни при каких ситуациях не вываливалось.
Гость писал(а): чем rsync или lftp -c 'mirror -n ... не угодил?
а х.з. чем не угодил. был у мну пример написаный для wget вот из него и состряпал..

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

По поводу того что скрипт такой использую давно - приврал конечно.
в том который давно ваще 2-е строчки было - удалить старый файл, закачать новый


резюме:
учюсь...
проблема решилась убиранием софтапдейта..
ваще говоря примерзенейшая опция для систем с накопителем на флешах.
один раз при создании образа системы какая-то зараза поставила и мучаемся уже год.
а все равно руки не доходят в svn'е подправить имидж