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.

Next Post Previous Post