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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
lutik
мл. сержант
Сообщения: 75
Зарегистрирован: 2007-04-24 13:56:23
Откуда: Odessa

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

Непрочитанное сообщение lutik » 2007-11-09 11:36:03

Доброго дня Уважаемым.

Помогите плз. найти багу в скрипте.
Вобщем все просто должно быть по замыслу -
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 ниче не грит за выгрузку
Присоветуйте плз. куда рыть и чито курить.

Заранее спасибо.
Однако...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2007-11-09 19:32:19

Где shebang то?
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

lutik
мл. сержант
Сообщения: 75
Зарегистрирован: 2007-04-24 13:56:23
Откуда: Odessa

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

Непрочитанное сообщение lutik » 2007-11-09 19:44:09

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
чудеса какието..
может софтапдейт виноват??
Однако...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2007-11-09 20:29:12

писал бы ты попроще....
команды - командами, и т.п. - без извратов вида (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 ... не угодил?


lutik
мл. сержант
Сообщения: 75
Зарегистрирован: 2007-04-24 13:56:23
Откуда: Odessa

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

Непрочитанное сообщение lutik » 2007-11-12 11:45:17

отвечаем по порядку
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'е подправить имидж
Однако...