管理されているmacOSデバイスに、最新バーションのアプリケーションを配布する方法として、Installomatorというスクリプトがあります。
以前、Jamf ProとInstallomatorで常に最新のアプリケーションを配布するの記事では基本的な使い方を紹介しました。 今回はInstallomatorをより深く理解するために、Installomatorで使用できるパラメータたちを紹介します。
この記事はv10.5時点の情報です。バージョンアップ後の内容とは異なる場合があります。
この記事はcorp-engr 情シスSlack(コーポレートエンジニア x 情シス)#1 Advent Calendar 2024の9日目の記事でもあります。
Installomatorの挙動を制御するパラメータ
スクリプト内にはいくつかのデフォルト設定がありますが、スクリプトを呼び出すときにカスタマイズできます。 以下の表では、初期状態で選択される値に「デフォルト」と付記しています。
DEBUG
デバッグモードに関する設定です。
| 値 | 説明 |
|---|---|
0 |
デバッグモードを無効化する。 |
1デフォルト |
デバッグモードを有効化する。スクリプトを実行したディレクトリにインストーラがダウンロードされる。また、バーションチェックは行われない。 |
2 |
デバッグモードを有効化する。インストーラを一時ディレクトリにダウンロードし、ブロックしているプロセスのチェックおよび、バージョンをチェックをする。何もインストールせず、現在のバージョンも削除しない。 |
LOGGING
ログの出力に関する設定です。
| 値 | 説明 |
|---|---|
DEBUG |
DEBUGが有効な場合のデフォルト。すべてのログを出力する。 |
INFOデフォルト |
通常のログを出力する。 |
WARN |
警告のログのみを出力する。 |
ERROR |
エラーのログのみを出力する。 |
REQ |
通常のログよりも少ない必要最低限のログのみを出力する。 |
NOTIFY
ユーザーに表示される通知を制御する設定です。
| 値 | 説明 |
|---|---|
successデフォルト |
インストールが成功した場合に通知を行う。 |
silent |
通知をしない。 |
all |
ダウンロード中、更新不要、インストール完了、失敗時に通知を行う。 |
通知方法の優先順位は以下のとおりです。
NOTIFY_DIALOGパラメータが有効で、swiftDialogのバージョン2以上がインストールされている場合は、swiftDialogが使用される。- Jamf Proでエンロールされている場合は、
Management Action.appが使用される。 - Workspace ONEでエンロールされている場合は、
Hub CLIが使用される。 - swiftDialogのバージョン2以上がインストールされている場合は、swiftDialogが使用される。
- AppleScriptを使用した通知センターへの通知が使用される。
NOTIFY_DIALOG
swiftDialogを使用するかどうかを制御する設定です。
| 値 | 説明 |
|---|---|
0デフォルト |
通知にswiftDialogを使用しない。 |
1 |
通知にswiftDialogを使用する。 |
LOGO
実行中のブロッキングプロセスがあった場合のダイアログに表示されるアイコンを指定する設定です。
| 値 | 説明 |
|---|---|
appstoreデフォルト |
App Storeのアイコンを使用する。 |
jamf |
Jamf Proのアイコンを使用する。 |
mosyleb |
Mosyle Businessのアイコンを使用する。 |
mosylem |
Mosyle Managerのアイコンを使用する。 |
addigy |
Addigyのアイコンを使用する。 |
microsoft |
Microsoft Intuneのアイコンを使用する。 |
ws1 |
Workspace ONEのアイコンを使用する。 |
filewave |
FileWaveのアイコンを使用する。 |
kandji |
Kandjiのアイコンを使用する。 |
プリセットとして、エンロールされているMDMのアイコンを指定できます。
また、LOGOパラメータはパスを許容しているため、たとえば/Applications/Google\ Chrome.app/Contents/Resources/app.icnsのように任意のアイコンを指定できます。
BLOCKING_PROCESS_ACTION
アプリケーションのインストールまたは更新時に実行中のブロッキングプロセスを検出したときのスクリプトの動作を制御する設定です。
アプリケーションにupdateTool変数が定義されている場合は、updateToolでの更新が終わり次第、Installomatorが終了するため、BLOCKING_PROCESS_ACTIONは実質無視されます。
| 値 | 説明 |
|---|---|
ignore |
ブロックするプロセスが見つかった場合でもインストールを続行する。 |
silent_fail |
アプリケーションのインストールをせずに終了する。 |
prompt_user |
ダイアログを表示し、ユーザーは「Quit and Update」または「Not Now」を選択できる。「Quit and Update」を選択すると、ブロックしているプロセスを終了させる。「Not Now」を選択すると、Installomatorが終了する。 |
prompt_user_then_kill |
prompt_userと同様だが、「Quit and Update」を選択した場合、ブロックするプロセスの終了ができなかった場合、ブロックするプロセスを強制終了させる。 |
prompt_user_loop |
prompt_userと同様だが、「Not Now」をクリックすると、1時間待機した後、再度ダイアログを表示する。スクリプトが終了しないため、MDMエージェントの処理をブロックする可能性がある点に注意が必要。 |
tell_userデフォルト |
ダイアログを表示し、ユーザーに「Quit and Update」のみを選択させる。 |
tell_user_then_kill |
tell_userと同様だが、ブロックするプロセスの終了ができなかった場合、ブロックするプロセスを強制終了させる。 |
kill |
ブロックするプロセスを強制終了させる。 |
quit |
ユーザーにプロンプトを表示せずに、ブロックするプロセスを終了させる。 |
quit_kill |
quitと同様だが、ブロックするプロセスの終了ができなかった場合、ブロックするプロセスを強制終了させる。 |
各処理でブロックするプロセスが3回終了しない場合、Installomatorが終了します。
PROMPT_TIMEOUT
BLOCKING_PROCESS_ACTION変数に次の値を指定した場合が対象です。
prompt_userprompt_user_then_killprompt_user_loop
ダイアログのタイムアウト時間を、秒単位で設定します。
デフォルトで86400秒が設定されています。
IGNORE_APP_STORE_APPS
以前にApp Store(Volume Purchase)からインストールされたアプリケーションを処理する方法を制御する設定です。
| 値 | 説明 |
|---|---|
noデフォルト |
App Storeからインストールされたアプリケーションが存在する場合、Installomatorを終了する。 |
yes |
App Storeからインストールされたアプリケーションが存在する場合、Installomatorでインストールできるアプリケーションを置き換える。 |
SYSTEMOWNER
dmg、zip、tbz、bz2ファイルから解凍してインストールするアプリケーションの所有者を制御する設定です。
Sparkleなど、ユーザー権限で動作する組込みの更新メカニズムからアプリケーションを更新する場合に有用です。
| 値 | 説明 |
|---|---|
0デフォルト |
dmg、zip、tbz、bz2ファイルから解凍してインストールするアプリケーションの場合、ファイル権限としての所有者を現在のユーザーにする。ただし、ユーザーがログインしていない場合に実行された場合は、所有者はrootになる。 |
1 |
ファイル権限としての所有者をrootにする。 |
INSTALL
アプリケーションのバーション情報が比較できる場合のインストール方法を制御する設定です。
| 値 | 説明 |
|---|---|
| 空文字デフォルト | インストールするアプリケーションのバージョンが現在インストールされているアプリケーションと異なる場合のみ、アプリケーションをインストールする。 |
force |
インストールするアプリケーションのバージョンが現在インストールされているアプリケーションが同じ場合でも、アプリケーションをインストールする。 |
REOPEN
アプリケーションを更新する場合、終了したアプリケーションを再度起動するかどうかを制御する設定です。
| 値 | 説明 |
|---|---|
yesデフォルト |
更新時にアプリケーションを終了した場合、インストールが終わり次第アプリケーションを起動する。 |
no |
アプリケーションを起動しない。 |
INTERRUPT_DND
スクリーンセーバーの起動を妨げるディスプレイアサーションが有効になっている場合の挙動を制御する設定です。
| 値 | 説明 |
|---|---|
yesデフォルト |
ディスプレイアサーションの有効に関係なくアプリケーションをインストールする。 |
no |
ディスプレイアサーションを有効にしているアプリケーションが存在する場合、Installomatorを終了する。 |
ディスプレイアサーションが有効な状態の主な例は以下の通りです。
- Zoomの会議中
- Microsoft PowerPointのプレゼンテーション中
- ブラウザのアクティブなタブでYouTubeビデオの再生中
どのアプリケーションがディスプレイアサーションを有効にしているかは、以下のコマンドで確認できます。
/usr/bin/pmset -g assertions | /usr/bin/awk '/NoDisplaySleepAssertion | PreventUserIdleDisplaySleep/ && match($0,/\(.+\)/) && ! /coreaudiod/ {gsub(/^.*\(/,"",$0); gsub(/\).*$/,"",$0); print};'IGNORE_DND_APPS
INTERRUPT_DNDパラメータにnoが設定されている場合、ディスプレイアサーションが有効なアプリケーションを無視する一覧を,(カンマ)区切りで設定します。
以下は例です。
IGNORE_DND_APPS="firefox,Google Chrome,Safari,Microsoft Edge,Opera,Amphetamine,caffeinate"RETURN_LABEL_NAME
ラベルに対応するアプリケーション名を、Installomatorスクリプトの末行へ出力するかどうかを制御する設定です。
アプリケーションのインストールは実行されません。
| 値 | 説明 |
|---|---|
1 |
Installomatorスクリプトの出力の末行にラベルに対応するアプリケーション名を出力する。 |
別のスクリプトからInstallomatorスクリプトを呼び出す場合などで、ラベル名に対応するアプリケーション名が取得できるため、後続の処理がある場合に有用です。
displayName=$(/usr/local/Installomator/Installomator.sh googlechromepkg RETURN_LABEL_NAME=1 | tail -n 1)echo "${displayName}"# Google ChromeDIALOG_CMD_FILE
Installomatorの進捗に関する情報記録するswiftDialogのコマンドファイルのファイルパスを設定します。
デフォルトでは空文字が設定されています。空文字の場合、Installomatorはコマンドファイルに情報を記録しません。
Installomatorでは進捗に関するswiftDialogのプロセスを起動しないため、Installomatorを実行するプロセスが事前にswiftDialogのプロセスを起動させておく必要があります。
DIALOG_LIST_ITEM_NAME
Installomatorの進捗に関する情報記録するswiftDialogのリストアイテムを設定します。
デフォルトでは空文字が設定されています。
Installomatorのラベルに関するパラメータ
Installomatorのgooglechromepkgなどのラベルには、そのアプリケーションをどのようにインストールするのかを設定する変数および関数が存在します。
# googlechromepkgラベルの例googlechromepkg) name="Google Chrome" type="pkg" # # Note: this url acknowledges that you accept the terms of service # https://support.google.com/chrome/a/answer/9915669 # downloadURL="https://dl.google.com/chrome/mac/stable/accept_tos%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen_ph%252Fchrome%252Fterms%252F%26_and_accept_tos%3Dhttps%253A%252F%252Fpolicies.google.com%252Fterms/googlechrome.pkg" appNewVersion=$(getJSONValue "$(curl -fsL "https://versionhistory.googleapis.com/v1/chrome/platforms/mac/channels/stable/versions/all/releases?filter=fraction>0.01,endtime=none&order_by=version%20desc" )" "releases[0].version" ) expectedTeamID="EQHXZ8M8AV" updateTool="/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/MacOS/GoogleSoftwareUpdateAgent" updateToolArguments=( -runMode oneshot -userInitiated YES ) updateToolRunAsCurrentUser=1 ;;ここでは、ラベルにどんなパラメータが用意されているのかを紹介します。
必須のパラメータ
ラベルを構成するには、アプリケーションをダウンロードしてインストールするために以下の値が最低限必要です。
| パラメータ名 | 説明 |
|---|---|
name |
.appの拡張子を除いたアプリケーションの表示名。 |
type |
アプリケーションのアーカイブタイプ。dmg、pkg、zip、tbz (bz2)、pkgInDmg、pkgInZip、appInDmgInZip、updateronlyが選択可能。 |
downloadURL |
アーカイブされたアプリケーションやインストーラのURL。 |
expectedTeamID |
アプリケーションおよびアーカイブを署名および公証しているチームID1。 |
バージョン情報に関する任意のパラメータ
Installomatorには現在インストールれているアプリケーションのバーションと、インストール予定のアプリケーションのバーションを比較するためのパラメータが用意されています。 現在インストールされているアプリケーションのバーションと異なる場合のみ、アプリケーションをインストールするように設定できます。
これにより、余計にアーカイブのダウンロードやインストール処理を実施せずに済むメリットがあります。
インストールされているアプリケーションのバージョン情報を特定するロジック
そもそも現在インストールされているアプリケーションのバージョン情報はどのように取得するのでしょうか。
これは、Installomatorスクリプト内のgetAppVersion関数に定義されています。
getAppVersion関数は以下のロジックおよび優先順位でバージョン情報を特定しています。
appCustomVersion関数が定義されていた場合、その関数を実行してバージョン情報を取得する。packageID変数が定義されていた場合、インストールされているpkgのメタデータ(plist)からpkg-versionの値を取得する。値が空文字の場合は次の判定ロジックに進む。targetDir変数に定義されたディレクトリ、/Applications、または/Applications/Utilities配下のappName変数の値のアプリケーション、またはname変数の値の.appディレクトリの存在を確認する。- 上記で見つからない場合、Spotlightの検索メタデータで
name変数の値に部分一致するアプリケーションディレクトリを取得する。
- 上記で見つからない場合、Spotlightの検索メタデータで
- 見つかった
.appのディレクトリ配下のContents/Info.plistからversionKey変数で定義したキーの値を取得する。
上記でバーション情報が特定できない場合でもInstallomatorの処理は続行されます。
任意のパラメータ
ラベルには、さまざまなインストールおよび更新に対応できるように、多くの任意のパラメータが用意されています。
| パラメータ名 | 説明 |
|---|---|
appCustomVersion |
インストールされているアプリケーションのバージョン情報を返すことを期待している関数。 |
appNewVersion |
インストール予定のアプリケーションのバージョン情報。 |
archiveName |
ダウンロードしてきたアーカイブのアプリケーションのファイル名。デフォルトは$name.$type。 |
packageID |
pkgファイルのpackage ID。pkgによってはpkg-versionの値が不正確であることがあるため注意が必要。 |
versionKey |
.appのディレクトリ配下のContents/Info.plistのバージョン情報を取得するためのplistのキー名。デフォルトはCFBundleShortVersionString。 |
appName |
name変数で定義した値とは異なるアプリケーション名である場合に設定。デフォルトは$name.app。 |
targetDir |
アプリケーションをインストールするディレクトリパス。デフォルトは、pkgの場合は/、それ以外は/Applications。 |
blockingProcesses |
アプリケーションのインストールまたは更新をブロックするプロセス名の配列。ブロックするプロセスが見つかった場合の処理はBLOCKING_PROCESS_ACTIONパラメータによって制御される。ブロッキングプロセスをチェックしない場合は( NONE )を指定。デフォルトは( $name )。 |
pkgName |
dmgまたはzip内のpkgファイルの名前。typeパラメータがpkgInDmg、dmgInZipおよびappInDmgInZipの場合のみ使用される。デフォルトは$name.pkg。 |
updateTool |
アプリケーションの更新時に新しいバージョンをダウンロードしてインストールする代わりに実行するコマンドを指定。アプリケーションがすでにインストールされている、またはtypeパラメータがupdateronlyの場合のみ使用される。 |
updateToolArguments |
updateToolパラメータで指定したコマンドの引数の配列。 |
updateToolLog |
updateToolパラメータで指定したコマンドが独自に出力するログファイルのパス。コマンドの標準出力はInstallomatorのログに統合するされるが、コマンドが独自のファイルにログを出力する場合でもInstallomatorのログに統合可能。現在統合可能なログ形式は,(カンマ)区切りのファイルのみ。 |
updateToolLogDateFormat |
updateToolLogパラメータで指定したファイルの1列目に存在する日付のフォーマット。このフォーマットに合致した日付の範囲をInstallomatorのログに統合。 |
updateToolRunAsCurrentUser |
updateToolパラメータで指定したコマンドを現在ログインしているユーザーで実行。空文字以外であればどんな値でも設定可能だが、通例的に有効にする場合は1が設定される。ログインユーザーが存在しない場合、正常終了したような挙動になる点に注意。 |
CLIInstaller |
.app内のインストーラコマンドパス。.app内のインストーラコマンドを実行してアプリケーションをインストールする形式をサポート。 |
CLIArguments |
CLIInstallerパラメータで指定したコマンドの引数の配列。 |
installerTool |
インストーラの.appが、nameやappNameパラメータで指定された値とは異なる場合、インストーラのアプリケーション名を指定。 |
curlOptions |
downloadURLパラメータで指定したURLにリクエストを送る際のcurlコマンドのオプションの配列。 |
Installomator実行時にパラメータを変更する
Installomatorの「挙動を制御するパラメータ」と「ラベルのパラメータ」の2種類を紹介しましたが、これらのパラメータをInstallomatorスクリプトを実行する際に変更できます。
たとえば、googlechromepkgデバッグモードを無効化して、アーカイブのURLをダウンロードする際にユーザーエージェントを付与するとした場合、以下のようにしてInstallomatorスクリプトを実行します。
./Installomator.sh googlechromepkg DEBUG=1 curlOptions=( -H "User-Agent: sample" )「挙動を制御するパラメータ」に関してはすでによく知られている方法ではありますが、「ラベルのパラメータ」の変更も可能であるため、スクリプトを実行する我々自身でさまざまな応用が可能となります。
パラメータとして用意されている関数を変更する
「ラベルのパラメータ」のappCustomVersionは、変数ではなく関数であるため、設定したい場合はひと工夫が必要です。
`./Installomator.sh googlechromepkg "_=;appCustomVersion(){ echo '1.0.0' }"`内部では、引数ごとに文字列をeval関数に渡しています。この実装を利用して、変数だけではなく関数も設定できます。
ただ、これはコマンドインジェクションのようなことをやってしまっているため、自己責任でお願いします。
終わりに
今回はInstallomatorの「挙動を制御するパラメータ」および「ラベルのパラメータ」を紹介しました。 これでより深くInstallomatorを理解できるようになったのではないでしょうか。
あんなことができるんじゃないか?あの不具合が解消できるかも!などのきっかけになれば幸いです。
また、このパラメータに関する内容を応用した、「Installomatorでサポートされていないアプリケーションをインストールする」という記事も合わせて書きましたので、ぜひご覧ください。
Footnotes
-
Apple Developer Programに登録すると得られる10桁のID、チームIDを確認する - Apple Developer ↩