Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Shell-Script zum prüfen ob ein Paket installiert ist
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German)
View previous topic :: View next topic  
Author Message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Wed Jul 06, 2016 10:44 am    Post subject: Shell-Script zum prüfen ob ein Paket installiert ist Reply with quote

Hi Mädels ... Jungs ... :)

Für ein Shell-Script das nach Bedarf Konfigurationen vornimmt wollte ich auch prüfen lassen ob die nötigen Pakete installiert sind. Meine Idee war mit "qlist -I | grep dhcp" einfach nach dem Paket suchen und dann im Script prüfen ob der zurückgegebene String richtig ist. Leider ist das Ergebnis nicht immer eindeutig. Kennt Ihr vielleicht eine Zuverlässigere Methode wie ich das Prüfen könnte?

Viele Grüße
Alexander
Back to top
View user's profile Send private message
franzf
Advocate
Advocate


Joined: 29 Mar 2005
Posts: 4408

PostPosted: Wed Jul 06, 2016 1:37 pm    Post subject: Reply with quote

eix --installed --exact dhcp sollte doch gehen.
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3254
Location: de

PostPosted: Wed Jul 06, 2016 9:31 pm    Post subject: Reply with quote

Ok, wusste gar nicht, dass es auch die Parameter als ausgeschriebene Version gibt. Ich hatte immer:
Code:
eix -Ie dhcp

benutzt. Für die Substring-Suche lässt du halt das e (exact) weg.

Allerdings kann man auch das o.g. qlist dafür verwenden:

Code:
qlist -Ic dhcp


zeigt zwar nicht soviele Details an, erfüllt aber auch seinen Zweck.

Code:
equery l dhcpcd


zeigt ebenfalls noch an, ob das Paket installiert ist. Und zur Not kannst du auch noch direkt in der Package-DB suchen:
Code:
find /var/db/pkg -iname "*dhcp*"


Gibt bestimmt noch mehr Möglichkeiten.
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 10:34 am    Post subject: Reply with quote

DIe zwei:

Code:

eix --installed --exact dhcp
equery l dhcp


liefern ein eindeutiges Ergebnis. Wenn ich das richtig gelesen habe liefert eix nur die Textausgabe zurück also keinen Return-Code den ich einfach abfragen könnte. Dann muss ich in der if Abfrage zum feststellen ob das Paket installiert ist nach dem Paketnamen suchen und wenn der nicht da ist eine Meldung ausgeben man möge es doch bitte installieren. Mal gucken wie das geht Shell-Scripte sind nicht so meine Spezialität bei einem C++ Programm täte ich mich leichter.
Back to top
View user's profile Send private message
franzf
Advocate
Advocate


Joined: 29 Mar 2005
Posts: 4408

PostPosted: Thu Jul 07, 2016 11:55 am    Post subject: Reply with quote

alexander_ro wrote:
DIe zwei:

Code:

eix --installed --exact dhcp
equery l dhcp


liefern ein eindeutiges Ergebnis. Wenn ich das richtig gelesen habe liefert eix nur die Textausgabe zurück also keinen Return-Code den ich einfach abfragen könnte.

Code:
❯ eix --installed --exact dhcp
Kein Treffer

❯ echo $?                     
1

❯ eix --installed --exact awesome
[I] x11-wm/awesome
     Verfügbare Versionen:   3.4.15 (~)3.5.6-r1 3.5.6-r2 (~)3.5.7 (~)3.5.8 (~)3.5.9 (**)9999[1] {dbus doc gnome ELIBC="FreeBSD"}
     Installierte Versionen: 9999[1](14:37:26 08.06.2016)(dbus doc -gnome ELIBC="-FreeBSD")
     Startseite:             http://awesome.naquadah.org/
     Beschreibung:           A dynamic floating and tiling window manager

[1] "ff2000" /var/repositories/ff2000

❯ echo $?                       
0

@musv: Ich verwende auch -Ie allerdings ist das I immer so ne Sache... Je nach Font kann man das auch für ein kleines l oder eine 1 halten, deshalb hab ich lieber die langen Optionen geschrieben ;)
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 1:07 pm    Post subject: Reply with quote

