O Munki usa informações do arquivo pkginfo e procura os itens de software para decidir se determinado item deve ou não ser instalado. Para criar um item funcional do pkginfo, entenda os métodos usados pelo Munki para verificar a lista de itens do software.
Métodos
Na ordem de precedência, Munki usa os seguintes métodos para determinar se o item especificado precisa ser instalado (ou removido):
- Instalar aplicativos macOS usando o script de verificação
- Instalar aplicativos macOS usando os itens de instalação
- Instalar aplicativos macOS usando as confirmações
Ao combinar esses métodos, somente o método de prioridade mais alta é usado. Por exemplo, se determinado item pkginfo tiver uma lista de "instalações" e uma lista de "confirmações", as confirmações serão ignoradas para determinar o status da instalação. Mesmo nesse caso, porém, as confirmações podem ser usadas ao remover um item, pois ajudam o Munki a determinar exatamente quais arquivos foram instalados.
Instalar aplicativos macOS usando o script de verificação
Um item pkginfo pode opcionalmente conter um installcheck_script. O install check script fornece um método para determinar se um item de software precisa ser instalado, onde fornecer instalações/recibos é inadequado ou não prático.
As ferramentas de linha de comando normalmente instaladas pela porta (MacPorts) ou módulos de Python instalados usando easy_install ou pip são exemplos fundamentais, pois não fornecem um método fácil para determinar a versão instalada deles.
Um install check script deve ser gravado de tal forma que um código de saída de 0 indique que o item não está atualmente instalado e, portanto, deve ser instalado. Todos os códigos de saída diferentes de zero indicam que o item está instalado.
Um exemplo de installcheck_script é ilustrado por uma verificação para determinar se a versão atual do módulo argparse de Python está instalada.
#!/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
Opcionalmente, um uninstallcheck_script pode ser fornecido para determinar se um item de software deve ou não ser removido. Nesse caso, o script com um código de saída 0 indica que o item está instalado no momento e que a remoção deve ocorrer. Todos os códigos de saída diferentes de zero indicam que o item não está instalado.
Instalar aplicativos macOS usando os itens de instalação
A lista de itens de instalação é gerada pelo VMware AirWatch Admin Assistant para alguns tipos de itens de instalação (.dmg), mas não para pacotes da Apple (.pkg ou .mpkg). Você pode gerar (ou modificar) essa lista, e ela é o mecanismo mais flexível para determinar o status da instalação.
A lista de instalações pode conter qualquer número de itens, como aplicativos, painéis de preferências, estruturas ou outros itens de estilo de pacote, info.plists, diretórios simples ou arquivos. Você pode usar qualquer combinação de itens para ajudar o Munki a determinar se um item está instalado ou não.
Um exemplo de uma lista de "instalações" gerada automaticamente para o 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>
Para determinar se o Firefox 6 está instalado ou não, o Munki verifica se há um aplicativo com um CFBundleIdentifier de org.mozilla.firefox e, se localizado, verifica se a versão dele (CFBundleShortVersionString) é pelo menos 6.0. Se o Munki não conseguir encontrar o aplicativo ou sua versão for anterior à 6.0, ele considerará o Firefox-6.0 como não instalado. As listas de instalações podem conter vários itens. Se algum item estiver faltando ou tiver uma versão mais antiga, o item será considerado não instalado. Você pode gerar manualmente itens para adicionar a uma lista de instalações usando o seguinte 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>
Copie e cole toda a chave e o valor das instalações, ou copie apenas o valor dict e adicione-o a uma lista de instalações existente dentro do seu arquivo pkginfo. O Munki verifica a existência de /Library/Internet Plug-Ins/Flash Player.plugin e, se encontrado, verifique a versão ele. Se a versão for inferior à 10.3.183.5, o item seria considerado não instalado. Você pode gerar itens de instalação para qualquer item do sistema de arquivos, mas o Munki sabe somente como determinar as versões para itens de estilo de pacote que contêm um Info.plist ou version.plist com informações de versão.
Para outros itens do sistema de arquivos, o Munki só pode determinar a existência (no caso de um diretório não empacotado), ou pode calcular uma soma de verificação (para arquivos). Para arquivos com somas de verificação, o teste falha (e, portanto, o item será considerado não instalado) se a soma de verificação do arquivo no disco não corresponder à soma de verificação no 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>
Se você quiser que o Munki verifique apenas a existência de um arquivo e não se preocupe com o conteúdo dele, remova as informações geradas do md5checksum nas informações do item de instalação. Certifique-se de que o caminho fornecido esteja intacto.
<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>
Instalar aplicativos macOS usando as confirmações
Quando um pacote estilo Apple é instalado, você pode gerar uma confirmação na máquina. Os metapacotes geram várias confirmações. O VMware AirWatch Admin Assistant adiciona os nomes e as versões dessas confirmações a uma matriz de confirmações no pkginfo de um pacote.
A seguir está uma matriz de confirmações para os codecs Avid LE QuickTime, versão 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>
Se o Munki estiver usando a matriz de confirmações para determinar o status da instalação, ele verificará a existência e a versão de cada confirmação na matriz. Se alguma confirmação estiver faltando ou tiver um número de versão inferior à versão especificada para esse recibo na matriz de confirmações, o item será considerado como não instalado. Somente se cada confirmação estiver presente e todas as versões forem iguais às do pkginfo (ou superior) o item é considerado instalado. Para solucionar problemas, use a ferramenta pkgutil para examinar as confirmações instaladas.
# pkgutil --pkg-info com.avid.avidcodecsle
No receipt for 'com.avid.avidcodecsle' found at '/'.
Neste caso, a confirmação dos codecs Avid LE QuickTime não foi encontrada nesta máquina. Uma complicação comum com confirmações é, com muitos metapacotes, a lógica de instalação resulta na instalação de apenas um subconjunto dos subpacotes. Em geral, a lista de confirmações contém uma confirmação para cada subpacote em um metapacote (e precisa dessa informação se for solicitado ao Munki que remova o item de software com base nas confirmações dos pacotes). Porém, se é normal e espera-se que nem todos os subpacotes sejam realmente instalados, o Munki marcará o item como não instalado no momento e oferecerá a instalação dele incessantemente. Uma solução para esse problema é adicionar uma chave opcional com o valor true às confirmações opcionalmente instaladas. O Munki não considera essas confirmações ao determinar o status da instalação.
<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>
Outra solução para esta situação é fornecer a matriz de instalação que lista itens que são instalados pelo pacote. O Munki pode usar as informações da matriz de instalação em vez das confirmações para determinar o status da instalação.