[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Perl und sitar



Hallo Waldemar,

* Waldemar Brodkorb <520052027732-0001@t-online.de> [05-08-01 18:55]:

> habe endlich Zeit gefunden an dem sitar.pl zu basteln.

Heisst das, dass Du es jetzt doch alleine machen moechtest?

> Wie bekomme ich am besten mit Perl eine Liste aller installierten
> Pakete in der Form hin:
> Paketname::Version::Größe::Kurzbeschreibung
> 
> Etwas adäquates zu:
> rpm -qa --queryformat '%{NAME}::%{VERSION}::%{SIZE}::%{SUMMARY}'
> 
> Mit dpkg scheint es nicht zu gehen.

Aber mit dpkg-awk:

dpkg-awk "Status:.* installed$" -- Package Version installed-size Description

> Irgendwie die Datei /var/lib/dpkg/status parsen und dann 
> die Info in ein Array bekommen, wie geht das?

Ich hatte ein aehnliches Problem und da ich dpkg-awk erst seid 2
Stunden kenne, habe ich das folgendermaßen gemacht:

(Angepasst fuer Dein Problem)

----8<----
use Fcntl;

sysopen (STATUS, "/var/lib/dpkg/status", O_RDONLY) || die "can't open '/var/lib/dpkg/status'";

$pos[0]=0; # erste Position = 0 (Dateianfang)
while (<STATUS>) { $pos[$#pos+1] = tell if /^$/; }

for ($i=0;$i<$#pos;$i++) {
   # alles von $pos bis zur naechsten Leerzeile in $package[i]
   # schreiben
   seek (STATUS, $pos[$i], seek_set) || die "can't seek!";
   while (<STATUS>) { last if /^$/; $package[$i] .= $_; }
}
close STATUS;

# zweite for Schleife weils dann deutlich schneller geht.
for ($i=0;$i<$#package;$i++) {

   # Paket installier oder nicht?
   if ($package[$i] =~ /^Status:.* installed$/im) {
        
        # alles ausser Version, Discr. etc. löschen
        $package[$i] =~ s/(^Package:.*$)(\n.*)*(^Installed-Size:.*$)(\n.*)*(^Version:.*$)(\n.*)*(^Description:.*(\n.*)*$)/$1\n$3\n$5\n$7/im;
        print "$package[$i]\n";
#   }else{
#       splice @package, $i, 1;
   }
}
#print @package;
----8<----

Wenn Du weißt, warum das split im Else-Zweig nicht funktioniert,
kannst Du es korrigieren und dann hast Du ein Array dessen Elemente
Name, Version, Size und Discr. fuer jeweils ein Paket enthalten.
Jetzt wird das nur ausgegeben und das Array enthaelt auch Pakete die
nicht installiert sind.

Fuer sitar ist das IMO besser als dpg-awk.

Aber warum willst eigentlich nur die vier Felder haben? Depends, Section,
Priority und Status sind doch auch interessant.

Janto

-- 
Janto Trappe    Germany     /* rapelcgrq znvy cersreerq! */
GnuPG-Key:      http://www.sylence.de/gpgkey.asc
Key ID:         0x8C53625F
Fingerprint:    35D7 8CC0 3DAC 90CD B26F B628 C3AC 1AC5 8C53 625F

Attachment: pgp6tFKoLU5tv.pgp
Description: PGP signature


Reply to: