Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe
allgemeine Kategorie => Installation & Einrichtung => Thema von: Andreas am 05. Oktober 2019, 18:43:08

Titel: Projekt "mein swupdate Script verbessern"
Beitrag von: Andreas am 05. Oktober 2019, 18:43:08

Bei Arch gibt es im Falle von Update-Problemen eine absolut überschaubare Menge an möglichen Ursachen, die sich alle stumpf durch das Abarbeiten meiner im Thread "Alles über Updates bei Arch/Antergos/Endeavour" aufgeführten Aspekte lösen lassen. Eine erhebliche Menge dieser Probleme erfordert zwar einen Eingriff durch den User, aber sehr oft keine Entscheidung
(er muss nämlich nur:
  • die ausgegebenen Fehlermeldungen mit denen in meinem Thread vergleichen
  • dann die dort aufgeführten richtigen (!!!) Kommandos mit copy & paste ausführen
  • )
    Das schreit förmlich danach, genau diese Probleme von meinem Script selbst abfangen zu lassen und mein Script führt dann die nötigen Befehle anhand von Vergleichen und Entscheidungen selbsttätig aus. Dabei müssen dann einfach bestimmte Worte aus den Fehlermeldungen extrahiert werden (z.B. Paketnamen - diese Worte stehen ja immer an denselben Positionen der Fehlermeldungen und sind deshalb automatisiert zu ermitteln) und dann in die nötigen Befehle eingefügt werden...

    Das ist ein sehr sinnvolles Projekt, da leider trotz Anleitung viele nicht in der Lage sind, die Ausgaben zu vergleichen und dann richtig zu handeln :'(

    Ich habe also damit begonnen, das nach und nach zu realisieren. Dabei müssen die aufgeführten Fehler auch real auftreten, denn nur dann kann ich testen, ob alles so läuft wie es soll.

    Einen ersten Erfolg kann ich verbuchen: Heute gab es mal wieder ein Update von "yay" - und das läuft IMMER in ein Problem, das in meinem Thread "Alles über Updates bei Arch/Antergos/Endeavour" aufgeführt ist... Ich habe das eingepflegt - und: es funktioniert!! Wenn der besagte Fehler auftritt, erkennt ihn mein verbessertes Script und es löscht dann selbsttätig den Ordner ~/.cache/yay/yay rekursiv und startet das Update erneut von selbst - und diesmal läuft es durch 8) Nun werden nach und nach die anderen Probleme bei denen keine User-Entscheidung notwendig ist folgen. Ihr könnt das jeweils aktuelle Script swupdate von mir auf den Treffen erhalten - oder ihr kopiert euch den Text aus dem Beitrag weiter unten wie dort beschrieben. Wenn ich neue Automaten eingebaut habe lasse ich es euch hier wissen.

    2becontinued

    LG
    Andreas

Titel: Re:Projekt "mein swupdate Script verbessern"
Beitrag von: DL8EBD am 07. Oktober 2019, 07:11:36

sehr schön Andreas, das macht es Newbies, wie ich einer bin, doch erheblich einfacher.
Ich versuche das Zeitnah umzusetzen - habe gerade viele Baustellen und zu wenig Zeit.

Vielen Dank für Deinen Einsatz

Titel: Re:Projekt "mein swupdate Script verbessern"
Beitrag von: Andreas am 07. Oktober 2019, 07:40:28

Ich werde das Script auch hier veröffentlichen. Da es eben KEIN kompilierter Code, sondern eine Textdatei ist (eben ein Bash-Script) kann man mit seiner Hilfe

  • sich das Leben im Umgang mit Updates vereinfachen
  • durch Betrachten des Scriptes lernen, wie sowas funktioniert
  • vielleicht sogar das Script verbessern

  • LG
    Andreas

Titel: Re:Projekt "mein swupdate Script verbessern"
Beitrag von: Chris am 09. Oktober 2019, 02:50:47

