Installierte Packete und -Abhängigkeiten darstellen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kultviech
Beiträge: 37
Registriert: 13.07.2008 11:20:04

Installierte Packete und -Abhängigkeiten darstellen

Beitrag von kultviech » 31.12.2008 12:08:02

Hallo !

Habe ein kleines Script geschrieben, das aus den installierten Packeten eines System die Paketabhängigkeiten als Verzeichnisbaum darstellt. Die Verzeichnisse sind die installierten Pakete und die Links sind die Depends.

In einem zweiten Schritt möchte ich die "Hauptpakete" rausfiltern und als Links in ein seperates Verzeichnis erstellen. Das funktoiniert mit dem Script mit Ausnahme eines Problems: wenn sich die Paketabhängigkeiten "im Kreis drehen", findet mein Script die nicht, um sie als "Hauptpaket" in das andere Verzeichnis zu linken.

Als Beispiel-Paket: gnome-do
gnome-do hat als rdepends gnome-do-plugins und dieses wiederum gnome-do als rdepends.

Hat jemand eine einfache Idee, wie ich dies in das Script einarbeiten kann? oder vll. einen ganz anderen Ansatz :-)

Code: Alles auswählen

#! /bin/bash
#
#
#

DIR="dpkg-analyse/system-$HOSTNAME"
DIRSEC="dpkg-analyse/.system-$HOSTNAME"

INSTALLEDDEBS=`dpkg -l | awk '/^ii/{print $2}'`
INSTALLSCRIPT="$DIR/../dpkg-analyser-install"

if [ $DIR ];then
  echo Hostverzeichnisse löschen
  rm -r $DIR
  rm -r $DIRSEC
fi

install -d $DIR $DIRSEC
echo Verzeichnisse: $DIR und $DIRSEC angelegt  


echo Für jedes Package ein Verzeichnis anlegen und Beschreibung abspeichern
for i in $INSTALLEDDEBS; do
  mkdir $DIRSEC/$i
  echo "`apt-cache show $i`" > $DIRSEC/$i/$i.txt
done

echo Für jede Abhängigkeit einen Link anlegen
for i in $INSTALLEDDEBS; do
  for r in `apt-cache rdepends $i | cut -b 3- -`; do
    #echo $i ist ein rdepend von $r
    if [ -d $DIRSEC/$r ]; then

      #Abhängigkeit verlinken
      if [ ! -h $DIRSEC/$r/$i ]; then
        ln -s ../$i $DIRSEC/$r/
      fi

      #Reverse Depends verlinken
      if [ ! -d $DIRSEC/$i/.rdeps ]; then
        mkdir $DIRSEC/$i/.rdeps
      fi
      if [ ! -h $DIRSEC/$i/.rdeps/$r ]; then
        ln -s ../../$r $DIRSEC/$i/.rdeps/
      fi

      #Mainpakete verlinken
      if ([ ! -h $DIR/$r ] && [ ! -f $DIRSEC/$r/.main ]); then
        ln -s ../../$DIRSEC/$r $DIR/
        touch $DIRSEC/$r/.main
      fi
      touch $DIRSEC/$i/.main
      if [ -h $DIR/$i ]; then
        rm $DIR/$i
      fi 
    fi
  done
done

echo Installationsscript anlegen
echo "#! /bin/sh" > $INSTALLSCRIPT
echo "apt-get install "`ls $DIR` >> $INSTALLSCRIPT

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Installierte Packete und -Abhängigkeiten darstellen

Beitrag von rendegast » 08.01.2009 06:09:25

Code: Alles auswählen

...
  for r in `apt-cache rdepends $i | cut -b 3- -`; do
...
Da würde ich ein 'tail -n +3' einarbeiten

Bei dem 'cut' hast Du an die " |..." gedacht?

Code: Alles auswählen

$ apt-cache rdepends sun-java6-jre
sun-java6-jre
Reverse Depends:
  sun-java6-fonts
  sun-java6-demo
  sun-java6-bin
  libworldwind-java
 |libjgroups-java
  jajuk
  weka
  weirdx
 |weirdx
  solr-common
 |robocode
 |omegat
 |libswingx-java
  liblucene2-java
 |libjibx-java
 |libjdic-java
 |libjavassist-java
 |libbytecode-java
 |jabref
 |tuxguitar-jsa
 |tuxguitar
  openoffice.org-writer
  openoffice.org-qa-tools
  openoffice.org-officebean
  openoffice.org-base
  openoffice.org
  libwoodstox-java
 |freecol
 |fetchexc
Weiterhin läßt sich die Ausgabe von 'apt-cache rdepends' vielleicht mit '--installed' vereinfachen.

Oder mit '--recurse ... | sort' brauchbar modifizieren?
Dann aber noch ' | grep -v $r' einarbeiten, um Selbstreferenzierungen zu vermeiden. 'tail' reicht hier nicht aus.



--------------
Der brauchbarste Ansatz erscheint mir:

Code: Alles auswählen

...
  for r in `apt-cache --installed rdepends $i | tail -n +3 | cut -b 3- - | sort | uniq`; do
...
Jetzt hast Du nur noch Ausgaben, die wirklich als Verzeichnis bzw. installiertes Paket vorhanden sind.
Diese hast Du vorher angelegt ('mkdir $DIRSEC/$i')
und kannst jetzt direkt verlinken, ohne Tests:

Code: Alles auswählen

...
for i in $INSTALLEDDEBS; do
echo $i
#  for r in `apt-cache rdepends $i | cut -b 3- -`; do
  for r in `apt-cache --installed rdepends $i | tail -n +3 | cut -b 3- - | sort | uniq`; do
# Besser mit -p, da keine Fehlermeldungen:
        mkdir -p $DIRSEC/$i/.rdeps

    echo $i ist ein rdepend von $r
#    if [ -d $DIRSEC/$r ]; then

      #Abh�ngigkeit verlinken
#      if [ ! -h $DIRSEC/$r/$i ]; then
        ln -s ../$i $DIRSEC/$r/
#      fi

      #Reverse Depends verlinken
#      if [ ! -d $DIRSEC/$i/.rdeps ]; then
#        mkdir $DIRSEC/$i/.rdeps
#      fi
#      if [ ! -h $DIRSEC/$i/.rdeps/$r ]; then
        ln -s ../../$r $DIRSEC/$i/.rdeps/
#      fi

      #Mainpakete verlinken
...
#    fi
  done
done



------------------
Ist alles so langsam durch die 'apt-cache show|rdepends'-Prozesse ("YaST-Geschwindigkeit" ;) ).
Mit 2s pro Suche kommt schnell eine Stunde zusammen.

Zumindest für die 'apt-cache show' wäre da eine Möglichkeit:

Code: Alles auswählen

apt-cache show $(dpkg -l | awk '$1=="ii" {print $2}')  >  full.txt
cat full.txt | awk '$1~/^Package:/ {print NR,$2}'  >  Package-nums             # Zeilennummern der Package:-Zeilen

# Keine Ahnung, was dieses exec macht, ich habe es aus mtab.sh
exec 9<&0 0<Package-nums
while read Linenumber Package; do
    sed -n "$Linenumber,/^$/ p" full.txt >> $DIRSEC/$Package/$Package.txt
    # von $Linenumber bis zur nächsten leeren Zeile,
    # 'apt-cache show' listet für einen Paketnamen alle erreichbaren Pakete auf, daher mit ">>"
done
Das geht viel flotter (~ 10/s), ist aber immer noch unelegant und langsam durch das ständige Neueinlesen von full.txt.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Installierte Packete und -Abhängigkeiten darstellen

Beitrag von ThorstenS » 08.01.2009 12:45:23

ein grafischer Ansatz:

Code: Alles auswählen

aptitude install graphviz
apt-cache dotty vim vim-doc > vim.dot
dot -Tpng vim.dot -o vim.png
Als Output geht natürlich auch svg, dann kannst du das mit inkscape nachbearbeiten.
Das ganze System habe ich damit bisher noch nicht aufgelöst, aber evtl. ist das ein Schubs in eine interessante Richtung.

kultviech
Beiträge: 37
Registriert: 13.07.2008 11:20:04

Re: Installierte Packete und -Abhängigkeiten darstellen

Beitrag von kultviech » 10.01.2009 00:59:48

Hallo !

@ThorstenS: finde das progi auch sehr interessant, danke!

@rendegast:

wow, danke für die ausführliche Antwort/Hilfe!

Code: Alles auswählen

apt-cache --installed rdepends $i | tail -n +3 | cut -b 3- - | sort | uniq
Komischerweise wirft mir dieser Befehl Packete aus, die ich nicht installiert habe, daher gibts beim Verlinken der Verzeichnisse Fehlermeldungen bei mir.

Code: Alles auswählen

apt-cache --installed rdepends grub
zeigt z.B. so einen Output, der mir bislang gänzlich unbekannt war und die Probleme aufwirft. Muß ich mal noch schauen, wie ich das mache.

Vielen Dank für die hilfreichen Tipps!

N8
Axel

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Installierte Packete und -Abhängigkeiten darstellen

Beitrag von rendegast » 10.01.2009 02:46:48

Code: Alles auswählen

$ apt-cache --installed rdepends grub | sort | uniq  
grub
    grub-efi
    grub-ieee1275
    grub-linuxbios
    grub-pc
...
Das sind Kollisionen, haben 4 Leerzeichen davor, falls es da nicht auch noch "|" gibt.
Lassen sich mit

Code: Alles auswählen

 | grep -v "^    "
entfernen.





----------- EDIT -------------------
Für weitere Beschleunigung:
Nach dem Muster

Code: Alles auswählen

apt-cache show $INSTALLEDDEBS  >  full.txt
kann das ja auch mit 'rdepends' geschehen:

Code: Alles auswählen

apt-cache --installed rdepends $INSTALLEDDEBS  >  full-rdepends.txt
ergibt

Code: Alles auswählen

paket1
Reverse Depends:
   ...
paket2
Reverse Depends:
   ...
paket3
Reverse Depends:
   ...
was dann wiederum mit den schnelleren Textanalysewerkzeugen zerlegt werden kann.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten