logo

Suletuxe.de
Linux - Nutzer
helfen
Linux - Nutzern

Willkommen, Gast. Bitte Login oder Registrieren.
18. April 2024, 16:50:04
Übersicht Hilfe Suche Login Registrieren

Amateurfunk Sulingen
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe  |  allgemeine Kategorie  |  Tutorials  |  Thema: checkrebuild « zurück vorwärts »
Seiten: [1] nach unten Drucken
   Autor  Thema: checkrebuild  (Gelesen 574 mal)
Andreas
Administrator
*****

Offline

Einträge: 1140



Linux von Innen

Profil anzeigen
checkrebuild
« 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
« Letzte Änderung: 17. Oktober 2023, 07:45:04 von Andreas » Gespeichert

Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es weitergeben, und es Menschen gibt, die bereit sind, dieses Geschenk auch unter eigenem Einsatz anzunehmen.


Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.
Sebastian
Sr. Member
****

Offline

Einträge: 371





Profil anzeigen
Re:checkrebuild
« Antwort #1 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: 

Zitat:
Installation
        pacman -S rebuild-detector

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

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
« Letzte Änderung: 17. Oktober 2023, 10:12:04 von Sebastian » Gespeichert

Sebastian
Sr. Member
****

Offline

Einträge: 371





Profil anzeigen
suletuxe.cheat
« Antwort #2 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
Gespeichert

Sebastian
Sr. Member
****

Offline

Einträge: 371





Profil anzeigen
PKGBUILD für aurrebuild
« Antwort #3 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"
}
« Letzte Änderung: 20. Oktober 2023, 19:21:36 von Sebastian » Gespeichert

Andreas
Administrator
*****

Offline

Einträge: 1140



Linux von Innen

Profil anzeigen
Re:checkrebuild
« Antwort #4 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
Gespeichert

Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es weitergeben, und es Menschen gibt, die bereit sind, dieses Geschenk auch unter eigenem Einsatz anzunehmen.


Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.
Sebastian
Sr. Member
****

Offline

Einträge: 371





Profil anzeigen
checkrebuild bash Autocomplete
« Antwort #5 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 

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
« Letzte Änderung: 15. November 2023, 18:18:08 von Sebastian » Gespeichert

Andreas
Administrator
*****

Offline

Einträge: 1140



Linux von Innen

Profil anzeigen
Re:checkrebuild
« Antwort #6 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
Gespeichert

Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es weitergeben, und es Menschen gibt, die bereit sind, dieses Geschenk auch unter eigenem Einsatz anzunehmen.


Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.
Seiten: [1] nach oben Drucken 
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe  |  allgemeine Kategorie  |  Tutorials  |  Thema: checkrebuild « zurück vorwärts »
Gehe zu: 


Login mit Username, Passwort und Session Länge

 Es wird die Verwendung "Blink"-basierter Browser und mindestens 1024x768 Pixel Bildschirmauflösung
für die beste Darstellung empfohlen
 
freie Software für freie Menschen!
Powered by MySQL Powered by PHP Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
© 2001-2004, YaBB SE Dev Team. All Rights Reserved.
- modified by Andreas Richter (DF8OE)
Valid XHTML 1.0! Valid CSS!