Ja stimmt $? daran hatte ich nicht mehr gedacht. Ich hätte doch ein C++ Programm machen sollen da kenne ich mich besser aus. Aber ich habe mir ja unbedingt ein Shell-Script eingebildet ...

Das mit den ausgeschriebenen Optionen finde ich gerade im Forum praktisch man frägt ja nach etwas das man nicht kennt und muss dann nicht die Optionen erst in der Manpage suchen und mit den Zeichen die man leicht verwechselt gibts auch keine Probleme da hast Du schon recht.

Ich habe die Prüfung ob alle Pakete da sind die gebraucht werden jetzt so gemacht. Vielleicht nicht schön aber es geht ... :-)
Code:

  PaketFehlt=0

  eix --installed --exact --quiet dhcp
  if [ $? == 1 ]
  then
    PaketFehlt=1
    echo "Bitte das Paket "dhcp" installieren: emerge dhcp"
  fi

  eix --installed --exact --quiet iptables
  if [ $? == 1 ]
  then
    PaketFehlt=1
    echo "Bitte das Paket "iptables" installieren: emerge iptables"
  fi

  eix --installed --exact --quiet wpa_supplicant
  if [ $? == 1 ]
  then
    PaketFehlt=1
    echo "Bitte das Paket "wpa_supplicant" installieren: emerge wpa_supplicant"
  fi

  if [ $PaketFehlt == 1 ]
  then
    exit
  fi


Danke für eure Hilfe
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1105
Location: Schwabenländle

PostPosted: Thu Jul 07, 2016 4:18 pm    Post subject: Reply with quote

Code:
qlist -IC dhcp
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 4:53 pm    Post subject: Reply with quote

Das liefert bei mir dieses Ergebnis:

Code:

alien alex # qlist -IC dhcp
net-misc/dhcp
net-misc/dhcpcd


Edit: So vielleicht
Code:

qlist -IeC dhcp
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1105
Location: Schwabenländle

PostPosted: Thu Jul 07, 2016 6:43 pm    Post subject: Reply with quote

Code:
CHECK="dhcpcd"
[ !  "$(qlist -ICe $CHECK)" ] && echo "$CHECK is not installed"
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 7:35 pm    Post subject: Reply with quote

Sieht nach höherer Kryptografie aus ... ;)

So könnte man das dann in eine Funktion packen die man dann nur noch mit Parameter aufruft. Es fehlt nur noch der Merker damit man nach allen Prüfungen entscheiden kann ob man das Script wegen Fehlenden Paketen beenden muss oder nicht. Ich weiß jetzt aber nicht wie man bei Deiner Version noch den Wert des Merkers setzt.

Edit:
Ich hätte da zwar ein bisschen anderes Thema aber auch Shell Problem. Ich habe zwar die Lösung zusammen gefunden bekomme aber das Ergebnis nicht in eine Shell Variable. Wäre fein wenn Ihr da einen Tipp hättet wie das geht.

Code:

echo "obase=16; (${RANDOM} % 256)" | bc
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1105
Location: Schwabenländle

PostPosted: Thu Jul 07, 2016 8:13 pm    Post subject: Reply with quote

Code:
#!/bin/bash


Z="0"
for I in dhcp iptables wpa_supplicant ; do
  if [ !  "$(qlist -ICe $I)" ] ; then
    echo "$I is not installed"
    Z=$(($Z+1))
  fi   
done
if [ "$Z" -gt 0 ] ; then
  echo "$Z packages not installed"
  exit
fi
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 8:30 pm    Post subject: Reply with quote

Also wenn man mehr als ein Kommando ausführen will muss man dann einen "if" benutzen. Hab ich das jetzt richtig verstanden?
Back to top
View user's profile Send private message
3PO
Veteran
Veteran


Joined: 26 Nov 2006
Posts: 1105
Location: Schwabenländle

PostPosted: Thu Jul 07, 2016 8:32 pm    Post subject: Reply with quote

Nö, es geht auch:

Code:
CHECK="dhcpcd"
[ !  "$(qlist -ICe $CHECK)" ] && echo "$CHECK is not installed && exit"


