Aktualisieren der Installationspakete nervt und daaaarum....
Verfasst: 10 Feb 2022, 13:24
...hab ich mich entschlossen, OPSI den Rücken zu kehren...
Neein, natürlich nicht!
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.
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.
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.
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!)
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

Neein, natürlich nicht!

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.

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.

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
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
So... Feuer frei.

Grüsskens,
Thomas_H