An dem Skript hab ich definitiv Interesse. Möglicherweise kann ich dann sogar was dazu beisteuern. Mal sehen. ^^

Titel: Re:Projekt "mein swupdate Script verbessern"
Beitrag von: Andreas am 09. Oktober 2019, 07:38:57

Ich möchte mindestens zwei der in meinem Thread aufgeführten Probleme automatisch lösen können. Eines geht schon - das zweite kommt bestimmt demnächst. Dann werde ich das Script hier reinstellen.


Nichtsdestotrotz ist es ein Eiertanz. Bei Microsoft und Apple sind die Automaten schon so weit fortgeschritten dass sie auch an Stellen, wo eigentlich "jemand mit gesundem Menschen- und Sachverstand" etwas entscheiden sollte, irgendwas automatisch einsetzen, was "wahrscheinlich" ist. Und genau durch sowas kommen die bekannten Updateprobleme bei diesen kommerziellen Betriebssystemen. "Wahrscheinlich" bedeutet eben "stimmt nicht immer". Es gibt dort also eine systembedingte Wahrscheinlichkeit, dass ein Update auch mal heftig in die Hose geht. Bei Linux wird eben der User gefragt. Bei kommerziellen Betriebssystemen "wird ihm diese unzumutbare Entscheidung abgenommen"...

Ich denke aber dass man mit etwas Fingerspitzengefühl die Wahrscheinlichkeit, dass mit meinem Script dann auch ein Update heftig in die Hose geht, sehr klein halten kann.

LG
Andreas

Titel: Ansatz zur Erweiterung
Beitrag von: Andreas am 11. Oktober 2019, 10:42:17

Hier mein genereller Ansatz:

Ich breche das Update in mehrere nacheinander abzuarbeitende Blöcke auf:

  • Sollte noch keine chroot-Umgebung für den User bestehen wird eine angelegt (Infos dazu gibt es hier - 2. Beitrag im Thread (https://www.suletuxe.de/forum/index.php?board=11;action=display;threadid=351))
  • Prüfung ob eine Verbindung mit dem Internet besteht
  • Holen der neuesten Standard-Repo-Paketdatenbanken mittels sudo pacman -Sy
  • Aktualisieren aus den Standard-Repos mit sudo pacman -Su --noconfirm
  • Löschen der heruntergeladenen Pakete, wenn das Update erfolgreich war, mit sudo paccache -vrk0
  • Aktualisieren aus den AURs mit yay -Sau --noconfirm --nocleanmenu --nodiffmenu --noeditmenu
  • Löschen der heruntergeladenen Quellen und eventueller Dateien, die beim Bauen erzeugt wurden - aber nur wenn das Update erfolgreich war mit yay -Sc --noconfirm

  • Die Ausgabe der Befehle wird aufgesplittet: sie wird nach wie vor auf die Konsole ausgegeben - aber zusätzlich auch in Textdateien ("Logs") umgelenkt. Wenn der Befehl mit einem Fehler beendet wurde wird das dazugehörige Log nach gewissen Schlüsselworten durchsucht, die bei Problemen auftreten (genau das was ihr bisher selbst machen solltet wenn es Probleme gibt). Wenn es einen Treffer gibt wird die dazugehörige Lösung ausprobiert (die zur Lösung notwendigen Informationen stehen nämlich auch alle im Log). Erst wenn das ebenfalls fehlschlägt soll mein Script diesen Befehl "aufgeben" - die Infos, wie es zu diesem Fehler gekommen ist, stehen aber nach wie vor im Log und bleiben dort auch - bis man swupdate erneut aufruft. Für forensische Maßnahmen sollte man also das Log vor dem erneuten Aufruf von swupdate sichern. Die Logs befinden sich hier: /tmp/upd-*.log. Und ja: es sind mehrere.

    Nach dem nächsten Update-Problem, das ich erfolgreich mit meinem Script lösen konnte, werde ich es in diesem Thread einstellen und ihr könnt es dann jeweils in aktuellster Version auf euer Arch kopieren.

    LG
    Andreas

Titel: Update-Script für Arch basierte Systeme
Beitrag von: Andreas am 15. Oktober 2019, 09:54:56

Hallo liebe Mitstreiter,

hier findet ihr die jeweils aktuelle Version meines Scriptes "swupdate".

Ich werde es immer, wenn ich etwas verbessert habe, aktualisieren.

Ihr habt ja bereits ein swupdate Script von mir auf euren Rechnern. Es befindet sich in /usr/local/bin/ . Dort befinden sich in Linux-Systemen alle "selbst erstellten" Programme oder Scripte (also solche, die NICHT mit dem System selbst ausgeliefert wurden und auch nicht mit dem Paketmanager installiert wurden). Der Vollständigkeit halber: es gibt auch noch den Ordner /usr/local/sbin/ - in dem befinden sich ebensolche Programme, aber welche, die nur der Superuser ausführen darf.
Das Script ist ein sogenanntes "Bash-Script". Dort ist in einer sehr simplen "Programmiersprache" einfach eine Aneinanderreihung von Befehlen, die ihr auch ebensogut auf der Konsole selbst eintippen könntet, hintereinandergereiht. Ihr könnt euch das Script mit einem Texteditor ansehen (aber Obacht: nicht "draufklicken" - dann wird es ausgeführt wenn es bereits Ausführungsrechte hatte! Ihr wollt es jetzt ja ansehen / öffnen). Geeignet ist jeder Texteditor (egal ob auf der Konsole oder in der grafischen Umgebung). Auf der Konsole würde ich den "mc" empfehlen, in der grafischen Oberfläche den "kate".
Das Script gehört "root" - und nur root darf es verändern oder löschen / ersetzen.

Wenn ihr das Script von dieser Seite auf eurem System "installieren" wollt schlage ich folgenden Weg vor:
  • Startet den Texteditor "kate"
  • kopiert den gesamten (!!) Text aus dem grauen Fenster unten in den leeren Texteditor (kontrolliert insbesondere, ob die erste und die letzte Zeile vollständig kopiert wurde)
  • speichert die Datei unter dem Namen "swupdate" irgendwo in eurem Heimatverzeichnis ab (ich gehe jetzt mal vom Ordner "Dokumente" aus)
  • Optional: sichert das alte Script, damit ihr es bei Problemen wieder herstellen könnt. Das geht z.B. mit cp /usr/local/bin/swupdate /root/swupdate. Wohin ist die Sicherheitskopie gegangen? Ihr könnt das natürlich auch wieder mit dem mc machen...
  • Führt die folgende Befehlszeile aus: sudo rm -f /usr/local/bin/swupdate; sudo cp ~/Dokumente/swupdate /usr/local/bin/swupdate; sudo chown root:root /usr/local/bin/swupdate; sudo chmod 755 /usr/local/bin/swupdate Das waren insgesamt vier Befehle! Könnt ihr die Zeile in die vier einzelnen Befehle zerlegen? Vielleicht könnt ihr ja mal versuchen herauszubekommen, was jeder einzelne Befehl tut? Vielleicht können wir so beim nächsten Treffen in Sachen "Konsole" beginnen? ::) Das würde mich sehr freuen! Man kann auch die Rechte einer Datei mit dem mc ändern, ebenso den Besitzer / die Gruppe zuweisen...

  • Jetzt seid ihr fertig und beim nächsten Aufruf von "swupdate" wird der neue Befehl verwendet.

    Aktuell werden folgende Probleme automatisch gelöst:
    (6)
    (7)
    (8)

    Und hier das Script:

    Code:
    #!/bin/bash

    SVERSION="Version 0.1.4 / 18. Okt. 2019"

    if [ $1 == "--version" ]; then
    echo "swupdate $SVERSION
    Dies ist das Arch-Update-Script von Andreas Richter. Es ruft die aktuell verfügbaren
    Aktualisierungen ab, macht dann ein Update von den Standard-Repositories, prüft danach
    verfügbare Updates aus den Arch User Repositories und führt auch diese Updates durch.
    Ist jeweils einer dieser Blöcke erfolgreich, werden temporäre Dateien aus den Caches
    gelöscht sowie doppelt gehaltene Pakete entfernt. War ein Vorgang nicht erfolgreich so
    entfällt der jeweilige Löschvorgang. Zusätzlich versucht das Script bei Update-Konflikten,
    die automatisch aufgelöst werden könnten, dies zu tun."
    exit 0
    fi

    RED='\033[0;31m'
    GREEN='\033[0;32m'
    BLUE='\033[0;34m'
    NC='\033[0m'

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

    # Keep-alive: update existing sudo time stamp if set, otherwise do nothing.
    while true; sleep 60; do sudo -n true; kill -0 "$$" || exit; done 2>/dev/null &
    # Example: do stuff over the next 30+ mins that requires sudo here or there.

    # test if internet connection is present
    wget -q --spider https://google.com
    if [ $? -eq 0 ]; then
    NOINTERNET=0
    ERRCOUNT=0
    else
    NOINTERNET=1
    ERRCOUNT=1
    echo -e "${RED}Kein Internet?!${NC}"
    fi

    if [ $NOINTERNET -eq 0 ]; then
    sudo rm /tmp/upd*.log > /dev/null 2>&1

    # create a chroot-build-system if not already present
    if [ ! -d ~/chroot ]; then
       echo -e "${GREEN}erstelle chroot-Build-Umgebung...${NC}"
       sudo pacman -S --noconfirm devtools
       mkdir ~/chroot
       CHROOT=~/chroot/
       mkarchroot $CHROOT/root base-devel
       arch-nspawn $CHROOT/root pacman -Syu
       echo -e "${GREEN}chroot-Build-Umgebung erstellt.${NC}"
    fi

    # actualize package database
    sudo pacman -Sy 2> >(tee -ia /tmp/upd-repodb.log)
    if [ $? -ne 0 ]; then
       echo -e "${RED}Arch Repository Datenbank konnte nicht aktualisiert werden.${NC}"
       ((ERRCOUNT++))
    else
       echo -e "${GREEN}Arch Repository Datenbank erfolgreich aktualisiert.${NC}"
    fi

    # run update from Arch standard repositories
    DOMA=1
    ERREXIMD=0
    while [ $DOMA -eq 1 ]; do
       sudo rm -f /tmp/upd-repos.log > /dev/null 2>&1
       sudo pacman -Su --noconfirm $1 2> >(tee -ia /tmp/upd-repos.log)
       UPRESULT=$?
       if [ $UPRESULT -ne 0 ]; then
        # overwrite a file which is already present on system and belongs to another package / version 2
        if [ $ERREXIMD -ne 1 ] && [ $(cat /tmp/upd-repos.log | grep "In Konflikt stehende Dateien") != "" ]; then
          sudo rm -f /tmp/upd-repos.log > /dev/null 2>&1
          sudo pacman -Su --noprogressbar --noconfirm $1 > /tmp/upd-repos.log
          PAKET=`cat /tmp/upd-repos.log | grep "existiert im Dateisystem" | cut -d ":" -f 1 | tail -n 1 | cut -d " " -f 2`
          echo -e "${BLUE}\"existierende Datei verhindert Update (von $PAKET Problem\" erkannt - versuche es selbsttätig zu lösen...${NC}"
          ERREXIMD=1
          sudo pacman -S --force --noconfirm $PAKET
          UPRESULT=$?
          if [ $UPRESULT -eq 0 ]; then
           echo -e "${GREEN}$PAKET konnte jetzt erfolgreich upgedated werden.${NC}"
          else
           echo -e "${RED}$PAKET konnte nach wie vor nicht upgedated werden.${NC}"
           DOMA=0
          fi
    #    elif [ -ne 1 ] && [ ]; then
        else
          DOMA=0
        fi
       else
        DOMA=0
       fi
    done

    if [ $UPRESULT -ne 0 ]; then
       echo -e "${RED}Update aus den Arch Repositories fehlgeschlagen.${NC}"
       ((ERRCOUNT++))
    else
       echo -e "${GREEN}Update aus den Arch Repositories erfolgreich abgeschlossen.${NC}"
       sudo paccache -vrk0
       echo -e "${GREEN}Heruntergeladene Pakete aus dem Cache gelöscht.${NC}"
    fi

    # run update from AURs
    DOMA=1
    ERRYAY=0
    ERRCHECKSUM=0
    NOAURUPD=0
    while [ $DOMA -eq 1 ]; do
       sudo rm -f /tmp/upd-aurs.log > /dev/null 2>&1
       yay -Sau --noconfirm --nocleanmenu --nodiffmenu --noeditmenu $1 2> >(tee -ia /tmp/upd-aurs.log)
       UPRESULT=$?
       # cannot get AUR update informations
       if [ $(cat /tmp/upd-aurs.log | grep "net/http: TLS handshake timeout") != "" ]; then
        ((NOAURUPD++))
       fi
       if [ $NOAURUPD -eq 5 ]; then
        echo -e "${RED}Kann nicht ermitteln ob es Updates aus den AURs gibt.${NC}"
        DOMA=0
        UPRESULT=0
       fi
       if [ $UPRESULT -ne 0 ]; then
        # yay cannot update itself
        if [ $ERRYAY -ne 1 ] && [ $(cat /tmp/upd-aurs.log | grep "rm: das Entfernen von.*/yay/yay/.*Keine Berechtigung") != "" ]; then
          echo -e "${BLUE}\"yay-kann-sich-nicht-selbst-updaten-Problem\" erkannt - versuche es selbsttätig zu lösen...${NC}"
          ERRYAY=1
          sudo chmod 777 -R ~/.cache/yay/yay
          sudo rm -rf ~/.cache/yay/yay
        # checksum failed
        elif [ $ERRCHECKSUM -ne 1 ] && [ $(cat /tmp/upd-aurs.log | grep "Eine oder mehrere Dateien überstanden nicht die Gültigkeits-Prüfung!") != "" ]; then
          PAKET=`cat /tmp/upd-aurs.log | grep "Error downloading sources" | cut -d ":" -f 2 | cut -d " " -f 2`
          echo -e "${BLUE}\"Gültigkeits-Prüfungs-Problem\" bei $PAKET erkannt - versuche es selbsttätig zu lösen...${NC}"
          ERRCHECKSUM=1
          cd ~/.cache/yay/$PAKET
          updpkgsums PKGBUILD
          makepkg -i PKGBUILD --noconfirm
    #      elif [];then
        else
          DOMA=0
        fi
       else
        DOMA=0
       fi
    done

    if [ $UPRESULT -ne 0 ]; then
       if [ $ERRYAY -eq 1 ]; then
        echo -e "${RED}Update von YAY fehlgeschlagen.${NC}"
       fi
       echo -e "${RED}Update aus den AURs fehlgeschlagen.${NC}"
       ((ERRCOUNT++))
    else
       echo -e "${GREEN}Update aus den AURs erfolgreich abgeschlossen.${NC}"
       yay -Sc --noconfirm
       echo -e "${GREEN}Heruntergeladener Quellcode aus dem Cache gelöscht.${NC}"
    fi
    fi

    echo " "
    echo " "

    if [ $ERRCOUNT -ne 0 ]; then
    echo -e "${RED}Update konnte nicht erfolgreich beendet werden - breche ab.${NC}"
    exit 1
    else
    echo -e "${GREEN}Update erfolgreich abgeschlossen - System ist wieder auf dem neuesten Stand.${NC}"
    fi


    LG
    Andreas


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