Munkianvender information fra pkginfo-filen og søger efter softwareelementer for at bestemme, hvorvidt et bestemt element skal installeres. For at oprette et funktionelt pkginfo-element, skal du forstå de metoder, der anvendes af Munki til at tjekke listen over softwareelementer.
Metoder
Munki anvender i prioriteret rækkefølge følgende metoder til at bestemme, om den angivne vare skal installeres (eller fjernes):
- Installer macOS-apps ved hjælp af kontrolscriptet
- Installer macOS-apps ved hjælp af installationselementer
- Installer macOS-apps ved hjælp af kvitteringerne
Når disse metoder kombineres, er det kun den højeste prioritetsmetode der anvendes. Hvis et bestemt pkginfo-element for eksempel har både en "installerer"-liste og en "kvitteringer"-liste, vil kvitteringerne blive ignoreret for at fastlægge installationsstatus. Men i dette tilfælde kan kvitteringer anvendes, når der fjernes et element, da de hjælper Munki med at bestemme, nøjagtigt hvilke filer der blev installeret.
Installer macOS-apps ved hjælp af kontrolscriptet
Et pkginfo-element kan valgfrit indeholde et installcheck_script. Installcheckscriptet giver en metode til at bestemme om et softwareelement skal installeres, hvor installation/kvitteringer er utilstrækkelige eller upraktiske.
Kommandolinjeværktøjer, der typisk installeres gennem port (MacPorts) eller Python-moduler installeret med easy_install eller pip er gode eksempler, da de ikke har en nem metode til at bestemme deres installerede version.
Et installations check_script bør skrives således, at en lukningskode på 0 indikerer at elementet ikke er installeret og derfor bør installeres. Alle ikke-nul lukningskoder indikerer, at elementet er installeret.
Et eksempel på installcheck_script, der illustrerer en kontrol for at fastslå, om den aktuelle version af argparse Python-modulet er installeret.
#!/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
Valgfrit kan et eksplicit uninstallcheck_script angives for at bestemme, hvorvidt et softwareelement bør fjernes. I dette tilfælde, vil scriptet med en lukningskode på 0 indikere at elementet er installeret på nuværende tidspunkt og at denne fjernelse burde foregå. Alle ikke-nul lukningskoder indikerer, at elementet ikke er installeret.
Installer macOS-apps ved hjælp af installationselementer
Listen med installationselementer genereres af VMware AirWatch Admin Assistant for nogle typer installationselementer (.dmg), men ikke for Apple-pakker (.pkg eller .mpkg). Du kan generere (eller ændre) denne liste, og det er den mest fleksible mekanisme til at bestemme installationsstatus.
Listen Installationer kan indeholde et vilkårligt antal elementer såsom apps, indstillingsvinduer, rammer eller andre bundt-formatelementer, info.plists, simple mapper eller filer. Du kan anvende en kombination af elementer til at hjælpe Munki med at afgøre, om et element er installeret eller ej.
Et eksempel på en automatisk genereret "installationer"-liste for 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>
For at fastslå om Firefox 6 er installeret eller ej, tjekker Munki efter en app med en CFBundleIdentifier, der hedder org.mozilla.firefox og hvis fundet, bekræfter det, at dens version (CFBundleShortVersionString) er mindst 6.0. Hvis Munki ikke kan finde appen eller dens version er lavere end 6,0, betragter den Firefox-6.0 som ikke installeret. Installationslister kan indeholde flere elementer. Hvis et element mangler eller har en ældre version, anses elementet ikke for installeret. Du kan manuelt generere elementer, der skal føjes til en Installations-liste ved hjælp af følgende 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>
Kopiér og Indsæt hele Installationer-nøglen og værdien, eller kopier kun dict-værdien, og føj den til en eksisterende installationsliste i din pkginfo-fil. Munkitjekker, om der findes /Library/Internet Plug-Ins/Flash Player.plugin, og hvis det findes, tjekker det versionen. Hvis versionen er lavere end 10.3.183.5, opfattes elementet som ikke installeret. Du kan generere installerede elementer for alle filsystemelementer, men kun Munki ved hvordan man bestemmer, hvilke versioner for bundletypeelementer, der indeholder Info.plist eller version.plist med versionsoplysninger.
For andre elementer i filsystemet kan Munki kun bestemme eksistensen i tilfælde af en ikke-bundtet mappe eller beregne en kontrolsum (for filer). For filer med kontrolsummer mislykkes testen (og derfor vil elementet ikke blive installeret), hvis kontrolsummen for filen på disken ikke matcher kontrolsummen i 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>
Hvis du ønsker, at Munki kun skal tjekke for eksistensen af en fil og ikke dens indhold, skal du fjerne de genererede md5checksum-oplysninger i elementinfo for installation. Sørg for at den angivne sti er intakt.
<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>
Installer macOS-apps ved hjælp af kvitteringerne
Når en pakke i Apple-format installeres, genereres der en kvittering på maskinen. Meta-pakker genererer flere kvitteringer. VMware AirWatch Admin Assistant tilføjer navne og versioner for disse kvitteringer til en kvitteringsmatrix i pkginfo for en pakke.
Følgende er en kvitteringsmatrix for Avid LE QuickTime-codecs, version 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>
Hvis Munki anvender kvitteringsmatrixen til at bestemme installationsstatus, godkender det for eksistensen og versionen af hver kvittering i matrixen. Hvis en kvittering mangler eller har et lavere versionsnummer end den version, der er angivet for den pågældende kvittering i kvitteringsmatrixen, betragtes elementet som ikke installeret. Kun hvis hver kvittering er tilstede, og alle versioner er de samme som dem i pkginfo (eller højere), anses elementet for at være installeret. For at foretage fejlfinding af problemer skal du anvende pkgutil-værktøjet til at undersøge de installerede kvitteringer.
# pkgutil --pkg-info com.avid.avidcodecsle
No receipt for 'com.avid.avidcodecsle' found at '/'.
I dette tilfælde blev kvitteringen for Avid LE QuickTime-codecs ikke fundet på denne computer. Et hyppigt problem med kvitteringer er at med mange meta-pakker vil installationslogikken kun resultere i en delpakke af de underpakker, der installeres. Generelt indeholder kvitteringslisten en kvittering for hver underpakke i en meta-pakke (og kræver denne information, hvis Munki bliver bedt om at fjerne softwareelementet baseret på pakkekvitteringer). Men hvis det er normalt og forventet, at ikke alle underpakker vil blive installeret, så vil Munki markere elementet som ikke installeret og tilbyde at installere det igen og igen. En løsning på dette problem er at tilføje en valgfri nøgle med værdien sand for de kvitteringer, der er valgfrit installeret. Munki vil derefter ikke tage hensyn til disse kvitteringer ved bestemmelse af installationsstatus.
<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>
En anden løsning for denne situation er at angive installations-matrixen, der viser en liste over elementer der er installeret af pakken. Munki kan bruge oplysninger fra installations-matrixen i stedet for kvitteringer for at bestemme installationsstatus.