Знатокам bash/sh`а 2. (Задачка.)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
demongloom
Сообщения: 454
Статус: Добрый Демон

Знатокам bash/sh`а 2.

Сообщение demongloom »

Буду премного благодарен если кто то напишет хотя бы куды копать для решения задачи. Сложность еще в том что задача должна быть решена на сш.

Итак имеем лог файл оставшийся от rpmbuild --rebuild packetname.src.rpm > logfile.log
По кривости девелоперов сей файл не собрался из за неправильного .spec файла.
Итак задача.
Дано:
срк.рпм пакет. Он содержит патчи, архив с сурсами и файл .spec, который используется для сборки пакета.
лог файл неудачной сборки. Он содержит в себе к примеру следущие строки (беру из лога):

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

+ rm -fr /var/tmp/GConf2-2.8.1-root
+ make install DESTDIR=/var/tmp/GConf2-2.8.1-root
+ chmod 755 /var/tmp/GConf2-2.8.1-root//etc/gconf/gconf.xml.defaults
+ chmod 755 /var/tmp/GConf2-2.8.1-root//etc/gconf/gconf.xml.mandatory
+ rm -f /var/tmp/GConf2-2.8.1-root//usr/lib/GConf/2/libgconfbackend-xml.a
+ rm -f /var/tmp/GConf2-2.8.1-root//usr/lib/GConf/2/libgconfbackend-oldxml.a
+ rm -f /var/tmp/GConf2-2.8.1-root//usr/lib/libgconf-2.la
+ rm -f '/var/tmp/GConf2-2.8.1-root//usr/lib/GConf/2/*.la'
+ /usr/lib/rpm/redhat/find-lang.sh /var/tmp/GConf2-2.8.1-root GConf2
+ /usr/lib/rpm/find-debuginfo.sh /usr/src/redhat/BUILD/GConf-2.8.1
1795 blocks
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
error: File not found by glob: /var/tmp/GConf2-2.8.1-root/usr/lib/GConf/2/*.so
error: File not found: /var/tmp/GConf2-2.8.1-root/usr/lib/GConf
error: File not found: /var/tmp/GConf2-2.8.1-root/usr/lib/GConf/2
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd GConf-2.8.1
+ DOCDIR=/var/tmp/GConf2-2.8.1-root/usr/share/doc/GConf2-2.8.1
+ export DOCDIR
+ rm -rf /var/tmp/GConf2-2.8.1-root/usr/share/doc/GConf2-2.8.1
+ /bin/mkdir -p /var/tmp/GConf2-2.8.1-root/usr/share/doc/GConf2-2.8.1
+ cp -pr COPYING ChangeLog NEWS README /var/tmp/GConf2-2.8.1-root/usr/share/doc/GConf2-2.8.1
+ exit 0
    File not found by glob: /var/tmp/GConf2-2.8.1-root/usr/lib/GConf/2/*.so
    File not found: /var/tmp/GConf2-2.8.1-root/usr/lib/GConf
    File not found: /var/tmp/GConf2-2.8.1-root/usr/lib/GConf/2


Как видите еррор весьма понятен. Так что перехватить имена файлов которые стали причиной легко.

Теперь же глянем в .spec файл.

%postun -p /sbin/ldconfig

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

%files -f %{name}.lang
%defattr(-, root, root)
%doc COPYING ChangeLog NEWS README
%config %{_sysconfdir}/gconf/2/path
%dir %{_sysconfdir}/gconf/2
%dir %{_sysconfdir}/gconf/gconf.xml.defaults
%dir %{_sysconfdir}/gconf/gconf.xml.mandatory
%{_bindir}/*
%{_libexecdir}/*
%{_libdir}/*.so.*
%{_libdir}/GConf/2/*.so <!>
%{_datadir}/sgml
%{_mandir}/man1/*
%dir %{_libdir}/GConf <!>
%dir %{_libdir}/GConf/2 <!>

%files devel
%defattr(-, root, root)
%{_libdir}/*.a
%{_libdir}/*.so
%{_includedir}/gconf
%{_datadir}/aclocal/*.m4
%{_datadir}/gtk-doc
%{_libdir}/pkgconfig/*

%changelog


Строки отмеченные <!> и стали причиной несборки пакета. Увы в оригинальном спек файле их нет :D .

Так вот задача такова.
1. Обнаружить и извлечь из логфайла пути/файлы которые не были найдены.
2. Каким то образом преобразовать что бы получить строки в .спек файле которые нужно закоменнтировать.
Если жизнь твоя порвется, тебе новую сошьют.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: Знатокам bash/sh`а 2.

Сообщение sdk »

grep и sed тебе помогут.
Спать ложусь, поэтому может завтра попробую сваять :).
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
demongloom
Сообщения: 454
Статус: Добрый Демон

Re: Знатокам bash/sh`а 2.

Сообщение demongloom »

grep и sed знаю что помогут. но я только чуть чуть умею грепом пользоваться.
Если жизнь твоя порвется, тебе новую сошьют.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: Знатокам bash/sh`а 2.

Сообщение sdk »

Не шибко просто вышло, но вот скрипт:

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

logfile=test
specfile=spec
libdir=/usr/lib

failed_files=`grep "^error.*$libdir" $logfile | sed "s#^error.*\($libdir.*\)#\1#"`
echo Failed files: $failed_files

# формируем команду
for i in $failed_files; do
   #убираем libdir из пути
   i=`echo $i | sed "s#$libdir##"`
   command_to_exec="$command_to_exec | sed 's#\\(.*$i\\)#\\#\\1#'";
done

command_to_exec="cat $specfile $command_to_exec"

echo "OK! I will exec this now: $command_to_exec"
echo "Here is the result"
echo

eval $command_to_exec


В переменной logfile задаешь файл с логом, в переменной specfile -- со спеком.
Одна проблема: libdir надо задавать ручками. Если ты мне скажешь, как заставить rpm сказать, чему равна его переменная %libdir, починю и сделаю все нормально :).
Отладочную информацию я не убрал, так что скрипт "шумит" :).

У меня вроде заработало. Во всяком случае на твоем примере :).
Попробуй, жду ответа :).

ЗЫ. Результат выдается на stdout, так что его надо ручками перенаправить в файл при желании ;).
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
demongloom
Сообщения: 454
Статус: Добрый Демон

Re: Знатокам bash/sh`а 2.

Сообщение demongloom »

Спасибо.

libdir то ли в спеке, то ли в переменных рпм. но их можно получить через некую команду к рпмбуилду. буду в линуксе посмотрю и напишу.
Если жизнь твоя порвется, тебе новую сошьют.
Спасибо сказали: