Munki gebruikt informatie uit het pkginfo-bestand en zoekt dan naar de software-items om te bepalen of een bepaald item al dan niet moet worden geïnstalleerd. Als u functionele pkginfo-items wilt maken, begrijp dan de methoden die door Munki worden gebruikt om de lijst met software-items te controleren.
Methodes
In volgorde van prioriteit gebruikt Munki de volgende methoden om te bepalen of het gegeven item moet worden geïnstalleerd (of verwijderd):
- macOS-applicaties installeren met behulp van het controlescript
- macOS-applicaties installeren met behulp van de installatie-items
- macOS-applicaties installeren met behulp van 'receipts'
Wanneer u deze methoden combineert, wordt alleen de methode met de hoogste prioriteit gebruikt. Als een bepaald pkginfo-item bijvoorbeeld zowel een lijst met 'installs' heeft als een lijst met 'receipts', worden de 'receipts' genegeerd bij het bepalen van de installatiestatus. Zelfs in dit geval kunnen er echter 'receipts' worden gebruikt bij het verwijderen van een item, omdat ze Munki helpen te bepalen welke bestanden er zijn geïnstalleerd.
macOS-applicaties installeren met behulp van het controlescript
Een pkginfo-item kan optioneel een installcheck_script bevatten. Het installatiecontrolescript biedt een methode om te bepalen of er een software-item moet worden geïnstalleerd, wanneer het aanleveren van 'installs/receipts' ontoereikend of onpraktisch is.
Commandoregelprogramma's die doorgaans worden geïnstalleerd via ports (MacPorts) of Python-modules die worden geïnstalleerd met easy_install of PIP, zijn uitstekende voorbeelden omdat ze geen eenvoudige methode bieden voor het bepalen van de geïnstalleerde versie.
Een installatiecontrolescript zou dan moeten worden geschreven, waarbij een afsluitcode van 0 aangeeft dat het item momenteel niet is geïnstalleerd en daarom moet worden geïnstalleerd. Alle afsluitcodes die niet gelijk zijn aan nul geven aan dat het item is geïnstalleerd.
Een voorbeeld van een installatiecontrolescript met een controle om te bepalen of de huidige versie van de argparse Python-module is geïnstalleerd.
#!/bin/sh# Grab current version of installed python moduleversion="$(python -c 'import argparse;print argparse.__version__' 2>/dev/null)"# Compare with the version we want to installif [ ${version:-0} < 1.2.1 ]; thenexit 0elseexit 1fi
Optioneel kan een expliciet installatiecontrolescript worden opgegeven om te bepalen of een software-item moet worden verwijderd. In dit geval geeft het script met een afsluitcode van 0 aan dat het item momenteel is geïnstalleerd en dat de verwijdering moet plaatsvinden. Alle afsluitcodes die niet gelijk zijn aan nul geven aan dat het item niet is geïnstalleerd.
macOS-applicaties installeren met behulp van de installatie-items
De lijst met te installeren items wordt gegenereerd door de VMware AirWatch Admin Assistant voor bepaalde typen installatie-items (.dmg), maar niet voor Apple-pakketten (.pkg of mpkg). U kunt deze lijst genereren (of wijzigen) en dit is het meest flexibele mechanisme voor het bepalen van de installatiestatus.
De lijst met 'installs' kan een willekeurig aantal items bevatten, zoals applicaties, voorkeursvensters, frameworks of andere gebundelde items, zoals info.plists, eenvoudige mappen of bestanden. U kunt iedere willekeurige combinatie van items gebruiken om Munki te helpen bepalen of een item is geïnstalleerd of niet.
Een voorbeeld van een automatisch gegenereerde lijst met 'installs' voor Firefox 6.0
<key>installs</key><array>
<dict>
<key>CFBundleIdentifier</key>
<string>org.mozilla.firefox</string>
<key>CFBundleName</key>
<string>Firefox</string>
<key>CFBundleShortVersionString</key>
<string>6.0</string>
<key>minosversion</key>
<string>10.5</string>
<key>path</key>
<string>Applications/Firefox.app</string>
<key>type</key>
<string>application</string>
</dict>
</array>
Om te bepalen of Firefox 6 geïnstalleerd is of niet, controleert Munki of een applicatie met een CFBundleIdentifier van org.mozilla.firefox aanwezig is, en indien deze wordt gevonden, of de versie (CFBundleShortVersionString) ten minste 6.0 is. Als Munki de applicatie niet kan vinden of als de versie lager is dan 6.0, wordt Firefox 6.0 beschouwt als niet geïnstalleerd. Lijsten met 'installs' kunnen meerdere items bevatten. Als een item ontbreekt of een oudere versie heeft, wordt het item beschouwd als niet geïnstalleerd. U kunt handmatig items genereren om toe te voegen aan een lijst met 'installs' met behulp van de volgende pkginfo:
/Library/Application\ Support/AirWatch/Data/Munki/bin/makepkginfo -f /Library/Interne
t\ Plug-Ins/Flash\ Player.plugin
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/Prope
rtyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>installs</key>
<array>
<dict>
<key>CFBundleShortVersionString</key>
<string>10.3.183.5</string>
<key>path</key>
<string>/Library/Internet Plug-Ins/Flash Player.plugin</string>
<key>type</key>
<string>bundle</string>
</dict>
</array>
</dict>
</plist>
Kopieer en plak de volledige 'installs'-sleutel en -waarde, of kopieer alleen de dict-waarde en voeg deze toe aan een bestaande lijst met 'installs' in uw pkginfo-bestand. Munki controleert of /Library/Internet Plug-Ins/Flash Player.plugin bestaat en, indien gevonden, wat de versie ervan is. Als de versie lager is dan 10.3.183.5, wordt het item als niet-geïnstalleerd beschouwd. U kunt voor elk item in een bestandssysteem 'installs'-items genereren, maar Munki weet alleen de versies te bepalen van gebundelde items die een Info.plist of version.plist bevatten met versie-informatie.
Voor andere items in het bestandssysteem kan Munki alleen het bestaan bepalen (in het geval van een niet-bundel-map) of een checksum berekenen (voor bestanden). Voor bestanden met checksums mislukt de test (en dus wordt het item als niet-geïnstalleerd beschouwd) als de checksum van het bestand op de schijf niet overeenkomt met de checksum in de pkginfo.
<key>installs</key>
<array>
<dict>
<key>md5checksum</key>
<string>087fe4805b63412ec3ed559b0cd9be71</string>
<key>path</key>
<string>/private/var/db/dslocal/nodes/MCX/computergroups/loginwindow.plist</s
tring>
<key>type</key>
<string>file</string>
</dict>
</array>
Als u wilt dat Munki alleen controleert op het bestaan van een bestand en de inhoud niet controleert, verwijdert u de gegenereerde md5checksum-informatie in de informatie van het 'installs'-item. Zorg ervoor dat het opgegeven pad juist is.
<key>installs</key>
<array>
<dict>
<key>path</key>
<string>/private/var/db/dslocal/nodes/MCX/computergroups/loginwindow.plist
</string>
<key>type</key>
<string>file</string>
</dict>
</array>
macOS-applicaties installeren met behulp van 'receipts'
Wanneer een pakket van het type Apple wordt geïnstalleerd, kunt u een 'receipt' (ontvangstbewijs) genereren op de machine. Metapakketten genereren meerdere 'receipts'. De VMware AirWatch Admin Assistant voegt de namen en versies van die 'receipts' toe aan een array met 'receipts' in de pkginfo van een pakket.
Hieronder ziet u een array met 'receipts' voor de Avid LE QuickTime-codecs, versie 2.3.4.
<key>receipts</key>
<array>
<dict>
<key>filename</key>
<string>AvidCodecsLE.pkg</string>
<key>installed_size</key>
<integer>1188</integer>
<key>name</key>
<string>AvidCodecsLE</string>
<key>packageid</key>
<string>com.avid.avidcodecsle</string>
<key>version</key>
<string>2.3.4</string>
</dict>
</array>
Als Munki de array met 'receipts' gebruikt om de installatiestatus te bepalen, wordt het bestaan en de versie van elke 'receipt' in de array gecontroleerd. Als een 'receipt' ontbreekt of een lager versienummer heeft dan de versie die is opgegeven voor dat 'receipt' in de array met 'receipts', wordt het item als niet-geïnstalleerd beschouwd. Alleen als elk 'receipt' aanwezig is en alle versies identiek zijn aan die in pkginfo (of hoger), wordt het item als geïnstalleerd beschouwd. Om problemen op te lossen, gebruikt u het hulpprogramma pkgutil om de geïnstalleerde 'receipts' te controleren.
# pkgutil --pkg-info com.avid.avidcodecsle
No receipt for 'com.avid.avidcodecsle' found at '/'.
In dit geval is het 'receipt' van de Avid LE QuickTime-codecs niet gevonden op deze machine. Bij veel metapakketten is een algemene complicatie met 'receipts' dat de installatielogica ertoe leidt dat slechts een subset van de subpakketten wordt geïnstalleerd. Doorgaans bevat de lijst met 'receipts' een 'receipt' voor elk subpakket in een metapakket (en deze informatie is ook nodig als Munki wordt gevraagd het software-item te verwijderen op basis van 'receipts' van pakketten). Maar als het normaal is en u verwacht dat niet elk subpakket daadwerkelijk wordt geïnstalleerd, zal Munki het item continu als niet-geïnstalleerd markeren en steeds opnieuw aanbieden om het te installeren. Eén oplossing voor dit probleem is het toevoegen van een optionele sleutel met de waarde 'true' voor de 'receipts' die optioneel zijn geïnstalleerd. Munki zal deze 'receipts' dan niet in aanmerking nemen bij het bepalen van de installatiestatus.
<key>receipts</key>
<array>
<dict>
<key>filename</key>
<string>mandatory.pkg</string>
<key>installed_size</key>
<integer>1188</integer>
<key>name</key>
<string>Mandatory</string>
<key>packageid</key>
<string>com.foo.mandatory</string>
<key>version</key>
<string>1.0</string>
</dict>
<dict>
<key>filename</key>
<string>optional.pkg</string>
<key>installed_size</key>
<integer>1188</integer>
<key>name</key>
<string>Optional</string>
<key>optional</key>
<true/>
<key>packageid</key>
<string>com.foo.optional</string>
<key>version</key>
<string>1.0</string>
</dict>
</array>
Een andere oplossing voor deze situatie is om een array met 'installs' op te geven met items die door het pakket worden geïnstalleerd. Munki kan een array met 'installs' gebruiken in plaats van de 'receipts' om de installatiestatus te bepalen.