Sieht halt doof aus.
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 9:00 pm    Post subject: Reply with quote

Macht auch bisschen was anderes ich wollte ja erst alle Pakete prüfen und dann das Script beenden wenn eins oder mehrere fehlen.
Damit man das Ding nicht drei mal Starten muss bis man weiß was noch fehlt.

Stimmt schon das mit den "if" und der Schleife sieht besser aus in dem Fall.
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Thu Jul 07, 2016 9:23 pm    Post subject: Reply with quote

Ist hübscher und auch leichter in anderen Scripten wieder zu verwenden. Danke für Deine Hilfe ... :)

Code:

  PaketabhaengigkeitenPruefen ()
  {
    PaketListe=$1
    Z="0"

    for I in $PaketListe ; do
    if [ !  "$(qlist -ICe $I)" ] ; then
      echo "Bitte das Paket \"$I\" installieren: emerge --ask $I"
      Z=$(($Z+1))
    fi
    done

    if [ "$Z" -gt 0 ] ; then
      echo "$Z Pakete nicht installiert"
    exit
    fi

    echo "benötigte Gentoo Pakete installiert: check"
  }

  PaketabhaengigkeitenPruefen "dhcp iptables wpa_supplicant"
Back to top
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6281

PostPosted: Sat Jul 09, 2016 1:10 pm    Post subject: Reply with quote

Nochmal 'ne Alternative mit eix:
Code:
early_exit=:
for need in dhcp iptables wpa_supplicant
do eix -Ieq $need || { early_exit=exit
  echo "Bitte das Paket \"$need\" installieren: emerge $need" >&2
}
done
$early_exit 1

Wobei allerdings eix aus mehreren Gründen hier ungeeignet ist, die auch in der eix manpage bei "--installed" aufgelistet sind:
  • Der Benutzer muss es installiert haben. (Das steht natürlich nicht in der manpage)
  • Es muss eix-update aktuell genug aufgerufen worden sein
  • Es gibt Ärger, wenn die Pakete einmal aus dem Gentoo-Baum verschwinden
Mit qlist umgegeht man einige dieser Probleme, aber auch das ist nicht der "Unix way". Die richtige Lösung wäre so etwas:
Code:
Die() {
  printf '%s' "$@"
  exit 1
}
command -v dhcpcd >/dev/null 2>&1 || Die 'dhcpcd ist nicht im PATH.' \
  'Bitte ggf. PATH korrigieren oder mit emerge -1 dhcpcd nachinstallieren.'

Das funktioniert dann auch auf anderen Systemen oder wenn der Benutzer dhcpcd nur lokal (etwa mit prefix-portage) installiert hat. Statt dem "exit" in "Die" kann man natürlich auch eine entsprechende Variable setzen. Eine Schleife ist wohl nicht möglich, da Paketnamen und zu testendes Kommando (oder ggf. zu testendes File - je nachdem, was Dein Script braucht) i.a. natürlich nicht identisch sind. Bei vielen Paketen kann man sicher mit einer Liste arbeiten, aber für 3-4 Tests lohnt sich das nicht.
Back to top
View user's profile Send private message
alexander_ro
Apprentice
Apprentice


Joined: 22 Nov 2014
Posts: 171

PostPosted: Sun Jul 10, 2016 9:29 am    Post subject: Reply with quote

Danke für die weitere Version Interessant zu sehen was da so alles möglich ist. Die Version von 3PO ist zwar länger aber zumindest ich verstehe die schneller als die von Dir (mv).

Es muss jetzt nicht der Unix Weg sein ... der Gentoo Weg reicht mir. Da bin ich der Meinung das kann man am vorhanden sein des Pakets testen. Das Script soll dann auch noch die Kernel-Optionen prüfen und Vorschläge für die Konfiguration der Netzwerkdienste machen. Ich benutze derzeit kein andere Distribution. Um es wirklich Distributions unabhängig zu bauen müsste man auch die Verschiedenen Paketverwaltungen und Implementierungen der Netzwerkdienste berücksichtigen das macht viel Arbeit.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum