Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe
allgemeine Kategorie => Installation & Einrichtung => Thema von: Andreas am 17. Juni 2023, 08:07:23

Titel: lokales Repository
Beitrag von: Andreas am 17. Juni 2023, 08:07:23

Ich habe auf meinem Schul-Server ein lokales Repository eingerichtet. In diesem befinden sich alle aktuellen Pakete die auf den Schülergeräten installiert sind - auch AUR-Pakete die auf dem Schul-Server gebaut wurden befinden sich dort als fertig gebaute Pakete. Der Sinn ist dass
1) auf den Schülergeräten keine zeitintensiven Bauprozesse bei einem Update notwendig sind
2) alle Pakete für alle Schülergeräte lediglich innerhalb des eigenen Netzwerkes bewegt werden müssen.
Klar: es setzt voraus dass sich das lokale Repository immer auf dem aktuellen Stand befindet wenn auf den Schülergeräten ein Update angestoßen wird. Das ist aber gewährleistet.

Dazu gibt es die beiden helper "repo-add" und "repo-remove". Ich habe auch ein bash-Script geschrieben das bei einem Update neu hinzugekommene Pakete automatisch in die Paketdatenbank einfügt.

Um die Pflege der Datenbank des lokalen Repos zu optimieren würde ich gerne alle Pakete finden die zwar in der Datenbank sind aber nicht mehr als physische Paketdatei existieren, und auch alle in der Datenbank fehlenden Pakete die aber als physische Paketdatei existieren. Es scheint dafür keine Befehle zu geben :o :o :o. Also habe ich angefangen ein Bash-Script dafür zu schreiben:
Zitat:
#!/bin/bash

echo "The following packages are listed in repository database but missing in fact:"
tar --exclude=*/* -tvf /home/local_repository/repo.db.tar.gz | cut -d ":" -f 2 | cut -d " " -f 2 | sed 's:/*$::' > /tmp/localrepofiles

while read -r line
do
if [ $(find /home/local_repository -name $line*) == "" ];then
echo $line
fi
done < /tmp/localrepofiles
rm /tmp/localrepofiles

echo "The following packages are present in repository but missing in database:"
Der Teil mir alle Pakete anzeigen zu lassen die in der Datenbank sind aber nicht mehr als Paketdatei existieren ist fertig und tut so in etwa was ich will. Perfekt ist es nicht: es wird nicht der Paketname sondern die angehängte Version mit angezeigt. Ideal wäre wenn ich nur den Paketnamen ohne die Versionsnummer bzw. Architektur angezeigt bekäme (dann könnte ich das Paket mittels repo-remove ggf. gleich automatisch aus der Datenbank entfernen) - das ist aber nicht so einfach weil es kein eindeutiges Merkmal gibt was zum Paketnamen gehört und was nicht.

Was sich mir als Fragen aufdrängt:
1) Gibt es wirklich keinen Befehl der mir alle Pakete auflistet die in einem Repository sind? Wie gesagt ALLE nicht nur aus diesem Repo installierte...

2) Gibt es vielleicht schon helper die ich nicht kenne die eine Datenbankprüfung eines Repos machen (mir also Pakete anzeigen bei denen die Konsistenz Datenbank / Dateien gestört ist?

Ich kenne zur Pflege eines lokalen Repos aktuell repo-add und repo-remove...

LG
Andreas

Titel: Re:lokales Repository
Beitrag von: Andreas am 17. Juni 2023, 13:42:24

Ich habe ein Bash-Script geschrieben das alles kann:

/usr/local/sbin/repo-list_missing_packages
Code:
#!/bin/bash

# configuration
PATH_TO_REPODB=/home/local_repository/repo.db.tar.gz
PATH_TO_REPO=/home/local_repository

# do not change anything behind this line

tar --exclude=*/* -tvf $PATH_TO_REPODB | cut -d ":" -f 2- | cut -d " " -f 2 | sed 's:/*$::' > /tmp/localrepofiles
ls $PATH_TO_REPO/*.zst | rev | cut -d "/" -f 1 | rev | sed 's/-any.pkg.tar.zst//g' | sed 's/-x86_64.pkg.tar.zst//g' | sed 's/.pkg.tar.zst//g' > /tmp/localfiles

t1=0
t2=0

echo "...checking local repository for inconsistences..."
echo ""

while read -r line
do
if [ $(find $PATH_TO_REPO -name $line*) == "" ];then
((t1=t1+1))
if [ $t1 == 1 ];then
echo "The following packages are listed in repository database but missing in fact:"
fi
echo $line
fi
done < /tmp/localrepofiles

while read -r line
do
if [ $(grep $line /tmp/localrepofiles) == "" ];then
((t2=t2+1))
if [ $t2 == 1 ];then
echo "The following packages are present in repository but missing in database:"
fi
echo $line
fi
done < /tmp/localfiles

if [ $t1 == 0 ] && [ $t2 == 0 ];then
echo "local repository is clean."
fi
echo "ready."

rm /tmp/localrepofiles
rm /tmp/localfiles
Frei zur Verwendung.

LG
Andreas

Titel: Re:lokales Repository
Beitrag von: Sebastian am 18. Juni 2023, 19:43:09

Zitat:
1) Gibt es wirklich keinen Befehl der mir alle Pakete auflistet die in einem Repository sind? Wie gesagt ALLE nicht nur aus diesem Repo installierte...


Grade nicht viel Zeit deswegen nur was mir auf die Schnelle einfällt


Code:

pacman -Slq <Reponame>


Gibt alle Paketnamen, aus die sich in diesem Repo befinden.

LG
Sebastian

Titel: Re:lokales Repository
Beitrag von: Andreas am 19. Juni 2023, 10:19:06

Ausgezeichnet. Ich hatte die Manpages mehrfach durchsucht, aber ich habe wohl nicht genau genug gelesen. Es waren einfach zu viele Seiten ;D...

LG
Andreas


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