Утилита Munki использует информацию из файла pkginfo и ищет элементы программного обеспечения, чтобы решить, требуется ли установка конкретного элемента. Чтобы создать функциональные элементы pkginfo, ознакомьтесь с методами, которые используются в Munki для проверки списка элементов программного обеспечения.
Методы
В порядке приоритетности Munki использует следующие способы для определения того, нужно ли установить (или удалить) данный элемент.
- Установка приложений macOS с помощью сценария проверки
- Установка приложений macOS с помощью элементов установки
- Установка приложений macOS с помощью поступлений
При сочетании этих методов используется только метод с наивысшим приоритетом. Например, если для данного элемента pkginfo заданы список «Установки» и список «Поступления», то при определении статуса установки поступления игнорируются. Несмотря на это, даже в этом случае при удалении элемента можно использовать поступления, поскольку они помогают Munki точно определить, какие файлы установлены.
Установка приложений macOS с помощью сценария проверки
Элемент pkginfo может при необходимости содержать installcheck_script. Сценарий проверки установки предоставляет способ определения необходимости установки программного элемента в тех случаях, где предоставление установок/поступлений неприемлемо или непрактично.
Основные примеры — средства командной строки, устанавливаемые через порт (MacPorts) или модули Python, установленные с помощью easy_install или pip, так как они не предоставляют простого способа определения установленной версии.
Необходимо написать сценарий проверки установки, чтобы код выхода 0 означал, что элемент в настоящее время не установлен и поэтому его следует установить. Все коды выхода, не равные нулю, указывают на то, что элемент установлен.
Пример сценария проверки установки, иллюстрирующий проверку, установлена ли текущая версия модуля Python argparse.
#!/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
При необходимости можно указать явный uninstallcheck_script, чтобы определить, следует ли удалить программный элемент. В этом случае сценарий с кодом выхода 0 указывает на то, что элемент установлен и что его следует удалить. Все коды выхода, не равные нулю, указывают на то, что элемент не установлен.
Установка приложений macOS с помощью элементов установки
Список элементов установки создается средством VMware AirWatch Admin Assistant для некоторых типов элементов установки (.dmg), но не для пакетов Apple (.pkg или .mpkg). Этот список можно создать (или изменить). Он является наиболее гибким механизмом определения состояния установки.
Список Установки может содержать любое количество таких элементов, как приложения, панели предпочтений, среды или другие пакетные элементы, файлы info.plist, простые каталоги или файлы. Можно использовать любое сочетание элементов, чтобы помочь Munki определить, установлен элемент или нет.
Пример автоматически сгенерированного списка «Установки» для 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>
Чтобы определить, установлена ли версия Firefox 6, Munki проверяет наличие приложения с идентификатором CFBundleIdentifier org.mozilla.firefox. Если оно найдено, Munki проверяет, что его версия (CFBundleShortVersionString) не ниже 6.0. Если Munki не может найти приложение или его версия ниже 6.0, это значит, что Firefox 6.0 не установлен. Списки установки могут содержать несколько элементов. Если какой либо элемент отсутствует или имеет более раннюю версию, он считается не установленным. Можно вручную создать элементы для добавления в список установок с помощью следующего файла 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>
Скопируйте и вставьте ключ и значение установок целиком или скопируйте только значение dict и добавьте его в существующий список установок в файле pkginfo. Munki проверяет наличие подключаемого модуля «/Library/Internet Plug-Ins/Flash Player.plugin» и, если он найден, его версию. Если версия ниже 10.3.183.5, будет считаться, что элемент не установлен. Можно создать элементы установки для любого элемента файловой системы, но Munki умеет определять только версии для пакетных элементов, которые содержат файлы Info.plist или version.plist с информацией о версии.
Для других элементов файловой системы Munki может только определить наличие (в случае не пакетного каталога) или вычислить контрольную сумму (для файлов). В случае файлов с контрольными суммами проверка завершится неудачно (и, следовательно, элемент будет считаться не установленным), если контрольная сумма для файла на диске не совпадает с контрольной суммой в 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>
Если нужно, чтобы Munki проверял только наличие файла без его содержимого, удалите сгенерированные сведения md5checksum в сведениях об элементе установки. Убедитесь, что указанный путь не поврежден.
<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 с помощью поступлений
При установке пакета Apple на компьютере можно генерировать уведомление о поступлении. Пакеты метаданных генерируют несколько поступлений. Средство VMware AirWatch Admin Assistant добавляет имена и версии этих поступлений добавляются в массив поступлений в pkginfo для пакета.
Ниже приведен массив поступлений для кодеков QuickTime Avid LE версии 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>
Если Munki использует массив поступлений для определения статуса установки, он проверяет существование и версию каждого поступления в массиве. Если какое-либо из поступлений отсутствует или имеет более низкую версию по сравнению с версией, указанной для этого поступления в массиве, элемент считается не установленным. Только если все поступления присутствуют и все версии совпадают с теми, которые указаны в pkginfo (или превышают их), элемент считается установленным. Для устранения неполадок используйте средство pkgutil, чтобы проверить установленные поступления.
# pkgutil --pkg-info com.avid.avidcodecsle
No receipt for 'com.avid.avidcodecsle' found at '/'.
В этом случае на данном компьютере не найдено поступление кодеков QuickTime Avid LE. Обычно сложность поступлений состоит в том, что при наличии большого количества пакетов метаданных логика установки приводит к тому, что устанавливается только поднабор подпакетов. Как правило, в списке поступлений содержится поступление для каждого подпакета в пакете метаданных (и эта информация необходима, если Munki получает запрос на удаление программного элемента на основе получений пакетов). Но если это нормально и ожидалось, что не все подпакеты будут установлены, Munki будет постоянно отмечать этот элемент как не установленный и предлагать установить его снова и снова. Одним из решений этой проблемы является добавление дополнительного ключа со значением «true» для поступлений, которые устанавливаются при необходимости. Munki не учитывает эти поступления при определении статуса установки.
<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>
Другим решением в этой ситуации является предоставление массива установок, в котором перечислены элементы, установленные пакетом. Вместо поступлений Munki может использовать массивы установок для определения статуса установки.