Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe
allgemeine Kategorie => Tutorials => Thema von: Andreas am 17. Oktober 2023, 06:13:35

Titel: checkrebuild
Beitrag von: Andreas am 17. Oktober 2023, 06:13:35

Ich hatte es euch schon mal auf einem unserer Treffen mitgeteilt: Wenn wichtige Bibliotheken sich verändern (z.B. bei einem Update) zieht das öfter mit sich, dass alle Pakete, die auf der "alten Version" aufbauen, nicht mehr funktionieren. Sie sind deshalb nicht fehlerhaft - sie müssen nur "neu gebaut werden" mit der neuen Bibliothek als Basis. Bei Paketen aus den Standard-Repos übernimmt das der Paketbetreuer - bei Paketen aus den AURs muss man das selbst machen. Um zu überprüfen ob auf dem eigenen System Pakete betroffen sind gibt es das Tool rebuild-detector. Das kann man mittels yay -S rebuild-detector installieren (es ist selbst auch in den AURs). Einmal installiert ruft man es mit sudo checkrebuild auf. Es listet alle Pakete auf die Aufrufe zu Bibliotheken enthalten die ins Leere laufen. Die aufgelisteten Pakete sind also deutliche Kandidaten für Fehlfunktionen - müssen es aber nicht sein. Wenn man diese Pakete neu baut (und man wirklich Quelldateien vor sich hatte) ist das Problem gelöst. Neu gebaut werden Pakete mit dem Befehl yay -S <Paketname>. Nach einem Neubau werden sie auf die aktuell vorhandenen Bibliotheken gelinkt und das Problem ist weg. Das funktioniert natürlich nicht wenn man von den Paketen keine Quelldateien vor sich hatte sondern fertig gebaute Binaries (z.B. aus Debian-Paketen etc.) Manchmal erkennt man das am Paketnamen: er sieht dann öfter so aus: Paketname-bin. Hier ist ein Neubau sinnfrei und das Paket wird auch nach einem Neubau mit checkrebuild als fehlerhaft angezeigt werden.

Bei einem sehr umfangreichen System hat man immer einige Kandidaten bei denen checkrebuild anschlägt und ein Neubau nichts bringt, und manchmal hat man dort auch viele Pakete die neu gebaut werden müssen. Das ging bislang nur "per Hand" - für jedes Paket was aufgelistet wurde. Einen Automaten dafür gab es nicht. Aso habe ich mir selbst einen gedengelt und möchte euch diesen nicht vorenthalten. Es ist ein Bash-Script das man in /usr/local/bin/ legt mit dem Namen aurrebuild. (und ein zweites Script mit gleichem Namen in /usr/local/sbin/). Das ist dann auch gleichzeitig der Befehl zum Aufruf. Und dann gibt es noch einen zweiten Teil. Ich habe den Befehl checkrebuild erweitert. Um das "sauber" zu tun (also so dass nach einem Update von checkrebuild meine Änderungen nicht "weg" sind) habe ich ein zweites Script geschrieben das man in /usr/local/sbin/ legt. Beim Aufruf von Kommandozeilenbefehlen werden nämlich die Ordner /usr/local/sbin und /usr/local/bin zuerst durchsucht - und damit mein Script und nicht der "Originalbefehl" gefunden und ausgeführt. Jetzt zur Nutzung:

Vorbereitung:
Zunächst prüft man manuell mittels sudo /usr/bin/checkrebuild welche Pakete aktuell betroffen sind. Diese Liste packt man in einen Texteditor. Alle Pakete mit einem "-bin" drin kann man getrost vergessen - dort kann man mit einem Neubau nichts bewirken. Diese Pakete werden "false-positiv" gemeldet. Die verbliebenen versucht man mittels yay -S <Paketname> neu zu bauen. Das wird bei einigen funktionieren - bei einigen jedoch nicht. Die, bei denen das funktioniert, kann man wegstreichen. Alle anderen bleiben auf der Liste. Wenn man die Liste nun komplett abgearbeitet hat baut man mit aurrebuild --update-exceptions zunächst die Ausnahmeliste auf. Diese legt mein Script als Textdatei /etc/rebuildexclude an. Wenn das Script fertig ist ruft man es mit aurrebuild erneut auf. Mein Script versucht nun alle Pakete neu zu bauen die nicht in der Ausnahmedatei sind. Danach zeigt es an bei wie vielen das erfolgreich war. Ggf. muss man danach bei einem oder zwei Paketen nochmal einen manuellen Neubau versuchen (z.B. in einer chroot-Umgebung) - und manchmal muss man die Ausnahmeliste neu bauen (weil ein neuer Kandidat bei dem ein Neubau nichts nützt dazugekommen ist).

Hier nun die Scripte:

/usr/local/sbin/aurrebuild:
Code:
#! /bin/bash

