• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Verzeichnis mit RPMs entrümpeln

Boccaccio

Member
Hallo zusammen!

Ich verwalte meine Pakete unter SuSE 9.1 mit apt. Da mein /var wo apt die heruntergeladenen RPMs speichert nur 1 GB groß ist, kopiere ich bei Bedarf die RPMs auf eine andere Platte mit mehr Platz.
Nun hat sich im Laufe der Zeit in diesem Verzeichnis eine beträchtliche Anzahl an Paketen gesammelt, insgesamt sind es knapp 3 GB. Dabei ist es aber so, daß ich viele RPMs in mehreren Versionen habe, z.B. kdebase3-3.2.1-68.15, kdebase3-3.2.1-68.23, kdebase3-3.3.1-10, kdebase3-3.3.1-3, kdebase3-3.3.2-7, kdebase3-3.4.0-27.
Um das ganze jetzt etwas zu entrümpeln würde ich gerne die nicht mehr aktuellen Pakete löschen. Dies per Hand zu machen erscheint mir allerdings bei 1289 Dateien sehr mühsam, weshalb ich fragen wollte, ob jemand weiß, wie man dieses Problem einfach lösen kann.

Schönen Dank schon einmal im voraus.
 

oc2pus

Ultimate Guru
guggst du hier:

[TIP] apt cache aufräumen
http://www.linux-club.de/viewtopic.php?t=21675

nimm gleich das RPM :)
 
OP
B

Boccaccio

Member
So, ich habe jetzt das apt-smartclean-RPM installiert und dann mal versucht, das ganze an meine Bedürfnisse anzupassen, in dem ich folgende Ersetzung gemacht habe:

Code:
def cleanaptcache(dryrun=0,dirs=('/var/cache/apt/archives/','/var/cache/apt/archives/partial/')):

wurde zu

Code:
def cleanaptcache(dryrun=0,dirs=('/home/Bjoern/I/apt-RPMs/')):

Das führte dann aber zu folgendem Ergebnis:

Code:
computername:/usr/bin # apt-smartclean
Running on SuSE-i386
Traceback (most recent call last):
  File "/usr/bin/apt-smartclean", line 61, in ?
    cleanaptcache(dryrun)
  File "/usr/bin/apt-smartclean", line 26, in cleanaptcache
    for file in os.listdir(dir):
OSError: [Errno 2] No such file or directory: 'h'
 

Grothesk

Ultimate Guru
An dem skript musst du nichts ändern. Die von apt runtergeladenen rpms liegen immer in var/cache/apt...
 
OP
B

Boccaccio

Member
Aber das ist das Verzeichnis, in dem ich meine RPMs gesammelt habe. Und aus Platzgründen ist es nicht möglich, jetzt erstmal alles nach /var/cache/apt/archives zu kopieren, dort zu entrümpeln und den verbleibenden Rest wieder nach /home/Bjoern/I/apt-RPMs zu bringen.
 

oc2pus

Ultimate Guru
Grothesk schrieb:
An dem skript musst du nichts ändern. Die von apt runtergeladenen rpms liegen immer in var/cache/apt...

