Aktualisieren der Installationspakete nervt und daaaarum....

Antworten
Benutzeravatar
Thomas_H
Beiträge: 525
Registriert: 09 Jun 2010, 11:57
Wohnort: Havelland

Aktualisieren der Installationspakete nervt und daaaarum....

Beitrag von Thomas_H »

...hab ich mich entschlossen, OPSI den Rücken zu kehren... :shock:




Neein, natürlich nicht! :D Alles gut, OPSI ist und bleibt klasse und ich bleibe auch bei OPSI.

Trotzdem: mich nervt(e) es sehr, dass meine Installationspakete (zumeist aus frei verfügbarer Software) relativ schnell veralten. Kaum hat man sich mal drangesetzt und die Pakete aktualisiert, waren sie eigentlich auch schon veraltet. Also wieder ran, Setup.exe herunterladen, ins /home/opsiproduct/<paketname>/CLIENT_DATA laden, raus aus dem Verzeichnis, rein in ../OPSI, die config schnell von Hand editieren oder beim Packen des Pakets eine neue Versionsnummer angeben (öhm... wie war die gleich nochmal?) und Paketmanager starten, um es zu installieren, um dann - verflixt - festzustellen, dass man irgendwas verbaselt hat. :evil:

Ich bin doch nicht Programmierer geworden um dann händisch irgendwelche IT-Prozesse zu erledigen! Gute Programmierer *müssen* (!) stinkfaul sein, damit sie mit drei Klicks (HÖCHSTENS!) alle aufkommenden Fragen beantworten können oder vielleicht sogar ein cronjob das erledigt. Und ich bin stinkefaul! Also habe ich mir dazu eine Lösung überlegt, die ich Euch nun präsentieren möchte. Sie ist sicherlich noch verbesserungswürdig, keine Frage, aber darum werfe ich es ja dem OPSI-Volk zu Füßen, auch in der Hoffnung, dass einige noch fauler sind als ich. :D

Wir benutzen hauptsächlich freie Software, die frei im Netz verfügbar ist. Bei anderer Software, bei der man sich beim Hersteller anmelden muss, mag das nicht funktionieren. Irfanview zum Beispiel funktioniert auch nicht, weil trotz des richtigen Links eine Webseite kommt, bei der man nochmal den Download bestätigen muss. Ich konnte wget nicht überreden, dem Link zu folgen...

Zunächst mal das Script, bei dem ich die Ausführung entscheidender Kommandos mit einem # --- auskommentiert habe, damit besonders Anfänger sich nicht gleich das Paket versauen.

Code: Alles auswählen

#!/bin/bash
#
##############################################################################
# first we declare some variables. A good programmer is a lazy programmer :)
##############################################################################
opsiproduct_path="/home/opsiproducts"                   # as recommended by uib it's always /home/opsiproducts
product="freecommanderXE"                               # just an example
setupname="freecommanderxe_x32_setup.exe"               # just an example
geturl="https://freecommander.com/downloads"            # move the rest beginning from the last slash to var urladd!
urladd="/FreeCommanderXE-32-public_setup.zip"           # minimum a slash / we add this at the end of $geturl
# Attention! following grepvar-string is a regular expression!! Leave the [^"]* at the end!!
grepvar=""                                              # A string, the grep should look for in the website. This will be part of the download-url! grep tries to add the version-number
searchstr=""                                            # what's behind the version-number of the downloadfile? We need to exctract the version-number for the config -file
alt_ver=$(date +"%y%m%d")                               # this is a dummy-version. Some programs don't include a version number in their name
startpos=0                                              # at which position is the first digit of the version-number? 
##############################################################################
#
# ATTENTION! FOR TESTING FIRST ALL REAL COMMANDS ARE COMMENTED OUT BY # --- !! WHEN CHANGING TO PRODUCTION YOU'LL HAVE TO REMOVE THE # --- THEN!
#
# first, let's remove the last valid exe-file
# --- rm $opsiproduct_path/$product/CLIENT_DATA/$setupname

# get the new setup-file from website and rename it to a standard file name (so no need to change the setup.ins :P )