sudo --user=#1000 /usr/local/bin/aurrebuild

/usr/local/bin/checkrebuild:
Code:
#!/bin/bash

/usr/bin/checkrebuild | sed 's/foreign\t//' | diff /etc/rebuildexclude -

/usr/local/bin/aurrebuild:
Code:
#!/bin/bash

# Might as well ask for password up-front, right?
sudo -v

if [ ! -f /etc/rebuildexclude ];then
sudo touch /etc/rebuildexclude
fi

/usr/bin/checkrebuild | grep foreign | cut -f 2 > /tmp/2rebuild1

if [ $1 == "--update-exceptions" ]; then
sudo mv /tmp/2rebuild1 /etc/rebuildexclude
echo "exception file updated."
exit 0
fi

while read -r line;
do
if [ $(grep -E "^$line$" /etc/rebuildexclude) == "" ];then
echo $line >> /tmp/2rebuild
fi
done < /tmp/2rebuild1
rm /tmp/2rebuild1

if [ ! -f /tmp/2rebuild ];then
echo "nothing to do..."
exit 0
fi

BEF=$(wc -l /tmp/2rebuild | cut -d " " -f 1)
echo "$BEF packages need possibly rebuild - starting"

while read -r line;
do
if [ $(grep -E "^$line$" /etc/rebuildexclude) == "" ];then
echo "trying to rebuild $line..."
yay --noconfirm --nocleanmenu --nodiffmenu --noeditmenu --sudoloop -S $line
fi
done < /tmp/2rebuild

truncate -s 0 /tmp/2rebuild

/usr/bin/checkrebuild | grep foreign | cut -f 2 > /tmp/2rebuild1
while read -r line;
do
if [ $(grep -E "^$line$" /etc/rebuildexclude) == "" ];then
echo $line >> /tmp/2rebuild
fi
done < /tmp/2rebuild1
rm /tmp/2rebuild1

echo "before: $BEF"
echo "after: $(wc -l /tmp/2rebuild | cut -d ' ' -f 1)"

rm /tmp/2rebuild
Mir hat es meine Systempflege sehr vereinfacht! Bei meinem System waren stets 10...20 Pakete bei denen ein Neubau nicht geholfen hat, und bei manchen Updates mussten 10...20 Pakete manuell neu gebaut werden, was schon recht nervig und zeitaufwändig war... Zusätzlich wird jetzt bei einem Aufruf von checkrebuild die neu gebaute Ausnahmeliste mit berücksichtigt und es werden nur die Pakete angezeigt bei denen ein Neubau wirklich erfolgsversprechend ist. Will man die "alte Ausgabe" haben muss man den Befehl mit /usr/bin/checkrebuild aufrufen.

Da Bash-Scripte nichts anderes sind als eine Textdatei mit Bash-Befehlen drin (deswegen muss man den oben aufgeführten Dateien dann auch Ausführungsrechte geben - bei denen in ...sbin nur für root, bei denen in bin... für "alle"). Man kann ihre Funktion selbst nachvollziehen und sie ggf. verbessern / anpassen. Und wie man einen vorhandenen Befehl durch einen anderen ersetzt (was der Nutzer nicht sofort erkennt) habt ihr nun auch gesehen. Also wieder viel Lernpotenzial in diesem Beitrag - wie auch in den vielen von Sebastian...

LG
Andreas

Titel: Re:checkrebuild
Beitrag von: Sebastian am 17. Oktober 2023, 10:01:21

Vielen Dank Andreas, für den ein oder anderen wird das mit Sicherheit eine Erleichterung sein. :)

Btw:
Zitat:
Das kann man mittels yay -S rebuild-detector installieren (es ist selbst auch in den AURs)


Bei mir ist es im extra Repository:


Code:

❯ pacman -Ss rebuild-detector
extra/rebuild-detector 4.4.2-1 [Installiert]
Detects which packages need to be rebuilt


Fun Fakt aus dem Handbuch: ;D
Zitat:
Installation
pacman -S rebuild-detector


Du bist echt zu viel in dem AUR unterwegs oder ich zu wenig ;D

Edit:

PS:

Eigentlich müsste beim Upgraden von Paketen auch eine Meldung kommen das Software neu gebaut werden müsste.

man checkrebuild
Zitat:
Pacman hook
A pacman hook is included in the distribution as well. For performance reasons, the ldd check is only executed against direct dependencies
of the packages that are being updated in this pacman transaction.


Habe bei mir nachgeschaut in meine System befindet sich der Hook unter

/usr/share/libalpm/hooks/rebuild-detector.hook

Titel: suletuxe.cheat
Beitrag von: Sebastian am 17. Oktober 2023, 11:11:50

Habe für dein tolles Skript auch gleich mal einen Spickzettel im navi cheat Format angelegt. Damit die Suletuxe einen schnell mal in ihrem Terminal deinen Befehl nachschlagen können. ;)

