RPM : ближайшие пакеты

Для всяких исследовательских целей наколхозил скрипт, который находит пакеты, установленные “рядом” с заданным (на основе идентификаторов транзакций пакетов). Думаю, может пригодится, особенно в каких-нибудь нештатных ситуациях, хе-хе.

#!/bin/bash
if  ! -e /tmp/tdb.txt ]
then
    echo Updating list of TIDs
    rpm -qa --queryformat '%{INSTALLTID} %{name}
' | sort > /tmp/tdb.txt
fi
tid=$(rpm -q --qf "%{INSTALLTID}" $1 | sed 's/.$//')
echo Nearest
cat /tmp/tdb.txt | grep $tid

Есть идеи, что улучшить? Самому противно от перекрестных запросов к базе rpm((

“Точность” поиска можно изменить в регулярке sed`а: сколько последних знаков отбрасывать в идентификаторе.

Не совсем понял, что это даёт.

Технически, по скриптописанию, есть претензии:

#!/bin/bash

исправить на

#!/bin/sh

Сделать проверку на один (единственный) входящий аргумент.

cat /tmp/tdb.txt | grep $tid

‘cat’ не нужен. ‘grep’ непосредственно файл.

if  ! -e /tmp/tdb.txt ]

Заменить на

if  ! -f /tmp/tdb.txt ]

Обозначить “exit” по ходу скрипта.

Не совсем понял, что это даёт.

Захотелось “логичекой” группировки пакетов. Допустим что-то стало работать не так, и нужно целиком “откатить” последнее обновление/ установку пакетов. Как это сделать, учитывая, что даже в рамках этого обновления установленные пакеты имеют разные time ID? Только выборкой ближайших. Конечно, тем, кто не возится иногда с Factory или checkinstall такой функционал не очень нужен…

Критику по стилю учту, спасибо.

Можно указать количество строк выводимых до и после искомого идентификатора транзакции (верно для ключа -C NUM; см. также ключи -A NUM -B NUM команды grep), добавив ещё один аргумент командной строки.


tid=$(rpm -q --qf "%{INSTALLTID}" $1)
echo Nearest
grep -C $2 $tid /tmp/tdb.txt

AndnoVember](http://forums.opensuse.org/members/andnovember.html), количество строк до и после искомого ID заранее неизвестно. Но технически оно итак уже ограничено:
TID- это время в UTC, секунды.

Я специально не стал считать разницу между TIDами арифметически, а использовал отбрасывание знаков с конца числа sedом: это значительно упрощает скрипт, а результат (вроде бы) тот же.

Хотя, как раз если считать, то можно ограничится только одним запросом к базе пакетов. Надо подумать, как быстрее и проще

UPD
не, второй запрос
tid=$( …
не нужен вообще, достаточно grep

Был такой вариант


#!/bin/sh
rpm -qa --qf "%{installtid} %{name}
" | sort | grep -B $2 -w $1
exit 0

, но работает не очень чисто, т.е. попадаются пакеты с похожим названием “с продолжение через дефис”. Например conky и conky-cairo, conky-imlib2.


~> ./test.sh conky 10
1363368679 gsettings-desktop-schemas
1363368680 gcr-data
1363368682 gtk3-data
1363368683 libgirepository-1_0-1
1363368685 libdconf1
1363368685 ypbind
1363368686 polkit
1363368688 obex-data-server
1363368689 libtelepathy-glib0
1363368689 libupower-glib1
1363368690 conky
--
1370657380 libqt4-devel
1370657384 libedataserver-1_2-17
1370657385 evolution-data-server
1370657388 evolution-data-server-lang
1370771155 libopenal1-32bit
1370773588 libstdc++33-32bit
1370797468 kiwi-desc-oemboot
1370868340 kiwi-desc-isoboot
1370960174 cifs-utils
1370961889 polkit-doc
1371055387 conky-cairo
1371055388 conky-imlib2

AndnoVember wrote:

> 1371055387 conky-cairo
> 1371055388 conky-imlib2

Надо бы в скрипт добавить перевод даты в читаемый формат:

% date -d @1371055388
Ср июн 12 20:43:08 MSK 2013

Спасибо за советы. От подобного скрипта в итоге я хотел бы получить вот что:

  1. вывод списка вида:
    > this_script.sh

10 Марта 10:23 Установлено:
Пакет_a Пакет_b … Пакет_c

16 Марта 11:50 Установлено:
Пакет_p Пакет_q

  1. поиск:
    > this_script.sh Пакет_b

10 Марта 10:23 Установлено:
Пакет_a Пакет_b … Пакет_c

И все это сделать несложно, просто лень… нет, не лень)) но может быть тут вообще выгоднее читать /var/log/zypp/history например?

Естественно.
Все функции вашего скрипта пока вполне решаемы элементарным grep’ом этого файла. Не говоря уже о том, что можно его терзать в графическом редакторе.

Не естественно никак- это файл истории изменений, я же использовал актуальное состояние системы. Как парсить-то собираетесь installed - removed? А к примеру за пару лет какой объем будет у этого файла?

Для поиска по дате и\или имени мне вполне достаточно.
По “installed - removed” ещё ни разу не приходилось (всё-таки проблемы возникают как правило из-за обновлений), но там же отдельный столбец для этого есть, так что проблемы не вижу.


#!/bin/sh
tid=$(rpm -q --qf "%{INSTALLTID}" $1)
echo Nearest
rpm -qa --qf "%{INSTALLTID} 	%{INSTALLTID:date} 	%{NAME}
" | sort | grep -B $2 $tid
exit 0

Вот что получилось:


~> sh ./rpm_nearest.sh opera 5
Nearest
1376235750     Вс 11 авг 2013 19:42:30     libconfuse0
1376235777     Вс 11 авг 2013 19:42:57     libconfuse0-lang
1376235778     Вс 11 авг 2013 19:42:58     i3status
1376240200     Вс 11 авг 2013 20:56:40     w3m-inline-image
1376387783     Вт 13 авг 2013 13:56:23     gdbm-devel
1376418764     Вт 13 авг 2013 22:32:44     opera