組織によっては、macOSのソフトウェアアップデートをエンドユーザーにお知らせしてアップデートを行っているかもしれません。 しかし、エンドユーザーが対応を忘れてしまい、中々対応パッチが当たらず脆弱な状態が続いてしまうこともあります。

また、独自にスクリプトを作成する場合、画面共有中など画面がビジーな状態などのハンドリングなどを考えたいという要望を実現する場合、高度な知識が必要となります。

今回はこのような課題を解決できるかもしれない、S.U.P.E.R.M.A.N.を紹介します。

メジャーバージョンアップ、つまりアップグレードで似たようなことを行いたい場合は、「erase-installを使ってmacOSの初期化、OS再インストール、OSアップグレードを行う」を参照してください。

macOSのソフトウェアアップデートの課題

macOSのソフトウェアアップデートとは、マイナーバージョンアップデートやセキュリティアップデートを指します。 これらのアップデートはデバイス上からは [システム環境設定] > [ソフトウェアアップデート] またはsoftwareupdateコマンドを用いてOSをアップデートできます。

システム環境設定からソフトウェアアップデートをする様子

組織内でソフトウェアアップデートを展開する際は、Jamf Proのポリシー1などMDMサービスを使用して展開する必要があります。

Apple Siliconの場合は、ソフトウェアアップデートのMDMコマンドが用意されていますが、自動化するためにはMDMサービスのこのコマンドに関するAPIを呼び出す必要があります。

しかし、ポリシーの設定は煩雑であり、動作するタイミングによってはエンドユーザーの作業を邪魔してしまう可能性があります。 また、組織内のメールやSNS、チャットツールを用いて、エンドユーザーに任意のタイミングでアップデートを依頼することも考えられますが、これだとどうしてもアップデート作業を忘れてしまうこともあります。

管理者としては、特にセキュリティパッチに関しては緊急度が高いものもあるため、なるべく早めにOSのアップデートを実施したい場合があります。

S.U.P.E.R.M.A.N.とは

S.U.P.E.R.M.A.N.とは、Kevinさんがメンテナンスされている、macOSのソフトウェアアップデートを柔軟に行えるbashスクリプトです。IntelとAppleSilicon両方のコンピュータをサポートしています。

プレゼンテーションモードや画面共有中には自動でソフトウェアアップデートを延期し、エンドユーザー操作による延長の期限を柔軟に設定できます。

一言で言うと、OSアップデートのファイルはバックグラウンドでダウンロードしておき、再起動を促すダイアログを良い感じに出してくれるツールです。

内部的にIBM Notifierを使用しているため、柔軟なダイアログ表現が実現できています。

ダイアログにカウトダウンを表示した例

ダイアログに遅延させる時間を選択できるようにした例

S.U.P.E.R.M.A.N.の各設定項目について

S.U.P.E.R.M.A.N.では、いくつか設定をカスタマイズできます。

以下の設定項目はバージョンが1.0rc1のものです。 最新の情報はGitHubを参照してください。

DefaultDefer

値として、秒数を設定します。 デフォルトでは3600、つまり1時間が設定されています。

最小値は120であり、これより小さい値を設定したとしても、120として動作します。 また、最大値は86400、つまり1日が設定されており、これより大きい値を設定したとしても、86400として動作します。

ユーザーが、今はアップデートを実行しないことを選択した場合、次回のアップデート処理が実行されるまでの秒数を指定します。 この遅延時間は、インターネットやJamf Proとの接続の問題などで、一時的にソフトウェアアップデートが実行できない場合にも使用されます。

FocusDefer

値として、秒数を設定します。

最小値は120であり、これより小さい値を設定したとしても、120として動作します。 また、最大値は86400、つまり1日が設定されており、これより大きい値を設定したとしても、86400として動作します。

フルスクリーンモードや画面共有または、集中モードやおやすみモードを有効にしている場合に、OSアップデートの再起動ダイアログの表示を遅延させる秒数を指定します。

FocusDeadlineSoftDeadlineを合わせて使用して適切にOSアップデートを延長するように設計すると良いです。

値として、秒数をカンマ(,)区切りで設定します。

秒数の最小値は120であり、これより小さい値を設定したとしても、120として動作します。 また、秒数の最大値は86400、つまり1日が設定されており、これより大きい値を設定したとしても、86400として動作します。

再起動を促すダイアログ内に、選択肢として表示され、ユーザーが延期時間を選択できます。 ユーザーが選択した値は、DefaultDeferで設定した時間よりも優先されます。

DisplayTimeout

値として、秒数を設定します。

再起動を促すダイアログのタイムアウトの秒数を指定します。 タイムアウトのカウントダウンはダイアログ内に表示されます。

タイムアウト時間が経過すると、強制的に再起動が実行されるため注意が必要です。 タイムアウトの秒数を設定しなければ強制的に再起動が実行されることはありません。

また、DisplayRedrawが設定されており、DisplayTimeoutの値がDisplayRedrawの3倍の値より小さい値を設定した場合、DisplayTimeoutDisplayRedrawの3倍の値が自動的に適用されることに注意が必要です。

DisplayRedraw

値として、秒数を設定します。

ユーザーが通知やダイアログを無視した場合(例えば、画面外に移動した場合)、S.U.P.E.R.M.A.N.がその通知やダイアログを閉じてから再度開き、通知やダイアログを元の位置に表示し直すまでの秒数を指定します。

短い秒数を指定すると、通知やダイアログが点滅したように見えるため避けたほうが良いです。

DisplayIcon

値として、ファイルへのローカルまたはHTTP/HTTPSのURLを指定します。 デフォルトでは/System/Library/PreferencePanes/SoftwareUpdate.prefPane/Contents/Resources/SoftwareUpdate.icnsが設定されています。

通知やダイアログに画像を表示できます。 パスまたはURLが見つからない場合は、デフォルトのアイコンが使用されます。

IconSizeIbm

値として、ピクセル数を設定します。 デフォルトでは96が設定されています。

最小値は96であり、これより小さい値を設定したとしても、96として動作します。 また、最大値は150であり、これより大きい値を設定したとしても、150として動作します。

IBM Notifierダイアログ上に表示するDisplayIconで指定した画像のピクセル数を設定します。 PreferJamfを有効にしている場合は、この設定は使用されません。

IconSizeJamf

値として、ピクセル数を設定します。 デフォルトでは96が設定されています。

最小値は32であり、これより小さい値を設定したとしても、32として動作します。 また、最大値は256であり、これより大きい値を設定したとしても、256として動作します。

jamfHelperのダイアログ上に表示するDisplayIconで指定した画像のピクセル数を設定します。 PreferJamfを無効にしている場合は、この設定は使用されません。

PreferJamf

値として、true/falseを設定します。

デフォルトでは通知やダイアログなどのユーザーインタラクションにIBM Notifierを使用しています。

この設定を有効にすると、通知やダイアログなどのユーザーインタラクションにjamfHelperを使用するようにします。

FocusDeadline

値として、YYYY-MM-DDまたはYYYY-MM-DD:hh:mm形式の日時を設定します。 時間は24時間表記を期待しており、時間と分の指定がない場合は00:00として扱われます。

FocusDeferと一緒に使用することをお勧めします。

この期限(日時)が過ぎた場合、フルスクリーンモードや画面共有などによってディスプレイのスリープを妨げていても、ユーザーが集中モードまたはおやすみモードを有効にしていても、ソフトウェアアップデートの再開ダイアログ(延期オプション付き)が常に表示されます。

SoftDeadlineまたはHardDeadlineと一緒に使用する場合、ここで設定する日時が、SoftDeadlineおよびHardDeadlineよりも前の日時を設定する必要があります。

もし、この設定による挙動を確認したい場合は、現在より過去の日時を指定します。

SoftDeadline

値として、YYYY-MM-DDまたはYYYY-MM-DD:hh:mm形式の日時を設定します。 時間は24時間表記を期待しており、時間と分の指定がない場合は00:00として扱われます。

この期限(日時)が過ぎた場合、これ以上ユーザーによる延期ができないことを示す対話型のソフトウェアアップデート再開ダイアログが表示されます。

FocusDeadlineとともに使用した場合、ここで設定する日時はFocusDeadlineよりも後の日時にする必要があります。 また、HardDeadlineとともに使用する場合は、ここで設定する日時はHardDeadlineよりも前の日時を設定する必要があります。

もし、この設定による挙動を確認したい場合は、現在より過去の日時を指定します。

HardDeadline

値として、YYYY-MM-DDまたはYYYY-MM-DD:hh:mm形式の日時を設定します。 時間は24時間表記を期待しており、時間と分の指定がない場合は00:00として扱われます。

この期日(日時)を過ぎると、ユーザーの承認を求めることなく、アップデートと再起動をします。 ただし、ユーザーには再起動が保留されていることが通知されます。

FocusDeadlineまたはSoftDeadlineとともに使用する場合、ここで設定する日時がFocusDeadlineおよびSoftDeadlineよりも後の日時を設定する必要があります。

もし、この設定による挙動を確認したい場合は、現在より過去の日時を指定します。

CountDeadline

値として、ダイアログの延期可能数を設定します。

インタラクティブなソフトウェアアップデート再開ダイアログをどれだけ延期できるかの最大数を設定します。 画面共有などの自動延期に関しては、カウント対象ではありません。

もし、この設定による挙動を確認したい場合は、0を指定します。

PolicyTriggers

値として、Jamf Proのポリシーのトリガー名をカンマ(,)区切りで設定します。

再起動が必要な場合、またはForceRestartで再起動を強制された場合、ここで設定したトリガー名のリストは、利用可能なソフトウェアアップデートがインストールされた後かつ、コンピュータが再起動される前に実行されます。

SkipUpdates一緒に使用すると、トリガーのみを実行できます。

SkipUpdates

値として、true/falseを設定します。

Apple社が提供するソフトウェアアップデートがある場合でもスキップします。

ForceRestartPolicyTriggersとともに使用すると、Jamf Proポリシーだけを実行し、通知、ダイアログ、延期、締め切りオプションを利用したままコンピュータを再起動できます。

ForceRestart

値として、true/falseを設定します。

ソフトウェアアップデートが必要ない場合でも、強制的に再起動させます。

用途としては、設定の検証またはPolicyTriggersを使用して再起動する場合に有用です。

TestMode

値として、true/falseを設定します。

パラメータ、認証情報、通知、ダイアログ、遅延、期限切れロジックを検証するモードです。

この設定を有効にすると、Appleソフトウェアのアップデート、Jamfポリシーの実行、コンピュータの再起動は試みません。

TestModeTimeout

値として、秒数を設定します。 デフォルトでは10が設定されています。

テスト用に表示される通知やダイアログの秒数を指定します。

VerboseMode

値として、true/falseを設定します。

この設定を有効にした場合、デバッグなどの役に立つログを出力します。

S.U.P.E.R.M.A.N.のローカルでの確認方法

  1. https://github.com/Macjutsu/superから対象のバーションをクローンまたはダウンロードします。
  2. superコマンドをテストモードとしてroot権限で実行すると動作確認ができます。
    • sudo ./super -T

また、sudo ./super -hを実行することで、各種コマンド引数の説明が出てきます。

たとえば、

  • ユーザーがソフトウェアアップデートを遅延させる秒数を選択できる
  • ダイアログにタイムアウトを設定
  • デバッグ用にログを多めに出す

の挙動を確認したいとすると、以下のコマンドを実行します。

sudo ./super -T -V --menu-defer "1800,3600,21600,43200,86400" --display-timeout 10

Jamf Proとの統合

S.U.P.E.R.M.A.N.はJamf Proをサポートしています。

ここではソフトウェアアップデートがあれば、自動でエンドユーザーに対して通知およびダイアログが表示されることをゴールとして設定します。

以降は、Jamf Proにログインをして作業します。

