Инструменты пользователя

Инструменты сайта


// Проверка целостности AUR пакетов после обновления

Время от времени, после обновления основной системы, обновляются библиотеки и некоторые пакеты, собранные вручную ломаются. Ниже представлена небольшая задумка автоматической проверки таких пакетов после обновления.

Для начала сделаем скрипт, который будет пробегаться по пакетам, которых нет в репозиториях и применять к ним некоторый набор действий, который позволит понять, что пакет поломан.

Сам критерий простой: ldd на ELF файле и удостовериться, что нет вхождений 'not found'.

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

Итак, для начала скрипт проверки:

aur-check
#!/usr/bin/env bash
 
set -e
export LANG=C
 
packages=$(pacman -Qmq)
orphaned=""
broken=""
 
check_orphaned() {
    list1=$(mktemp -p /tmp -u XXXXXXXX)
    list2=$(mktemp -p /tmp -u XXXXXXXX)
    trap "rm -f $list1 $list2" RETURN QUIT
    pacman -Qmq > $list1
    cower -iq --timeout=30 -- $packages | grep '^Name' | awk '{print $3}' > $list2
    orphaned=$(diff -u $list1 $list2 | grep '^-' | grep -v '^---' | sed 's|^-||')
}
 
# Check for orphaned packages
check_orphaned
 
# Check integrity
for pkg in $packages
do
    echo "    => $pkg"
    # Basic check for package breaks, mostly call ldd for libs and binaries
    files=$(pacman -Qlq $pkg)
    for file in files
    do
        # Check only executables and skip directories
        if [ -x "$file" ]; then
            is_elf=$(file $file | grep ELF)
            if [ -n "$is_elf" ]; then
                # Apply check
                is_broken=$(ldd "$file" 2>&1 | grep 'not found')
                if [ -n "$is_broken" ]; then
                    broken="$broken $pkg"
                fi
            fi
        fi
    done
done
 
if [ -n "$orphaned" ]; then
    echo "Orphaned packages:"
    for pkg in $orphaned
    do
        echo "    $pkg"
    done
fi
 
if [ -n "$broken" ]; then
    echo "Broken packages:"
    for pkg in $broken
    do
        echo "    $pkg"
    done
fi

Поместите его в /usr/local/bin/.

Будет определённое неудобство при недоступности сети, при проверке брошенных пакетов (запрос к AUR). Я думаю исправить это в будущем.

А теперь HOOK для libaplm:

99-aur.hook
[Trigger]
Operation = Upgrade
Type = Package
Target = *
 
[Action]
Description = "Check non-repo packages integrity"
Depends = pacaur
When = PostTransaction
Exec = /usr/local/bin/aur-check

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

Сам HOOK нужно положить в /usr/share/libalpm/hooks/.

Комментарии