Installomatorのパラメータの紹介
管理されている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_user
prompt_user_then_kill
prompt_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 Chrome
DIALOG_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でサポートされていないアプリケーションをインストールする」という記事も合わせて書きましたので、ぜひご覧ください。
-
Apple Developer Programに登録すると得られる10桁のID、チームIDを確認する - Apple Developer ↩