if [ "$grepvar" == "" ]; then
    setupprg=$setupname
else
# here we try to find the full name of the new setup-file. For example we know start and ending of the file, but not the rest.
# Example: Setup-file-name is always "freecommanderxe-<version>_setup.exe" we try to find out, what is <version>. grep will find it, so we have a
# "freecommander-791_setup.exe". Yay. This will be added to the download-link.
#
    setupprg=$( wget --no-check-certificate $geturl -q -O- | grep -o $grepvar ) 
fi

echo setupprg=$setupprg
# --- wget --no-check-certificate "$setupprg" -O $opsiproduct_path/$product/CLIENT_DATA/$setupname 

# Do we need to unzip the file first? If so, watch the right name of setup.exe is written in setup.ins
# --- unzip -o $opsiproduct_path/$product/CLIENT_DATA/$setupname  # -o -overwrite files without prompting!
# --- rm  $opsiproduct_path/$product/CLIENT_DATA/$setupname

# let's change the directory to the package
cd $opsiproduct_path/$product/
# remove the *.opsi-files
# --- rm *.opsi
# --- rm *.zsync
# --- rm *.md5

# to find out, which version it is, we do a little bit of awk
if [ $startpos != 0 ]; then
    pos=$(echo $setupprg | grep -b -o $searchstr | awk 'BEGIN {FS=":"}{print $1}')
    # well done, we found it.
    version=$(echo $setupprg | cut -c$startpos-$pos)
else
    version=$alt_ver
fi
echo Version=$version
# now let's change the /OPSI/control file
# --- sed "s/version:.*/version: $version /g" $opsiproduct_path/$product/OPSI/control > $opsiproduct_path/$product/OPSI/control.new
# --- mv $opsiproduct_path/$product/OPSI/control.new $opsiproduct_path/$product/OPSI/control

# make new package, but quiet
# --- opsi-makepackage -q
# --- opsi-package-manager -i *.opsi
Was macht das Script?
Zunächst mal deklariere ich ein paar Variablen, die wir brauchen, um das Installationsprogramm zu erhalten.
Auf welche Seite müssen wir?
Wie genau ist der Downloadlink?
Wo ändert sich im Setup-File möglicherweise etwas? Also, wo steht die Versionsnummer? Wir wissen ja, manchmal steht die Versionsnummer im Setup-File: irfan_5.65_setup.exe - hier ist eine Versionsnummer drin, die sich ändern könnte.
An welcher Stelle beginnt die Versionsnummer? Hier hinter "irfan_" also an 7. Stelle
Wie lautet der String nach dem grep hinter der Versionsnummer suchen muss? Hier also "_setup.exe"
Haben wir ein Zip-File, dass extrahiert werden muss?
usw.

All das macht dieses Script, hier am Beispiel von FreeCommanderXE, es ist nun meine aktuelle Vorlage für weitere Scripte, die im Laufe meiner Erfahrungen erweitert wurde.

Ich habe nun schon einige geschrieben, die auch funktionieren. Cron habe ich noch nicht beauftragt. Ich muss unbedingt dafür sorgen, dass ich nach Ausführung dieser Scripte diese auch per Mail bekomme, damit ich überprüfen kann, ob alles funktioniert hat und die Pakete wirklich aktualisiert wurden.

Weitere funktionierende Beispiele stelle ich gerne ein, wenn gewünscht.

Ich habe hier noch ein anderes, etwas "älteres" Script (naja, gerade mal drei Tage alt), bei dem das eine oder andere deutlicher wird:
(VORSICHT! Dieses Script ist scharf! Es erstellt gnadenlos ein update Eures bestehenden Pakets!)

Code: Alles auswählen

