plutilがJamf Proの拡張属性スクリプト書くのに便利そうでした
拡張属性スクリプト
Jamf Proの拡張属性は、Macのローカルで実行されたスクリプトの結果を入れることが出来るので大変便利です。
ただスクリプトを実行するのがユーザーのローカル環境なので、基本的にはmacOSデフォルトの機能でスクリプトを書くことになります。
特に拡張属性スクリプトで使われがちな(と個人的に思っている)ioreg
やsystem_profiler
の結果から特定の値が欲しい場合、grep
やawk
やsed
を使って抽出・整形する必要があります。
plutilを使えるケースがある
plutil
は文字通りplistを操作するためのutilityです。plistは基本的にXMLなので、XMLにも使えます。
そしてioreg
やsystem_profiler
は出力をXMLにするオプションがあるため、結果をplutil
に渡すことでシンプルな書き方ができるようになります。
また、macOS Monterey以降ではJSONの値を読む事ができます。
plutilを使ってみる
バッテリーの最大容量を取得してみる
Apple Silicon搭載のMacでは、system_profiler
コマンドでバッテリーの最大容量を取得できます。
このコマンドはIntel Macだと動かないのでご注意下さい。
plutilを使わない場合
system_profiler
の結果から、grep
とawk
で必要な値を取り出す必要があります
system_profiler SPPowerDataType | \
grep "Maximum Capacity" | awk '{print $3}'
88%
やりたいことは出来ているのでこれでも良いのですが、もう少し何をやってるのかわかりやすいと嬉しいですね
plutilを使う場合
system_profiler
は -xml
オプションで出力をxmlで出力できるので、それをパイプでplutil
に渡します
plutil
でファイルではなく標準入力で受け取りたい場合は-
オプションを使います
system_profiler SPPowerDataType -xml | \
plutil -extract 0._items.0.sppower_battery_health_info.sppower_battery_health_maximum_capacity raw -
88%
-extract
オプションを使い、抽出したい値のキーと出力する形式(raw)を指定しています。
欲しい情報のキーまでのパスを全て書く必要がありますが、どの情報を参照しているのかが分かりやすくなりました。
キーボードレイアウトを取得してみる
plutilを使わない場合
plutilを使わない場合はgrep
とawk
とsed
で必要な情報を取り出します。
ioreg -rln AppleHIDKeyboardEventDriverV2 | \
grep -m1 KeyboardLanguage | awk '{print $4,$5}' | sed s/\"//g
Japanese Keyboard
Japanese
とKeyboard
の間にスペースがあるため、awk '{print $4,$5}'
としています。
またそのままだとダブルクオーテーションが付いてしまうため、sed
で取り除いています。
plutilを使う場合
ioreg
に-a
オプションを付けることでxmlで出力できるので、その結果をplutil
に渡します
ioreg -arln AppleHIDKeyboardEventDriverV2 | \
plutil -extract 0.KeyboardLanguage raw -
Japanese Keyboard
指定したキーに対応した値を取り出すのでスペースが入っていても気にする必要がありませんし、ダブルクオーテーションが付かないのも良いです。
目的のキーのパスを調べる
(XMLファイルの中の一つのキーのパスを簡単に一発でバシッと調べる方法を知らないので、どなたかご存知でしたら教えて下さい。)
plutil
に-p
オプションを付けると、XMLを人間にも比較的読みやすい形に変換してくれます。
system_profiler SPPowerDataType -xml | plutil -p -
[
0 => {
"_dataType" => "SPPowerDataType"
"_detailLevel" => "0"
"_items" => [
0 => {
"_name" => "spbattery_information"
"sppower_battery_charge_info" => {
"sppower_battery_at_warn_level" => "FALSE"
"sppower_battery_fully_charged" => "TRUE"
"sppower_battery_is_charging" => "FALSE"
"sppower_battery_state_of_charge" => 100
}
"sppower_battery_health_info" => {
"sppower_battery_cycle_count" => 38
"sppower_battery_health" => "Good"
"sppower_battery_health_maximum_capacity" => "88%"
}
############以下略############
これでsppower_battery_health_maximum_capacity
のパスが0._items.0.sppower_battery_health_info.sppower_battery_health_maximum_capacity
だということがわかります。
plutilをJSONで使ってみる
Jamf Proのスクリプト内で何かしらのAPIを叩いて返ってきたJSONをどうにかしたいみたいなケースがありますが、クライアント端末に勝手にjq
を入れるのも微妙なので、パイプと各種コマンドで頑張ることになります。
plutil
を使えばシンプルで読みやすく書けるので、未来の自分が過去の自分にイライラする事も減るのかなと思います。
ただ手元にBig SurなMacが無いので試せていないのですが、JSONの読み込みはMontery以降でしか対応していないらしいので環境にBig Sur端末がある方はご注意下さい。
JSONを使った良い例が思い浮かばなかったので、ひとまず今回はGoogle ChromeのVersionHistory APIを使って、macOS用のstableチャンネルのGoogle Chromeの最新バージョン情報を取得してみます。
plutilを使わない場合
curl -s https://versionhistory.googleapis.com/v1/chrome/platforms/mac/channels/stable/versions | \
grep version | sed -n 3p | awk '{print $2}' | sed s/\"//g
114.0.5735.45
力技感があって良いですね、温かみを感じます。
plutilを使う場合
curl -s https://versionhistory.googleapis.com/v1/chrome/platforms/mac/channels/stable/versions | \
plutil -extract versions.0.version raw -
114.0.5735.45
だいぶシンプルに書くことができました。
Discussion