見出し画像

Jamfからデバイス情報ぶっこ抜き!

ネットランナーみたいなタイトルになってしまった。

Python初めて書いたので見てーみんな見てーという記事です。
特に目新しいことはないです!

はじめに

APIを使ってJamf Proからデバイス情報を取得する方法を模索していた時、APIリファレンスを見る限り

  1. Smart Device Groupsを作成して取得したいデバイスをまとめる

  2. Smart Device Groupsからデバイス情報を取得する 

これが対象の端末をまとめて取得できそうだなと気づいたのが発端。
ただ、この場合取得できる情報が以下に限られます。

  • ID

  • デバイス名

  • macアドレス

  • UDID

  • WiFi macアドレス

  • シリアル番号

今回欲しかったのは上記に加えてインベントリの最終アップロード日時
この情報でデバイスがいつ起動してネットワークに接続されているのかを確認し、一定期間更新されていない場合は端末の現物確認を依頼しようと思いました。

立ちはだかる問題

インベントリの最終アップロード日時がAPI1回の呼び出しで1台分しか取得できない問題。

つまり、1000台対象の端末があると1000回呼び出しを行わないといけず、時間は勿論コスト(IPaaSを経由するとタスク数)が比例してかかるんですよねー…。

MobileIronだとWhere句で必要な情報を選択できるので、SQL分かってる人だとMobileIronのほうが断然使いやすいですね。
まぁ代わりに1回の呼び出しで取得できる件数に500件の制限がありますが。

よし、プログラミングだ!

で、どうしたかというとPythonで繰り返し処理を実行する部分を書きました。
こうすることでAPI自体は何回呼び出しても、呼び出し元はPythonコード1回呼ぶだけということでコストは少なくとも抑えられるっつう寸法なんですね。

で、作成したコードはこちらになります。
認証用のトークンは事前に取得し引数で渡しています。
URLの<myserver>部分は自テナント名に変更してください。

import requests

def main(input):
    # ベアラートークン認証情報
    authorization = input['token']
    # デバイス情報
    result = []
    
    # デバイス数分繰り返し
    for item in input['mobile_devices']:
        # Get先URL
        url = f"https://<myserver>.jamfcloud.com/JSSResource/mobiledevices/udid/{item['udid']}/subset/General"
        # HTTPリクエストと結果を取得
        headers = {"Accept": "application/json", "Authorization": f"Bearer {authorization}"}
        
        # インベントリの最終アップデートを取得
        response = requests.get(url, headers=headers).json()
        
        # デバイス情報格納
        id = response['mobile_device']['general']['id']
        udid = response['mobile_device']['general']['udid']
        name = response['mobile_device']['general']['name']
        serialNumber = response['mobile_device']['general']['serial_number']
        last_inventory_update_epoch = response['mobile_device']['general']['last_inventory_update_epoch']
        result.append({'id': id, 'udid': udid, 'name': name, 'serialNumber': serialNumber, 'last_inventory_update_epoch': last_inventory_update_epoch})

    return {'general': result}

そして現れる次なる問題

このコードを公開した理由の一つとして、これ結果的にボツになってます

理由は簡単。使ってるiPaaSの仕様上タイムアウトするんだな!ガハハ!

30秒じゃ支度できねぇー!

時間自体が短くなってない(なるわけない)ので、こりゃ駄目だってことで現在はRubyで書き直したりもしていますが、Rubyでも根本解決しないのでゴールをもっと現実的な方向に修正しないといけないかなーと考えてます。

さいごに

Jamfさんデバイス情報まとめて取得するAPIで引っ張る項目選ばせてください!お願いします!何でもしまかぜ!


この記事が気に入ったらサポートをしてみませんか?