管理されている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   ダウンロード中、更新不要、インストール完了、失敗時に通知を行う。

通知方法の優先順位は以下のとおりです。

  1. NOTIFY_DIALOG パラメータが有効で、swiftDialogのバージョン2以上がインストールされている場合、swiftDialogが使用されます。
  2. Jamf Proでエンロールされている場合、Management Action.appが使用されます。
  3. Workspace ONEでエンロールされている場合、Hub CLIが使用されます。
  4. swiftDialogのバージョン2以上がインストールされている場合、swiftDialogが使用されます。
  5. AppleScriptを使用した通知センターへの通知が使用されます。

NOTIFY_DIALOG

swiftDialogを使用するかどうかを制御する設定です。

デフォルト 説明
0 通知にswiftDialogを使用しない。
1   通知にswiftDialogを使用する。

実行中のブロッキングプロセスがあった場合のダイアログに表示されるアイコンを指定する設定です。

デフォルト 説明
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 アプリケーションのアーカイブタイプ。dmgpkgziptbz (bz2)、pkgInDmgpkgInZipappInDmgInZipupdateronlyが選択可能。
downloadURL アーカイブされたアプリケーションやインストーラのURL。
expectedTeamID アプリケーションおよびアーカイブを署名および公証しているチームID1

バージョン情報に関する任意のパラメータ

Installomatorには現在インストールれているアプリケーションのバーションと、インストール予定のアプリケーションのバーションを比較するためのパラメータが用意されています。 現在インストールされているアプリケーションのバーションと異なる場合のみ、アプリケーションをインストールするように設定できます。

これにより、余計にアーカイブのダウンロードやインストール処理を実施せずに済むメリットがあります。

インストールされているアプリケーションのバージョン情報を特定するロジック

そもそも現在インストールされているアプリケーションのバージョン情報はどのように取得するのでしょうか。 これは、Installomatorスクリプト内のgetAppVersion関数に定義されています。

getAppVersion関数は以下のロジックおよび優先順位でバージョン情報を特定しています。

  1. appCustomVersion関数が定義されていた場合、その関数を実行してバージョン情報を取得する。
  2. packageID変数が定義されていた場合、インストールされているpkgのメタデータ(plist)からpkg-versionの値を取得する。値が空文字の場合は次の判定ロジックに進む。
  3. targetDir変数に定義されたディレクトリ、/Applications、または/Applications/Utilities配下のappName変数の値のアプリケーション、またはname変数の値の.appディレクトリの存在を確認する。
    • 上記で見つからない場合、Spotlightの検索メタデータでname変数の値に部分一致するアプリケーションディレクトリを取得する。
  4. 見つかった.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パラメータがpkgInDmgdmgInZipおよび 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が、nameappNameパラメータで指定された値とは異なる場合、インストーラのアプリケーション名を指定。
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でサポートされていないアプリケーションをインストールする」という記事も合わせて書きましたので、ぜひご覧ください。

  1. Apple Developer Programに登録すると得られる10桁のID、チームIDを確認する - Apple Developer