[GAS]Jamf APIを利用してパッチ情報をまとめた一覧シートを作成

2023.02.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • Jamf Proでのデバイス管理の際に、Jamf APIを利用すると容易に情報を取得することができます。
  • そこでGASを利用してパッチ情報を一覧としてシートに書き出す方法を記録いたします。

結果

  • 今回の手順で以下のような「パッチ一覧シート」を作成します。

環境

  • mac OS Ventura 13.1
  • Google Apps Script

準備

  • Jamf Pro APIを利用するためのアカウントを用意してこちらを参考に以下の権限を付与してください。
    • Read - Patch Management Software Titles

手順

スプレッドシート作成

  • 新規でスプレッドシートを作成してください。
  • その後、シート内の「拡張機能」タブから「Apps Script」でスクリプトエディタを開いてください。

プロパティ設定

  • スクリプトエディタを開いたら、スクリプトプロパティに以下の内容を設定してください。
プロパティ
BASIC_TOKEN Jamfユーザー名:Jamfパスワード
例: ユーザー名がaaa、パスワードがbbbであれば「aaa:bbb」となる。
CLASSIC_API_BASE Jamf CLASSIC API URL
PRO_API_BASE Jamf PRO API URL
SHEET_ID 上記で作成したスプレッドシートID

コード記述

  • プロパティ設定後、以下の内容をスクリプトエディタの任意のgsファイルに記述します。
const properties = PropertiesService.getScriptProperties().getProperties();
const baseProApi = properties.PRO_API_BASE
const baseClassicApi = properties.CLASSIC_API_BASE

function main(){
  // シート情報
  const patchSheetId = properties.SHEET_ID
  const patchSheet = SpreadsheetApp.openById(patchSheetId).getSheets()[0];
  const headers = [['タイトル','情報']]
  const columns = headers[0].length
  const lastRow = patchSheet.getLastRow()

  // 初期化
  if(lastRow !== 0){
    patchSheet.getRange(1, 1, lastRow, columns).clearContent();
  }

  // Bearerトークン
  const bearToken = getBearerToken();

  // パッチタイトル情報
  const patchTitles = getPatchTitles(bearToken);
  const patchTitleIds = patchTitles.map(title => title.id);

  // 書き込み配列生成
  const insertPatches = patchTitleIds.map(titleId => {
    // 指定IDのパッチ情報
    const patchReports = getPatchReports(bearToken, titleId);
    // 指定IDのパッチ名
    const patchName = patchReports.name;
    // 指定IDのパッチ詳細(対象コンピュータやや対象バージョン)
    const patchVersions = patchReports.versions

    return [
      patchName,
      JSON.stringify(patchVersions), // 結果のオブジェクトをまとめて1セルに格納
    ]
  })

  // ヘッダーとマージ
  const insertValues = [...headers, ...insertPatches];

  // 書き込み
  patchSheet.getRange(1, 1, insertValues.length, columns).setValues(insertValues);
}

// Bearerトークン取得
function getBearerToken(){
  const basicToken = Utilities.base64Encode(properties.BASIC_TOKEN)
  const res = UrlFetchApp.fetch(`${baseProApi}/auth/token`, {
      method: 'post',
      headers: {
        'Authorization': `Basic ${basicToken}`,
      },
  });
  const json = JSON.parse(res.getContentText());
  return json.token
}

// パッチタイトル情報取得
function getPatchTitles(bearerToken){
  const res = UrlFetchApp.fetch(`${baseClassicApi}/patchsoftwaretitles`, {
    method: 'get',
    headers: {
      'Authorization': `Bearer ${bearerToken}`,
      'accept': 'application/json'
    }
  })
  const json = JSON.parse(res.getContentText())
  return json.patch_software_titles
}

// 特定タイトルのパッチレポート取得
function getPatchReports(bearerToken, titleId){
  const res = UrlFetchApp.fetch(`${baseClassicApi}/patchreports/patchsoftwaretitleid/${titleId}`, {
    method: 'get',
    headers: {
      'Authorization': `Bearer ${bearerToken}`,
      'accept': 'application/json'
    }
  });
  const json = JSON.parse(res.getContentText());
  return json.patch_report
}

実行

  • コード記述後、main関数を実行して、スプレッドシートが以下のように検出されたパッチ情報となることを確認します。

  • 以上です。

まとめ

  • 今後もJamf APIのさまざまなサービスを適宜利用していき、日々の業務改善に努めてまいります。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。