#!/bin/bash
#
##############################################################################
# first we declare some variables. A good programmer is a lazy programmer :)
##############################################################################
opsiproduct_path="/home/opsiproducts"
product="7zip"
setupname="7zip_x64_setup.exe"
geturl="https://7-zip.org"
urladd="/a/" # minimum a slash /
# Attention! following grepvar-string is a regular expression!! Leave the [^"]* at the end!!
grepvar='7z.*-x64\.exe[^"]*'
searchstr="-"
# Where is the first digit of the version-number?
startpos=3
##############################################################################
#
#
# first, let's remove the last valid exe-file
# --- rm $opsiproduct_path/$product/CLIENT_DATA/$setupname
# get the new setup-file from website and rename it to a standard file name (so no need to change the setup.ins :P )
setupprg=$(wget --no-check-certificate $geturl -q -O- | grep -o $grepvar )
echo setupprg=$setupprg
wget --no-check-certificate "$geturl$urladd$setupprg" -O $opsiproduct_path/$product/CLIENT_DATA/$setupname
# let's change the directory to the package
cd $opsiproduct_path/$product/
# remove the *.opsi-files
rm *.opsi
rm *.zsync
rm *.md5
# to find out, which version it is, we do a little bit of awk
pos=$(echo $setupprg | grep -b -o $searchstr | awk 'BEGIN {FS=":"}{print $1}')
# well done, we found it.
version=$(echo $setupprg | cut -c$startpos-$pos)
echo Version=$version
# now let's change the /OPSI/control file
sed "s/version:.*/version: $version /g" $opsiproduct_path/$product/OPSI/control > $opsiproduct_path/$product/OPSI/control.new
mv $opsiproduct_path/$product/OPSI/control.new $opsiproduct_path/$product/OPSI/control
# make new package, but quiet
opsi-makepackage -q
opsi-package-manager -i *.opsi
Es muss noch erwähnt werden, dass es in diesem Zusammenhang klug ist, in den setup.ins den Namen der setup_...exe zu vereinheitlichen, damit wget beim Download den Namen der Datei vorbestimmt, egal, wie sie beim download auch immer heissen mag. Sonst muss die setup.ins immer wieder angepasst werden.

So... Feuer frei. :)

Grüsskens,

Thomas_H
Kennst Du schon die WIKI für OPSI-Scripte? Fertige Installationsscripte bekommen und ablegen unter OPSI-Wiki
Aus dem Glashaus :) : UIB bietet auch Schulungen und Supportverträge für Opsi an.
Bild
Benutzeravatar
Thomas_H
Beiträge: 525
Registriert: 09 Jun 2010, 11:57
Wohnort: Havelland

Re: Aktualisieren der Installationspakete nervt und daaaarum....

Beitrag von Thomas_H »

Moinsens,

ich habe weitere Erfahrungen sammeln können, die ich gerne hier noch ergänzen möchte. Zum einen hatte ich im nicht scharf geschalteten Script einen Fehler drin, der dazu geführt hätte, dass das eigentliche Setup-Programm nicht heruntergeladen worden wäre. Ich ermittle weiter oben in Script den Wert für "$setupprg", also den eigentlichen Downloadlink, der direkt zur Setup.exe führt, hatte ihn aber beim eigentlichen Download nicht angewendet.

Mitunter wird von einer https://www.foo.com zu einer https://download.foo.com oder auch zu einer https://get.foo.com umgeleitet. Das muss im $grepvar also der Suchvariable für das grep berücksichtigt werden.

Das "$startpos", also das erste Zeichen welches für die Versionsnummer ermittelt wird muss noch händisch ausgezählt werden. Das geht sicher auch anders. Ich bin da noch etwas vorsichtig, weil "es könnte sich ja mal was ändern..." :)

Alles in allem habe ich bei allen meinen Scripten festgestellt, dass sie recht schnell erstellbar sind. Manchmal muss eine kleine Anpassung des Scripts erfolgen, weil beispielsweise keine msi oder exe zur Verfügung steht, sondern eine zip-Datei, die zuerst entpackt werden muss, ehe man das OPSI-Paket bauen kann. Man wird also um kleinere Programmänderungen nicht herumkommen, zumal die Bereitstellung von Programm zu Programm doch etwas variiert. Bislang aber alles keine wirklich "böhmische Dörfer".

Ich werde diese Scripte gerne zur Verfügung stellen, die ich schon gebaut habe. Sie können dann alle als cron-jobs zB. wöchentlich oder monatlich ausgeführt werden.

Für die bessere Erklärung der Scripte will hier hier mal erzählen, was sie eigentlich zu tun haben:

Durch den Anwender von OPSI werden Variablen festgelegt. Die meisten habe ich schon im Eingangspost beschrieben. Was sich als nicht immer notwendig erwiesen hat (ob es ganz überflüssig ist, daran arbeite ich noch) ist das "urladd="""

Die $grepvar -Variable ist der Suchstring, welcher in der unter $geturl heruntergeladenen Webseite gefunden werden muss. Ich lade eine Seite herunter, beispielsweise https://www.videolan.org/vlc/index.de.html. Schauen wir uns die Seite an, dann finden wir einen Downloadbutton. Dahinter verbirgt sich ein Link. Diesen suchen wir mittels einer RegEx, die da lautet:

Code: Alles auswählen

"//get\.videolan\.org/vlc/[0-9.]*/win64/vlc-[0-9.]*-win64\.exe"
Diesen Downloadlink habe ich dadurchgefunden, dass ich die Webseite mit im Quellcode angeschaut habe und nach ".exe" gesucht habe. Da uns nun das "https:" fehlt müssen wir das im Script zusätzlich hinzufügen. Hier ist ein wenig Handarbeit angesagt, dass dieses https: in der Zeile

Code: Alles auswählen

wget --no-check-certificate "$setupprg" -O $opsiproduct_path/$product/CLIENT_DATA/$setupname
eingefügt wird. Sie wird also zu

Code: Alles auswählen

wget --no-check-certificate "https://$setupprg" -O $opsiproduct_path/$product/CLIENT_DATA/$setupname
Beim eigentlichen Download wird die heruntergeladene Datei auch gleich umbenannt, im Beispiel von VLC zu "vlc_x64_setup.exe". Das ist wichtig, damit die OPSI-Installation auch künftig funktioniert, ohne dass die Versionsnummer in der setup.ins immer wieder neu angepasst werden muss.

Nun müssen wir aber auch noch die Versionsnummer ermitteln, damit diese in die Datei "[...]/OPSI/control" eingetragen werden kann.

Das erreiche ich mit dem (leider noch händischen Auszählen) des ersten Zeichens (dieser Wert geht dann in die Variable "$startpos") und dem Suchen nach einem ganz bestimmten String, den ich in "$searchstr" festlege. Auch das ist eine Regex und lautet hier

Code: Alles auswählen

/win64/vlc-[0-9.]*-win64.exe
Damit drösel ich den eigentlichen Downloadlink auf:

Code: Alles auswählen

//get.videolan.org/vlc/3.0.16/win64/vlc-3.0.16-win64.exe  ==>
//get.videolan.org/vlc/
3.0.16
/win64/vlc-3.0.16-win64.exe
und erhalte die 3.0.16 als Versionsnummer.

Sollte der Download eine zip-Datei sein, wird sie vorher noch entpackt und die entpackte Datei gleich umbenannt.

Der Rest ist OPSI-Rucksackwissen und ein wenig sed, welche in der [...]/OPSI/config die Werte hinter beiden Einträgen "version: " überschreibt.

Was allerdings unabdingbar ist, ist dass die setup.ins in den jeweiligen OPSI-Paketen einen standardisierten Namen für das zu installierende Programm erhält, also zum Beispiel "vlc_x64_setup.exe", "tightvnc_x64_setup.exe", "360TS_setup.exe",... und auch das wget als Output genau diesen festgelegten Namen in das jeweilige CLIENT-Verzeichnis speichert. Das räumt auch gleich mal die setup.ins'n auf und das permanente Editieren der Versionsnummer hört auf.

Hier das gesamte Script für den VLC:

Code: Alles auswählen

#!/bin/bash
#
##############################################################################
# first we declare some variables. A good programmer is a lazy programmer :)
##############################################################################
opsiproduct_path="/home/opsiproducts"                   # as recommended by uib it's always /home/opsiproducts
product="vlc"                                           # just an example
setupname="vlc_x64_setup.exe"                           # just an example
geturl=https://www.videolan.org/vlc/index.de.html               # move the rest beginning from the last slash to var urladd!
urladd=""               # minimum a slash / we add this at the end of $geturl
# Attention! following grepvar-string is a regular expression!! Leave the [^"]* at the end!!
grepvar="//get\.videolan\.org/vlc/[0-9.]*/win64/vlc-[0-9.]*-win64\.exe" # A string, the grep should look for in the website. This will be part of the download-url! grep tries to add the version-number
searchstr="/win64/vlc-[0-9.]*-win64.exe"                                                # what's behind the version-number of the downloadfile? We need to exctract the version-number for the config -file
alt_ver=$(date +"%y%m%d")                               # this is a dummy-version. Some programs don't include a version number in their name
startpos=24                                             # at which position is the first digit of the version-number?
##############################################################################
#
# ATTENTION! FOR TESTING FIRST ALL REAL COMMANDS ARE COMMENTED OUT BY # --- !! WHEN CHANGING TO PRODUCTION YOU'LL HAVE TO REMOVE THE # --- THEN!
#
# first, let's remove the last valid exe-file
rm $opsiproduct_path/$product/CLIENT_DATA/$setupname

# get the new setup-file from website and rename it to a standard file name (so no need to change the setup.ins :P )

if [ "$grepvar" == "" ]; then
    setupprg=$setupname
else
# here we try to find the full name of the new setup-file. For example we know start and ending of the file, but not the rest.
# Example: Setup-file-name is always "freecommanderxe-<version>_setup.exe" we try to find out, what is <version>. grep will find it, so we have a
# "freecommander-791_setup.exe". Yay. This will be added to the download-link.
#
    setupprg=$( wget --no-check-certificate $geturl -q -O- | grep -o $grepvar )
fi

echo setupprg=$setupprg
wget --no-check-certificate "https:$setupprg" -O $opsiproduct_path/$product/CLIENT_DATA/$setupname

# Do we need to unzip the file first? If so, watch the right name of setup.exe is written in setup.ins
# --- unzip -o $opsiproduct_path/$product/CLIENT_DATA/$setupname  # -o -overwrite files without prompting!
# --- rm  $opsiproduct_path/$product/CLIENT_DATA/$setupname

# let's change the directory to the package
cd $opsiproduct_path/$product/
# remove the *.opsi-files
rm *.opsi
rm *.zsync
rm *.md5

# to find out, which version it is, we do a little bit of awk
if [ $startpos != 0 ]; then
    pos=$(echo $setupprg | grep -b -o $searchstr | awk 'BEGIN {FS=":"}{print $1}')
    # well done, we found it.
    version=$(echo $setupprg | cut -c$startpos-$pos)
else
    version=$alt_ver
fi
echo Version=$version
# now let's change the /OPSI/control file
sed "s/version:.*/version: $version /g" $opsiproduct_path/$product/OPSI/control > $opsiproduct_path/$product/OPSI/control.new
mv $opsiproduct_path/$product/OPSI/control.new $opsiproduct_path/$product/OPSI/control

# make new package, but quiet
opsi-makepackage -q
opsi-package-manager -i *.opsi
Cron darf übrigens die Ausgaben nicht unterdrücken. Es besteht sonst die Gefahr, dass man fehlgeschlagene Updates übersieht!

[edit]
Ich war so frei, alle meine Scripte in der Wiki einzustellen. So muss die Arbeit nicht zweimal gemacht werden.


Grüsskens,

Thomas
Kennst Du schon die WIKI für OPSI-Scripte? Fertige Installationsscripte bekommen und ablegen unter OPSI-Wiki
Aus dem Glashaus :) : UIB bietet auch Schulungen und Supportverträge für Opsi an.
Bild
Jan.Schmidt
Beiträge: 439
Registriert: 08 Jul 2017, 12:02

Re: Aktualisieren der Installationspakete nervt und daaaarum....

Beitrag von Jan.Schmidt »

Hi,

ich bin noch viel fauler als wie Du :D
Aber nicht so faul, dass ich die Zeile

Code: Alles auswählen

opsi-set-rights ./
einspare - die solltest du dir sicherheitshalber auch gönnen.

Weil ich auch geizig bin und "eine" Zeile mehr immer teuer ist - kannst du statt hier drei Zeilen zu vergeuden

Code: Alles auswählen

rm *.opsi
rm *.zsync
rm *.md5
das mit einer abfackeln

Code: Alles auswählen

rm *.ops*
Ps: Manchmal wird der oben beschriebene Weg nicht funzen, weil die Hersteller und Herstellerinnen (immer hybsch politisch korrekt :oops: )
Keine Versionsnummer direkt verlinken.

Dann brauchst du sowas

Code: Alles auswählen

version=$(exiftool installer.exe|grep "Product Version Number"|cut -d ' ' -f2- 
ja geht auch mit awk aber du siehst was ich meine

Gruß
Benutzeravatar
Thomas_H
Beiträge: 525
Registriert: 09 Jun 2010, 11:57
Wohnort: Havelland

Re: Aktualisieren der Installationspakete nervt und daaaarum....

Beitrag von Thomas_H »

Moinsens,

hoii, hätte nicht gedacht, dass da noch eine Antwort folgt. :)

Du hast recht, ein "Set-Rights" wäre nochmal gut, weil das Paket ja nicht unter Opsiuser erstellt wird, sondern unter dem Namen unter welchem cron läuft. Danke für den wichtigen Tip!
Weil ich auch geizig bin und "eine" Zeile mehr immer teuer ist - kannst du statt hier drei Zeilen zu vergeuden
[...]
das mit einer abfackeln

rm *.ops*
Ich hab's probiert und bin begeistert! Auch dafür Danke! :) Hab's in meinen Scripten gleich geändert. :)

Mit der Versionsnummer stimmt, das war auch mein Problem, weshalb ich dann das aktuelle Datum als "Versionsnummer" für das Paket genommen habe. Das ist nicht ideal, keine Frage, lässt aber den Admin zumindest wissen, wann zuletzt die Install.exe geholt wurde. Ich teste das auf jeden Fall mal aus.

Bin gespannt, ob es noch andere Opsi-Nutzer gibt, die noch fauler sind als wir beide. :lol:

Gruesskens Thomas
Kennst Du schon die WIKI für OPSI-Scripte? Fertige Installationsscripte bekommen und ablegen unter OPSI-Wiki
Aus dem Glashaus :) : UIB bietet auch Schulungen und Supportverträge für Opsi an.
Bild
Jan.Schmidt
Beiträge: 439
Registriert: 08 Jul 2017, 12:02

Re: Aktualisieren der Installationspakete nervt und daaaarum....

Beitrag von Jan.Schmidt »

Thomas_H hat geschrieben: 10 Mär 2022, 08:47
Ich muss unbedingt dafür sorgen, dass ich nach Ausführung dieser Scripte diese auch per Mail bekomme, damit ich überprüfen kann, ob alles funktioniert hat und die Pakete wirklich aktualisiert wurden.
Bin gespannt, ob es noch andere Opsi-Nutzer gibt, die noch fauler sind als wir beide. :lol:

Gruesskens Thomas
Den da hab ich glatt überlesen am sein getut getan...
$tomail iss ja klar und dass die kiste grundsätzlich mailen können muß eher auch.

Code: Alles auswählen

new=$(find /var/lib/opsi/depot/ -mtime -1)
if [[ $new ]]
   then
   echo we have a new Package $new>/home/opsi/mail.ini
   uuencode /home/opsi/mail.ini /home/opsi/mail.ini|mail -s "OPSI" $tomail< /home/opsi/mail.ini
   rm /home/opsi/mail.ini
fi
Sinngemäß - ich mach das natürlich ganz anders - so mit package_long (abc-123-1.opsi) und package_short (abc) und baller mir mit Package_short dann die Pakete mit dem opsi-admin auf meinen Testclientfuhrpark...
Antworten