fast richtig :)
in der apt.conf gibt es eine Sektion, die legt fest wo der cache steht. In meinem Fall in /local/packages2 ... und nicht /var
Code:
Dir "/"
{
...
    Cache "local/packages2/cache/apt/" {
        archives "archives-8.2";
        srcpkgcache "srcpkgcache-8.2.bin";
        pkgcache "pkgcache-8.2.bin";
    };
...
 

Grothesk

Ultimate Guru
O.K. du hast recht. Ich war jetzt von einer Standardinstallation ausgegangen wie sie wohl die meisten hier haben. Bei Leuten die sich die Verzeichnisse zurechtbiegen gehe ich davon aus, dass die auch die skripte anpassen können.
 
OP
B

Boccaccio

Member
Also ich hab jetzt an meine apt.conf Folgendes angehängt

Code:
Dir "/"
{
    Cache "home/Bjoern/I/apt-RPMs/" {
        archives "archives-9.1";
        srcpkgcache "srcpkgcache-9.1.bin";
        pkgcache "pkgcache-9.1.bin";
    };
}

da noch nichts Cache-Bezogenes drin stand. Leider gibt mir apt-smartclean immer noch dieselbe Fehlermeldung aus :-(
 

oc2pus

Ultimate Guru
Boccaccio schrieb:
Aber das ist das Verzeichnis, in dem ich meine RPMs gesammelt habe. Und aus Platzgründen ist es nicht möglich, jetzt erstmal alles nach /var/cache/apt/archives zu kopieren, dort zu entrümpeln und den verbleibenden Rest wieder nach /home/Bjoern/I/apt-RPMs zu bringen.

dann musst du dir mit apt4rpm (aptate) ein eigenes apt-Repository anlegen und mit aptate indizieren, in der sources.list wird dies durch einen Eintrag
# Mirrors in /local/packages
rpm file:/local/packages2/apt/ SuSE/8.2-i386 SuSE82
eingebunden. dann Wird dieses Verzeichnis zu einem "apt"-Verzeichnis ... und dann kann das apt-smartclean dort auch löschen.

Ansonsten Handarbeit :)
 

oc2pus

Ultimate Guru
bevor es das apt-smartclean gab habe ich dieses script verwendet, musst du dir selber ein wenig anpassen ...

wenn das scrip myMirrorCheck heisst werden mit
myMirrorcheck | xargs rm -f die alten Versionen gelöscht ...

Code:
#! /bin/bash
#####################################################
# actual mirror is checked for "duplicates"
#
# to delete all duplicates:
# myMirrorCheck | xargs rm -f
#####################################################

#####################################################
# params: list of rpm-names
#         directory-name
#####################################################
function processList ()
{
	if [ -n "$1" ]; then
		for name in $1; do
			# search every real package in masterlist
			if [ ! "`grep -o $2/$name $MASTERLIST`" ]; then
				# actual package $name is not most recent version
				if [ "$VERSION" = "yes" ]; then
					getInstalledVersion $name
					echo "$2/$name [$PACKAGEVERSION]"
				else
					echo "$2/$name"
				fi
			fi
		done
	fi
}

#####################################################
# package-0.64.4-1.i586.rpm ==> package
#####################################################
function packageBaseName ()
{
	TMPdatei=$1
	TMPdatei2=${TMPdatei%-*}
	TMPdatei3=${TMPdatei2%-*}
	PACKAGEBASENAME=${TMPdatei3##/*/}
}

#####################################################
# package-0.64.4-1.i586.rpm ==> package
#####################################################
function packageNameVersion ()
{
	TMPdatei=$1
	TMPdatei2=${TMPdatei%.rpm}
	TMPdatei3=${TMPdatei2%.*}
	PACKAGEBASENAME=${TMPdatei3##/*/}
}

#####################################################
#####################################################
function getInstalledVersion ()
{
	packageBaseName $1
	PACKAGEVERSION=`rpm -q $PACKAGEBASENAME 2> /dev/null`
}

#####################################################
# rpms in actual directory $1
#####################################################
function processDirectoryContent ()
{
	LISTE=`ls -1 *.rpm 2> /dev/null`
	processList "$LISTE" $1
}

#####################################################
# package-0.64.4-1.i586.rpm ==> package-0.64-1.i686.rpm
#####################################################
function get686PackageName ()
{
	TEMP=$1
	TEMP2=${TEMP%.i586.rpm}
	PACKAGENAME=$TEMP2.i686.rpm
}

#####################################################
# build master list
#####################################################
function buildMasterList ()
{
	# APT cache directory
	CACHEDIR=$MIRRORBASE/apt/share/$SUSE_VERSION2/cache
	cd $CACHEDIR
	CACHELISTE=`ls -1 . 2> /dev/null`

	# build list with most recent version for every list in cache
	for i in $CACHELISTE; do
		$COMPAREPROG --format path --rpmtype bin $CACHEDIR/$i >  /tmp/$i.mrv
		$COMPAREPROG --format path --rpmtype pat $CACHEDIR/$i >> /tmp/$i.mrv
	done

	# build master list from all (sub)lists
	MASTERLIST=/tmp/MASTER.rmv
	cat /tmp/*.mrv > $MASTERLIST
	rm -f /tmp/*.mrv
}

#####################################################
#####################################################
function setMirrorParam ()
{
	MIRRORBASE=$LOCAL_MIRROR_BASE
	BASEVERZ=$SERVER_BASE_VERZ
	SUSEVERZ=$SUSE_PREFIX

	MIRRORVERZ=""
	case "$SUSE_VERSION" in
	8.2)
		MIRRORVERZ="$MIRRORVERZ SuSE82"
		;;
	9.0)
		MIRRORVERZ="$MIRRORVERZ SuSE90"
		;;
	9.1)
		MIRRORVERZ="$MIRRORVERZ SuSE91"
		;;
	esac
}

#####################################################
# special check for architecture i586 vs i686
#####################################################
function checkArchitecture ()
{
	case "$SUSE_VERSION" in
	8.2)
		PACKMANVERZ=$BASEVERZ/SuSE82
		VERZ586=$PACKMANVERZ
		cd $MIRRORBASE
		LISTE=`ls -1 *.i586.rpm 2> /dev/null`
		;;
	9.0)
		PACKMANVERZ=$BASEVERZ/SuSE90
		VERZ586=$PACKMANVERZ
		cd $MIRRORBASE
		LISTE=`ls -1 *.i586.rpm 2> /dev/null`
		;;
	9.1)
		PACKMANVERZ=$BASEVERZ/SuSE91
		VERZ586=$PACKMANVERZ
		cd $MIRRORBASE
		LISTE=`ls -1 *.i586.rpm 2> /dev/null`
		;;
	esac

	echo ""
	for i in $LISTE; do
		get686PackageName $i
		if [ -f $PACKAGENAME ]; then
			echo $VERZ586/$i
		fi
	done
}

#####################################################
# check for programm
#####################################################
function checkProgramm ()
{
	COMPAREPROG=/usr/lib/apt4rpm/compare_rpm_version
	if [ ! -f $COMPAREPROG ]; then
		echo "$0: programm $COMPAREPROG is missing ??"
		exit 1
	fi
}

#####################################################
# compare mirrored package vs installed package
#####################################################
function checkInstalledPackages ()
{
	for i in $MIRRORVERZ; do
		cd $MIRRORBASE/$i
		LISTE=`ls -1 *.rpm 2> /dev/null`
		processList2 "$LISTE" $i

		# get subdirectory names in actual directory
		SUBDIR=`ls -d * 2> /dev/null`
		for k in $SUBDIR; do
			if [ -d "$k" ] && [ "$k" != "SRPMS" ]; then
				cd $k
				LISTE=`ls -1 *.rpm 2> /dev/null`
				processList2 "$LISTE" $i/$k
				cd ..
			fi
		done
	done
}

#####################################################
# compare mirrored SRPM package vs installed package
#####################################################
function checkSRPMPackages ()
{
	SRPM_VERZ=""
	case "$SUSE_VERSION" in
	8.2)
		SRPM_VERZ="$SRPM_VERZ $LOCAL_MIRROR_BASE/SuSE82"
		;;
	9.0)
		SRPM_VERZ="$SRPM_VERZ $LOCAL_MIRROR_BASE/SuSE90"
		;;
	9.1)
		SRPM_VERZ="$SRPM_VERZ $LOCAL_MIRROR_BASE/SuSE91"
		;;
	esac

	for verz in $SRPM_VERZ; do
		cd $verz
		LISTE=`ls -1 *.src.rpm 2> /dev/null`
		processList2 "$LISTE" $verz
	done
}

#####################################################
# compare mirrored package to installed package
# params: package name
#         directory
#####################################################
function checkVersion ()
{
	getInstalledVersion $1
	if [ -n "$PACKAGEVERSION" ]; then
		packageNameVersion $1
		if [ "$PACKAGEVERSION" != "$PACKAGEBASENAME" ]; then
			echo "$2/$1 [$PACKAGEVERSION]"
		fi
	fi
}

#####################################################
# compare a list of packages vs installed package
# params: list of rpm-names
#         directory-name
#####################################################
function processList2 ()
{
	if [ -n "$1" ]; then
		for name in $1; do
			checkVersion $name $2
		done
	fi
}

#####################################################
# set basic parameters
#####################################################
function setParam ()
{
	case "$1" in
		8.2)
			SUSE_VERSION=8.2
			SUSE_VERSION2=suse82
			;;
		9.0)
			SUSE_VERSION=9.0
			SUSE_VERSION2=suse90
			;;
		9.1)
			SUSE_VERSION=9.1
			SUSE_VERSION2=suse91
			;;
	esac

	LOCAL_MIRROR_BASE=/local/packages
}

#####################################################
# myMirrorCheck [-a] [-v]
#####################################################
ARCHCHECK=no
VERSION=no

# debug option
#set -x

# mirror params
case "$1" in
	8.2)
		setParam 8.2
		;;
	9.0)
		setParam 9.0
		;;
	9.1)
		setParam 9.1
		;;
esac
shift

setMirrorParam

while [ $# -gt 0 ]; do
	case $1 in
	  -a)
		ARCHCHECK=yes
		;;
	  -v)
	  	VERSION=yes
	  	;;
	  -i)
	  	checkInstalledPackages
		exit 0
	  	;;
	  -s)
	  	checkSRPMPackages
		exit 0
	  	;;
	  -h)
	  	echo "$0 [-(a)rchitecture] [-(v)ersion] [-(s)ource] [-(i)nstalled]"
		exit 1
	  	;;
	esac
	shift
done

# version compare programm
checkProgramm

# build list of packagenames from mirror
buildMasterList

# check all mirror directories
for i in $MIRRORVERZ; do
	cd $MIRRORBASE/$i
	processDirectoryContent $i

	# get subdirectory names in actual directory
	SUBDIR=`ls -d * 2> /dev/null`
	for k in $SUBDIR; do
		if [ -d "$k" ] && [ "$k" != "SRPMS" ]; then
			cd $k
			processDirectoryContent $i/$k
			cd ..
		fi
	done
done

# cleanup
rm -f $MASTERLIST

if [ "$ARCHCHECK" = "yes" ]; then
	checkArchitecture
fi
 
OP
B

Boccaccio

Member
Ich hab mich jetzt für eine halbmanuelle Lösung entschieden. Die Dateien aus /home/Bjoern... habe ich in passenden Häppchen nach /var/cache... kopiert, dann apt-smartclean darauf losgelassen und anschließend in einem neuen Verzeichnis gesammelt.

Was mich nur etwas verwundert ist, daß meine ursprünglich angedachte Scriptveränderung nicht funktionierte, da ich mein /home/Bjoern/I/apt-RPMs mit aptate indiziert und zur sources.lsit hinzugefügt habe. Ich kann von dort aus Pakete installieren und ein apt policy xyz zeigt mir auch Pakete dort an.

Egal, Hauptsache ich hab jetzt fürs erste aufgeräumt.
 
Oben