https://www.suletuxe.de/forum/index.php?board=11;action=display;threadid=816;start=msg18399#msg18399

Titel: PKGBUILD für aurrebuild
Beitrag von: Sebastian am 17. Oktober 2023, 18:20:18

Habe mal für dein aurrebuild Skript ein PKGBUILD gemacht, damit man dein Script über pacman verwalten kann. Wenn die Dateien:

/usr/local/sbin/aurrebuild -> aurrebuild_sbin
/usr/local/bin/checkrebuild -> checkrebuild
/usr/local/bin/aurrebuild -> aurrebuld_bin

Unter dem angegebenen Namen im selben Verzeichnis wie das PKGBUILD liegen, dann lässt sich das bauen. Musste die Dateien vorher umbenennen, da aurrebuild doppelt vorkommt.


Code:

# Maintainer: Your Name <youremail@domain.com>
pkgname=aurrebuild
pkgver=1
pkgrel=1
pkgdesc="Verlinkt Software gegen Biblioteken mit Ausnahmen"
arch=(any)
url="https://www.suletuxe.de/forum/index.php?board=11;action=display;threadid=818"
license=('unknown')
depends=(rebuild-detector)
backup=(etc/rebuildexclude)
source=("aurrebuild_bin"
"checkrebuild"
"aurrebuild_sbin")
sha256sums=('SKIP'
'SKIP'
'SKIP')

package() {
install -m 755 -d "${pkgdir}"/usr/local/{,s}bin
install -m 775 "aurrebuild_bin" "${pkgdir}/usr/local/bin/aurrebuild"
install -m 775 "checkrebuild" "${pkgdir}/usr/local/bin/checkrebuild"
install -m 774 "aurrebuild_sbin" "${pkgdir}/usr/local/sbin/aurrebuild"
}

Titel: Re:checkrebuild
Beitrag von: Andreas am 17. Oktober 2023, 18:21:35

Das mag daran liegen, dass ich viele dieser Progis schon lange auf meinem System habe. Zuerst waren sie nur in den AURs, irgendwann sind sie dann wegen großer Beliebtheit in die Standard-Repos gewandert. Das entgeht mir in der Tat so gut wie immer...

LG
Andreas

Titel: checkrebuild bash Autocomplete
Beitrag von: Sebastian am 15. November 2023, 18:13:09

Hallo Andreas,

Ich habe mich mit der Bash Autocomplete Funktion etwas näher befasst (Auslöser ist die Euphorie rund um fzf) und als Übung eine kleine Autocomplete Funktion für dein aurrebuild Skript geschrieben. Da dies nur eine Option hat dachte ich mir eigenet sich das ganz gut zum üben ;D

Nunja was soll ich sagen hier ist die kleine Funktion.


Code:

#!/usr/bin/env bash

_aurrebuild() {
local current_word="${COMP_WORDS[COMP_CWORD]}"
local options=(--update-exceptions)
((COMP_CWORD == 1)) &&
COMPREPLY=($(compgen -W "${options
  • }" -- "${current_word}"))
    }

    complete -F _aurrebuild aurrebuild


  • Um diese zu verwenden entweder manuell sourcen oder in eine Datei speichern unter einer dieser Pfade:


    Code:

    /etc/bash_completion.d/ # Systemweit für alle User
    $XDG_DATA_HOME/bash-completion # Für den Einzelnen User
    ~/.local/share/bash-completion # Falls man die $XDG_DATA_HOME Variable nicht gesetzt hat.


    danach bekommt man ein Autocomplete wenn man aurrebuild <TAB><TAB> verwendet.

    LG
    Sebastian

    Titel: Re:checkrebuild
    Beitrag von: Andreas am 15. November 2023, 18:36:10

    Ein riesengroßes Smily...

    Danke Sebastian!

    Du zeigst auf eindrucksvolle Weise wie weit man in wie kurzer Zeit kommen kann wenn man sich mit der Materie beschäftigt. Es ist jetzt nicht abwertend gemeint: fast jeder kann das erreichen. Das Zauberwort heißt beschäftigen. Es kommt nicht dahergeflogen, und auch das "Buch-unter-das-Kopfkissen-legen" ist keine zielführende Methode. Man muss Zeit (anfangs vieeeel) investieren und verstehen lernen.

    Die Thematik ist nicht superschwierig. Es erfordert weder ein Studium noch Hochbegabtsein. Es erfordert die Fähigkeit zu logischem Denken (die über 95% der Menschen sowieso haben) und Biss, auch bei Problemen nicht aufzuhören. Natürlich erfordert es auch Zeit. Diese beiden Dinge verhindern in den meisten Fällen das Weiterkommen...

    LG
    Andreas


    Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
    © 2001-2003, YaBB SE Dev Team. All Rights Reserved.