[gelöst] Herausfinden, ob ein Paket installiert ist (distributionsübergreifend)

thatgui

Active member
Themenstarter
Registriert
3 Juli 2009
Beiträge
1.874
Hallo,
ich würde gerne für ein Program, welches ich gerade entwickle, eine Funktion haben, die ermittelt, ob ein bestimmtes Paket installiert ist.
Derzeit verwende ich dazu "dpkg -l <Paketname>". Leider hat das zwei Nachteile:

  • das sollte ja nur funktionieren, wenn die verwendete Distribution auch das Debian Paket Managment nutzt.
  • die Ausgabe von dpkg ist für die "maschinelle" Auswertung nicht so gut geeignet, am schönsten wäre die Variante bei der als Ausgabe nur die Versionsnummer erscheint, wenn installiert, und nix oder ein Schlüsselwort wenn das Paket fehlt.
Hier gibt es doch bestimmt den ein oder anderen Skript/Linuxprofi, der mit weiterhelfen kann oder.
 
Zuletzt bearbeitet:
Warum benutzt du nicht die ueblichen, von Debian bereigestellten Methoden, ein .deb zu bauen?
Ansonsten musst du in deinem Skript erst abfragen, welche Distribution in welcher Version laeuft und entsprechend weiter gehen.
 
Da hab ich mich wohl (mal wieder) etwas ungenau ausgedrückt, ich möchte kein Paket aus meinem Programm erstellen, da es nur ein Tool ist, um mir persönlich Arbeit ab zu nehmen. Zusätzlich ist die Funktionalität, die mit den bestimmten Paketen zusammenhängen nur Optional.
Meine Frage war ja auch speziell distributionsübergreifend angelegt, eben um ein "Abfragen" der Distribution (geht dies denn so "einfach") aus dem Weg gehen zu können.

PS.: Ziel ist übrigens kein Script, ist eine Mono - Anwendung
 
