WPKG 3: wpkgExpress
wpkgExpress bietet nicht nur eine Oberfläche um Packages, Hosts und Profiles zu verwalten, es liefert diese auch selbst aus.
Dies ist in der WPKG config.xml
entsprechend zu vermerken:
<param name='wpkg_base' value='http://192.168.1.1/wpkg' />
<param name='packages_file_name' value='packages.xml' />
<param name='profiles_file_name' value='profiles.xml' />
<param name='hosts_file_name' value='hosts.xml' />
wpkgExpress wird einfach im docroot
des Webservers abgelegt. Wenn die config.xml
korrekt angepasst wurde und bereits Pakete angelegt wurden importiert wpkgExpress diese bei der ersten Verwendung automatisch.
Zunächst ist aber die wpkgExpress-Konfiguration vorzunehmen, diese Startet automatisch wenn wpkgExpress über das Webinterface aufgerufen wird. Damit man sich ein besseres Bild machen kann, hier ein Link zu den wichtigsten Screens: https://code.google.com/p/wpkgexpress/wiki/Screenshots
Die Einstellungen werden in folgenden Dateien abgelegt:
- config/core.php
- config/database.php
- config/wpkgExpress.php
Nun kann man mit der Erstellung von Paketen, Profilen und Hosts beginnen. In der Regel sollte man hierbei mit den Hosts beginnen und diese einem Profil zuordnen. Dann können die Pakete erstellt werden.
Paket erstellen
Das neue Paket wird mit folgenden Einstellungen erzeugt:
<package id="java" name="Java" revision="7.04" priority="0" reboot="false" execute="once">
<install cmd="\\192.168.1.1\wpkg\software\Java\java.exe"/>
<upgrade cmd="\\192.168.1.1\wpkg\software\Java\java.exe"/>
<remove cmd="MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83217004FF} /qn"/>
<remove cmd="MsiExec.exe /X{1111706F-666A-4037-7777-210328764D10} /qn"/>
</package>
Die Option execute="once"
bewirkt, dass das Paket nur einmal installiert wird, obwohl keine Checks hinterlegt sind. Tritt während der Installation ein Fehler auf (errorlevel != 0) wird die Installation bei der nächsten Ausführung erneut versucht. Alternativ kann man mit Package-Checks arbeiten:
<package id="acdsee" name="ACDSee Fotomanager 12" revision="12.0.344.0" priority="50" reboot="false">
<variable name="version" value="12.0.344.0"/>
<check type="logical" condition="or">
<check type="file" condition="versionequalto" path="%PROGRAMFILES%\ACD Systems\ACDSee\12.0\ACDSee12.exe" value="%version%"/>
<check type="file" condition="versionequalto" path="%PROGRAMFILES(x86)%\ACD Systems\ACDSee\12.0\ACDSee12.exe" value="%version%"/>
</check>
<install cmd="msiexec /i "\\192.168.1.1\wpkg\software\ACDSee\ACDSee12.msi" /qn DISABLE_SOFTWARE_UPDATE=1"/>
<upgrade cmd="msiexec /i "\\192.168.1.1\wpkg\software\ACDSee\ACDSee12.msi" /qn DISABLE_SOFTWARE_UPDATE=1"/>
</package>
Hier entscheidet dann nicht mehr nur der Installer-Errorlevel (ExitCode) über Erfolg oder Misserfolg sondern es wird auch noch nachgeschaut ob die Datei %PROGRAMFILES%\ACD Systems\ACDSee\12.0\ACDSee12.exe
bzw. %PROGRAMFILES(x86)%\ACD Systems\ACDSee\12.0\ACDSee12.exe
die Version 12.0.344.0
aufweist. Ist dies nicht der Fall gilt die Installation als gescheitert und wird beim nächsten WPKG-Lauf wiederholt.
Liefert ein Installationsprogramm trotz erfolgreicher Installation einen anderen Errorlevel zurück so muss dieser im Paket angegeben werden:
<package id="java" name="Java" revision="7.04" priority="0" reboot="false" execute="once">
<install cmd="\\192.168.1.21\wpkg\software\Java\install.exe">
<exit code="1" reboot="false"/>
</install>
<upgrade cmd="\\192.168.1.21\wpkg\software\Java\upgrade.exe">
<exit code="1" reboot="false"/>
</upgrade>
<remove cmd="\\192.168.1.21\wpkg\software\Java\remove.exe">
<exit code="1" reboot="false"/>
</remove>
</package>
Installer Script
Mit AutoIt wird nun ein Script erstellt, welches die Installation vorbereitet:
; install.au3
; Uninstall Java JRE6
uninstall("{1111706F-666A-4037-7777-210328764D10}")
uninstall("{26A24AE4-039D-4CA4-87B4-2F83216032FF}")
; If Uninstall fails to delete all files, remove them by hand
delete("Java/jre6")
Func uninstall($id)
local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $id
local $var = RegEnumKey($key, 1)
local $string = RegRead($key & $var, "UninstallString")
if $string Then
RunWait("MsiExec.exe /X "& $id &" /qn")
RegDelete($key)
EndIf
EndFunc
Func delete($path)
if FileExists(@ProgramFilesDir & $path) then
DirRemove(@ProgramFilesDir & $path,1)
EndIf
EndFunc
; Run Setup
If @OSArch = "X86" Then
RunWait("\\192.168.1.1\wpkg\software\java\setup.exe /s")
Else
RunWait("\\192.168.1.1\wpkg\software\java\setup64.exe /s")
EndIf
Zunächst wird ggf. eine alte Version der zu installierenden Software entfernt. Hierzu muss der/die entsprechende Registry-Key(s) angegeben werden. Diese finden sich in der Registry des Clients unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
. Das Script prüft zunächst ob der entsprechende Key vorhanden ist, falls ja wird die Deinstallation durchgeführt.
Um ganz sicherzugehen, dass alle Dateien der Vorgängerversion entfernt wurden kann noch das Programmverzeichnis gelöscht werden. Hier sollte jedoch geprüft werden, ob dabei nicht eventuell Einstellungen verloren gehen die noch benötigt werden. Im Zweifel kann delete
entfallen. Das Macro @ProgramFilesDir
stellt hierbei sicher, dass der Unterschied im Pfad zwischen 32/64-bit Systemen entsprechend berücksichtigt wird.
Der RegKey für die Deinstallation wird von manchen Programmen nicht korrekt entfernt, daher kümmert sich das Script im Anschluss selbst darum.
Wenn die Deinstallation (sofern nötig) durchgeführt wurde startet die eigentliche Installation. Sofern es unterschiedliche Setups für 32/64-bit Systeme gibt kann dies mit @OSArch
geprüft werden.
Das Script wird (nach erfolgreichem Test) in eine EXE umgewandelt und zusammen mit dem eigentlichen Installer auf \\192.168.1.1\wpkg\$software\$package
abgelegt.
Für das remove cmd
kann ebenfalls ein entsprechendes Script angefertigt werden, falls nötig.
Im besten Fall gibt es folgende Scripte für jede mögliche Paketaktion:
install cmd
; install.au3
If @OSArch = "X86" Then
RunWait("\\192.168.1.1\wpkg\software\java\setup.exe /s")
Else
RunWait("\\192.168.1.1\wpkg\software\java\setup64.exe /s")
EndIf
upgrade cmd
; upgrade.au3
; Uninstall Java JRE6
uninstall("{1111706F-666A-4037-7777-210328764D10}")
uninstall("{26A24AE4-039D-4CA4-87B4-2F83216032FF}")
Func uninstall($id)
local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $id
local $var = RegEnumKey($key, 1)
local $string = RegRead($key & $var, "UninstallString")
if $string Then
RunWait("MsiExec.exe /X "& $id &" /qn")
EndIf
EndFunc
; Run Setup
If @OSArch = "X86" Then
RunWait("\\192.168.1.1\wpkg\software\java\setup.exe /s")
Else
RunWait("\\192.168.1.1\wpkg\software\java\setup64.exe /s")
EndIf
remove cmd
; remove.au3
; Uninstall Java JRE6
uninstall("{3111706F-366A-3037-3777-210328764D13}")
uninstall("{36A24AE4-339D-3CA4-37B4-2F83216032F3}")
; If Uninstall fails to delete all files, remove them by hand
delete("Java/jre7")
Func uninstall($id)
local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & $id
local $var = RegEnumKey($key, 1)
local $string = RegRead($key & $var, "UninstallString")
if $string Then
RunWait("MsiExec.exe /X "& $id &" /qn")
RegDelete($key)
EndIf
EndFunc
Func delete($path)
if FileExists(@ProgramFilesDir & $path) then
DirRemove(@ProgramFilesDir & $path,1)
EndIf
EndFunc
Nach der erfolgreichen Umwandlung der au3
-Files in exe
-Dateien können diese in den Packages genutzt werden. Es ist natürlich nicht nötig immer alle Aktionen (Install
, Upgrade
, Downgrade
und Remove
) zu füllen. Meist reicht Install
und Upgrade
aus. Unterstützt ein Installer von sich aus Silent Installation und braucht keine separaten Befehle für 32/64-Bit können die Installaufrufe natürlich auch direkt in das Package aufgenommen werden.