スクリプトの登録

  1. [設定] > [コンピュータの管理] > [スクリプト]から新規作成に進みます。

    • カテゴリの設定は必須ではありませんが、このスクリプトを分類するのに使用できます。

    S.U.P.E.R.M.A.N.の新規スクリプト作成の一般セクションの設定

  2. 次に、ScriptセクションにGitHubから取得してきたsuperスクリプトを貼り付けます。

    S.U.P.E.R.M.A.N.の新規スクリプト作成のスクリプトセクションの設定

  3. [保存]してスクリプトの登録は完了です。

構成プロファイルの設定

構成プロファイルの設定は任意です。 ユースケースによってはJamf ProのポリシーにS.U.P.E.R.M.A.N.の設定を都度記述していく方法が良い場合もあります。

  1. [コンピュータ] > [構成プロファイル]から新規作成に進みます。
  2. Generalセクションで各値を設定します。
    • 名称: S.U.P.E.R.M.A.N.のプロファイル
      • これは例ですので、任意の文字列を設定してください。
    • カテゴリ: OS Update
      • カテゴリの設定は任意です。
    • レベル: Computer Level
    • 配布方法: Install Automatically
      • 組織のユースに合うように設定してください。

    S.U.P.E.R.M.A.N.の構成プロファイル設定 一般

  3. アプリケーションとカスタム設定セクションの[外部アプリケーション]を選択します。
  4. [追加]からペイロードを設定します。
    • ソース: カスタムスキーマ
    • 環境設定ドメイン: com.macjutsu.super

    S.U.P.E.R.M.A.N.の構成プロファイル設定 アプリケーションとカスタム設定

  5. [スキーマを追加]からS.U.P.E.R.M.A.N.用のカスタム設定マニフェストを登録します。
    • Jamf ProではJSON Schema用いて、アプリケーションが使用する設定値を動的に定義できます。2

    S.U.P.E.R.M.A.N.の構成プロファイル設定 アプリケーションとカスタム設定 スキーマ追加

  6. 設定したい項目を設定します。例としてDefault Deferを設定します。
    • Default Defer: 3600
      • 任意の数値を設定してください。
  7. [保存]して構成プロファイルの登録は完了です。

ポリシーの設定

  1. [コンピュータ] > [ポリシー]から新規作成に進みます。
  2. Generalセクションで各値を設定します。
    • 表示名: ユーザーインタラクションを用いたソフトウェアアップデート
      • これは例ですので、任意の表示名を設定してください。
    • カテゴリ: OS Update
      • カテゴリの設定は任意です。
    • 実行頻度: Once every day
      • 急ぎではないが常に監視しておきたいため、1日1回起動するようにしています。

    ソフトウェアアップデートのポリシー設定 オプションセクションの一般設定

  3. 次に、スクリプトの項目を選択し、登録したS.U.P.E.R.M.A.N.のスクリプトを追加します。
  4. 次に、ファイルとプロセスの項目を選択し、各値を設定します。
    • コマンドを実行 : /usr/local/bin/super

    ソフトウェアアップデートのポリシー設定 オプションセクションのファイルとプロセス設定

  5. 次に、ScopeセクションからターゲットコンピュータをAll Computersにします。
  6. [保存]してポリシーの登録は完了です。

ファイルとプロセスの項目ではsuperコマンドを実行しましたが、引数も設定できます。 たとえば、DefaultDeferを1時間にしてHardDeadlineを2022-01-31までにする場合は、以下のように設定します。

/usr/local/bin/super --default-defer 3600 --hard-deadline "2022-01-31"

このように構成プロファイルでS.U.P.E.R.M.A.N.の設定をせずとも、柔軟なポリシーを作成できます。

まとめ

macOSのソフトウェアアップデートの実施には課題があり、ユーザーインタラクションを含めた形で解決するS.U.P.E.R.M.A.N.を紹介しました。 また、合わせてJamf Proとの統合方法を紹介しました。

ユーザーインタラクションに関してさまざまな設定が用意されており、組織にあったユースケースを選択できるかもしれません。

現時点ではダイアログメッセージが固定であり、かつ英語であるため、日本語圏の組織に展開する場合はスクリプト内部を変更する必要があります。 また、まだリリース候補版であるため、いくつかのバグが存在する可能性がある点に注意が必要です。

もし要望がある場合は、GitHubのIssueからフィードバックをすると良いでしょう。