Ich glaube du wirst dann nicht um ein cat /etc/*-release herum kommen.
 
könntest du die abfrage über packagekit machen? das hat afaik backends für verschiedene paketmanager, und kann mindestens mit deb und rpm umgehen.
 
Naja, da wäre dann das Problem, das ich erstmal prüfen müsste, ob es packagekit auf dem System gibt.
Ich dachte dabei mehr an einen Befehl für die Konsole, der "Standard" auf den meißten Desktopdistributionen ist, er muss auch nicht explizit zum suchen von installierten Paketen sein, könnte auch etwas ala "locate xyz" o. Ä. sein.
 
Was weißt du denn alles über das zu suchende Paket?
Hinweise wonach du Distri-Independent suchen kannst:
- Hat es einen Standard-Verzeichnis für bins?
- Legt ist immer eine Config ins User-Dir ab?
- Startet es einen Service auf einem Default-Port?
 
- Hat es einen Standard-Verzeichnis für bins?
- Legt ist immer eine Config ins User-Dir ab?
- Startet es einen Service auf einem Default-Port?

Konkret geht es bei mir um die "squashfs-tools".
Wie kann ich denn herausfinden, ob es ein Standard-Verzeichnis für die binarys hat ? Bei den beiden anderen Punkten, schätze ich mal nein.
Könnte denn ein "find / -name *squashfs-tools*" verlässlich sein
die Ausgabe auf meinen virtuellen LMDE
/var/cache/apt/archives/squashfs-tools_1%3a4.0-8_i386.deb
/var/lib/dpkg/info/squashfs-tools.md5sums
/var/lib/dpkg/info/squashfs-tools.list
/usr/share/doc/squashfs-tools
der "doc-Eintrag" könnte da vielleicht interessant sein. Hmm vielleicht mal heute Abend Suse in eine VM packen und testen ?

BTW: OT: kennt jemand eine Möglichkeit, wie ich das Dateisystem eines Image bestimmen kann (z.B. Iso oder squashfs) ?

Aber schonmal vielen Dank an alle für die rege Anteilnahme
 
Noe, doc hilft gar nix - kann ja gut sein das jemand das Paket ohne die Docs gebaut/installiert hat.

Im konkreten Fall wuerde ich einfach nach z.b. mksquashfs suchen, und das nicht wild mit nem Find ueber alles. Das kann naemlich z.B. auf groesseren Fileservern beliebig haesslich werden. Eher mit "which mksquashfs" o.ae. Der Befehl "which" ist Teil von util-linux, und das wuerde ich einfach mal als gegeben voraussetzen.
 
das fs kannst du über den befehl mount oder den inhalt von /proc/mounts erhalten. natürlich vorausgesetzt das fs ist gemountet.
 
...und wenn das image einfach nur irgendwo rumliegt:

~> file KNOPPIX_V6.4.4DVD-2011-01-30-EN.iso
KNOPPIX_V6.4.4DVD-2011-01-30-EN.iso: ISO 9660 CD-ROM filesystem data 'KNOPPIX ' (bootable)
 
Distributionsübergreifend nach einem Paket zu suchen ist schwierig. Es gibt da keine Konventionen, das fängt schon bei der Namenswahl der Pakete an und hört bei der Versionsnummerierung auf.

Das beste wäre wohl du rufst mit soetwas wie execvp oder popen einfach das mksquashfs executable mit dem parameter -version auf. Sprich du nimmst dir eine Funktion, die dir anahand des Executable-Namens den absoluten Pfad automatisch ermittelt, dann musst du dich nicht mit den unterschiedlichen Pfaden rumschlagen. Unter C würde ich jetzt pipe(), fork(), dup(), execvp() benutzen bzw. popen() wenn ich faul bin unter python wäre das sowas wie subprocess.Popen(["mksquashfs", "-version"], stdout=subprocess.PIPE) und dann - wenn du das willst - kannst du dir über die pipe die du an den stdout gehängt hast noch die Versionsausgabe auswerten lassen.

Alternativ wenn es dir recht zu wissen ob das mksquashfs executable vorhanden ist und wo es ist, dann versuchs mal mit '/usr/bin/which mksquashfs'.
Das durchsucht dir $PATH, also alle Pfade für ausführbare Dateien nach dem executable und gibt dir den absoluten Pfad auf stdout zurück.
 
Ich würde es auch als erstes mit which versuchen. Wenn das nicht ausreicht kannst Du ja anfangen mit autoconf herumzubasteln.

Das Dateisystem ließe sich evtl. mit file(1) erkennen. Für ISO 9660 und UDF bringen die meisten Distributionen fertige magic(5) mit für squashfs, keine Ahnung, notfalls selbst basteln?
 
Ich denke mal, das "file" für meine Zwecke reicht. Wenn es nicht funktioniert, mounte ich halt erst, und schau mir dann nochmal die Ausgabe von mount an. In welchem Paket steckt eigentlich file ?
Schön/unschön : bei einem meiner zwei Test - Images gibt file nur ein empty zurück.

Wenn ich könnte, würde ich dem Thread jetzt ein [gelöst] verpassen. :thumbup: Vielen Dank nochmal an Alle :thumbup:
 
wie schon erwaehnt wurde gibt es frontends fuer packagemanager distro uebergreifend die dann natuerlich auch erstmal installiert sein wollen.
wenn du lust hast dir was selber zu scripten ist das hier eine schoene auflistung : https://wiki.archlinux.org/index.php/Pacman_Rosetta

which und file sollten allerdings beide wirklich reichen ansonsten eben via autotools/cmake. nicht vergessen zu unterscheiden zwischen distris die alle header und .a dateien seperat verpacken in -devel paketen dann hilft dir ein which auf die binary nuescht wenn du da was brauchen solltest :P
 
  • ok1.de
  • thinkstore24.de
  • ok2.de - Notebook Computer Server
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben