見出し画像

ジョーシスAPIで機器の状態を一括で変えてみた

はじめに

多分きっとおそらくMaybe新米情シスなっちです。
資産管理としてジョーシスを導入し半年ほど立ちました。
かなり使いやすく良いソリューションです。しかし使用しているとかゆいところに手が届かない事があります。今回の記事ではAPIを用いて大規模入れ替え後の旧端末の使用者解除&ステータス変更を行います。

おすすめな人

  • ジョーシスを導入している方でこれからデバイスの大規模入替を行う方

  • CSVでステータス変更ができなくてモヤモヤしている方

本題

■今回の課題

デバイスのステータスをCSVで変更できない仕様だが一括で変更したい

■開発環境

使用言語:Python
使用するモジュール:Request,csv,json

■準備物

コードを書く前にジョーシスでの作業が必要になります。
APIユーザーキー作成
APIシークレット作成
作成の方法は下記ドキュメントを御覧ください。

■処理の概要

①:ジョーシスAPIを用い、全デバイス一覧CSVを作成(コード①)
②:ステータスを変更したいデバイスを残し②で作成したCSVから削除(手作業)
③:②から使用し対象機器を一括解除&ステータス変更(コード②)

#コード

トークンの発行→一覧の取得→CSVへの落としこみとなっています。

import requests  # HTTPリクエストを送信するためのライブラリ
import csv  # CSVファイルを読み書きするためのライブラリ
import json  # JSONデータを扱うためのライブラリ

# ジョーシスから入手したAPIキーとシークレット
APIKEY = "ジョーシスで作成したAPIユーザーキー"
APISEC = "ジョーシスで作成したAPIシークレット"

# ジョーシスAPIのベースURL
base_url = "https://developer.josys.it/api"

def Token_get():
    """ジョーシスからAPIを実行するためのTokenを取得する

    Returns:
        str: token
    """
    # トークン取得のエンドポイントURL
    endpoint_url = base_url + "/v1/oauth/tokens"
    # トークン取得のためのリクエストデータ
    data = {
        "grant_type": "client_credentials",
        "api_user_key": APIKEY,
        "api_user_secret": APISEC
    }

    # トークン取得のためのPOSTリクエストを送信
    response = requests.post(endpoint_url, json=data)
    print(response.json())  # レスポンスの内容を出力
    token = response.json()["id_token"]  # レスポンスからトークンを取得
    return token  # トークンを返す

def Devicelist_get(token: str):
    """デバイスのリストを取得する

    Args:
        token (str): アクセストークン

    Returns:
        list: デバイスデータ
    """

    # デバイスリスト取得のエンドポイントURL
    endpoint_url = base_url + "/v1/devices"
    # 認証ヘッダー
    header = {
        "Authorization": "Bearer " + token
    }
    # ページネーションのパラメータ
    params = {
        'page': 1,
        "per_page": 1000
    }
    # 取得した全デバイス情報を格納するリスト
    all_devices = []

    while True:
        # APIからデバイス情報を取得
        response = requests.get(endpoint_url, headers=header, params=params)
        Total = int(response.headers.get('X-Total-Pages'))  # 総ページ数を取得

        # レスポンスのステータスコードを確認
        if response.status_code == 200:
            devices = response.json()  # JSONレスポンスをパース
            all_devices.extend(devices["data"])  # 取得したデバイス情報をリストに追加
            print(params["page"])  # 現在のページ番号を出力
            if Total != params["page"]:
                params['page'] = int(params['page']) + 1  # 次のページ番号を設定
            else:
                break  # 次のページがない場合、ループを終了
        else:
            print(f"APIリクエストに失敗しました。ステータスコード: {response.status_code}")
            break

    return all_devices  # 取得した全デバイス情報を返す

def Output(data):
    """取得したデバイスデータをCSV化する

    Args:
        data (list): 取得したデバイスデータ
    """
    # CSVファイルを開く
    with open('devices.csv', 'w', newline='') as csvfile:
        # CSVファイルのヘッダー
        fieldnames = [
            'uuid', 'asset_number', 'device_type', 'status', 'source', 'manufacturer', 
            'model_number', 'model_name', 'operating_system', 'serial_number', 
            'device_procurement', 'start_date', 'end_date', 'additional_device_information', 
            'custom_fields', 'mdm_fields', 'assignment_detail'
        ]
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)  # CSVファイルへの書き込みオブジェクト

        writer.writeheader()  # ヘッダーを書き込む
        for device in data:
            writer.writerow(device)  # 各デバイス情報を書き込む

# メイン処理
token = Token_get()  # トークンを取得
res = Devicelist_get(token)  # デバイスリストを取得
Output(res)  # デバイスリストをCSVファイルに出力


#コード

トークンの発行→CSVを読み込み→①件づつステータスを変更
今回はステータスを利用中から破棄に変更しました。

import requests  # HTTPリクエストを送信するためのライブラリ
import csv  # CSVファイルを読み書きするためのライブラリ
import json  # JSONデータを扱うためのライブラリ

# ジョーシスから入手したAPIキーとシークレット
APIKEY = "ジョーシスで作成したAPIユーザーキー"
APISEC = "ジョーシスで作成したAPIシークレット"
base_url = "https://developer.josys.it/api"

def Token_get():
    """ジョーシスからAPIを実行するためのTokenを取得する

    Returns:
        str: token
    """
    # トークン取得のエンドポイントURL
    endpoint_url = base_url + "/v1/oauth/tokens"
    # トークン取得のためのリクエストデータ
    body = {
        "grant_type": "client_credentials",
        "api_user_key": APIKEY,
        "api_user_secret": APISEC
    }

    # トークン取得のためのPOSTリクエストを送信
    response = requests.post(endpoint_url, json=body)
    print(response.json())  # レスポンスの内容を出力
    token = response.json()["id_token"]  # レスポンスからトークンを取得
    return token  # トークンを返す

def unassign(data, token):
    """デバイスの割り当てを解除する

    Args:
        data (dict): デバイスデータ
        token (str): Token_get関数で取得したアクセストークン
    """
    # 割り当て解除のためのリクエストボディ
        # 他のステータスに変更したい場合はこの部分を変更する
    body = {
        "target_status": "DECOMMISSIONED",
        "assignment_end_date": "20yy-mm-dd",
        "end_date": "20yy-mm-dd"
    }
    # 認証ヘッダー
    header = {
        "Authorization": "Bearer " + token
    }
    # デバイスのUUIDを取得
    uuid = data["uuid"]
    # 割り当て解除のエンドポイントURL
    endpoint_url = base_url + "/v1/devices/unassign/" + uuid
    # 割り当て解除のためのPOSTリクエストを送信
    response = requests.post(endpoint_url, headers=header, json=body)
    print(response)  # レスポンスを出力

# トークンを取得
token = Token_get()

# CSVファイルのパスを指定
csv_file_path = 'devices.csv'

# CSVファイルを読み込む
with open(csv_file_path, mode='r', newline='') as csvfile:
    csvreader = csv.DictReader(csvfile)
    for row in csvreader:
        unassign(row, token)  # 各デバイスの割り当てを解除

#他のステータスに変えたい場合

この部分を変更するとで対応できます。

    body = {
        "target_status": "DECOMMISSIONED",
        "assignment_end_date": "20yy-mm-dd",
        "end_date": "20yy-mm-dd"
    }

例)不明にする場合

    body = {
        "target_status": "UNKNOWN",
        "assignment_end_date": "20yy-mm-dd",
    }

詳細は下記を御覧ください

最後に

ジョーシスの開発者様へ
CSVで処理ができるようになればいいなぁ(チラ
以上!!!!!!!!!!


いいなと思ったら応援しよう!