こんにちは、中井です。今回は、簡単なBashのコマンドを扱うというちょっとエンジニアの方向けのお話です。
経緯
Kintoneでアプリのアクセス権を参照する場合は、[アプリのアクセス権]画面を表示します。
参考 : アプリにアクセス権を設定する – kintone ヘルプ
[アプリのアクセス権]画面は、一覧表示されてとても見やすいのです。しかし、スペースにアプリがたくさんある場合に「組織毎に権限を見たい」「全アプリの権限をチェックしたい」という場合には、アプリ毎に[設定画面]を表示して[アプリのアクセス権]画面を表示して・・・を繰り返さなくてはいけません。面倒くさいのです。そこで、スペースにあるアプリ全部のアクセス権をKintoneのRest APIを利用してCSVに出力することにしました。
方法
1. 準備する
- Git BashなどをインストールしてBashを使えるようにします。
- 参考 : https://gitforwindows.org/
- jqコマンドをインストールします。
- Kintoneのログイン情報をBASE64エンコードしたものを作成します。
- 「ログイン名:パスワード」をBASE64エンコードしたものを作成します。
- Base64コマンドを使ってBASE64エンコードしたものを作成できます(下にサンプルを記載しています)。
- Base64コマンドがない場合でも以下のようなWebツールを利用すると簡単にBASE64エンコードできます。
- KintoneのRest APIには「パスワード認証」「APIトークン認証」「セッション認証」があります。今回は「パスワード認証」を利用することでアプリを限定しないでアクセスできるようにします。
- 「ログイン名:パスワード」をBASE64エンコードしたものを作成します。
$ echo -n 'loginname:password' | base64
bG9naW5uYW1lOnBhc3N3b3Jk
2. シェルを作る
ここからは、Bash用のexport_app_acl.shというシェルファイルを作成して書いていきます。ここでは、シェルの主な処理となるコードを抜き出して説明します。シェルファイル全体のコードはページの最後に載せていますので参考にしてください。
まずは、「KintoneのURL」「APIトークン」「ファイル名」を変数に定義します。
BASE_URL変数に設定する「KintoneのURL」は、権限を取得したいアプリのあるKintoneのURLにしてください。kintone REST APIの共通仕様 – cybozu developer networkに記載されている「リクエストURI」を参考にしてください。
# KintoneのURL(ゲストスペースのアプリの場合は「/k」の部分が「/k/guest/(スペースのID)」になる。動作テスト環境の場合は「/v1」の部分が「/v1/preview」になる)
BASE_URL='https://{サブドメイン}.cybozu.com/k/v1'
# APIトークン(「ログイン名:パスワード」をBASE64エンコードしたもの)
TOKEN='bG9naW5uYW1lOnBhc3N3b3Jk'
# 出力するCSVファイルのファイル名
CSV_NAME=acl.csv
KintoneのAPIを呼出して「アプリID」「アプリ名」の一覧を作成します。APIの使い方は、アプリ情報の一括取得 – cybozu developer networkを参照してください。
# 「アプリID」「アプリ名」を格納した配列を作成する
apps=$(curl -sS -X GET -H "X-Cybozu-Authorization:$TOKEN;" $BASE_URL/apps.json | jq '[.apps[] | {appId:.appId, name:.name}]')
「アプリID」「アプリ名」の一覧を基にAPIでアプリ毎のアクセス権限を取得します。APIの使い方は、アプリのアクセス権の取得 – cybozu developer networkを参照してください。
取得したアクセス権限の情報をjqコマンドでCSV形式に加工します。jqコマンドの詳しい使い方は、jq Manual (development version)を参照してください。
for app in $(echo $apps | jq -c '.[]'); do
appId=$(echo $app | jq -r .appId)
name=$(echo $app | jq -r .name)
json=$(curl -sS -X GET -H "X-Cybozu-Authorization:$TOKEN;" $BASE_URL/app/acl.json?app=$appId)
echo $json | jq --arg appId $appId --arg name $name '.rights[] | [$appId, $name, .entity.type, .entity.code, (.appEditable|tostring), (.recordViewable|tostring), (.recordAddable|tostring), (.recordEditable|tostring), (.recordDeletable|tostring), (.recordImportable|tostring), (.recordExportable|tostring), (.includeSubs|tostring)] | @csv' \
| sed -e 's/\\"//g' | sed -e 's/"//g' >> $CSV_NAME
done
3. シェルを実行する
Git Bashなどのターミナルでシェルを実行します。これで、アプリ毎のアクセス権限をCSVに出力することができます。
$ bash export_app_acl.sh
シェルと同じ場所にacl.csvというファイルが出力されています。acl.csvの内容はこんな感じです。
アプリID,アプリ名,設定対象の種類,設定対象コード,アプリの管理,レコード閲覧,レコード追加,レコード編集,レコード削除,ファイル読み込み,ファイル書き出し,アクセス権の継承
71,社員名簿,CREATOR,,true,true,true,true,true,true,true,false
71,社員名簿,GROUP,everyone,false,true,true,true,true,false,false,false
73,作業依頼申請,CREATOR,,true,true,true,true,true,true,true,false
73,作業依頼申請,GROUP,everyone,false,true,true,true,true,false,false,false
172,とりあえず,ORGANIZATION,管理者_A7lIQe,true,true,true,true,true,true,true,true
172,とりあえず,ORGANIZATION,参照者_jUmF8o,false,true,false,true,false,false,false,false
172,とりあえず,GROUP,everyone,false,true,false,false,false,false,false,false
173,物品購入申請,ORGANIZATION,参照者_jUmF8o,false,true,true,true,false,false,false,false
173,物品購入申請,CREATOR,,true,true,true,true,true,true,true,false
173,物品購入申請,GROUP,everyone,false,true,false,false,false,false,false,false
やりたいことに合わせて、CSVのまま加工したりExcelで表示したりして使ってください。ただ、acl.csvは文字コードがUTF-8になっていますのでExcelファイルで開くときは文字化けしないように文字コードを指定してください。
Visual Studio Codeを使っているとCSVファイルを簡単にExcelのように表示することもできます(以下動画)。
参考 : Edit csv – Visual Studio Marketplace
さいごに
Kintoneはとても便利なツールです。しかし、もうちょっとだけ便利に使いたいというときにはKintoneのAPIを使ったツールを作るのはお勧めです。
今回は、それほど難しい内容ではないのでBashを使ったことがない方もチャレンジしてみてはいかがでしょうか?
シェルファイルの全コード
#!/bin/bash
# KintoneのURL(ゲストスペースのアプリの場合は「/k」の部分が「/k/guest/(スペースのID)」になる。動作テスト環境の場合は「/v1」の部分が「/v1/preview」になる)
BASE_URL='https://{サブドメイン}.cybozu.com/k/v1'
# APIトークン(「ログイン名:パスワード」をBASE64エンコードしたもの)
TOKEN='bG9naW5uYW1lOnBhc3N3b3Jk'
# 出力するCSVファイルのファイル名
CSV_NAME=acl.csv
# CSVファイルの見出し行を作成する
echo 'アプリID,アプリ名,設定対象の種類,設定対象コード,アプリの管理,レコード閲覧,レコード追加,レコード編集,レコード削除,ファイル読み込み,ファイル書き出し,アクセス権の継承' > $CSV_NAME
# 「アプリID」「アプリ名」を格納した配列を作成する
apps=$(curl -sS -X GET -H "X-Cybozu-Authorization:$TOKEN;" $BASE_URL/apps.json | jq '[.apps[] | {appId:.appId, name:.name}]')
# 区切り文字(IFS:Internal Filed Separator)に「改行のみ」を設定する
IFS=$'\n';
# アプリ毎のアクセス権限を取得してjqコマンドで加工する
for app in $(echo $apps | jq -c '.[]'); do
appId=$(echo $app | jq -r .appId)
name=$(echo $app | jq -r .name)
json=$(curl -sS -X GET -H "X-Cybozu-Authorization:$TOKEN;" $BASE_URL/app/acl.json?app=$appId)
echo $json | jq --arg appId $appId --arg name $name '.rights[] | [$appId, $name, .entity.type, .entity.code, (.appEditable|tostring), (.recordViewable|tostring), (.recordAddable|tostring), (.recordEditable|tostring), (.recordDeletable|tostring), (.recordImportable|tostring), (.recordExportable|tostring), (.includeSubs|tostring)] | @csv' \
| sed -e 's/\\"//g' | sed -e 's/"//g' >> $CSV_NAME
done