Skript zum graphischen darstellen der Abhängigkeiten der installierten Ports

Maledictus

FreeBSD ftw
Siehe Topic.

Benötigt wird graphics/graphviz für `dot`.
Bisher nur unter FreeBSD benutzt.

pkg_dot.sh:
Code:
#!/bin/sh

# Find all packages required by the given package (recursive)
upward() {
	LIST=$(grep '^"'$1 COMPLETE.dot | cut -d '"' -f 4)
#	This is as fast but not as easy to understand
#	LIST=$(sed -nE 's/"'$1'.*" -> "(.*)";$/\1/p' COMPLETE.dot)

	for dep in $LIST; do
		echo '"'$1'" -> "'$dep'";' >> $2
		upward $dep $2
	done
}

# Find all packages depending on the given package (recursive)
downward() {
	if [ -r /var/db/pkg/$1*/+REQUIRED_BY ]; then
		for line in $(cat /var/db/pkg/$1*/+REQUIRED_BY); do
			echo '"'$line'" -> "'$1'";' >> $2
			downward $line $2
		done
	else
		# Leaf packages will be blue
		echo '"'$1'" [color = blue, fontcolor = blue];' >> $2
	fi
}


# Generate the full dependancy graph (needed by upward())
full() {
	for dir in /var/db/pkg/*; do
		for file in $dir/*; do
			if [ "$(basename $file)" = "+REQUIRED_BY" ]; then
				for line in $(cat $file); do
					echo '"'$line'" -> "'$(basename $(dirname $file))'";' >> $1
				done
			fi
		done
	done
}

TMPFILE=$(mktemp -q /tmp/$(basename $0).XXXXXX)
if [ $? -ne 0 ]; then
	echo "$0: Can't create temp file, exiting..."
	exit 1
fi

case "$1" in
	full)
		full $TMPFILE
		;;
	up)
		upward $2 $TMPFILE
		;;
	down)
		downward $2 $TMPFILE
		;;
	both)
		upward $2 $TMPFILE
		downward $2 $TMPFILE
		;;
	*)
		echo ""
		echo "Usage: `basename $0` { full | up | down | both } [portname]"
		echo ""
		exit 64
		;;
esac

echo "digraph {"
# Our point of view is red (except in "full" mode)
if [ "$1" != full ]; then
	echo '"'$2'" [color = red, fontcolor = red];'
fi
sort $TMPFILE | uniq
echo "}"

rm $TMPFILE

Als erstes sollte man ein
./pkg_dot.sh full >COMPLETE.dot
machen. Dies erzeugt den kompletten Graphen für alle installierten Ports. Der ist meist so groß, dass man nichts erkennen kann.

Zum anschauen der einzelnen Ports kann man dann z.B. folgenden kleinen Wrapper nehmen

pd.sh:
Code:
#!/bin/sh

./pkg_dot.sh both $1 > $1.dot
dot -Tsvg $1.dot -o $1.svg
inkview $1.svg

rm $1.dot $1.svg

Das geht dann z.B. so:
./pd.sh xmms
und schon sollte inkview die Abhängigkeiten von xmms anzeigen.
(Inkview gehört zu graphics/inkscape)

Feedback welcome :)
 
das ist sehr lustig, habe es letztes jahr mal ausprobiert, allerdings ohne den wrapper => speicher voll, das bild war so scheisse gross
 
Hallo

Eine python und einer perlversion eines solchen Skriptes sollten sich auch hier im Forum finden lassen.
Die pythonversion hab ich irgendwann selbst gepostet ;)

Aber das problem dabei:
dotty wird gekillt, wennes mehr als 512 MB RAM belegen will. :(
 
Ja, ist klar. Bitte lies dir limits(1) durch.

btw, es gibt sysutils/pkg_tree. Dessen Output koennte man auch durch dot(1) jagen.
 
Python ist einfach ein gut zu lesender Pseudocode.

Gliederung erfolgt durch Einrücken.

Das sollte alles sein, was man zum oberflächlichen Lesen wissen muß.
 
Zurück
Oben